diff --git a/react-app/.idea/compiler.xml b/react-app/.idea/compiler.xml new file mode 100644 index 0000000000..96cc43efa6 --- /dev/null +++ b/react-app/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/react-app/.idea/copyright/profiles_settings.xml b/react-app/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000000..e7bedf3377 --- /dev/null +++ b/react-app/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/react-app/.idea/encodings.xml b/react-app/.idea/encodings.xml new file mode 100644 index 0000000000..97626ba454 --- /dev/null +++ b/react-app/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/react-app/.idea/misc.xml b/react-app/.idea/misc.xml new file mode 100644 index 0000000000..f869d265ef --- /dev/null +++ b/react-app/.idea/misc.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.8 + + + + + + + + \ No newline at end of file diff --git a/react-app/.idea/modules.xml b/react-app/.idea/modules.xml new file mode 100644 index 0000000000..28cb897548 --- /dev/null +++ b/react-app/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/react-app/.idea/workspace.xml b/react-app/.idea/workspace.xml new file mode 100644 index 0000000000..ce70f1627f --- /dev/null +++ b/react-app/.idea/workspace.xml @@ -0,0 +1,802 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + + + + + + + + + + + + + + + + + + + + + + + + + 1459937301294 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/react-app/bower_components/file-upload/.bower.json b/react-app/bower_components/file-upload/.bower.json new file mode 100644 index 0000000000..5d24dd80e4 --- /dev/null +++ b/react-app/bower_components/file-upload/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "file-upload", + "version": "1.6.4", + "authors": [ + "Winston Howes " + ], + "description": "An element for using ajax to upload files.", + "keywords": [ + "web-component", + "web-components", + "polymer", + "file", + "ajax", + "upload" + ], + "main": "file-upload.html", + "license": "MIT", + "homepage": "https://github.com/winhowes/file-upload/", + "ignore": [ + "/.*", + "/test/", + "/demo/", + "/bower_components/" + ], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0", + "paper-progress": "PolymerElements/paper-progress#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "web-component-tester": "*" + }, + "_release": "1.6.4", + "_resolution": { + "type": "version", + "tag": "v1.6.4", + "commit": "eeaa8d62ac0d7ae2f5adb9531c427bfba3952f1c" + }, + "_source": "git://github.com/winhowes/file-upload.git", + "_target": "~1.6.4", + "_originalSource": "file-upload", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/file-upload/LICENSE b/react-app/bower_components/file-upload/LICENSE new file mode 100644 index 0000000000..76617e9148 --- /dev/null +++ b/react-app/bower_components/file-upload/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Winston Howes + +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. + diff --git a/react-app/bower_components/file-upload/README.md b/react-app/bower_components/file-upload/README.md new file mode 100755 index 0000000000..540032943e --- /dev/null +++ b/react-app/bower_components/file-upload/README.md @@ -0,0 +1,10 @@ +# Introduction +This repository contains an element for file uploads using ajax. It supports multi-file selection as well as optional drop zones for drag-and-drop. The element is designed for use in Polymer 1.0. + +Check out the demo and docs here: https://winhowes.github.io/file-upload/components/file-upload/. + +# Installation +To install simply run: +``` +bower install --save file-upload +``` diff --git a/react-app/bower_components/file-upload/bower.json b/react-app/bower_components/file-upload/bower.json new file mode 100755 index 0000000000..e89e540bf3 --- /dev/null +++ b/react-app/bower_components/file-upload/bower.json @@ -0,0 +1,33 @@ +{ + "name": "file-upload", + "version": "1.6.4", + "authors": [ + "Winston Howes " + ], + "description": "An element for using ajax to upload files.", + "keywords": [ + "web-component", + "web-components", + "polymer", + "file", + "ajax", + "upload" + ], + "main": "file-upload.html", + "license": "MIT", + "homepage": "https://github.com/winhowes/file-upload/", + "ignore": [ + "/.*", + "/test/", + "/demo/", + "/bower_components/" + ], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0", + "paper-progress": "PolymerElements/paper-progress#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "web-component-tester": "*" + } +} diff --git a/react-app/bower_components/file-upload/file-upload.html b/react-app/bower_components/file-upload/file-upload.html new file mode 100755 index 0000000000..d9a3ff5664 --- /dev/null +++ b/react-app/bower_components/file-upload/file-upload.html @@ -0,0 +1,504 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/file-upload/index.html b/react-app/bower_components/file-upload/index.html new file mode 100755 index 0000000000..0557d150fa --- /dev/null +++ b/react-app/bower_components/file-upload/index.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/font-roboto/.bower.json b/react-app/bower_components/font-roboto/.bower.json new file mode 100644 index 0000000000..eafbb18866 --- /dev/null +++ b/react-app/bower_components/font-roboto/.bower.json @@ -0,0 +1,31 @@ +{ + "name": "font-roboto", + "version": "1.0.1", + "description": "An HTML import for Roboto", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "font", + "roboto" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/font-roboto.git" + }, + "main": "roboto.html", + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/font-roboto/", + "ignore": [ + "/.*" + ], + "_release": "1.0.1", + "_resolution": { + "type": "version", + "tag": "v1.0.1", + "commit": "21ce9b51a417fa9995cf6606e886aba0728f70a1" + }, + "_source": "git://github.com/PolymerElements/font-roboto.git", + "_target": "^1.0.1", + "_originalSource": "PolymerElements/font-roboto" +} \ No newline at end of file diff --git a/react-app/bower_components/font-roboto/README.md b/react-app/bower_components/font-roboto/README.md new file mode 100644 index 0000000000..61c6394ce3 --- /dev/null +++ b/react-app/bower_components/font-roboto/README.md @@ -0,0 +1 @@ +# font-roboto diff --git a/react-app/bower_components/font-roboto/bower.json b/react-app/bower_components/font-roboto/bower.json new file mode 100644 index 0000000000..977cf2d4ed --- /dev/null +++ b/react-app/bower_components/font-roboto/bower.json @@ -0,0 +1,22 @@ +{ + "name": "font-roboto", + "version": "1.0.1", + "description": "An HTML import for Roboto", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "font", + "roboto" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/font-roboto.git" + }, + "main": "roboto.html", + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/font-roboto/", + "ignore": [ + "/.*" + ] +} diff --git a/react-app/bower_components/font-roboto/roboto.html b/react-app/bower_components/font-roboto/roboto.html new file mode 100644 index 0000000000..7a24999fff --- /dev/null +++ b/react-app/bower_components/font-roboto/roboto.html @@ -0,0 +1,11 @@ + + + diff --git a/react-app/bower_components/iron-a11y-keys-behavior/.bower.json b/react-app/bower_components/iron-a11y-keys-behavior/.bower.json new file mode 100644 index 0000000000..f920799d20 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "iron-a11y-keys-behavior", + "version": "1.1.2", + "description": "A behavior that enables keybindings for greater a11y.", + "keywords": [ + "web-components", + "web-component", + "polymer", + "a11y", + "input" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git" + }, + "main": "iron-a11y-keys-behavior.html", + "license": "http://polymer.github.io/LICENSE.txt", + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.2", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/polymerelements/iron-a11y-keys-behavior", + "_release": "1.1.2", + "_resolution": { + "type": "version", + "tag": "v1.1.2", + "commit": "0c2330c229a6fd3d200e2b84147ec6f94f17c22d" + }, + "_source": "git://github.com/polymerelements/iron-a11y-keys-behavior.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/iron-a11y-keys-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md b/react-app/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..7d93604870 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/react-app/bower_components/iron-a11y-keys-behavior/.gitignore b/react-app/bower_components/iron-a11y-keys-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-a11y-keys-behavior/.travis.yml b/react-app/bower_components/iron-a11y-keys-behavior/.travis.yml new file mode 100644 index 0000000000..c273b2e9b5 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: OZhLlPsjjnWU4FyZ+RKq5i/Nv/tElvcjr9+OT04ENGKfh9+fkuij/XdHJQe6EpOCjrNkwt23c+I6V5YWRrSatRX/AxEkViW8EXnF32rX3HV8fWnjD6Vfn+4Qz82y4huc9II8OV5I7jFDln6yzEGZn08zAtbmhj5dSpYtT1spSf/ZuUkqn4mMRJW2wCOnzbjueP56Ry40IwQm0enLXVQLPYB3LC4fBWfT+VFrsE9qH1ZgGKcSD/n2dOD3d6xjts4FSilNp2IZ8Km5RNAFUxYmkcwrY4O2ltNtKUngWwIpeplpz0bNj5k8kOpT5xA/FT630M5sFd1ODVp846kTr/EyYTq/VCiwTaA/vDfZL85DC3O+Zt0vTHAvkxKAaXkg9sMp8gJOJ6gt6cK8rV8z7npeAUVsK1gmuHYXne1Z76SRgWwbE0/z82vyFLNgitmZDLLM1fP3TpzsK1QQg1ikn6iYXdWpHcrzBi6lk8mCafnP7D7B/yFB/Z6Y9AFI6NQI/jWP2FMMJjMWbaJVG9DAU4PWlVTiFnhfVjPI7FUEmW46/QjH1ztSZWpDA9SBozJluIpKRA1qk1EgGX1RBFBHrbFtHG//x0AGyAV6gWOfdKjl/nqcM02xFUSrDb0tkNUnEAS6K7l+X1eDaBbiaAQiakPt9Je2WvvHyc+OiZviSc72Gmc= + - secure: vIs86+z7s1QwihkHtLBRQzlmJRSIWIadq3SlDdZHS4HOivH7fNV0d4hm8QnZYZ9X8yvSvxFCzEFdLuX1TpU0H3oy5wgYky7DnfJtsEhuOfW8dobHHZeCNi/t2FQAXpobqpRwojC3A+1b1lNrY1XNpYRz7aEialO4Yr8e1SQSLex5zw/pqm7g9Vz6PnQwobDQcGXKc6ZWc84+DqOo9qfkSlnEJC/1vQxHYpUa172UnnAnmHJ7gZKdhf9aLWJSZcSpPcoKEnvslRFmeDyRMNRDWVzcg2vHnV+tc1aYzp1wsrRW3P+oqwYlvGlxo+5U92QLXKIcKZhGblVWxe8BtXgiVzgS1sz5D11vKs61Xe46onbguG/XK3UxX9bPRK5uklkC5fwAY2hhvOTGXqimTb2YrlyEWO3BCKGBk6Is3KGyCe7c2nNEmXPUSun9X1JLGRPivJb9iBR4/WSEFvibYHl6/gIke9LdXPOCHuJ3+Iu14lCz+pwi8ADIWVuGpDIxFcorG8a3BCoxQo5VouUbSe0mcNttAvSzBNxhljaaBuFs56DLDpLRr0sGhqvfA1JzdCyzVyrk4WECfZw26pAnYCyTczVXmu5msVdKnjPJKtDqWazvIhHk2G1mk8CKb14lrN58u/Kh6PQ3miJ+61c1stBWhRDlp2QffOkBJiOATKHF+AA= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md b/react-app/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-a11y-keys-behavior/README.md b/react-app/bower_components/iron-a11y-keys-behavior/README.md new file mode 100644 index 0000000000..30ab211dc8 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/README.md @@ -0,0 +1,35 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-a11y-keys-behavior)_ + + +##Polymer.IronA11yKeysBehavior + +`Polymer.IronA11yKeysBehavior` provides a normalized interface for processing +keyboard commands that pertain to [WAI-ARIA best practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding). +The element takes care of browser differences with respect to Keyboard events +and uses an expressive syntax to filter key presses. + +Use the `keyBindings` prototype property to express what combination of keys +will trigger the event to fire. + +Use the `key-event-target` attribute to set up event handlers on a specific +node. +The `keys-pressed` event will fire when one of the key combinations set with the +`keys` property is pressed. + + diff --git a/react-app/bower_components/iron-a11y-keys-behavior/bower.json b/react-app/bower_components/iron-a11y-keys-behavior/bower.json new file mode 100644 index 0000000000..866d5ee967 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/bower.json @@ -0,0 +1,33 @@ +{ + "name": "iron-a11y-keys-behavior", + "version": "1.1.2", + "description": "A behavior that enables keybindings for greater a11y.", + "keywords": [ + "web-components", + "web-component", + "polymer", + "a11y", + "input" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git" + }, + "main": "iron-a11y-keys-behavior.html", + "license": "http://polymer.github.io/LICENSE.txt", + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.2", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-a11y-keys-behavior/demo/index.html b/react-app/bower_components/iron-a11y-keys-behavior/demo/index.html new file mode 100644 index 0000000000..2c3fec7c59 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/demo/index.html @@ -0,0 +1,24 @@ + + + + + + Iron A11y Keys Behavior demo + + + + + +
+ +
+ + diff --git a/react-app/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html b/react-app/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html new file mode 100644 index 0000000000..16b9b2a518 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/demo/x-key-aware.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-a11y-keys-behavior/index.html b/react-app/bower_components/iron-a11y-keys-behavior/index.html new file mode 100644 index 0000000000..c53ba6cf31 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/index.html @@ -0,0 +1,24 @@ + + + + + + iron-a11y-keys-behavior + + + + + + + + + + diff --git a/react-app/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html b/react-app/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html new file mode 100644 index 0000000000..fb90a4110a --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html @@ -0,0 +1,462 @@ + + + + + diff --git a/react-app/bower_components/iron-a11y-keys-behavior/test/basic-test.html b/react-app/bower_components/iron-a11y-keys-behavior/test/basic-test.html new file mode 100644 index 0000000000..d53b6009fc --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/test/basic-test.html @@ -0,0 +1,429 @@ + + + + + + + iron-a11y-keys + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-a11y-keys-behavior/test/index.html b/react-app/bower_components/iron-a11y-keys-behavior/test/index.html new file mode 100755 index 0000000000..d00850a0e7 --- /dev/null +++ b/react-app/bower_components/iron-a11y-keys-behavior/test/index.html @@ -0,0 +1,28 @@ + + + + Tests + + + + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/.bower.json b/react-app/bower_components/iron-behaviors/.bower.json new file mode 100644 index 0000000000..85e8252b32 --- /dev/null +++ b/react-app/bower_components/iron-behaviors/.bower.json @@ -0,0 +1,42 @@ +{ + "name": "iron-behaviors", + "version": "1.0.13", + "description": "Provides a set of behaviors for the iron elements", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-behaviors.git" + }, + "main": [ + "iron-button-state.html", + "iron-control-state.html" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "dependencies": { + "polymer": "Polymer/polymer#^1.2.0", + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "paper-input": "polymerelements/paper-input#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/iron-behaviors", + "_release": "1.0.13", + "_resolution": { + "type": "version", + "tag": "v1.0.13", + "commit": "a7bc3428a6da2beed21987b3a8028206826a12bc" + }, + "_source": "git://github.com/PolymerElements/iron-behaviors.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-behaviors" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-behaviors/.gitignore b/react-app/bower_components/iron-behaviors/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-behaviors/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-behaviors/.travis.yml b/react-app/bower_components/iron-behaviors/.travis.yml new file mode 100644 index 0000000000..6cfa94dfac --- /dev/null +++ b/react-app/bower_components/iron-behaviors/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: ZOqj2XVNVwfT74rHxg/ljcAsS6FnmDpRSsXbsy1Icv9DcLHrMlmyQ10gWBjE/YXYF0Uv4akQ1qqn0TJaKOtp9HZeH+P6OPAYk2vJbWD7qp52pPtIqEFomcsUyflt4IjfaXKuN4FMod7PSWVSGJ+DxSguJvZKILkrs5d/rJdFv3c= + - secure: clkqemGQG16TXyAPkv9LBv6x3SbT3ZM0eo8LETx4uNKi3WzlwgXxZA9b5Sr5wYzxyxFFpnhDXW7CL4+UjYu1atGNeTW2TuSaYUPHtgu67OFDr8Jbw047p1XQb5enPSt9+YxrHKfjHBiJvWulJ8rCSQshU9Rhe0DC6NrFRPFgk0A= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-behaviors/CONTRIBUTING.md b/react-app/bower_components/iron-behaviors/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-behaviors/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-behaviors/README.md b/react-app/bower_components/iron-behaviors/README.md new file mode 100644 index 0000000000..0a0629ec7e --- /dev/null +++ b/react-app/bower_components/iron-behaviors/README.md @@ -0,0 +1,22 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-behaviors) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-behaviors)_ + + + + + diff --git a/react-app/bower_components/iron-behaviors/bower.json b/react-app/bower_components/iron-behaviors/bower.json new file mode 100644 index 0000000000..6f3b79d3f2 --- /dev/null +++ b/react-app/bower_components/iron-behaviors/bower.json @@ -0,0 +1,32 @@ +{ + "name": "iron-behaviors", + "version": "1.0.13", + "description": "Provides a set of behaviors for the iron elements", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-behaviors.git" + }, + "main": [ + "iron-button-state.html", + "iron-control-state.html" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "dependencies": { + "polymer": "Polymer/polymer#^1.2.0", + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "paper-input": "polymerelements/paper-input#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-behaviors/demo/index.html b/react-app/bower_components/iron-behaviors/demo/index.html new file mode 100644 index 0000000000..2b9b6d3eb1 --- /dev/null +++ b/react-app/bower_components/iron-behaviors/demo/index.html @@ -0,0 +1,47 @@ + + + + + + + + + + simple-button + + + + + + + + + +
+

Normal

+ + Hello World + +

Toggles

+ + Hello World + +

Disabled

+ + Hello World +
+ + diff --git a/react-app/bower_components/iron-behaviors/demo/simple-button.html b/react-app/bower_components/iron-behaviors/demo/simple-button.html new file mode 100644 index 0000000000..ab6432b6c9 --- /dev/null +++ b/react-app/bower_components/iron-behaviors/demo/simple-button.html @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/index.html b/react-app/bower_components/iron-behaviors/index.html new file mode 100644 index 0000000000..220deb0034 --- /dev/null +++ b/react-app/bower_components/iron-behaviors/index.html @@ -0,0 +1,27 @@ + + + + + + Iron Behaviors + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/iron-button-state.html b/react-app/bower_components/iron-behaviors/iron-button-state.html new file mode 100644 index 0000000000..8114e2ddea --- /dev/null +++ b/react-app/bower_components/iron-behaviors/iron-button-state.html @@ -0,0 +1,228 @@ + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/iron-control-state.html b/react-app/bower_components/iron-behaviors/iron-control-state.html new file mode 100644 index 0000000000..45ca87ddfe --- /dev/null +++ b/react-app/bower_components/iron-behaviors/iron-control-state.html @@ -0,0 +1,107 @@ + + + + + diff --git a/react-app/bower_components/iron-behaviors/test/active-state.html b/react-app/bower_components/iron-behaviors/test/active-state.html new file mode 100644 index 0000000000..28b6ce9aec --- /dev/null +++ b/react-app/bower_components/iron-behaviors/test/active-state.html @@ -0,0 +1,279 @@ + + + + + active-state + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/test/disabled-state.html b/react-app/bower_components/iron-behaviors/test/disabled-state.html new file mode 100644 index 0000000000..5db3e04b8f --- /dev/null +++ b/react-app/bower_components/iron-behaviors/test/disabled-state.html @@ -0,0 +1,81 @@ + + + + + disabled-state + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/test/focused-state.html b/react-app/bower_components/iron-behaviors/test/focused-state.html new file mode 100644 index 0000000000..b20b98b90a --- /dev/null +++ b/react-app/bower_components/iron-behaviors/test/focused-state.html @@ -0,0 +1,145 @@ + + + + + focused-state + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/test/index.html b/react-app/bower_components/iron-behaviors/test/index.html new file mode 100644 index 0000000000..b09e59cbb0 --- /dev/null +++ b/react-app/bower_components/iron-behaviors/test/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/react-app/bower_components/iron-behaviors/test/test-elements.html b/react-app/bower_components/iron-behaviors/test/test-elements.html new file mode 100644 index 0000000000..8a7139a7bf --- /dev/null +++ b/react-app/bower_components/iron-behaviors/test/test-elements.html @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-checked-element-behavior/.bower.json b/react-app/bower_components/iron-checked-element-behavior/.bower.json new file mode 100644 index 0000000000..31b32b0aef --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "iron-checked-element-behavior", + "version": "1.0.4", + "description": "Implements an element that has a checked attribute and can be added to a form", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "main": "iron-checked-element-behavior.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0", + "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0", + "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "_release": "1.0.4", + "_resolution": { + "type": "version", + "tag": "v1.0.4", + "commit": "cc30263ec2871ae8f8f944948f44299d3f3cdf0d" + }, + "_source": "git://github.com/PolymerElements/iron-checked-element-behavior.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-checked-element-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-checked-element-behavior/.gitignore b/react-app/bower_components/iron-checked-element-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-checked-element-behavior/.travis.yml b/react-app/bower_components/iron-checked-element-behavior/.travis.yml new file mode 100644 index 0000000000..0b7456d71e --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: false +before_script: + - npm install web-component-tester + - npm install bower + - 'export PATH=$PWD/node_modules/.bin:$PATH' + - bower install +env: + global: + - secure: EJSBYkW/C3ppDTbxHYRzyFPAko5R1ET1LSbdM484/j0OHGLkSIwtKrrZLNz5+QEmKSw79MpLpBoD+SfXuSCn0yKkf6tvK4mt+kRs32vKVfoWrYReVcfth+EWV7QDpTDJw1QEijT1bKUxULhP0OrT2/5vVpKpXX2zczg+VFL7IZuY3y1dsA4qWmWTfMiAk3762dZx47D5qzJ4POHlpG0i/cHH2EgqV8sFXFBctf6EY68GqzStPUuMuea6xX2wMrebg6vqQDfDb1gs8N34gxGE+u8QaqOSniW1Vzdoe1vwOUo4dbJYw3JMYK5Qn2pj3p2E4m9J609JNnBfqjS7mB5KVC7Hf5r9ul3UMsAIlOnlmSqOq1oO22/3regjWHGjlrzCNHzma2SgDhTxGaLDJl1LnsUevbVb6TGloiQPXwum8oa7dvZ1PqspqyqZEb31t/FyUnG+VXnC0YYpdRj3eRGqeoqqaNtad97DrPHP7er9LdvJIKjsXux7gUW4hKWsr+jsU/krdHpTUC8GYWdTF54EcLhxfzNYKL7voTq+xoQ2yxCOSiBmcQCviuQyVvNQyhde/+edAmOt24CLiuSQjHCbEWzBQs9QinUPRekg6+LJ1WaifTIKkhsm04AdaZrs7LR34hF+Mpqp4HHl/AfcbtVeB/W7jUnhJyMFaQDfGkpzSZs= + - secure: izhN5Z3WdajR3ois2T55qepsvLwVg/wv8u4kVQ4TqWhUL08tka83m/W+EMzS/tcvfz7J3VkuTFrJ5scYD9kaTVhRo4dv2u+DdbPmTNcf/hmADXLVLxddyueK3bWEcBurg8+rSdqq/RdI+5CPwWeGtQl+lmjRCyBzodIpQ90zJQF4Al7nmmLuEUhiNVjuqQ3VB1pFLYgky4SVM0bfJnoKSDsZ2z9DOOJE34ZUUmcNqVcQoZ5/oM+PWdVDkUqW3vMK1lTMtE/dk6WcSztQwFyoMrW+uzEstPwUsJCyuBEx4KdioXZH3vrlxRApySfHmEf5eVWwE6jyPSHuWj/2D5O4R9LY1dq1Wcoiu3BJj19B4V3s4L2uJF+xL077d4Mna6z9dE4RSRzs8Z8MvSMTgzDkga/A25JI3XxJMJ78WTbkNQ4hVFN2xwcU5cm+fbs3Sr1ZEdFW/MWAPtUQOzscqS5Op7sSLLaiqO+R0zj56H2NA2bl/zCmbZhyLcOPl0oAfJ85bqNxyF8CoO+GZ98UG15ROigC90/HCP7TUHZnQSrGtiFGTiPTBm+VCITYmC5IEyJBTwgqh/ljbDzz4UuSZ3KsldL3MwWnqO3tGr6VvPfqKF6xq0vuyn9P7f9WNAYwZGcRi3AtxtY+znO+IGv2sGmrfo7ZY+U4nceXTEDrG8OY0Jo= +node_js: 4 +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-checked-element-behavior/CONTRIBUTING.md b/react-app/bower_components/iron-checked-element-behavior/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-checked-element-behavior/README.md b/react-app/bower_components/iron-checked-element-behavior/README.md new file mode 100644 index 0000000000..fc570916df --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/README.md @@ -0,0 +1,25 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-checked-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-checked-element-behavior) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-checked-element-behavior)_ + + +##Polymer.IronCheckedElementBehavior + + +Use `Polymer.IronCheckedElementBehavior` to implement a custom element +that has a `checked` property, which can be used for validation if the +element is also `required`. Element instances implementing this behavior +will also be registered for use in an `iron-form` element. + + diff --git a/react-app/bower_components/iron-checked-element-behavior/bower.json b/react-app/bower_components/iron-checked-element-behavior/bower.json new file mode 100644 index 0000000000..65154c82fa --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/bower.json @@ -0,0 +1,34 @@ +{ + "name": "iron-checked-element-behavior", + "version": "1.0.4", + "description": "Implements an element that has a checked attribute and can be added to a form", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "main": "iron-checked-element-behavior.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0", + "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0", + "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/react-app/bower_components/iron-checked-element-behavior/demo/index.html b/react-app/bower_components/iron-checked-element-behavior/demo/index.html new file mode 100644 index 0000000000..788a64f001 --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/demo/index.html @@ -0,0 +1,39 @@ + + + + + + + + + iron-checked-element-behavior demo + + + + + + +
+
+

Not required

+
+ +
+
+
+

Required

+
+ +
+
+
+ + diff --git a/react-app/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html b/react-app/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html new file mode 100644 index 0000000000..fd99c98a48 --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/demo/simple-checkbox.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-checked-element-behavior/index.html b/react-app/bower_components/iron-checked-element-behavior/index.html new file mode 100644 index 0000000000..1975dc5a75 --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-checked-element-behavior + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html b/react-app/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html new file mode 100644 index 0000000000..5809c03761 --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/iron-checked-element-behavior.html @@ -0,0 +1,120 @@ + + + + + + + diff --git a/react-app/bower_components/iron-checked-element-behavior/test/basic.html b/react-app/bower_components/iron-checked-element-behavior/test/basic.html new file mode 100644 index 0000000000..4c13dd8cd3 --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/test/basic.html @@ -0,0 +1,152 @@ + + + + + + iron-checked-element-behavior basic tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-checked-element-behavior/test/index.html b/react-app/bower_components/iron-checked-element-behavior/test/index.html new file mode 100644 index 0000000000..1ddeca33ae --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/test/index.html @@ -0,0 +1,31 @@ + + + iron-checked-element-behavior tests + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-checked-element-behavior/test/simple-checkbox.html b/react-app/bower_components/iron-checked-element-behavior/test/simple-checkbox.html new file mode 100644 index 0000000000..95228faeca --- /dev/null +++ b/react-app/bower_components/iron-checked-element-behavior/test/simple-checkbox.html @@ -0,0 +1,26 @@ + + + + + + diff --git a/react-app/bower_components/iron-dropdown/.bower.json b/react-app/bower_components/iron-dropdown/.bower.json new file mode 100644 index 0000000000..504bcd5051 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "iron-dropdown", + "version": "1.3.0", + "description": "An unstyled element that works similarly to a native browser select", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer" + ], + "main": "iron-dropdown.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-dropdown" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-dropdown", + "dependencies": { + "polymer": "polymer/polymer#^1.0.0", + "iron-behaviors": "polymerelements/iron-behaviors#^1.0.0", + "iron-overlay-behavior": "polymerelements/iron-overlay-behavior#^1.0.0", + "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0", + "neon-animation": "polymerelements/neon-animation#^1.0.0", + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0", + "iron-image": "polymerelements/iron-image#^1.0.0" + }, + "ignore": [], + "_release": "1.3.0", + "_resolution": { + "type": "version", + "tag": "v1.3.0", + "commit": "9d6bb9e7a8150430e61559f5a0827526d2eefaa4" + }, + "_source": "git://github.com/PolymerElements/iron-dropdown.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-dropdown" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-dropdown/.gitignore b/react-app/bower_components/iron-dropdown/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-dropdown/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-dropdown/.travis.yml b/react-app/bower_components/iron-dropdown/.travis.yml new file mode 100644 index 0000000000..771c6b21b4 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: Nd7sbgkYVekuQRB4K3svNCL3veA6t6aGopNP2FUxlJvQuzRV1vKV67angPvMUAFelEA7/rTzrFPBMfNbsz9C2wInLLLPux4wEk1MQX+2KYZVeXKMHjgl8iQKMXnodaL7XXwBPg0L7053TWtYkIt8wZ/vN0JGPQFKhlQkSrduztkPCJQfkFsMPJ7SudPG3Ld0UPBVxo8TwH/d44p8VhLGiI0oEWw3GnGZZ1T7RJLDAVBwj1BiVHAOaS0SSeOR3ngpZyXbk8OItgzw4o/bbAt2yrHMfwymBy0Xv9v3G0QLFJnMi/gE2lWnN4+IttUPI8gVyr1TuiTgtFxdwteLO3R5iFe+qlQjq0VGssmAHcPwtLhvrT4wEkGMc8ZeyW11z+GdkIw4XHGACWj+9Jz9f19mJd9xU3fkJ+f5mFiB8vEkzjsUI9pswgd3RoHt2WewcVdHnCED2wRdQCw9H34dX7d2ieWKPl/pv+EKZOgEJJ8UNZMyKnj57Y25WRrTpIQBt6p9uVv5MsiZQm7Sd1pYQnJKPQ+BxvvL5fsoT1YkFSjyz9gwijtftXhfL8KLB6i04V3mra3f9d5hc20wAOt+ad+mTOkaM/aGxE/I3Ko13BceMvRSNzuz+N2WE6FEJj1NuOCW/AeSh5/6n9nnlDeu7Nu7VeM9kjk4dyBGNRDWLNcSCEk= + - secure: aFsYKL6Sw8/r57wzj3pnzEwBE1mnTajJasHAbXgQMd336S2Sq/f39DCNTXgKBA4AKZGvWKe8w9nzaocQoMa4l9bLWEBJMCMPQFawOhTkuEjsLjpU3g74b46/EhjBP5zixR32xoyF5o9FTzC6UyrDjt2XpKwIQJYxaEfoyIW1vTPdoasWdaG5rXvWFTsmXtaMDpCKFH9aQ1DHn9Sbi9NZlR4izdULsbv9GZwg53xvuH4xYEkGtB29KKy04uK1nJ+9SmRWTAnu4Q/ivYWlbwBArjiYTTi0wclvDNvT1iaFNAaeK2pJea8CnoyJJ0pg9NcuzZtStGUvP00kGUpJQ4lqkr+gBCHDPYtoZ17XCz59cg6LrhG1q//vPi7Yz0xW51GHuwmcVs+PsjmWaRuO/1UFreDCQYf+GU4I1pQZf2q1R4m8noe4i5CcFXLKTrC4udBzPmzVB4As2LsxRc3HCIXmhaMxI8MJwdkQBA22u4vCwU2xpqBawJocj0Gvbeme6wG99PW7+XSkijQDk2cTJ5/CJtY22nAECvn4tve3OVvybSTjQ1yipLxJm/dtjgEXFWtknFZr++tId88wPd3EBtrwEhliD3zD/TyLPO2RPZGuI0i6oD3O89P5d8qp66T/eByDr1IEm0+FIQjgiCEMbhmaIuUKGG2GCfwPglI3uR0kbg0= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-dropdown/CONTRIBUTING.md b/react-app/bower_components/iron-dropdown/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-dropdown/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-dropdown/README.md b/react-app/bower_components/iron-dropdown/README.md new file mode 100644 index 0000000000..6440ec68a7 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/README.md @@ -0,0 +1,46 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-dropdown.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-dropdown) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-dropdown)_ + + +##<iron-dropdown> + +`` is a generalized element that is useful when you have +hidden content (`.dropdown-content`) that is revealed due to some change in +state that should cause it to do so. + +Note that this is a low-level element intended to be used as part of other +composite elements that cause dropdowns to be revealed. + +Examples of elements that might be implemented using an `iron-dropdown` +include comboboxes, menubuttons, selects. The list goes on. + +The `` element exposes attributes that allow the position +of the `.dropdown-content` relative to the `.dropdown-trigger` to be +configured. + +```html + + + +``` + +In the above example, the `
` with class `.dropdown-content` will be +hidden until the dropdown element has `opened` set to true, or when the `open` +method is called on the element. + + diff --git a/react-app/bower_components/iron-dropdown/bower.json b/react-app/bower_components/iron-dropdown/bower.json new file mode 100644 index 0000000000..6cbbe388d1 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/bower.json @@ -0,0 +1,39 @@ +{ + "name": "iron-dropdown", + "version": "1.3.0", + "description": "An unstyled element that works similarly to a native browser select", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer" + ], + "main": "iron-dropdown.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-dropdown" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-dropdown", + "dependencies": { + "polymer": "polymer/polymer#^1.0.0", + "iron-behaviors": "polymerelements/iron-behaviors#^1.0.0", + "iron-overlay-behavior": "polymerelements/iron-overlay-behavior#^1.0.0", + "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0", + "neon-animation": "polymerelements/neon-animation#^1.0.0", + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0", + "iron-image": "polymerelements/iron-image#^1.0.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-dropdown/demo/grow-height-animation.html b/react-app/bower_components/iron-dropdown/demo/grow-height-animation.html new file mode 100644 index 0000000000..e2fdc448a0 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/demo/grow-height-animation.html @@ -0,0 +1,36 @@ + + + + + + diff --git a/react-app/bower_components/iron-dropdown/demo/index.html b/react-app/bower_components/iron-dropdown/demo/index.html new file mode 100644 index 0000000000..3ddbaf209b --- /dev/null +++ b/react-app/bower_components/iron-dropdown/demo/index.html @@ -0,0 +1,160 @@ + + + + + + iron-dropdown + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-dropdown/demo/x-select.html b/react-app/bower_components/iron-dropdown/demo/x-select.html new file mode 100644 index 0000000000..2216c65946 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/demo/x-select.html @@ -0,0 +1,80 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/iron-dropdown/index.html b/react-app/bower_components/iron-dropdown/index.html new file mode 100644 index 0000000000..1d3d6cada9 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/index.html @@ -0,0 +1,24 @@ + + + + + + iron-dropdown + + + + + + + + + + diff --git a/react-app/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html b/react-app/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html new file mode 100644 index 0000000000..5e9176efaf --- /dev/null +++ b/react-app/bower_components/iron-dropdown/iron-dropdown-scroll-manager.html @@ -0,0 +1,233 @@ + + + + + + diff --git a/react-app/bower_components/iron-dropdown/iron-dropdown.html b/react-app/bower_components/iron-dropdown/iron-dropdown.html new file mode 100644 index 0000000000..7c48a2d47f --- /dev/null +++ b/react-app/bower_components/iron-dropdown/iron-dropdown.html @@ -0,0 +1,470 @@ + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-dropdown/test/index.html b/react-app/bower_components/iron-dropdown/test/index.html new file mode 100644 index 0000000000..3507c6bcf6 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/test/index.html @@ -0,0 +1,28 @@ + + + + + + + iron-dropdown tests + + + + + + diff --git a/react-app/bower_components/iron-dropdown/test/iron-dropdown-scroll-manager.html b/react-app/bower_components/iron-dropdown/test/iron-dropdown-scroll-manager.html new file mode 100644 index 0000000000..885a5f91a1 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/test/iron-dropdown-scroll-manager.html @@ -0,0 +1,152 @@ + + + + + + iron-dropdown-scroll-manager tests + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-dropdown/test/iron-dropdown.html b/react-app/bower_components/iron-dropdown/test/iron-dropdown.html new file mode 100644 index 0000000000..5652892d33 --- /dev/null +++ b/react-app/bower_components/iron-dropdown/test/iron-dropdown.html @@ -0,0 +1,428 @@ + + + + + + iron-dropdown basic tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-dropdown/test/x-scrollable-element.html b/react-app/bower_components/iron-dropdown/test/x-scrollable-element.html new file mode 100644 index 0000000000..a3012e222d --- /dev/null +++ b/react-app/bower_components/iron-dropdown/test/x-scrollable-element.html @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/react-app/bower_components/iron-fit-behavior/.bower.json b/react-app/bower_components/iron-fit-behavior/.bower.json new file mode 100644 index 0000000000..1318aaf6e9 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/.bower.json @@ -0,0 +1,41 @@ +{ + "name": "iron-fit-behavior", + "version": "1.0.6", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Fits an element inside another element", + "private": true, + "main": "iron-fit-behavior.html", + "keywords": [ + "web-components", + "polymer", + "behavior" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-fit-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/iron-fit-behavior", + "_release": "1.0.6", + "_resolution": { + "type": "version", + "tag": "v1.0.6", + "commit": "f2e868af4fad643ffb7fea3501e1429acc4ec0f0" + }, + "_source": "git://github.com/PolymerElements/iron-fit-behavior.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-fit-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-fit-behavior/.gitignore b/react-app/bower_components/iron-fit-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-fit-behavior/.travis.yml b/react-app/bower_components/iron-fit-behavior/.travis.yml new file mode 100644 index 0000000000..899ec45bc6 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: QL2j7nfSA/40iIPMKLMosv9hj8q7eGBbPQXVQmCL3uXD5qoMPTqo1qronKKX+bi3Rh7W104ufV4CzzbWvBwQh8gipx+4REGijzc77Fro2y3v3/wUp9H/UEWnbhAWPDsqEoAD8xQXFHkVv7874/VwOlubQyXDGlvqh0fzYbUNUQo= + - secure: ajBo8YcSzi4kNuCHcmajCirWQKf5Mj4OZ3tQjNAcJJAy0UtyrAgTenayWN2ijKqD5V8wfTK66jUXGYMZkoJV4EpknrUliqRgRqKHHfULXYWRSC7lDGxf835ReFxstkPun4HmNtxraAWJgmgFz7mylntTVKm46Ce4INj3n8reWaY= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-fit-behavior/CONTRIBUTING.md b/react-app/bower_components/iron-fit-behavior/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-fit-behavior/README.md b/react-app/bower_components/iron-fit-behavior/README.md new file mode 100644 index 0000000000..ed1b72f9bd --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/README.md @@ -0,0 +1,36 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-fit-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-fit-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-fit-behavior)_ + + +##Polymer.IronFitBehavior + +Polymer.IronFitBehavior fits an element in another element using `max-height` and `max-width`, and +optionally centers it in the window or another element. + +The element will only be sized and/or positioned if it has not already been sized and/or positioned +by CSS. + +| CSS properties | Action | +| --- | --- | +| `position` set | Element is not centered horizontally or vertically | +| `top` or `bottom` set | Element is not vertically centered | +| `left` or `right` set | Element is not horizontally centered | +| `max-height` or `height` set | Element respects `max-height` or `height` | +| `max-width` or `width` set | Element respects `max-width` or `width` | + + diff --git a/react-app/bower_components/iron-fit-behavior/bower.json b/react-app/bower_components/iron-fit-behavior/bower.json new file mode 100644 index 0000000000..86c8582164 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-fit-behavior", + "version": "1.0.6", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Fits an element inside another element", + "private": true, + "main": "iron-fit-behavior.html", + "keywords": [ + "web-components", + "polymer", + "behavior" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-fit-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-fit-behavior/demo/index.html b/react-app/bower_components/iron-fit-behavior/demo/index.html new file mode 100644 index 0000000000..1a3f4d8f98 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/demo/index.html @@ -0,0 +1,43 @@ + + + + + + iron-fit-behavior demo + + + + + + + + + + + + + + + + Centered in window.

+ Resize the window and click here to refit. +
+ + + diff --git a/react-app/bower_components/iron-fit-behavior/demo/simple-fit.html b/react-app/bower_components/iron-fit-behavior/demo/simple-fit.html new file mode 100644 index 0000000000..52fe59e1b9 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/demo/simple-fit.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-fit-behavior/index.html b/react-app/bower_components/iron-fit-behavior/index.html new file mode 100644 index 0000000000..5ffa7d61ce --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-fit-behavior + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-fit-behavior/iron-fit-behavior.html b/react-app/bower_components/iron-fit-behavior/iron-fit-behavior.html new file mode 100644 index 0000000000..1705f31a20 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/iron-fit-behavior.html @@ -0,0 +1,272 @@ + + + + + diff --git a/react-app/bower_components/iron-fit-behavior/test/index.html b/react-app/bower_components/iron-fit-behavior/test/index.html new file mode 100644 index 0000000000..fd047ea3d0 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/test/index.html @@ -0,0 +1,31 @@ + + + iron-fit-behavior tests + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-fit-behavior/test/iron-fit-behavior.html b/react-app/bower_components/iron-fit-behavior/test/iron-fit-behavior.html new file mode 100644 index 0000000000..46fdf4f7ec --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/test/iron-fit-behavior.html @@ -0,0 +1,409 @@ + + + + + + iron-fit-behavior tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-fit-behavior/test/test-fit.html b/react-app/bower_components/iron-fit-behavior/test/test-fit.html new file mode 100644 index 0000000000..b8768fe4c8 --- /dev/null +++ b/react-app/bower_components/iron-fit-behavior/test/test-fit.html @@ -0,0 +1,42 @@ + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-flex-layout/.bower.json b/react-app/bower_components/iron-flex-layout/.bower.json new file mode 100644 index 0000000000..c6c5c62b6b --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/.bower.json @@ -0,0 +1,41 @@ +{ + "name": "iron-flex-layout", + "version": "1.3.1", + "description": "Provide flexbox-based layouts", + "keywords": [ + "web-components", + "polymer", + "layout" + ], + "main": "iron-flex-layout.html", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-flex-layout.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/iron-flex-layout", + "_release": "1.3.1", + "_resolution": { + "type": "version", + "tag": "v1.3.1", + "commit": "6d88f29f3a7181daa2a5c7f678de44f0a0e6a717" + }, + "_source": "git://github.com/PolymerElements/iron-flex-layout.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-flex-layout" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-flex-layout/.gitignore b/react-app/bower_components/iron-flex-layout/.gitignore new file mode 100644 index 0000000000..1eb1fa5e92 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/.gitignore @@ -0,0 +1,2 @@ +bower_components + diff --git a/react-app/bower_components/iron-flex-layout/.travis.yml b/react-app/bower_components/iron-flex-layout/.travis.yml new file mode 100644 index 0000000000..516b453f81 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: jFaXkmco40NlJT4VyFYM34Zv9D1XVfLXgixobnyHQyJDBKSXrNLcwDuvrGUpJx/pwBCxEhKAbvxeJ+PBMUv8QV08MAdw2S6QOsIe3CUxAehoNoOMJw5duhE8faWlz8qzmCWEowHVFUeVsd0ZUsgOu6RTspj2A51D/CztQuW0Ljw= + - secure: fKrO5yMx8kZM1WQ3k0bzo6MCREKGW2WkCl2suDjuEtb1SQ/SaZa9Tun0fcqIHVJqg9+jOS1Romt/+MN27Nc6IT1tv/NdLd+uWjtMA+OzLyv48gzcdu8Ls/TISUGm5Wb7XHkcvMAb1tRoBs5BOvQ/85FilZLEq1km8snG9ZsOOWI= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-flex-layout/CONTRIBUTING.md b/react-app/bower_components/iron-flex-layout/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-flex-layout/README.md b/react-app/bower_components/iron-flex-layout/README.md new file mode 100644 index 0000000000..219fca7d72 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/README.md @@ -0,0 +1,55 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-flex-layout.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-flex-layout) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-flex-layout)_ + + +##<iron-flex-layout> + +The `` component provides simple ways to use +[CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes), +also known as flexbox. This component provides two different ways to use flexbox: + +1. [Layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html). +The layout class stylesheet provides a simple set of class-based flexbox rules, that +let you specify layout properties directly in markup. You must include this file +in every element that needs to use them. + +Sample use: + + + + + +
+
cross axis start alignment
+
+ +1. [Custom CSS mixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html). +The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the `@apply` function. + + + +Please note that the old [/deep/ layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/classes) +are deprecated, and should not be used. To continue using layout properties +directly in markup, please switch to using the new `dom-module`-based +[layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html). +Please note that the new version does not use `/deep/`, and therefore requires you +to import the `dom-modules` in every element that needs to use them. + +A complete [guide](https://elements.polymer-project.org/guides/flex-layout) to `` is available. + + diff --git a/react-app/bower_components/iron-flex-layout/bower.json b/react-app/bower_components/iron-flex-layout/bower.json new file mode 100644 index 0000000000..e175297334 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-flex-layout", + "version": "1.3.1", + "description": "Provide flexbox-based layouts", + "keywords": [ + "web-components", + "polymer", + "layout" + ], + "main": "iron-flex-layout.html", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-flex-layout.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-flex-layout/classes/iron-flex-layout.html b/react-app/bower_components/iron-flex-layout/classes/iron-flex-layout.html new file mode 100644 index 0000000000..0c6aad604b --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/classes/iron-flex-layout.html @@ -0,0 +1,311 @@ + + + + + + + diff --git a/react-app/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html b/react-app/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html new file mode 100644 index 0000000000..196df284c0 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/classes/iron-shadow-flex-layout.html @@ -0,0 +1,307 @@ + + + + + diff --git a/react-app/bower_components/iron-flex-layout/demo/index.html b/react-app/bower_components/iron-flex-layout/demo/index.html new file mode 100644 index 0000000000..2c3f5f7d21 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/demo/index.html @@ -0,0 +1,396 @@ + + + + + + + iron-flex-layout demo + + + + + + + + + + + + + + +
+

Horizontal and vertical layout

+ + + + +

Flexible children

+ + + + +

Flexible children in vertical layouts

+ + + + +

Flex ratios

+ + + + +

Cross-axis stretch alignment (default)

+ + + + +

Cross-axis center alignment

+ + + + +

Cross-axis start alignment

+ + + + +

Cross-axis end alignment

+ + + + +

Justification, start justified

+ + + + +

Justification, start justified

+ + + + +

Justification, end justified

+ + + + +

Justification, equal space between elements

+ + + + +

Justification, equal space around each element

+ + + + +

Self alignment

+ + + + +

Wrapping

+ + + + +

Reversed layouts

+ + + + +

General purpose rules

+ + + +
+ + diff --git a/react-app/bower_components/iron-flex-layout/index.html b/react-app/bower_components/iron-flex-layout/index.html new file mode 100644 index 0000000000..7d3b0881f8 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/index.html @@ -0,0 +1,24 @@ + + + + + + iron-flex-layout + + + + + + + + + + diff --git a/react-app/bower_components/iron-flex-layout/iron-flex-layout-classes.html b/react-app/bower_components/iron-flex-layout/iron-flex-layout-classes.html new file mode 100644 index 0000000000..d382652b71 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/iron-flex-layout-classes.html @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-flex-layout/iron-flex-layout.html b/react-app/bower_components/iron-flex-layout/iron-flex-layout.html new file mode 100644 index 0000000000..d98e9d0fdd --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/iron-flex-layout.html @@ -0,0 +1,399 @@ + + + + + + + + + diff --git a/react-app/bower_components/iron-flex-layout/test/index.html b/react-app/bower_components/iron-flex-layout/test/index.html new file mode 100644 index 0000000000..90e12a78c9 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/test/index.html @@ -0,0 +1,31 @@ + + + + + iron-flex-behavior tests + + + + + + + + + + + diff --git a/react-app/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html b/react-app/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html new file mode 100644 index 0000000000..3173b308a7 --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/test/iron-flex-layout-classes.html @@ -0,0 +1,412 @@ + + + + + iron-flex-layout-classes tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-flex-layout/test/iron-flex-layout.html b/react-app/bower_components/iron-flex-layout/test/iron-flex-layout.html new file mode 100644 index 0000000000..f2090878ee --- /dev/null +++ b/react-app/bower_components/iron-flex-layout/test/iron-flex-layout.html @@ -0,0 +1,434 @@ + + + + + iron-flex-layout tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/.bower.json b/react-app/bower_components/iron-form-element-behavior/.bower.json new file mode 100644 index 0000000000..e09f62a160 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/.bower.json @@ -0,0 +1,41 @@ +{ + "name": "iron-form-element-behavior", + "version": "1.0.6", + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "main": "iron-form-element-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "description": "Enables a custom element to be included in an iron-form", + "keywords": [ + "web-components", + "polymer", + "form" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-form-element-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/iron-form-element-behavior", + "_release": "1.0.6", + "_resolution": { + "type": "version", + "tag": "v1.0.6", + "commit": "cf9e09ded62daf3363852ce98260aaad1ed0fae1" + }, + "_source": "git://github.com/PolymerElements/iron-form-element-behavior.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-form-element-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-form-element-behavior/.gitignore b/react-app/bower_components/iron-form-element-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-form-element-behavior/.travis.yml b/react-app/bower_components/iron-form-element-behavior/.travis.yml new file mode 100644 index 0000000000..6d4a6216ae --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: false +before_script: + - npm install web-component-tester + - npm install bower + - 'export PATH=$PWD/node_modules/.bin:$PATH' + - bower install +env: + global: + - secure: EN5HtbAeaCE1IzGk5JlSq7GWcANh/zYgbpZn1y0VocfkZfzOv8cIh8Zmr4Q6shII6K07Fyx1LQuAjsURqX9mc3AmfMHgPIbpZGpOKrjvt1Vf0bPN+uIC9vIFj3sLQj12gcfJg48EXk6HWsHscCZ3+am1xvRflhNEY3TjHPrUTgkF+KLbBEfb4mCZwVc4dln76ffvTQ/cPI9eYczNp1q9wWpYvn794qRLtAkKuQ5Z1b6hunOAx/hzCjGNbJDO3gkxO68dzzSp9YDIhKEFAUlMDalwLRr7sNgB4sNeDCg4mmie5fe6xk831HvBYFxZxmXD1uS6/Hvd8MiBDiols3lwz8uEUnPyrwDlxUkjn2sl5S+gO8CcHU2mShUCl73JfBtyWDKPSfQLR5QHEk4eqNzNn2HinAE/aezi4/TVCY7P3ujeK8sFlTsb9vlywnlJO3fqyZ+lBwZ4CbNjOTs1L2W+guT1Oq30PJ5TVxU2mvmIMtdpPveZB0iM/PM9FECsb303KeV5Zomk4dp2MxirK1O/4mPAHIz9UUpGopGOtpuODnRV4Lq7V9HaDxYOZzAHZDK4mJ1y6tSRH/yMUTEidhG2j5F6MXmhbKXj3I0oR95xx1RH+b8myErvUBlto4jR21Pd+mOVlkU78CBSN9XGhtBQjklF5+aC8YeH1DEv6mTn2o8= + - secure: q3AjjaoaTZcdAdjIvzSf8Q1SdEg1mY6lBkeoDTMKJcftJ8zz1qIfjGzEuycSVVnOJhZ6WmvMMBxdThQCymF1wzT++SV+u34DYSFoZ5EhjM0TFhP63PRuhbE3DquPaISpM5aCH7epV4nMFD7PFE1BP4u/qiETAgPeAoY9LMT/JPclOfcQ3euwks3TSM6O8g7Ro1h1ElywCQ1souzkcjvJ3FxsqysJb7Mg/n9bmtwnkol/mrBaP6JzQMURUyswx7ZPj3qiFoA9ZLiNirzf+O781A4msKursjYrKr6TZtB6xcMlEg89YhFBXrLE9IEEM/fNp+vPNhaIA5VjYRy8iIK402RXpbh7/AlPD7yMFITeMSfT+Bqldur+pi0oN1N9SeWrmk6P+bdfdkdyGl1CVKP4S35z8cyFRgmvxO4/UG65cb66AdMeNVBEQsi2flCWgPyaTmOQ53YryCs7cFRu3zSMnU3F/gWqlmletgxGhFOBHTtEmr2A9QBLgg+EvB/83wj2dEEfMlIpoeq83/2PaE8hKAWyqPga7t532vU5AIFNOUk9vGzRCxsqGKF2j0/zFBdgHSLYCsWVrbjxmxdu6Fzi8ZATeqjDoc0eaIPhBkekOvDrUtUSHA9sSSG8j69GGUL4+WkoCMB74dz+GXz85fMJlMZWBXPtazDlNXYfU60T/1E= +node_js: 4 +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-form-element-behavior/CONTRIBUTING.md b/react-app/bower_components/iron-form-element-behavior/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-form-element-behavior/README.md b/react-app/bower_components/iron-form-element-behavior/README.md new file mode 100644 index 0000000000..b68d08fb06 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/README.md @@ -0,0 +1,23 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-form-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-form-element-behavior) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-form-element-behavior)_ + + +##Polymer.IronFormElementBehavior + + + Polymer.IronFormElementBehavior enables a custom element to be included + in an `iron-form`. + + diff --git a/react-app/bower_components/iron-form-element-behavior/bower.json b/react-app/bower_components/iron-form-element-behavior/bower.json new file mode 100644 index 0000000000..865f9b549c --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-form-element-behavior", + "version": "1.0.6", + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "main": "iron-form-element-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "description": "Enables a custom element to be included in an iron-form", + "keywords": [ + "web-components", + "polymer", + "form" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-form-element-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-form-element-behavior/demo/index.html b/react-app/bower_components/iron-form-element-behavior/demo/index.html new file mode 100644 index 0000000000..e919d0bcca --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/demo/index.html @@ -0,0 +1,67 @@ + + + + + + iron-form-element-behavior demo + + + + + + + + + + + + + + +
+
+
+ Element with iron-form-element-behavior +
+ Element without iron-form-element-behavior +
+ Element with iron-form-element-behavior +
+ +

Elements tracked by the form:

+ +
    +
+
+
+ + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/demo/simple-element.html b/react-app/bower_components/iron-form-element-behavior/demo/simple-element.html new file mode 100644 index 0000000000..450276923b --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/demo/simple-element.html @@ -0,0 +1,27 @@ + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/demo/simple-form.html b/react-app/bower_components/iron-form-element-behavior/demo/simple-form.html new file mode 100644 index 0000000000..4dc5dc6bb8 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/demo/simple-form.html @@ -0,0 +1,53 @@ + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/index.html b/react-app/bower_components/iron-form-element-behavior/index.html new file mode 100644 index 0000000000..8d748c0509 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-form-element-behavior + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/iron-form-element-behavior.html b/react-app/bower_components/iron-form-element-behavior/iron-form-element-behavior.html new file mode 100644 index 0000000000..cd9c6b4ab6 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/iron-form-element-behavior.html @@ -0,0 +1,86 @@ + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/test/basic.html b/react-app/bower_components/iron-form-element-behavior/test/basic.html new file mode 100644 index 0000000000..5947a1e460 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/test/basic.html @@ -0,0 +1,71 @@ + + + + + iron-form-element-behavior + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/test/index.html b/react-app/bower_components/iron-form-element-behavior/test/index.html new file mode 100644 index 0000000000..3b2badac6b --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/test/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/test/simple-element.html b/react-app/bower_components/iron-form-element-behavior/test/simple-element.html new file mode 100644 index 0000000000..b1aa300213 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/test/simple-element.html @@ -0,0 +1,23 @@ + + + + + diff --git a/react-app/bower_components/iron-form-element-behavior/test/simple-form.html b/react-app/bower_components/iron-form-element-behavior/test/simple-form.html new file mode 100644 index 0000000000..7fa38d8801 --- /dev/null +++ b/react-app/bower_components/iron-form-element-behavior/test/simple-form.html @@ -0,0 +1,19 @@ + + + + diff --git a/react-app/bower_components/iron-icon/.bower.json b/react-app/bower_components/iron-icon/.bower.json new file mode 100644 index 0000000000..f0167baf13 --- /dev/null +++ b/react-app/bower_components/iron-icon/.bower.json @@ -0,0 +1,45 @@ +{ + "name": "iron-icon", + "private": true, + "version": "1.0.8", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "An element that supports displaying an icon", + "main": "iron-icon.html", + "author": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-icon.git" + }, + "ignore": [], + "dependencies": { + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", + "iron-iconset": "polymerelements/iron-iconset#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "homepage": "https://github.com/polymerelements/iron-icon", + "_release": "1.0.8", + "_resolution": { + "type": "version", + "tag": "v1.0.8", + "commit": "f36b38928849ef3853db727faa8c9ef104d611eb" + }, + "_source": "git://github.com/polymerelements/iron-icon.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/iron-icon" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-icon/.gitignore b/react-app/bower_components/iron-icon/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-icon/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-icon/.travis.yml b/react-app/bower_components/iron-icon/.travis.yml new file mode 100644 index 0000000000..982392253e --- /dev/null +++ b/react-app/bower_components/iron-icon/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: Cyo7MV8FASyf2EZyrSmDbmoZmopQhuTbV79Ntl6eDq6JxEOAApULHn6W+ht0tvmaA+L2cRNq3Z4uvy3tbZCI5SCgQuEKLDJFoghzNp4Izc54bBlJzsxMjcgxEEMbw1jDIKp+PJ+1+8oyT5H1NogcGoNWcvMCjn+8Vl64/999mhw= + - secure: dI3wfjJoooFlq6Kb8V1fkbc9N5jrvw7dExN4tp4KlvJFiXIvgb823jEyLGnK/oeVLwP9yncvOYxiG/enNbjpk6fId3zjwptN2H1am3pIsPQASOZJ0Pwvwa1dX7EYGk2kxOwY1pyX4is/QRVDrlUkLm3YAPOFfYJEiVB7m6TNFIo= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-icon/CONTRIBUTING.md b/react-app/bower_components/iron-icon/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-icon/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-icon/README.md b/react-app/bower_components/iron-icon/README.md new file mode 100644 index 0000000000..a08298f649 --- /dev/null +++ b/react-app/bower_components/iron-icon/README.md @@ -0,0 +1,92 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-icon.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icon) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-icon)_ + + +##<iron-icon> + +The `iron-icon` element displays an icon. By default an icon renders as a 24px square. + +Example using src: + +```html + +``` + +Example setting size to 32px x 32px: + +```html + + + +``` + +The iron elements include several sets of icons. +To use the default set of icons, import `iron-icons.html` and use the `icon` attribute to specify an icon: + +```html + + + +``` + +To use a different built-in set of icons, import the specific `iron-icons/-icons.html`, and +specify the icon as `:`. For example, to use a communication icon, you would +use: + +```html + + + +``` + +You can also create custom icon sets of bitmap or SVG icons. + +Example of using an icon named `cherry` from a custom iconset with the ID `fruit`: + +```html + +``` + +See [iron-iconset](iron-iconset) and [iron-iconset-svg](iron-iconset-svg) for more information about +how to create a custom iconset. + +See the [iron-icons demo](iron-icons?view=demo:demo/index.html) to see the icons available +in the various iconsets. + +To load a subset of icons from one of the default `iron-icons` sets, you can +use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you +to select individual icons, and creates an iconset from them that you can +use directly in your elements. + +### Styling + +The following custom properties are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--iron-icon-width` | Width of the icon | `24px` | +| `--iron-icon-height` | Height of the icon | `24px` | +| `--iron-icon-fill-color` | Fill color of the svg icon | `currentcolor` | +| `--iron-icon-stroke-color` | Stroke color of the svg icon | none | + + diff --git a/react-app/bower_components/iron-icon/bower.json b/react-app/bower_components/iron-icon/bower.json new file mode 100644 index 0000000000..38e4ba45d0 --- /dev/null +++ b/react-app/bower_components/iron-icon/bower.json @@ -0,0 +1,35 @@ +{ + "name": "iron-icon", + "private": true, + "version": "1.0.8", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "An element that supports displaying an icon", + "main": "iron-icon.html", + "author": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-icon.git" + }, + "ignore": [], + "dependencies": { + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", + "iron-iconset": "polymerelements/iron-iconset#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/react-app/bower_components/iron-icon/demo/async.html b/react-app/bower_components/iron-icon/demo/async.html new file mode 100644 index 0000000000..eaf40d1ba2 --- /dev/null +++ b/react-app/bower_components/iron-icon/demo/async.html @@ -0,0 +1,62 @@ + + + + + iron-icon demo + + + + + + + +
+

+ This demo is for an <iron-icon> with an asynchronously loaded + iconset. +

+ +
Waiting to load iconset...
+ +
+ + + +

<iron-icon icon="example:location">

+ + +
+
+ + + diff --git a/react-app/bower_components/iron-icon/demo/index.html b/react-app/bower_components/iron-icon/demo/index.html new file mode 100644 index 0000000000..999ed35b48 --- /dev/null +++ b/react-app/bower_components/iron-icon/demo/index.html @@ -0,0 +1,48 @@ + + + + + iron-icon demo + + + + + + + + +
+

This demo is for a single <iron-icon>. If you're looking for the + whole set of available icons, check out the <iron-icons> demo.

+ +
+ + + +

<iron-icon icon="example:location">

+ + + +

<iron-icon src="location.png">

+ +
+
+ + diff --git a/react-app/bower_components/iron-icon/demo/location.png b/react-app/bower_components/iron-icon/demo/location.png new file mode 100644 index 0000000000..9bb74236b8 Binary files /dev/null and b/react-app/bower_components/iron-icon/demo/location.png differ diff --git a/react-app/bower_components/iron-icon/hero.svg b/react-app/bower_components/iron-icon/hero.svg new file mode 100755 index 0000000000..19f01c2fdb --- /dev/null +++ b/react-app/bower_components/iron-icon/hero.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icon/index.html b/react-app/bower_components/iron-icon/index.html new file mode 100644 index 0000000000..487bb5c38a --- /dev/null +++ b/react-app/bower_components/iron-icon/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icon/iron-icon.html b/react-app/bower_components/iron-icon/iron-icon.html new file mode 100644 index 0000000000..3428062b9d --- /dev/null +++ b/react-app/bower_components/iron-icon/iron-icon.html @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icon/test/index.html b/react-app/bower_components/iron-icon/test/index.html new file mode 100644 index 0000000000..4414532e87 --- /dev/null +++ b/react-app/bower_components/iron-icon/test/index.html @@ -0,0 +1,27 @@ + + + + Tests + + + + + + + + + + diff --git a/react-app/bower_components/iron-icon/test/iron-icon.html b/react-app/bower_components/iron-icon/test/iron-icon.html new file mode 100644 index 0000000000..3a51dd3911 --- /dev/null +++ b/react-app/bower_components/iron-icon/test/iron-icon.html @@ -0,0 +1,220 @@ + + + + + + + iron-icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/.bower.json b/react-app/bower_components/iron-icons/.bower.json new file mode 100644 index 0000000000..46f5f8d340 --- /dev/null +++ b/react-app/bower_components/iron-icons/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "iron-icons", + "version": "1.1.3", + "description": "A set of icons for use with iron-icon", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "main": "iron-icons.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-icons" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-icons", + "dependencies": { + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "polymerelements/iron-component-page#1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + }, + "ignore": [ + "util", + "update-icons.sh" + ], + "_release": "1.1.3", + "_resolution": { + "type": "version", + "tag": "v1.1.3", + "commit": "c13869b57a9464dfc3a1f26e89858f8be37e7441" + }, + "_source": "git://github.com/PolymerElements/iron-icons.git", + "_target": "~1.1.3", + "_originalSource": "iron-icons", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/iron-icons/.gitignore b/react-app/bower_components/iron-icons/.gitignore new file mode 100644 index 0000000000..bb1944ea16 --- /dev/null +++ b/react-app/bower_components/iron-icons/.gitignore @@ -0,0 +1,3 @@ +util/node_modules +material-design-icons +bower_components diff --git a/react-app/bower_components/iron-icons/.travis.yml b/react-app/bower_components/iron-icons/.travis.yml new file mode 100644 index 0000000000..57e6cef9c9 --- /dev/null +++ b/react-app/bower_components/iron-icons/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: itlu3qIX/3ggZQIuzTJc62A5MD2Rdms+zB1EvNEWFiQZQgNGu2+hhp72PcVB/urybOTFmMeq4W12RGr53KMvwj6mwNlXPhQxeP1oyR+icZZVbuLDfj5pF8OvNf4OXEkGv0yH+OTuNTB8CU4msJzgB2W8iuC+pFH/dIas6fQDTfE= + - secure: LBT0VumsEPWUYm0OLhqHU1XWmVY18QP64cMeqZAwASnYYyH/R5OGYAcI7aH8To29FWpkZSL85NPto37bN+f8DWRSULq4p+1wl2HviYHsam8x1NzN7hKq6nv+203qaT9SflheaNy6sSDfZJQ+36bRcGQ5khKkVeDpw7h8D/osSQ4= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-icons/CONTRIBUTING.md b/react-app/bower_components/iron-icons/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/iron-icons/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-icons/README.md b/react-app/bower_components/iron-icons/README.md new file mode 100644 index 0000000000..bd11ba7082 --- /dev/null +++ b/react-app/bower_components/iron-icons/README.md @@ -0,0 +1,44 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-icons.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icons) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-icons)_ + + +##<iron-icons> + +`iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set. + +The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project. + +Example loading icon set: + +```html + +``` + +To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id. + +Example using the directions-bus icon from the maps icon set: + +```html + +``` + +See [iron-icon](#iron-icon) for more information about working with icons. + +See [iron-iconset](#iron-iconset) and [iron-iconset-svg](#iron-iconset-svg) for more information about how to create a custom iconset. + + diff --git a/react-app/bower_components/iron-icons/av-icons.html b/react-app/bower_components/iron-icons/av-icons.html new file mode 100644 index 0000000000..e4a0d245bd --- /dev/null +++ b/react-app/bower_components/iron-icons/av-icons.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/bower.json b/react-app/bower_components/iron-icons/bower.json new file mode 100644 index 0000000000..c5066e9fbc --- /dev/null +++ b/react-app/bower_components/iron-icons/bower.json @@ -0,0 +1,38 @@ +{ + "name": "iron-icons", + "version": "1.1.3", + "description": "A set of icons for use with iron-icon", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "main": "iron-icons.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-icons" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-icons", + "dependencies": { + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "polymerelements/iron-component-page#1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "^4.0.0" + }, + "ignore": [ + "util", + "update-icons.sh" + ] +} diff --git a/react-app/bower_components/iron-icons/communication-icons.html b/react-app/bower_components/iron-icons/communication-icons.html new file mode 100644 index 0000000000..b522e6db68 --- /dev/null +++ b/react-app/bower_components/iron-icons/communication-icons.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/demo/index.html b/react-app/bower_components/iron-icons/demo/index.html new file mode 100644 index 0000000000..acfbf36cc7 --- /dev/null +++ b/react-app/bower_components/iron-icons/demo/index.html @@ -0,0 +1,132 @@ + + + + + + + iron-icons demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/device-icons.html b/react-app/bower_components/iron-icons/device-icons.html new file mode 100644 index 0000000000..03809ee517 --- /dev/null +++ b/react-app/bower_components/iron-icons/device-icons.html @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/editor-icons.html b/react-app/bower_components/iron-icons/editor-icons.html new file mode 100644 index 0000000000..cb6ea04ae1 --- /dev/null +++ b/react-app/bower_components/iron-icons/editor-icons.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/hardware-icons.html b/react-app/bower_components/iron-icons/hardware-icons.html new file mode 100644 index 0000000000..ddaddbdae6 --- /dev/null +++ b/react-app/bower_components/iron-icons/hardware-icons.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/hero.svg b/react-app/bower_components/iron-icons/hero.svg new file mode 100755 index 0000000000..52949be5d2 --- /dev/null +++ b/react-app/bower_components/iron-icons/hero.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/image-icons.html b/react-app/bower_components/iron-icons/image-icons.html new file mode 100644 index 0000000000..96dee0697d --- /dev/null +++ b/react-app/bower_components/iron-icons/image-icons.html @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/index.html b/react-app/bower_components/iron-icons/index.html new file mode 100644 index 0000000000..cea02f96d9 --- /dev/null +++ b/react-app/bower_components/iron-icons/index.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/iron-icons.html b/react-app/bower_components/iron-icons/iron-icons.html new file mode 100644 index 0000000000..c219575b3b --- /dev/null +++ b/react-app/bower_components/iron-icons/iron-icons.html @@ -0,0 +1,338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/maps-icons.html b/react-app/bower_components/iron-icons/maps-icons.html new file mode 100644 index 0000000000..059ae91d4b --- /dev/null +++ b/react-app/bower_components/iron-icons/maps-icons.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/notification-icons.html b/react-app/bower_components/iron-icons/notification-icons.html new file mode 100644 index 0000000000..ac6744a203 --- /dev/null +++ b/react-app/bower_components/iron-icons/notification-icons.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/places-icons.html b/react-app/bower_components/iron-icons/places-icons.html new file mode 100644 index 0000000000..5084b8c54d --- /dev/null +++ b/react-app/bower_components/iron-icons/places-icons.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-icons/social-icons.html b/react-app/bower_components/iron-icons/social-icons.html new file mode 100644 index 0000000000..8848395ef9 --- /dev/null +++ b/react-app/bower_components/iron-icons/social-icons.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-iconset-svg/.bower.json b/react-app/bower_components/iron-iconset-svg/.bower.json new file mode 100644 index 0000000000..b142eb2262 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "iron-iconset-svg", + "description": "Manages a set of svg icons", + "version": "1.0.9", + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-iconset-svg.git" + }, + "dependencies": { + "polymer": "polymer/polymer#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "*" + }, + "main": "iron-iconset-svg.html", + "homepage": "https://github.com/polymerelements/iron-iconset-svg", + "_release": "1.0.9", + "_resolution": { + "type": "version", + "tag": "v1.0.9", + "commit": "ce9b2ea1f73d936cffdd05f3fe34b1f69d1d32db" + }, + "_source": "git://github.com/polymerelements/iron-iconset-svg.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/iron-iconset-svg" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-iconset-svg/.gitignore b/react-app/bower_components/iron-iconset-svg/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-iconset-svg/.travis.yml b/react-app/bower_components/iron-iconset-svg/.travis.yml new file mode 100644 index 0000000000..d4e78c40f2 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/.travis.yml @@ -0,0 +1,28 @@ +language: node_js +sudo: false +matrix: + include: + - node_js: stable + script: xvfb-run wct + addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + - node_js: node + script: + - | + if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then + wct -s 'default' + fi +before_script: +- npm install web-component-tester +- npm install bower +- export PATH=$PWD/node_modules/.bin:$PATH +- bower install +env: + global: + - secure: UR1rxThVZH+l6fFHhAlgNIWs9wHmC5A102oAQBtCuQqKiXPZCDAPQHdjufX8z6hH93JkR+Esh2VPv0baSXFrHteKTRN6bsNDTMFDdHJ5BiRAdhVoV6bsdNH2GTgRXQ+ACMgrh4sXLA5+2Z+JGq7m0zaHehDfNZqmo/1U59qImP8= + - secure: PmWDypBdjKlUGPn9UoBEkjoYiyJFQGe2QiACmdOgueOLSLeA6xW+/1521uFIBHpwuWn29mxVYv5gS1D8hafWhZdXn4OYQl550RrT092jXIO6+mMKZXPmUaKCkPMY6QYJJ5j9ZOC36KgF//IpoE7OCxpLReYOD2KBR3mhw0jOYJA= diff --git a/react-app/bower_components/iron-iconset-svg/CONTRIBUTING.md b/react-app/bower_components/iron-iconset-svg/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-iconset-svg/README.md b/react-app/bower_components/iron-iconset-svg/README.md new file mode 100644 index 0000000000..f5b7e563e3 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/README.md @@ -0,0 +1,50 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-iconset-svg.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-iconset-svg) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-iconset-svg)_ + + +##<iron-iconset-svg> + + +The `iron-iconset-svg` element allows users to define their own icon sets +that contain svg icons. The svg icon elements should be children of the +`iron-iconset-svg` element. Multiple icons should be given distinct id's. + +Using svg elements to create icons has a few advantages over traditional +bitmap graphics like jpg or png. Icons that use svg are vector based so +they are resolution independent and should look good on any device. They +are stylable via css. Icons can be themed, colorized, and even animated. + +Example: + + + + + + + + + + + + +This will automatically register the icon set "my-svg-icons" to the iconset +database. To use these icons from within another element, make a +`iron-iconset` element and call the `byId` method +to retrieve a given iconset. To apply a particular icon inside an +element use the `applyIcon` method. For example: + + iconset.applyIcon(iconNode, 'car'); + + diff --git a/react-app/bower_components/iron-iconset-svg/bower.json b/react-app/bower_components/iron-iconset-svg/bower.json new file mode 100644 index 0000000000..8467a3b7e5 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/bower.json @@ -0,0 +1,33 @@ +{ + "name": "iron-iconset-svg", + "description": "Manages a set of svg icons", + "version": "1.0.9", + "keywords": [ + "web-components", + "polymer", + "icon" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-iconset-svg.git" + }, + "dependencies": { + "polymer": "polymer/polymer#^1.0.0", + "iron-meta": "polymerelements/iron-meta#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "*" + }, + "main": "iron-iconset-svg.html" +} diff --git a/react-app/bower_components/iron-iconset-svg/demo/index.html b/react-app/bower_components/iron-iconset-svg/demo/index.html new file mode 100644 index 0000000000..53b291aa35 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/demo/index.html @@ -0,0 +1,70 @@ + + + + + + + iron-iconset-svg + + + + + + + + + +
+ + + + +
+ + + diff --git a/react-app/bower_components/iron-iconset-svg/demo/svg-sample-icons.html b/react-app/bower_components/iron-iconset-svg/demo/svg-sample-icons.html new file mode 100644 index 0000000000..3eed843f09 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/demo/svg-sample-icons.html @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-iconset-svg/index.html b/react-app/bower_components/iron-iconset-svg/index.html new file mode 100644 index 0000000000..e871f17d98 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-iconset-svg/iron-iconset-svg.html b/react-app/bower_components/iron-iconset-svg/iron-iconset-svg.html new file mode 100644 index 0000000000..5bd143ad6b --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/iron-iconset-svg.html @@ -0,0 +1,194 @@ + + + + + + diff --git a/react-app/bower_components/iron-iconset-svg/test/index.html b/react-app/bower_components/iron-iconset-svg/test/index.html new file mode 100644 index 0000000000..db4a3f6203 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/test/index.html @@ -0,0 +1,30 @@ + + + + + + + + Tests + + + + + + + + + diff --git a/react-app/bower_components/iron-iconset-svg/test/iron-iconset-svg.html b/react-app/bower_components/iron-iconset-svg/test/iron-iconset-svg.html new file mode 100644 index 0000000000..aa7bae9ff9 --- /dev/null +++ b/react-app/bower_components/iron-iconset-svg/test/iron-iconset-svg.html @@ -0,0 +1,145 @@ + + + + + + + iron-iconset-svg + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/.bower.json b/react-app/bower_components/iron-list/.bower.json new file mode 100644 index 0000000000..74faa249d9 --- /dev/null +++ b/react-app/bower_components/iron-list/.bower.json @@ -0,0 +1,58 @@ +{ + "name": "iron-list", + "description": "Displays a virtual, 'infinite' scrolling list of items", + "keywords": [ + "web-components", + "polymer", + "list", + "virtual-list" + ], + "version": "1.2.8", + "homepage": "https://github.com/PolymerElements/iron-list", + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-list" + }, + "main": "iron-list.html", + "license": "http://polymer.github.io/LICENSE.txt", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0", + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0", + "iron-scroll-target-behavior": "PolymerElements/iron-scroll-target-behavior#^1.0.0" + }, + "devDependencies": { + "app-layout": "PolymerLabs/app-layout#master", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-ajax": "polymerelements/iron-ajax#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-scroll-threshold": "polymerelements/iron-scroll-threshold#^1.0.0", + "iron-image": "polymerelements/iron-image#^1.0.0", + "paper-menu": "polymerelements/paper-menu#^1.0.0", + "paper-item": "polymerelements/paper-item#^1.0.0", + "paper-icon-button": "polymerelements/paper-icon-button#^1.0.0", + "paper-button": "polymerelements/paper-button#^1.0.0", + "paper-badge": "polymerelements/paper-badge#^1.0.0", + "paper-spinner": "polymerelements/paper-spinner#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.2", + "web-component-tester": "^4.0.0" + }, + "_release": "1.2.8", + "_resolution": { + "type": "version", + "tag": "v1.2.8", + "commit": "4d974edf5c2eca5646846910efcc0bacbbff647f" + }, + "_source": "git://github.com/PolymerElements/iron-list.git", + "_target": "~1.2.8", + "_originalSource": "PolymerElements/iron-list", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/iron-list/.gitignore b/react-app/bower_components/iron-list/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-list/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-list/.travis.yml b/react-app/bower_components/iron-list/.travis.yml new file mode 100644 index 0000000000..98ae9ad276 --- /dev/null +++ b/react-app/bower_components/iron-list/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: qC9ustzA7LUlOLi34bsHNYQRkTMd8/KLNTXGGscSgWmSTb2bgyngdWOuIjA6qVvfaHrB/CygMiy17QJn0IeKD18yfGJHu17vYxDy4WW628An3C3VIgXO4F4+LzyDFuoHfK3eQYHrBKh6M8JvG6CVU/QYdOrzuwDtcOkZIEA72N8rj5bROcPygmHZsa/0cjz7Q29lseiI1qpPxcQPMADoJfD4BvnMD7kyJJTkLyq4UDySaWmC8GT6C8PIXeZI8uLQFOc47TQqFnGJg3H6luQoOC5wQ3uv4gBWbek5pY/GAXieDNvuXAdi7cvRziCuW4oG+cYg8NYZCBI7VkMcYhEA7wNzhhcb+OPt5eOgV0YPZjyVRhXktc+ikRQYi2UU9ig66UlJFMRuNcz9al6AAKa4La5Msalv8dJnLc896qebs9eWTN5uAn4QvOJ3KHtuBNppJtJVDi1GLdIWDZgad0paklGyyln0FRwBiQauiOsuvynJBk2H97f/45l95ExEpTNPzpu3rVXkSd5xF8UYzFvw0Fb1gYQa3kNKM10leHQvr+WfQ9t1xfpGpCkPC1YOVFS9HSipBLKGmeFkl3Xa+bMSF+lrEPSHMNTN02Tq1FfIJGOlHTeRhahLldWw0REZZ5xXyzdGa8HKt7gA0aktrkYbFbJNjciN68I+bGqMt3U2KZw= + - secure: vj29+8qXACt2RY0sK0Qk1Mf8XM5pgDDeJBqzoSyNxGAYL08BQAHQvXNv/2qWfSfA4b1HxleERsN2X4+b3mOAyWpKDAOcOABptpdI3qAQsZFOC1Qslz/vqHQBqIphZhiaxd1nVg02xJgrCt6Pk3sW8k7mj2cSH0q9JorWTch3fBWq4pLtzm0b/XEgyw2AbSAM0KUj18BCg9u0hJzrI+kVpenzegdrT3oNU3LYFSz2BgfMKKsuRtaJsMbnlfBhUKNUgfwp9FenvnztGWE3h+ZCK/1zUf0FsedH6s3OWF7U6dALv4AQlgwBKH8TmwVz82bvFpHaqCjy9bhrWbW/kYG+UYCeDg2C1DOAyjr4E42iIiGB/1QKTKCuGplVf2dzYxmozOcJGf7qa440WMfuHSccp5DWH++nEDnjrog1m1uw3GltQuSpJo6LkegwP5R0jHkZxx6K7ssaJWi3VEmwItenecsxvJTDUPn9sR1CQwID82XEc3qCapzXNZIM9UGty9dir79MFmF2oOMzKZhOD9cRt+DLm3s5btM5Nn52bDDw9rZ5XtNY9rFBChszCqZeA/S4v6Iogw8LS9uliLtcY6J8wA7m9bH0ZTjZ1cSXqXsgwovGOprPyggRsmJHD8IQqjBxsslq8/IsPoh7H9ZBSipwROXVjDDYTwsCyf9Nn5/mS2c= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - "xvfb-run -s '-screen 0 1024x768x24' wct" + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-list/CONTRIBUTING.md b/react-app/bower_components/iron-list/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-list/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-list/README.md b/react-app/bower_components/iron-list/README.md new file mode 100644 index 0000000000..a4386c1a30 --- /dev/null +++ b/react-app/bower_components/iron-list/README.md @@ -0,0 +1,139 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-list.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-list) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-list)_ + + +##<iron-list> + +`iron-list` displays a virtual, 'infinite' list. The template inside +the iron-list element represents the DOM to create for each list item. +The `items` property specifies an array of list item data. + +For performance reasons, not every item in the list is rendered at once; +instead a small subset of actual template elements *(enough to fill the viewport)* +are rendered and reused as the user scrolls. As such, it is important that all +state of the list template be bound to the model driving it, since the view may +be reused with a new model at any time. Particularly, any state that may change +as the result of a user interaction with the list item must be bound to the model +to avoid view state inconsistency. + +__Important:__ `iron-list` must either be explicitly sized, or delegate scrolling to an +explicitly sized parent. By "explicitly sized", we mean it either has an explicit +CSS `height` property set via a class or inline style, or else is sized by other +layout means (e.g. the `flex` or `fit` classes). + +### Template model + +List item templates should bind to template models of the following structure: + +```js +{ + index: 0, // index in the item array + selected: false, // true if the current item is selected + tabIndex: -1, // a dynamically generated tabIndex for focus management + item: {} // user data corresponding to items[index] +} +``` + +Alternatively, you can change the property name used as data index by changing the +`indexAs` property. The `as` property defines the name of the variable to add to the binding +scope for the array. + +For example, given the following `data` array: + +##### data.json + +```js +[ + {"name": "Bob"}, + {"name": "Tim"}, + {"name": "Mike"} +] +``` + +The following code would render the list (note the name and checked properties are +bound from the model object provided to the template scope): + +```html + +``` + +### Accessibility + +`iron-list` automatically manages the focus state for the items. It also provides +a `tabIndex` property within the template scope that can be used for keyboard navigation. +For example, users can press the up and down keys to move to previous and next +items in the list: + +```html + + + +``` + +### Styling + +You can use the `--iron-list-items-container` mixin to style the container of items: + +```css +iron-list { + --iron-list-items-container: { + margin: auto; + }; +} +``` + +### Resizing + +`iron-list` lays out the items when it receives a notification via the `iron-resize` event. +This event is fired by any element that implements `IronResizableBehavior`. + +By default, elements such as `iron-pages`, `paper-tabs` or `paper-dialog` will trigger +this event automatically. If you hide the list manually (e.g. you use `display: none`) +you might want to implement `IronResizableBehavior` or fire this event manually right +after the list became visible again. For example: + +```js +document.querySelector('iron-list').fire('iron-resize'); +``` + +### When should `` be used? + +`iron-list` should be used when a page has significantly more DOM nodes than the ones +visible on the screen. e.g. the page has 500 nodes, but only 20 are visible at the time. +This is why we refer to it as a `virtual` list. In this case, a `dom-repeat` will still +create 500 nodes which could slow down the web app, but `iron-list` will only create 20. + +However, having an `iron-list` does not mean that you can load all the data at once. +Say, you have a million records in the database, you want to split the data into pages +so you can bring a page at the time. The page could contain 500 items, and iron-list +will only render 20. + + diff --git a/react-app/bower_components/iron-list/bower.json b/react-app/bower_components/iron-list/bower.json new file mode 100644 index 0000000000..21b92c73d1 --- /dev/null +++ b/react-app/bower_components/iron-list/bower.json @@ -0,0 +1,48 @@ +{ + "name": "iron-list", + "description": "Displays a virtual, 'infinite' scrolling list of items", + "keywords": [ + "web-components", + "polymer", + "list", + "virtual-list" + ], + "version": "1.2.8", + "homepage": "https://github.com/PolymerElements/iron-list", + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-list" + }, + "main": "iron-list.html", + "license": "http://polymer.github.io/LICENSE.txt", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0", + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0", + "iron-scroll-target-behavior": "PolymerElements/iron-scroll-target-behavior#^1.0.0" + }, + "devDependencies": { + "app-layout": "PolymerLabs/app-layout#master", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-ajax": "polymerelements/iron-ajax#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-scroll-threshold": "polymerelements/iron-scroll-threshold#^1.0.0", + "iron-image": "polymerelements/iron-image#^1.0.0", + "paper-menu": "polymerelements/paper-menu#^1.0.0", + "paper-item": "polymerelements/paper-item#^1.0.0", + "paper-icon-button": "polymerelements/paper-icon-button#^1.0.0", + "paper-button": "polymerelements/paper-button#^1.0.0", + "paper-badge": "polymerelements/paper-badge#^1.0.0", + "paper-spinner": "polymerelements/paper-spinner#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.2", + "web-component-tester": "^4.0.0" + } +} diff --git a/react-app/bower_components/iron-list/demo/basic.html b/react-app/bower_components/iron-list/demo/basic.html new file mode 100644 index 0000000000..c5b45dd70d --- /dev/null +++ b/react-app/bower_components/iron-list/demo/basic.html @@ -0,0 +1,60 @@ + + + + + + + iron-list demo + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/demo/collapse.html b/react-app/bower_components/iron-list/demo/collapse.html new file mode 100644 index 0000000000..3ac65cd104 --- /dev/null +++ b/react-app/bower_components/iron-list/demo/collapse.html @@ -0,0 +1,209 @@ + + + + + + + Collapsable items using iron-list + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/demo/data/contacts.json b/react-app/bower_components/iron-list/demo/data/contacts.json new file mode 100644 index 0000000000..2cde665a7f --- /dev/null +++ b/react-app/bower_components/iron-list/demo/data/contacts.json @@ -0,0 +1,11002 @@ +[ + { + "index": 0, + "name": "Liz Grimes", + "first": "Isabel", + "last": "Conrad", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/enda/73.jpg", + "expanded": false, + "guid": "8ea90ed8-83e1-4a28-a371-e5c0e1d0e021", + "integer": 28, + "date": "Sun Aug 14 1994 03:27:03 GMT-0700 (PDT)", + "shortText": "est ad reprehenderit occaecat consequat", + "mediumText": "Non duis commodo dolore et esse non adipisicing nisi tempor. Nisi culpa adipisicing quis dolore amet anim nulla aliqua excepteur labore. Adipisicing fugiat anim commodo velit in nisi ex exercitation.", + "longText": "Id aliqua ullamco ullamco commodo ipsum Lorem. Amet ut eu voluptate cillum occaecat Lorem et cillum excepteur ullamco mollit enim. Ea nostrud dolore culpa nulla nostrud ex voluptate anim laborum esse commodo sunt. Velit laboris pariatur labore dolore occaecat enim fugiat qui. Sit in eu ex aute minim deserunt qui consectetur laboris nostrud ad quis qui id.\r\n", + "address": "3 Vista Place", + "city": "Longbranch", + "state": "North Carolina", + "zip": 64470, + "country": "Lesotho", + "email": "isabelconrad@scentric.com", + "phone": "(817) 426-2901", + "color": "rgb(76,120,108)" + }, + { + "index": 1, + "name": "Frazier Lara", + "first": "Jocelyn", + "last": "Wooten", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guillogo/73.jpg", + "expanded": false, + "guid": "7017f9b1-690e-4c9d-8eee-f63285ca5148", + "integer": 10, + "date": "Tue May 24 1988 14:10:20 GMT-0700 (PDT)", + "shortText": "consectetur culpa adipisicing voluptate enim", + "mediumText": "Occaecat in do proident et deserunt quis commodo veniam occaecat mollit. Nulla enim elit nulla excepteur.", + "longText": "Laboris nisi cupidatat occaecat officia ea sunt ex deserunt mollit. Est laboris in amet eu reprehenderit nisi minim. Id nulla fugiat ad nostrud nostrud tempor adipisicing. Minim duis esse irure nostrud cillum cupidatat. Cupidatat proident labore id duis deserunt cupidatat do incididunt sint minim consectetur. Ea Lorem reprehenderit fugiat culpa dolore consequat exercitation labore sit sunt culpa laborum dolore.\r\nAd nisi incididunt ea ex ullamco magna tempor. Ipsum fugiat commodo reprehenderit deserunt in adipisicing. Reprehenderit aliqua mollit ut enim. Veniam ipsum occaecat nisi ut pariatur dolor magna ea tempor eiusmod adipisicing aliqua adipisicing. Fugiat irure laborum incididunt nostrud cupidatat consectetur.\r\nEx esse cupidatat exercitation aute eu est excepteur tempor consectetur elit elit amet. Ullamco sunt aliqua veniam eu eiusmod esse sit. Incididunt aute non ex irure in deserunt. Nulla sit nulla sunt quis Lorem tempor officia exercitation nulla esse ipsum. Non qui sint ullamco minim ut consequat consectetur Lorem consequat.\r\nEiusmod irure aliqua magna non ea enim incididunt. Irure ea sunt deserunt laboris qui. Officia nostrud aute commodo sit sunt nisi irure officia cillum tempor id do tempor et. Est cupidatat esse consequat laboris culpa minim exercitation laboris eu. Ea incididunt nulla fugiat est pariatur do velit consectetur. Veniam dolor mollit veniam dolore ea consequat qui dolore deserunt adipisicing officia officia eu est. Velit dolor nostrud veniam reprehenderit consectetur quis ad consequat aliquip dolore labore.\r\nIn nisi non sunt elit aute nisi elit in adipisicing excepteur ex. Anim nulla ex tempor qui nulla dolor aute fugiat et sit ipsum sunt eiusmod sunt. Irure est dolore proident qui est adipisicing minim. Sint consequat adipisicing aute amet adipisicing adipisicing. Do labore ea enim occaecat cupidatat et. Elit deserunt anim commodo ullamco. Consequat elit excepteur nisi mollit ea.\r\n", + "address": "2 Catherine Street", + "city": "Healy", + "state": "Connecticut", + "zip": 41121, + "country": "Mongolia", + "email": "jocelynwooten@scentric.com", + "phone": "(901) 441-2582", + "color": "rgb(134,91,60)" + }, + { + "index": 2, + "name": "Dora Griffith", + "first": "Valentine", + "last": "Meyer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iboldurev/73.jpg", + "expanded": false, + "guid": "8c3bd9ad-e8d6-4ea4-85e6-d145295f3f91", + "integer": 99, + "date": "Sat Feb 17 1973 03:45:57 GMT-0800 (PST)", + "shortText": "veniam qui", + "mediumText": "Nulla ex consectetur dolore dolore cillum. Proident dolor cupidatat consequat irure enim nostrud aliqua fugiat tempor commodo et eiusmod irure. Lorem deserunt eiusmod laborum velit tempor do nostrud reprehenderit exercitation amet occaecat eiusmod aliqua sint. Dolore commodo ex ea id veniam ullamco et cupidatat dolore. Sit nostrud minim irure sint eiusmod ea est est ipsum eiusmod.", + "longText": "Ullamco eiusmod velit labore sunt deserunt excepteur commodo sunt anim incididunt ullamco adipisicing labore Lorem. Est id nostrud ad eiusmod ad ex aliqua quis irure dolore nostrud. Aute nostrud magna tempor ex pariatur cupidatat occaecat cillum ipsum reprehenderit cillum aute proident ex. Lorem ea ipsum quis adipisicing sit exercitation ipsum. Consectetur amet nulla id amet exercitation labore minim eu nisi ullamco id do. Cillum laborum sint elit laborum eiusmod irure nulla irure.\r\nId officia mollit commodo do laborum ut officia officia. Irure reprehenderit aliqua mollit pariatur. Exercitation laborum reprehenderit fugiat nisi pariatur anim mollit magna aliquip eu labore culpa reprehenderit. Irure ad quis magna laboris nisi commodo.\r\nPariatur ea exercitation labore laborum amet et mollit. Magna tempor laboris officia commodo exercitation consectetur ullamco esse. Non cillum laborum et et nisi. Culpa laboris ad amet est minim qui ea. Consequat nulla voluptate incididunt enim qui proident consectetur et adipisicing mollit. Esse elit incididunt excepteur deserunt reprehenderit quis irure eu Lorem tempor. Qui ea pariatur laborum culpa nulla eu consectetur exercitation.\r\nDo nisi occaecat eiusmod ad cupidatat nostrud deserunt ea ex ullamco do exercitation. Sit aliqua magna Lorem tempor commodo duis duis eu ex. Do labore voluptate proident elit ad id. Lorem laboris nostrud esse occaecat. Deserunt elit nisi et labore fugiat consectetur excepteur esse culpa. Amet ipsum sunt minim sint laboris incididunt. Esse excepteur excepteur mollit ea ipsum exercitation.\r\nIn dolore nulla eiusmod exercitation culpa in voluptate voluptate ipsum dolore proident. Minim enim veniam occaecat deserunt eiusmod consectetur consectetur elit id magna laboris reprehenderit nisi. Magna enim cupidatat non laborum minim anim consequat. Exercitation cupidatat tempor irure consequat.\r\n", + "address": "4 Whitty Lane", + "city": "Nicholson", + "state": "South Carolina", + "zip": 41343, + "country": "Germany", + "email": "valentinemeyer@scentric.com", + "phone": "(956) 428-2996", + "color": "rgb(201,142,97)" + }, + { + "index": 3, + "name": "Shelley Molina", + "first": "Silva", + "last": "Alexander", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/smalonso/73.jpg", + "expanded": false, + "guid": "37224065-ac71-4716-be9a-108ecddfee47", + "integer": 16, + "date": "Wed Aug 02 1995 07:03:12 GMT-0700 (PDT)", + "shortText": "laboris do velit ipsum non", + "mediumText": "Eiusmod ut magna sint ut dolor magna anim ipsum non velit. Occaecat reprehenderit ex aliquip consequat. Eu dolor non in pariatur dolore minim.", + "longText": "Cillum ullamco ullamco sunt sunt incididunt ea commodo enim nulla irure irure. Magna sunt incididunt do duis ad. Magna pariatur dolore commodo duis reprehenderit commodo aliqua anim sit deserunt veniam aute officia. Consequat non deserunt deserunt cupidatat ad do culpa. Labore aliqua aliqua ex sint ut.\r\nEnim ullamco elit eu mollit id ullamco. Tempor velit amet anim sint est ea consequat commodo ea. Aliquip magna veniam pariatur sint ullamco est aliquip do reprehenderit qui. Anim nulla occaecat commodo quis velit fugiat veniam ut.\r\nEst nisi proident id incididunt occaecat aliquip in cillum reprehenderit non et. Incididunt consectetur fugiat aute excepteur eu reprehenderit ex laboris dolore dolor reprehenderit mollit. Amet laboris ipsum ullamco id pariatur commodo excepteur est sint cillum incididunt.\r\n", + "address": "2 Berkeley Place", + "city": "Manila", + "state": "Michigan", + "zip": 22009, + "country": "Thailand", + "email": "silvaalexander@scentric.com", + "phone": "(823) 415-2224", + "color": "rgb(113,105,251)" + }, + { + "index": 4, + "name": "Rita Lopez", + "first": "Hopkins", + "last": "Wong", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taherrapee/73.jpg", + "expanded": false, + "guid": "1ea0922e-179d-4057-abeb-d8fe63e55da8", + "integer": 94, + "date": "Wed Sep 21 2011 04:03:55 GMT-0700 (PDT)", + "shortText": "ad esse ullamco", + "mediumText": "Fugiat nostrud et consectetur mollit labore incididunt est duis nostrud id tempor veniam ad. Nulla voluptate est irure ipsum commodo do nostrud. Minim aliqua voluptate officia sit tempor nulla esse pariatur eu. Ipsum deserunt est magna veniam adipisicing nisi aute officia.", + "longText": "Officia do consequat ullamco est voluptate voluptate. Esse tempor irure aute ullamco. Aliqua veniam esse mollit veniam elit consectetur aliqua anim. Irure aute nostrud voluptate tempor consequat ut elit elit ipsum cupidatat. Aliqua duis duis minim tempor mollit qui. Labore id adipisicing laborum commodo. Tempor aliqua velit excepteur velit laborum Lorem id amet pariatur.\r\nEt nisi reprehenderit aliquip dolore ea ut aliquip duis laboris pariatur tempor cillum. Pariatur quis mollit aliquip ut proident sunt. Est aute laboris tempor officia. Sint anim qui officia deserunt amet Lorem occaecat aliquip. In eiusmod elit anim id elit eiusmod ex veniam sit sit adipisicing aliquip.\r\nQuis irure fugiat labore ex pariatur fugiat est irure. Deserunt commodo in nostrud sit Lorem amet non quis commodo eu. Nulla voluptate id enim commodo fugiat esse qui magna nostrud occaecat. Excepteur sunt cupidatat esse consequat sit voluptate ipsum magna excepteur deserunt sunt laboris labore minim. Labore ipsum ullamco dolore sint ut aliqua id nisi sunt id ipsum ea aute magna. Consequat qui commodo velit esse anim reprehenderit ea anim ut duis et veniam deserunt. Consequat amet dolor esse cupidatat incididunt exercitation laboris esse in labore.\r\nCulpa commodo commodo veniam elit elit. Consequat proident deserunt voluptate ea ut consectetur sit ex ex proident dolore nisi. Mollit est mollit sint eiusmod mollit voluptate adipisicing tempor cupidatat nisi duis dolor irure id.\r\nEu velit aliquip consectetur mollit. Officia ipsum incididunt cupidatat occaecat consequat adipisicing. Aute cupidatat quis quis consectetur aliqua. Consequat ut eu exercitation elit Lorem incididunt sint commodo ut consectetur eu non. Pariatur pariatur ut sunt aliquip exercitation nostrud mollit cillum nostrud ea cillum.\r\n", + "address": "4 Tompkins Avenue", + "city": "Movico", + "state": "Maine", + "zip": 89440, + "country": "Seychelles", + "email": "hopkinswong@scentric.com", + "phone": "(814) 488-2063", + "color": "rgb(133,126,66)" + }, + { + "index": 5, + "name": "Wagner Shelton", + "first": "Harriet", + "last": "Sherman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ismailmayat/73.jpg", + "expanded": false, + "guid": "46a4a1bc-97af-46e0-aedd-c3cc42e6b8f5", + "integer": 27, + "date": "Wed Jul 07 2010 05:48:57 GMT-0700 (PDT)", + "shortText": "do dolore tempor labore", + "mediumText": "Enim exercitation incididunt minim eiusmod est enim qui ex sit. Sit duis eiusmod officia nostrud ullamco aliquip. Minim ipsum ad fugiat dolore sint nisi tempor. Anim minim sint nisi est ea id cillum adipisicing ullamco fugiat velit aute.", + "longText": "Do veniam eiusmod sint irure. Ad aute magna consequat sint enim duis ad laboris mollit dolore esse ex do labore. Minim pariatur incididunt velit nostrud proident minim sit ad ex Lorem dolore. Esse do do sit veniam officia non sunt aliquip non exercitation id aliquip voluptate elit.\r\n", + "address": "3 Stratford Road", + "city": "Makena", + "state": "Kansas", + "zip": 21389, + "country": "Chad", + "email": "harrietsherman@scentric.com", + "phone": "(887) 497-3612", + "color": "rgb(195,89,110)" + }, + { + "index": 6, + "name": "Bethany Adkins", + "first": "Stacie", + "last": "Bartlett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlyson/73.jpg", + "expanded": false, + "guid": "17aac57d-4644-44d8-8a6b-b2eedd3d42dc", + "integer": 49, + "date": "Sun Mar 14 1999 23:13:33 GMT-0800 (PST)", + "shortText": "deserunt", + "mediumText": "Lorem dolor sint labore minim eu ullamco cupidatat ea velit minim. Sint eiusmod dolor nisi adipisicing pariatur esse sint anim labore consectetur irure exercitation cillum. Quis labore nulla occaecat incididunt qui ex dolor voluptate sunt eiusmod sunt proident occaecat excepteur. Dolore quis magna adipisicing esse enim occaecat.", + "longText": "Aute labore ipsum id proident occaecat cillum magna commodo excepteur Lorem et ea incididunt. Labore reprehenderit minim ipsum id aliquip fugiat elit. Sit in esse aute mollit id elit sint amet minim commodo id. Esse tempor aliqua enim amet anim commodo non anim nisi.\r\n", + "address": "4 Luquer Street", + "city": "Newcastle", + "state": "Iowa", + "zip": 72190, + "country": "Uruguay", + "email": "staciebartlett@scentric.com", + "phone": "(957) 412-3261", + "color": "rgb(164,84,221)" + }, + { + "index": 7, + "name": "Angelia Rowe", + "first": "Charlene", + "last": "Stevens", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thewillbeard/73.jpg", + "expanded": false, + "guid": "f3c6a195-d50e-479f-9c2a-c54c2a629852", + "integer": 13, + "date": "Sat Jan 04 1992 04:10:22 GMT-0800 (PST)", + "shortText": "eu reprehenderit aliquip minim", + "mediumText": "Fugiat ipsum ex irure dolore. Reprehenderit laborum proident commodo ut qui ea reprehenderit duis occaecat nostrud aliqua.", + "longText": "Esse ullamco veniam aliquip cillum aliqua veniam in consequat eu cupidatat. Ad amet reprehenderit sit anim dolor sit amet labore magna irure consequat duis cupidatat cillum. Voluptate aute consectetur ea elit labore nulla reprehenderit excepteur sit laboris sit.\r\nUllamco aliqua adipisicing velit adipisicing nulla anim cillum sunt mollit labore. Et anim aliquip adipisicing non. Exercitation consectetur nisi aute ipsum eiusmod nisi dolore. Excepteur deserunt reprehenderit occaecat sunt eu culpa ullamco proident qui excepteur. Sit proident sunt elit aliqua sit dolore deserunt officia fugiat laborum eiusmod nisi est dolor.\r\nQuis fugiat duis ullamco mollit do. Cillum cupidatat magna do id proident ut nisi do nostrud fugiat cillum incididunt. Est enim tempor labore tempor qui ipsum reprehenderit aliquip commodo quis est aute eiusmod.\r\nFugiat deserunt esse laborum labore sit nisi mollit eu dolore elit non ullamco. Velit id et quis aute esse culpa deserunt nostrud. Quis consequat consectetur fugiat ex aute sit proident aliqua dolor laboris et. Ipsum aliquip minim nostrud nostrud sunt quis eiusmod ea fugiat anim sint est duis aute.\r\nVelit aliqua cillum laboris sit officia deserunt incididunt. Consequat labore ad incididunt incididunt excepteur ex ad sunt dolore nulla qui pariatur. Cupidatat aute qui velit ipsum mollit. Aliqua veniam velit elit nostrud do consequat in in ea ea. Proident ea in qui adipisicing tempor irure qui eu ex dolore deserunt. Ipsum voluptate nulla id id culpa consectetur cillum nulla amet. Amet elit fugiat dolore anim laborum irure aute.\r\n", + "address": "4 Tiffany Place", + "city": "Dargan", + "state": "Vermont", + "zip": 31427, + "country": "Burkina Faso", + "email": "charlenestevens@scentric.com", + "phone": "(946) 404-2511", + "color": "rgb(99,147,74)" + }, + { + "index": 8, + "name": "Knox Rivers", + "first": "Reyes", + "last": "Hartman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tgormtx/73.jpg", + "expanded": false, + "guid": "88e71d65-5a7a-4973-a1dc-9f5c1df485c8", + "integer": 41, + "date": "Sat May 28 1994 15:27:35 GMT-0700 (PDT)", + "shortText": "incididunt ut", + "mediumText": "Quis voluptate eu ea et id voluptate.", + "longText": "Nostrud esse proident laborum et ex. Cupidatat proident ex velit id fugiat nulla exercitation Lorem velit ullamco exercitation excepteur. Occaecat reprehenderit occaecat in in deserunt. Ea quis laborum cupidatat ullamco aliquip. Duis proident ad mollit do eiusmod non minim sint voluptate nisi in ea deserunt consequat. Nostrud aliqua voluptate sit aliqua. Do laborum dolor ex commodo irure.\r\nIrure ipsum laboris elit ullamco labore cillum consequat et esse reprehenderit culpa elit sint consectetur. Aute exercitation excepteur Lorem do occaecat voluptate ullamco ullamco commodo sint deserunt. Esse nulla laboris non dolore adipisicing fugiat enim Lorem cillum do id proident quis eu. Ullamco officia consectetur aliqua labore cupidatat anim sint. Ipsum aute aliquip magna nostrud sint officia id irure. Non ad non reprehenderit id sunt cupidatat esse tempor officia proident occaecat qui mollit ut.\r\nExcepteur excepteur ullamco aute deserunt magna laboris ipsum ullamco laborum laboris nostrud. Excepteur sunt fugiat aliquip nostrud magna cillum commodo voluptate amet ad laboris. Officia minim sint dolor nostrud fugiat. Consequat velit sint irure amet cillum enim sunt pariatur amet mollit aute ipsum cupidatat do.\r\n", + "address": "3 Wythe Place", + "city": "Coldiron", + "state": "Nebraska", + "zip": 76971, + "country": "Greenland", + "email": "reyeshartman@scentric.com", + "phone": "(910) 533-3832", + "color": "rgb(99,55,193)" + }, + { + "index": 9, + "name": "Warren Scott", + "first": "Alissa", + "last": "Duncan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/73.jpg", + "expanded": false, + "guid": "dfc23019-ab40-4597-91fe-74bcf60a9e2b", + "integer": 54, + "date": "Sun Feb 08 2009 21:57:53 GMT-0800 (PST)", + "shortText": "ullamco aliquip veniam", + "mediumText": "Officia est sint velit magna reprehenderit.", + "longText": "Eu ipsum ipsum nisi voluptate sit voluptate occaecat sunt laborum do aute. Et id amet consequat culpa sunt. Quis aliquip adipisicing velit officia adipisicing cupidatat. Sint Lorem et consequat consectetur. Anim adipisicing ullamco dolore pariatur aliquip quis aliqua qui cillum amet amet fugiat.\r\nCupidatat fugiat exercitation duis proident in esse eiusmod dolore nisi ut. Anim dolor minim elit est ex eiusmod est. In elit pariatur non non veniam nostrud consectetur.\r\n", + "address": "4 Henderson Walk", + "city": "Oley", + "state": "Florida", + "zip": 38878, + "country": "Fiji", + "email": "alissaduncan@scentric.com", + "phone": "(876) 584-3746", + "color": "rgb(218,58,52)" + }, + { + "index": 10, + "name": "Mai Shepherd", + "first": "Christina", + "last": "Craft", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mwarkentin/73.jpg", + "expanded": false, + "guid": "7b829e11-da52-4302-a645-4711c9af7df2", + "integer": 40, + "date": "Sat Apr 18 1992 20:34:36 GMT-0700 (PDT)", + "shortText": "culpa laboris aliquip veniam nostrud", + "mediumText": "Dolore voluptate esse eiusmod ea reprehenderit aliqua sunt magna pariatur tempor veniam ad reprehenderit nostrud. Deserunt esse fugiat enim nisi in fugiat eu. Enim sit deserunt nostrud adipisicing laboris voluptate eu do non exercitation culpa deserunt. Ullamco cillum occaecat cillum adipisicing cupidatat deserunt qui. Tempor nisi duis irure cillum occaecat ullamco cillum quis enim exercitation proident proident excepteur.", + "longText": "Quis incididunt in cillum in sit deserunt excepteur ipsum magna consectetur nulla. Incididunt cillum reprehenderit ut cupidatat proident officia commodo eiusmod id nulla aliquip aliquip anim pariatur. Sint tempor do elit nisi minim consequat cupidatat non mollit ex. Laboris ullamco laborum pariatur ea exercitation eu tempor. Aute incididunt voluptate ut nulla veniam sint. Eu aliquip labore aliquip dolore sunt reprehenderit elit labore elit aliqua reprehenderit duis quis. Esse qui pariatur nostrud nostrud irure nulla aliqua non pariatur.\r\nReprehenderit sunt consequat laborum eu tempor ad Lorem commodo consequat. Incididunt officia est incididunt aliquip mollit pariatur enim qui pariatur non anim veniam aute ullamco. Fugiat nisi aliqua ex in pariatur cillum aliquip nisi elit dolor laborum labore do sit.\r\nConsectetur non sit aliqua esse est aliqua. Deserunt consequat Lorem dolore proident elit occaecat in. Esse commodo aute minim adipisicing enim eiusmod aliqua magna ea magna. Qui proident id adipisicing non ea non quis sit. Et dolore dolore labore non consequat.\r\nNostrud qui irure laborum ipsum occaecat consectetur laboris. Sunt irure eiusmod irure labore cillum veniam enim. Do aliquip proident et amet sunt laborum dolore amet reprehenderit exercitation do id duis. Sunt magna labore minim nostrud enim laborum mollit ullamco amet laborum mollit magna consequat. Sunt eiusmod cupidatat tempor duis exercitation ad minim laboris. Magna dolor nulla et ut eiusmod incididunt Lorem anim magna. Ipsum sit sint quis eu deserunt nulla nisi ad in amet proident.\r\n", + "address": "3 Ocean Court", + "city": "Fairmount", + "state": "New Jersey", + "zip": 95002, + "country": "Viet Nam", + "email": "christinacraft@scentric.com", + "phone": "(842) 503-2389", + "color": "rgb(181,253,141)" + }, + { + "index": 11, + "name": "Flora Tran", + "first": "Burt", + "last": "Landry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/herkulano/73.jpg", + "expanded": false, + "guid": "3efeb9cc-5705-4e17-b800-42ee8e354d30", + "integer": 64, + "date": "Fri Apr 30 1982 14:23:53 GMT-0700 (PDT)", + "shortText": "nostrud ipsum", + "mediumText": "Excepteur mollit velit nulla nisi culpa irure laboris cillum sunt ullamco. Laborum minim excepteur dolore ea labore Lorem eiusmod adipisicing.", + "longText": "Laborum exercitation id cupidatat voluptate cupidatat laboris id. Do exercitation dolor anim occaecat officia. Fugiat esse et aliqua incididunt consequat.\r\n", + "address": "2 Butler Street", + "city": "Walker", + "state": "Wisconsin", + "zip": 56241, + "country": "France, Metropolitan", + "email": "burtlandry@scentric.com", + "phone": "(914) 461-3510", + "color": "rgb(95,147,193)" + }, + { + "index": 12, + "name": "Crawford Jordan", + "first": "Baldwin", + "last": "Hammond", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jonny_moon/73.jpg", + "expanded": false, + "guid": "758e8af9-6a3c-47e1-a062-b49e6263b6e8", + "integer": 80, + "date": "Sat Sep 22 2012 18:24:55 GMT-0700 (PDT)", + "shortText": "excepteur eiusmod sit irure", + "mediumText": "Ad esse ex exercitation aliqua cillum. Magna ut est nisi nisi aute enim officia excepteur aliqua. Excepteur aliqua dolor sunt mollit esse officia.", + "longText": "Esse fugiat laborum mollit labore exercitation dolor magna esse anim qui in. Excepteur proident exercitation duis laboris nostrud irure fugiat labore aute ut pariatur ea. Adipisicing labore ad laborum id et ad. Lorem laboris nulla velit pariatur ipsum. Cillum reprehenderit anim dolore mollit dolor. Ut velit veniam pariatur nisi dolor anim ut laborum cillum ut ad.\r\n", + "address": "3 Preston Court", + "city": "Vincent", + "state": "Washington", + "zip": 47560, + "country": "Uganda", + "email": "baldwinhammond@scentric.com", + "phone": "(800) 559-2165", + "color": "rgb(175,176,59)" + }, + { + "index": 13, + "name": "Stanley Williams", + "first": "Laverne", + "last": "Hampton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alyssalowww/73.jpg", + "expanded": false, + "guid": "718262e9-01e7-4016-b068-6edd11a14a38", + "integer": 62, + "date": "Sat Sep 27 1975 16:25:15 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Sunt voluptate magna ullamco cupidatat laborum anim irure.", + "longText": "Duis magna nulla laborum reprehenderit ullamco ipsum irure. Exercitation veniam Lorem Lorem est commodo. In et occaecat et quis veniam quis esse ea anim cupidatat labore.\r\nDeserunt commodo est consectetur velit ullamco eu do nisi consequat culpa sunt. Nulla aliquip veniam anim reprehenderit irure occaecat sit nulla. Culpa Lorem in culpa adipisicing eiusmod aute cillum fugiat voluptate deserunt.\r\nDo do enim et tempor minim aliqua incididunt aute nulla ullamco fugiat magna occaecat in. Mollit aute sunt eu culpa enim magna nulla pariatur cillum amet quis consectetur et laboris. Ex officia nulla dolor ea aliqua est voluptate do Lorem aliquip irure. Lorem velit ad eiusmod aliquip. Amet irure amet consequat est aliqua quis.\r\nEt Lorem magna sunt aliquip dolore minim. Adipisicing ea ipsum dolore commodo labore eiusmod nisi consectetur. Reprehenderit culpa officia culpa mollit. Eu nostrud ullamco elit nostrud incididunt. Reprehenderit officia fugiat est sunt sunt consectetur Lorem ex magna reprehenderit.\r\nElit laboris eiusmod sunt cupidatat elit qui irure adipisicing culpa voluptate laborum eiusmod nisi. Ullamco magna minim enim ea veniam incididunt laborum aliqua qui minim commodo laborum. Consectetur nisi adipisicing voluptate velit ex. Id anim est sunt elit dolore qui incididunt aute voluptate consectetur exercitation. Sint tempor est laboris laborum incididunt fugiat dolor. Laboris est duis ullamco laborum eiusmod incididunt aliquip aute.\r\n", + "address": "4 Varet Street", + "city": "Breinigsville", + "state": "Oregon", + "zip": 54164, + "country": "Antarctica", + "email": "lavernehampton@scentric.com", + "phone": "(988) 478-3842", + "color": "rgb(225,78,134)" + }, + { + "index": 14, + "name": "Key Keith", + "first": "Kirsten", + "last": "Chang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rafelorden/73.jpg", + "expanded": false, + "guid": "1e75c394-1574-4168-a33d-c5895f7af76d", + "integer": 47, + "date": "Tue Sep 18 1990 08:36:33 GMT-0700 (PDT)", + "shortText": "quis proident ea", + "mediumText": "Do voluptate et reprehenderit aute tempor exercitation ipsum enim quis elit dolore in quis. Veniam sunt dolore excepteur consectetur. Lorem occaecat laborum elit veniam ad commodo sint ullamco exercitation aliquip.", + "longText": "Nulla esse et consectetur in nulla nostrud laboris reprehenderit minim sit sunt nisi est fugiat. Duis elit id sit excepteur amet aute culpa incididunt. Nisi veniam ut nisi mollit sunt proident Lorem reprehenderit. Et voluptate occaecat veniam et proident ipsum non cillum aliquip laboris ad.\r\n", + "address": "4 Ryder Avenue", + "city": "Wheatfields", + "state": "Illinois", + "zip": 28092, + "country": "Kiribati", + "email": "kirstenchang@scentric.com", + "phone": "(882) 531-2818", + "color": "rgb(118,83,134)" + }, + { + "index": 15, + "name": "Lizzie Oneal", + "first": "Mercado", + "last": "Hancock", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wim1k/73.jpg", + "expanded": false, + "guid": "8fbb9f3a-64df-4069-9aec-0d3dd0c2dd3f", + "integer": 22, + "date": "Thu Jan 02 1986 03:48:22 GMT-0800 (PST)", + "shortText": "cupidatat pariatur consequat incididunt", + "mediumText": "Non do dolore consequat nostrud. Ullamco dolore sunt anim incididunt aliqua minim mollit ad consectetur do ipsum.", + "longText": "Enim consequat dolor nostrud culpa cillum consequat mollit eu sint est commodo. Sit cillum minim incididunt id mollit eiusmod non nostrud sunt proident aliquip. Excepteur occaecat amet ullamco deserunt. Nisi elit excepteur commodo nisi anim incididunt consequat laboris exercitation pariatur occaecat deserunt sint. Aliquip in non quis enim cillum eiusmod duis pariatur elit proident consequat nostrud proident culpa.\r\nMollit culpa adipisicing laboris occaecat commodo id incididunt aliquip adipisicing ex ipsum elit elit adipisicing. Officia voluptate reprehenderit elit dolore. Consequat culpa officia id ut irure eu Lorem eu mollit excepteur adipisicing aute occaecat amet. Anim reprehenderit enim deserunt velit elit ut amet. Deserunt voluptate eiusmod labore tempor duis in est consequat adipisicing excepteur sunt consequat ea. Occaecat eiusmod fugiat do elit sunt.\r\nDeserunt fugiat velit mollit do culpa sunt in enim qui tempor anim esse sunt. Do eu fugiat culpa ex aliquip quis exercitation. Culpa non culpa duis magna officia dolore officia minim culpa non. Enim voluptate minim ullamco eiusmod dolore do sit non quis et anim incididunt aliqua tempor.\r\n", + "address": "4 Sumner Place", + "city": "Ruckersville", + "state": "West Virginia", + "zip": 65886, + "country": "Ecuador", + "email": "mercadohancock@scentric.com", + "phone": "(996) 557-3624", + "color": "rgb(244,178,231)" + }, + { + "index": 16, + "name": "Bentley Guthrie", + "first": "Obrien", + "last": "Bruce", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rpeezy/73.jpg", + "expanded": false, + "guid": "720e6095-dc65-4bef-b8bf-56b3e43c13e8", + "integer": 33, + "date": "Sat Sep 09 1989 04:51:19 GMT-0700 (PDT)", + "shortText": "nulla officia ullamco anim", + "mediumText": "Incididunt ut irure quis non ad ut tempor et labore enim Lorem eiusmod. Sit laborum elit duis pariatur occaecat fugiat labore. Laborum velit incididunt dolor minim aute aute. Cillum id amet ut in. Eiusmod tempor et fugiat do qui dolor aliquip labore mollit tempor.", + "longText": "Labore et amet excepteur ea id. Anim mollit cupidatat nulla in sint. Nulla nulla proident Lorem minim consequat ea quis. Non Lorem mollit duis aliquip labore est. Eiusmod excepteur do do eiusmod officia id nisi proident consequat. Occaecat anim eiusmod dolore nostrud culpa adipisicing commodo anim incididunt laborum.\r\nDuis occaecat qui ullamco in magna nisi ad ex. Qui laboris tempor nulla magna. Ut est nulla laboris mollit do id qui esse exercitation culpa officia exercitation. Ipsum mollit amet ad exercitation ut eu Lorem reprehenderit magna. Veniam laboris officia ea voluptate sint anim qui est quis mollit qui occaecat cillum. Officia magna deserunt eu laboris culpa proident.\r\nElit est eiusmod non dolor nisi tempor et in deserunt eiusmod veniam ea quis. Elit magna anim pariatur ea do elit in duis cupidatat incididunt quis qui laboris. Ad ad ex officia proident ullamco consequat labore nulla consequat enim.\r\nProident ut elit quis anim reprehenderit amet deserunt eiusmod sit sit velit proident deserunt sunt. Est quis magna fugiat in nisi proident. Adipisicing Lorem sint enim esse laboris sit laborum.\r\n", + "address": "2 Chester Street", + "city": "Finzel", + "state": "Mississippi", + "zip": 52444, + "country": "Bulgaria", + "email": "obrienbruce@scentric.com", + "phone": "(923) 461-2312", + "color": "rgb(52,103,133)" + }, + { + "index": 17, + "name": "Marsh Cleveland", + "first": "Pearl", + "last": "Moran", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sectronov/73.jpg", + "expanded": false, + "guid": "9b385d87-2847-44f4-acae-a47970ff7c9f", + "integer": 8, + "date": "Tue Apr 26 1988 18:46:50 GMT-0700 (PDT)", + "shortText": "reprehenderit in reprehenderit dolor", + "mediumText": "Ex cillum in minim ullamco laborum. Dolor dolore adipisicing dolore ad.", + "longText": "Voluptate fugiat veniam do minim culpa. Proident irure mollit est exercitation est. Tempor pariatur proident excepteur aliquip cupidatat quis id ut fugiat excepteur tempor aliquip ea non. Consectetur ipsum Lorem reprehenderit laboris enim reprehenderit duis irure eu sint sit magna eu cupidatat. Sunt sunt laborum mollit ex fugiat ex quis. Proident quis labore occaecat est laborum quis ea irure ipsum magna ad nisi ut. Proident est culpa aliquip ullamco irure eu duis duis occaecat Lorem amet qui.\r\nMinim in adipisicing nostrud Lorem esse anim aute ullamco adipisicing ut enim magna. Cupidatat non dolor pariatur deserunt consectetur cillum dolor adipisicing. In proident commodo non exercitation cupidatat enim culpa officia voluptate. Et in sunt dolore mollit aute commodo sint et adipisicing. Labore velit esse occaecat esse commodo tempor veniam officia Lorem proident aute.\r\nEx magna aliqua adipisicing non esse labore non duis. Excepteur cupidatat eiusmod laborum laborum in quis reprehenderit id irure. Incididunt laboris qui adipisicing eu.\r\n", + "address": "4 Portland Avenue", + "city": "Henrietta", + "state": "Rhode Island", + "zip": 53764, + "country": "American Samoa", + "email": "pearlmoran@scentric.com", + "phone": "(964) 543-3486", + "color": "rgb(168,119,234)" + }, + { + "index": 18, + "name": "Maude Perry", + "first": "Underwood", + "last": "Barton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/starburst1977/73.jpg", + "expanded": false, + "guid": "0f6385b5-481e-4ddf-9ad4-b91f8e951922", + "integer": 33, + "date": "Wed Apr 23 2014 06:02:36 GMT-0700 (PDT)", + "shortText": "do pariatur quis consequat ex", + "mediumText": "Sunt magna elit adipisicing sint quis minim. Commodo irure pariatur esse deserunt proident enim incididunt et deserunt sit consectetur enim anim. Esse pariatur non magna culpa cillum culpa dolore ad id ex dolor deserunt. Dolore qui amet cupidatat et pariatur fugiat voluptate eiusmod duis commodo. Proident adipisicing irure eu aliquip nisi.", + "longText": "Nisi ipsum excepteur eiusmod irure velit. Elit ad nulla culpa eu sint veniam deserunt cupidatat. Esse culpa nisi velit aliquip esse consequat dolor amet velit culpa labore est do.\r\nLorem consectetur ad proident Lorem aute eiusmod sit incididunt. Pariatur sit cupidatat enim fugiat sunt ut. Aliquip mollit fugiat ea non laboris exercitation amet Lorem cillum.\r\n", + "address": "3 Mermaid Avenue", + "city": "Deputy", + "state": "Georgia", + "zip": 58449, + "country": "Angola", + "email": "underwoodbarton@scentric.com", + "phone": "(946) 414-3492", + "color": "rgb(112,197,153)" + }, + { + "index": 19, + "name": "Knapp Pratt", + "first": "Solomon", + "last": "Lloyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mocabyte/73.jpg", + "expanded": false, + "guid": "895a8dab-d037-46f4-b822-795814f418d9", + "integer": 72, + "date": "Thu Apr 13 1978 08:14:17 GMT-0800 (PST)", + "shortText": "nisi quis", + "mediumText": "Officia id sint exercitation excepteur aliqua enim est id duis occaecat consectetur excepteur. Ea incididunt nulla quis ea ad et ex exercitation laboris sit sit aliquip. Est magna tempor ex commodo id aliquip nostrud aliquip id culpa quis velit excepteur.", + "longText": "Ut nostrud nisi sit sit laboris labore ea ullamco fugiat enim esse. Velit fugiat adipisicing amet amet. Sint cillum eiusmod cillum esse exercitation duis adipisicing incididunt eiusmod culpa laboris eiusmod.\r\nEu cupidatat anim mollit laboris excepteur do in voluptate. In voluptate exercitation proident commodo Lorem id. Laboris cillum dolor et eiusmod do eu. Amet veniam proident in id deserunt mollit incididunt quis exercitation sunt pariatur duis cillum proident. Sunt ad deserunt adipisicing adipisicing consectetur.\r\nLorem reprehenderit deserunt reprehenderit incididunt anim elit aliquip ipsum reprehenderit. Aliqua amet sint mollit fugiat ut est ut tempor aliquip elit laboris. Esse minim qui non aliquip exercitation dolore quis incididunt incididunt. Ullamco cillum excepteur eu duis eu id in commodo.\r\nVelit duis ullamco veniam dolore exercitation aliquip magna veniam et. Excepteur ipsum duis voluptate Lorem in veniam reprehenderit eu deserunt magna reprehenderit. Minim ullamco nostrud irure irure culpa esse. Laboris ad incididunt proident elit sit eiusmod voluptate ad culpa qui duis aute. Cillum ex esse non veniam nulla excepteur quis non.\r\nEiusmod adipisicing Lorem sunt est. Duis reprehenderit esse sint aute. Est dolore cillum minim anim Lorem adipisicing amet fugiat. Esse dolor commodo labore ea nulla ipsum nulla laboris proident consequat duis ex ut minim. Occaecat irure nostrud nulla eiusmod est aliqua proident irure laboris.\r\n", + "address": "4 Glenwood Road", + "city": "Berlin", + "state": "New Mexico", + "zip": 64625, + "country": "Bhutan", + "email": "solomonlloyd@scentric.com", + "phone": "(802) 539-3360", + "color": "rgb(69,68,176)" + }, + { + "index": 20, + "name": "Jodi Tanner", + "first": "Lyons", + "last": "Stevenson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamasifmirza/73.jpg", + "expanded": false, + "guid": "f6a0ef12-6a1e-48a8-990a-da79c0bbf30e", + "integer": 79, + "date": "Tue Feb 11 2003 17:16:18 GMT-0800 (PST)", + "shortText": "et", + "mediumText": "Eu laboris adipisicing nostrud in in officia pariatur irure occaecat ut consequat commodo adipisicing elit.", + "longText": "Ullamco aliquip reprehenderit Lorem id duis ipsum sit exercitation id Lorem consequat enim ea. Aliquip officia minim dolore ea aliqua non. Aliqua cillum ipsum qui commodo non nostrud eiusmod duis commodo officia et nisi. Proident cillum deserunt eiusmod ea nisi quis incididunt id consectetur qui excepteur ad ipsum. Proident non dolor eu laboris proident Lorem aliquip elit sunt eu tempor sint fugiat Lorem.\r\nId mollit veniam amet labore id. Est proident tempor qui excepteur. Ipsum non irure sint minim sint eu cupidatat eu exercitation dolor et.\r\nSunt sunt nulla et mollit eu in amet est do qui ipsum mollit. Cillum voluptate excepteur consectetur sunt laboris tempor sunt laborum mollit veniam incididunt voluptate pariatur laboris. Mollit cupidatat esse aute sunt dolore cillum cillum qui sunt duis consequat anim. Sit ad laboris et do proident ipsum veniam amet dolor. Id elit anim ut et laborum. Dolor aliqua Lorem Lorem consectetur sint sunt.\r\n", + "address": "3 Cropsey Avenue", + "city": "Lewis", + "state": "Arizona", + "zip": 89420, + "country": "Dominica", + "email": "lyonsstevenson@scentric.com", + "phone": "(818) 424-2348", + "color": "rgb(178,99,182)" + }, + { + "index": 21, + "name": "Mamie Crane", + "first": "Swanson", + "last": "Richardson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benoitboucart/73.jpg", + "expanded": false, + "guid": "66c048df-eefc-4c09-a468-b3044e4e7f11", + "integer": 26, + "date": "Sun Jun 30 2002 05:57:21 GMT-0700 (PDT)", + "shortText": "quis aliquip aliqua", + "mediumText": "Non ad sit sit veniam officia id officia laborum qui irure eiusmod elit reprehenderit. Voluptate cillum mollit adipisicing mollit esse commodo. Labore exercitation voluptate duis pariatur magna labore ex non cillum incididunt eu esse nostrud.", + "longText": "Anim ut amet laboris culpa velit sunt ea sunt. Do anim nisi minim labore. In cillum pariatur ex non minim sint.\r\n", + "address": "3 Aurelia Court", + "city": "Inkerman", + "state": "Texas", + "zip": 10482, + "country": "Egypt", + "email": "swansonrichardson@scentric.com", + "phone": "(810) 406-3416", + "color": "rgb(230,107,202)" + }, + { + "index": 22, + "name": "Cooley Macdonald", + "first": "Aida", + "last": "Hurley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/markwienands/73.jpg", + "expanded": false, + "guid": "466a665b-b7b6-4eae-b404-e9b5a8d1641d", + "integer": 20, + "date": "Sun Jan 05 2014 15:48:57 GMT-0800 (PST)", + "shortText": "incididunt irure", + "mediumText": "Anim incididunt commodo minim voluptate enim proident aute adipisicing dolore reprehenderit commodo reprehenderit ipsum ut.", + "longText": "Id quis elit duis veniam enim cupidatat duis. Dolore proident magna minim reprehenderit Lorem. Velit tempor consequat adipisicing aute cillum exercitation eu sunt dolore.\r\nTempor ex laborum dolore voluptate aliqua in id est non. Eiusmod sunt non in culpa id magna non. Cupidatat voluptate magna aute cupidatat aliqua deserunt ut Lorem duis occaecat magna. Occaecat sit pariatur quis ipsum. Non qui non laboris cupidatat adipisicing.\r\nEst nulla aute veniam deserunt nulla labore reprehenderit reprehenderit sint. Nulla cupidatat laboris tempor labore cillum in excepteur minim laboris quis. Amet voluptate sunt in nostrud excepteur dolor in irure laborum commodo et cupidatat. Aliqua enim incididunt voluptate dolore est exercitation officia labore enim commodo quis veniam aliquip. Esse aliquip do labore eiusmod reprehenderit enim officia officia enim dolore magna dolore. Velit in sit dolore consequat.\r\nAdipisicing ea consequat voluptate proident enim commodo labore. Eu dolore ut amet aute tempor exercitation ad mollit occaecat velit non labore reprehenderit. Aute esse dolore id cillum Lorem eu quis elit exercitation ex esse sint. Sit nostrud non ullamco do esse. Voluptate velit officia eu laboris ut commodo tempor velit. Eiusmod cupidatat nostrud ex veniam sit duis. Proident fugiat laboris quis id dolor reprehenderit.\r\n", + "address": "4 Hall Street", + "city": "Stouchsburg", + "state": "District Of Columbia", + "zip": 32399, + "country": "Chile", + "email": "aidahurley@scentric.com", + "phone": "(975) 451-3272", + "color": "rgb(119,239,85)" + }, + { + "index": 23, + "name": "Snow Blankenship", + "first": "Mccormick", + "last": "Jensen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/menghe/73.jpg", + "expanded": false, + "guid": "961f5da2-2479-4f45-9132-9e89a8bc32e4", + "integer": 70, + "date": "Tue Jan 22 1974 01:18:15 GMT-0700 (PDT)", + "shortText": "aliqua commodo", + "mediumText": "Proident est sunt aliqua cillum ex sit aliquip irure ad. Pariatur dolore cillum nulla qui excepteur deserunt culpa magna consectetur et officia.", + "longText": "Culpa id veniam minim enim nulla ea enim proident. Esse sint ipsum et culpa. Cillum cillum incididunt fugiat occaecat Lorem velit. Quis esse incididunt esse sunt labore nulla. In minim ullamco officia do ad tempor. Sint sunt labore ullamco reprehenderit dolor ullamco ut occaecat.\r\n", + "address": "3 Lewis Place", + "city": "Elizaville", + "state": "Virgin Islands", + "zip": 32784, + "country": "Norfolk Island", + "email": "mccormickjensen@scentric.com", + "phone": "(961) 443-3343", + "color": "rgb(204,198,130)" + }, + { + "index": 24, + "name": "Gabriela Brock", + "first": "Ramona", + "last": "Meyers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/heyanata/73.jpg", + "expanded": false, + "guid": "07133f92-9308-420e-ae7b-e5ecd657aa85", + "integer": 76, + "date": "Sat Sep 15 1984 07:22:38 GMT-0700 (PDT)", + "shortText": "ex duis do", + "mediumText": "Aliqua qui dolore laborum aute culpa eiusmod ipsum incididunt. Incididunt cillum nisi culpa ea. Incididunt reprehenderit Lorem veniam occaecat elit anim mollit deserunt.", + "longText": "Magna nostrud laboris cupidatat sint esse pariatur ut irure sint dolore laborum. Ut id aute dolor laboris. Cillum officia id officia ut. Irure incididunt dolor exercitation eiusmod sunt nostrud labore. Ad do deserunt deserunt ad elit culpa commodo pariatur. Pariatur excepteur et nisi aute. Ex amet irure anim pariatur voluptate pariatur adipisicing dolor eiusmod dolore.\r\nVelit eu consectetur sint nulla culpa laboris ex et esse. Nostrud voluptate nostrud esse nisi proident quis consequat sit commodo consectetur ut. Ea ex irure labore ullamco proident ullamco consequat sit. Ipsum sit adipisicing mollit deserunt.\r\nEst quis ea magna aliquip anim. Cupidatat ea commodo amet tempor laboris commodo eu. Duis qui irure sunt aliquip velit elit. Laboris fugiat anim officia eiusmod enim ut aliqua incididunt eiusmod ad nulla aute esse. Sit in velit amet labore non consequat id id enim labore Lorem.\r\n", + "address": "3 Rodney Street", + "city": "Orin", + "state": "Puerto Rico", + "zip": 60446, + "country": "Japan", + "email": "ramonameyers@scentric.com", + "phone": "(839) 591-3993", + "color": "rgb(236,222,59)" + }, + { + "index": 25, + "name": "Graciela Orr", + "first": "Sharp", + "last": "Lindsay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/73.jpg", + "expanded": false, + "guid": "0ea67b0a-5ea7-4e07-8d06-48b6e2a00c6e", + "integer": 39, + "date": "Mon May 25 1970 21:04:46 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Aliqua sunt commodo occaecat nisi esse aliqua labore exercitation qui in ut officia laborum ad. Tempor nisi ad aliquip ipsum nostrud nostrud et sint commodo cillum labore. Ullamco qui fugiat consectetur minim consequat cupidatat laboris. Eu irure veniam sint esse adipisicing ipsum do aliqua pariatur.", + "longText": "Tempor Lorem reprehenderit quis exercitation sit sunt labore elit. Laborum incididunt quis deserunt fugiat culpa aliquip irure esse sit excepteur. Elit elit ad et do dolore minim enim.\r\n", + "address": "2 Tech Place", + "city": "Kraemer", + "state": "Maryland", + "zip": 24019, + "country": "Saudi Arabia", + "email": "sharplindsay@scentric.com", + "phone": "(852) 538-3232", + "color": "rgb(218,74,95)" + }, + { + "index": 26, + "name": "Ethel Wood", + "first": "Dina", + "last": "Robbins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluesix/73.jpg", + "expanded": false, + "guid": "342d8ae0-5eea-403c-9922-a85d39738463", + "integer": 22, + "date": "Sat Jun 03 1978 07:31:03 GMT-0700 (PDT)", + "shortText": "qui", + "mediumText": "Excepteur eu laboris magna cupidatat eiusmod nostrud laborum commodo officia sunt fugiat ad. Aliqua reprehenderit duis est consequat incididunt ullamco.", + "longText": "Pariatur velit exercitation aute adipisicing et enim laborum. Laboris anim nostrud consequat Lorem eu irure non aute eiusmod tempor veniam. Aute amet elit tempor irure occaecat esse labore elit veniam anim ea anim. Consequat excepteur esse mollit tempor mollit aute et sit duis. Labore veniam cillum enim nostrud ea laborum.\r\n", + "address": "2 Plymouth Street", + "city": "Bison", + "state": "Massachusetts", + "zip": 64340, + "country": "Micronesia", + "email": "dinarobbins@scentric.com", + "phone": "(967) 410-2522", + "color": "rgb(158,62,57)" + }, + { + "index": 27, + "name": "Tameka Francis", + "first": "Franco", + "last": "Carrillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/w8candice/73.jpg", + "expanded": false, + "guid": "d193f8ac-79ea-4201-9a75-c66cbf504ad5", + "integer": 37, + "date": "Mon Jul 14 1986 03:07:27 GMT-0700 (PDT)", + "shortText": "do aliqua laborum", + "mediumText": "Est incididunt exercitation voluptate culpa ut excepteur voluptate velit est minim nulla. Mollit anim ipsum velit excepteur eu occaecat exercitation. Mollit ipsum commodo aliqua voluptate do incididunt ipsum quis.", + "longText": "Anim voluptate cupidatat labore amet. Ex pariatur duis officia commodo excepteur. Quis dolor esse quis veniam. Non veniam et fugiat quis magna. Cillum ad commodo ex cupidatat labore duis aute est cillum. Ad nostrud duis officia ea proident non veniam qui quis.\r\nEx enim duis Lorem sit adipisicing laboris occaecat amet consectetur labore. Pariatur deserunt qui veniam ad exercitation proident commodo dolore aliqua. Aliquip sit Lorem mollit est culpa sint veniam veniam adipisicing elit eiusmod ipsum deserunt. Sint eiusmod consequat occaecat exercitation commodo qui. Labore et consequat dolor voluptate dolor excepteur in anim aliquip ea ullamco labore exercitation ipsum. Mollit occaecat dolor proident ipsum ad esse mollit qui laboris. Anim reprehenderit nulla magna mollit exercitation labore minim.\r\n", + "address": "2 Harkness Avenue", + "city": "Hollins", + "state": "Oklahoma", + "zip": 57691, + "country": "Liberia", + "email": "francocarrillo@scentric.com", + "phone": "(812) 540-2032", + "color": "rgb(89,84,186)" + }, + { + "index": 28, + "name": "Hendricks Levy", + "first": "Guadalupe", + "last": "Odom", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mbilderbach/73.jpg", + "expanded": false, + "guid": "cb09adfd-ad50-4ada-85f2-9a6da5e61812", + "integer": 51, + "date": "Tue Sep 12 1995 23:12:02 GMT-0700 (PDT)", + "shortText": "laboris non labore elit ea", + "mediumText": "Veniam tempor cillum non deserunt duis aliquip elit velit velit do sunt est ad et. Incididunt anim id dolore reprehenderit Lorem est laborum aliqua. Cupidatat ut irure proident pariatur nulla minim nostrud minim laborum non.", + "longText": "Dolor consectetur eu Lorem ea fugiat culpa dolore magna qui magna mollit. Minim est qui eiusmod incididunt nisi ullamco incididunt irure. Tempor officia amet ea nisi elit sunt nulla dolor non labore officia ipsum sit. Esse tempor duis labore laborum cillum nostrud sunt do quis.\r\nEx quis consequat est laborum eu non consequat exercitation aute proident ea excepteur irure ex. Adipisicing nulla laborum ipsum enim dolore. Reprehenderit labore veniam Lorem qui adipisicing dolore commodo cillum anim reprehenderit cupidatat cupidatat amet.\r\nAliqua est magna incididunt amet sit et ad laboris nostrud. Labore culpa cupidatat aliquip magna tempor elit cillum ad ut irure. Ipsum irure qui ullamco aliqua ex sit do. Ut irure nisi voluptate excepteur nulla deserunt dolor dolore id ut laboris proident pariatur. Consequat est exercitation esse id nulla culpa cupidatat deserunt deserunt nostrud in est nostrud. Incididunt eiusmod non sunt deserunt reprehenderit eiusmod officia cupidatat quis ea cupidatat pariatur dolore.\r\n", + "address": "4 Terrace Place", + "city": "Salunga", + "state": "Ohio", + "zip": 43114, + "country": "Korea (South)", + "email": "guadalupeodom@scentric.com", + "phone": "(902) 544-3976", + "color": "rgb(180,227,238)" + }, + { + "index": 29, + "name": "Porter Mcpherson", + "first": "Mcguire", + "last": "Kerr", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/coreyweb/73.jpg", + "expanded": false, + "guid": "c15b43e1-5b71-49c8-8319-7c6739d3d481", + "integer": 81, + "date": "Tue Jun 05 2012 02:47:02 GMT-0700 (PDT)", + "shortText": "do", + "mediumText": "Qui est labore deserunt velit ut adipisicing quis. Aliquip ex esse enim esse commodo duis non nisi nisi incididunt anim duis sunt magna.", + "longText": "Consequat laborum est irure eiusmod fugiat dolore fugiat do. Consequat occaecat deserunt non consectetur. Do et dolore minim dolore in ex enim.\r\nMinim pariatur tempor sit anim reprehenderit quis laboris elit veniam Lorem ipsum amet. Sunt aute reprehenderit eiusmod sint mollit proident sint veniam. Eu elit amet minim excepteur aliqua esse enim. Dolor nulla magna excepteur id nostrud Lorem magna duis.\r\n", + "address": "4 Myrtle Avenue", + "city": "Waukeenah", + "state": "Nevada", + "zip": 54957, + "country": "Pakistan", + "email": "mcguirekerr@scentric.com", + "phone": "(812) 545-2648", + "color": "rgb(122,207,233)" + }, + { + "index": 30, + "name": "Rosalie Noble", + "first": "Giles", + "last": "Miller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyshimko/73.jpg", + "expanded": false, + "guid": "490401d1-d8e8-4bd1-866c-b9ddd28804a4", + "integer": 45, + "date": "Sun Apr 21 2002 02:16:55 GMT-0700 (PDT)", + "shortText": "proident ad adipisicing duis non", + "mediumText": "Veniam esse officia laborum pariatur. Esse cillum duis sunt minim nisi irure eu in. Occaecat minim culpa adipisicing do amet in amet ipsum velit minim est. Est quis voluptate deserunt id sunt exercitation reprehenderit duis ad dolor et dolor mollit.", + "longText": "Ex dolor culpa fugiat amet esse Lorem dolor ad anim reprehenderit voluptate adipisicing. Nostrud minim laborum mollit labore Lorem officia dolor Lorem. Et voluptate in nulla id ea est duis velit. Aute adipisicing sint commodo et.\r\nNon deserunt nostrud veniam velit occaecat cupidatat adipisicing exercitation. Anim duis enim enim excepteur non voluptate mollit occaecat sunt adipisicing cillum duis. Adipisicing eiusmod nulla ex minim ipsum.\r\nLabore ea dolore fugiat culpa ad aute veniam sint id nulla sit voluptate. Esse magna cupidatat mollit eiusmod. Consectetur dolor incididunt deserunt veniam veniam voluptate elit do aute officia occaecat aliquip aliqua. Ea irure incididunt ut in elit minim et laborum minim enim culpa est do. Nostrud quis ullamco excepteur amet irure ad exercitation voluptate dolore amet pariatur non nisi.\r\n", + "address": "4 Dakota Place", + "city": "Matheny", + "state": "Montana", + "zip": 48981, + "country": "Guyana", + "email": "gilesmiller@scentric.com", + "phone": "(937) 481-3812", + "color": "rgb(117,82,141)" + }, + { + "index": 31, + "name": "Katrina Stuart", + "first": "Norton", + "last": "Carr", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pavelbuben/73.jpg", + "expanded": false, + "guid": "f9c2cf75-a70b-45c5-8a9c-cbceae872250", + "integer": 77, + "date": "Sun May 09 1993 04:38:21 GMT-0700 (PDT)", + "shortText": "labore", + "mediumText": "Adipisicing tempor ad sit ut anim eiusmod exercitation laboris. Velit pariatur occaecat minim consectetur aliquip nostrud anim.", + "longText": "Commodo anim aliquip nostrud occaecat cupidatat quis tempor aliquip consequat dolore. Ea sit ullamco amet consequat elit. Magna magna amet in reprehenderit adipisicing amet cillum tempor qui nisi ad. Eu veniam ad adipisicing aliquip officia ut occaecat exercitation do ad irure do magna veniam. Reprehenderit nisi voluptate consectetur Lorem eu duis incididunt aliquip irure duis sit ea nostrud id. Reprehenderit reprehenderit ipsum in commodo.\r\nAd excepteur adipisicing aliqua eu veniam ullamco velit eu enim nisi reprehenderit non duis nulla. Voluptate aliqua sit sit duis exercitation ad. Incididunt incididunt quis aliqua eu anim esse reprehenderit ut aliqua. Ea id pariatur dolor dolor minim tempor laboris magna non culpa ut non. Officia Lorem proident elit consectetur excepteur dolor velit id velit minim mollit aliqua qui. Aliquip dolor sint aliqua ex tempor.\r\n", + "address": "3 Estate Road", + "city": "Zortman", + "state": "California", + "zip": 33484, + "country": "Poland", + "email": "nortoncarr@scentric.com", + "phone": "(807) 556-3727", + "color": "rgb(189,210,164)" + }, + { + "index": 32, + "name": "Katy Guzman", + "first": "Marcie", + "last": "Rose", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hafeeskhan/73.jpg", + "expanded": false, + "guid": "0b1f8fd2-2acd-402f-aa66-728b60d1d8ba", + "integer": 62, + "date": "Mon Aug 05 1985 19:37:56 GMT-0700 (PDT)", + "shortText": "elit laborum esse", + "mediumText": "Nulla officia ex elit nulla aliqua magna cillum mollit ad sint. Fugiat consequat officia id ullamco ullamco excepteur aliquip. Occaecat esse eu veniam labore laboris laborum sint laborum esse eiusmod Lorem. Aliquip ex quis et adipisicing sunt cillum pariatur exercitation exercitation fugiat. Est velit anim esse consequat id in nisi adipisicing qui ad ex do non velit.", + "longText": "Amet dolor cillum voluptate occaecat quis cupidatat laborum commodo. Ut et quis ut proident qui do aliquip exercitation non. Ipsum ullamco commodo mollit Lorem do consectetur qui ad in cillum tempor irure consequat.\r\nVeniam laboris minim do exercitation eiusmod ut do sint reprehenderit anim irure proident proident. Quis adipisicing duis qui ut quis veniam dolor non velit consectetur eu voluptate. Duis mollit velit fugiat magna eu ullamco magna irure ipsum est tempor labore eu sint. Cupidatat ullamco nulla dolore quis commodo esse cupidatat quis sunt tempor proident. Labore ullamco ullamco ex Lorem laboris veniam mollit in sint eiusmod.\r\n", + "address": "4 Bedford Place", + "city": "Outlook", + "state": "Marshall Islands", + "zip": 74859, + "country": "Canada", + "email": "marcierose@scentric.com", + "phone": "(968) 546-3854", + "color": "rgb(211,242,218)" + }, + { + "index": 33, + "name": "Lindsay Vega", + "first": "Loraine", + "last": "Castro", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/timmillwood/73.jpg", + "expanded": false, + "guid": "e380ab32-0565-4177-8396-017f4ffea65f", + "integer": 16, + "date": "Thu Aug 30 1984 16:22:17 GMT-0700 (PDT)", + "shortText": "aliquip veniam duis mollit incididunt", + "mediumText": "Ut ea cillum magna nulla eiusmod velit ullamco proident quis quis duis. Culpa aliqua sint excepteur id sint velit. Ex ut consectetur occaecat officia excepteur non sit reprehenderit laboris.", + "longText": "Culpa deserunt adipisicing non anim. Elit do veniam proident incididunt dolore ut et occaecat. Ut reprehenderit commodo irure velit deserunt velit et esse nisi labore officia do nisi quis. Do reprehenderit ex exercitation tempor esse esse cupidatat. Consequat occaecat nisi adipisicing mollit excepteur adipisicing velit nostrud ex do. Et dolor labore exercitation nostrud laboris amet nostrud labore.\r\nAmet aliqua dolore velit sint non. Velit in esse aute esse nulla et quis nulla ut excepteur commodo. Culpa veniam consectetur ut ullamco minim culpa Lorem dolor aute amet qui cillum nulla id.\r\nSint excepteur in culpa occaecat minim deserunt aliquip mollit cupidatat ipsum et mollit ad deserunt. Sunt eu aliquip ut nulla cillum commodo laboris labore nisi ut dolore amet. Magna sunt ipsum ut officia pariatur dolore elit ullamco velit qui Lorem duis. Enim anim quis et incididunt aute sit consectetur. Amet non commodo exercitation quis tempor labore ex do eu et anim voluptate.\r\nIncididunt sit esse fugiat velit incididunt cillum. Est elit do deserunt elit excepteur do. Adipisicing est tempor cillum consequat.\r\nEst consectetur elit ad nisi reprehenderit tempor eiusmod culpa reprehenderit veniam anim. Mollit minim nulla commodo excepteur occaecat nulla ex deserunt irure nisi aliquip. Enim ullamco sunt duis veniam mollit nulla dolor elit nulla.\r\n", + "address": "4 Robert Street", + "city": "Ellerslie", + "state": "Indiana", + "zip": 16816, + "country": "US Minor Outlying Islands", + "email": "lorainecastro@scentric.com", + "phone": "(816) 465-3014", + "color": "rgb(76,135,180)" + }, + { + "index": 34, + "name": "Hughes Flynn", + "first": "Fry", + "last": "Harmon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butchewing/73.jpg", + "expanded": false, + "guid": "bcaa95bc-6077-4332-84f7-c432a0f25269", + "integer": 52, + "date": "Thu Sep 22 1983 12:18:11 GMT-0700 (PDT)", + "shortText": "consectetur voluptate et enim sint", + "mediumText": "Veniam duis ut aute id occaecat nisi officia qui ut anim magna eiusmod quis non. Qui duis ad nostrud et sint eu est consectetur amet ad id velit enim.", + "longText": "Cillum labore in voluptate sit pariatur laborum laboris veniam anim officia tempor. Ad nisi amet enim consequat do est est ut deserunt sunt commodo cupidatat aliqua. Irure ad dolor officia veniam commodo labore incididunt. Ex aliquip ad dolor fugiat exercitation minim cillum exercitation eiusmod velit. Aliqua minim minim exercitation dolore dolor laboris.\r\nEnim cillum do consectetur occaecat dolor nulla. Et officia culpa ad et ea irure culpa laboris ullamco ea enim aliquip proident eiusmod. Irure veniam ipsum fugiat sint exercitation deserunt commodo eu consectetur amet nostrud aute duis ullamco.\r\nAliqua minim veniam dolore exercitation non in ipsum irure et culpa irure labore excepteur exercitation. Ad reprehenderit officia deserunt velit aliqua consectetur commodo magna magna consectetur reprehenderit Lorem. Elit qui officia cillum do duis cillum. Non quis proident cillum et non deserunt elit voluptate commodo minim non. Ad occaecat dolor dolore incididunt voluptate proident.\r\n", + "address": "2 Logan Street", + "city": "Cataract", + "state": "Tennessee", + "zip": 16373, + "country": "East Timor", + "email": "fryharmon@scentric.com", + "phone": "(810) 510-3744", + "color": "rgb(157,152,156)" + }, + { + "index": 35, + "name": "Massey Merritt", + "first": "Cooper", + "last": "Sampson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dotmariusz/73.jpg", + "expanded": false, + "guid": "b3614dbf-f75d-410c-9a0a-8d805f386b40", + "integer": 75, + "date": "Tue Feb 03 1981 16:12:08 GMT-0800 (PST)", + "shortText": "enim ad ea mollit aute", + "mediumText": "Aute exercitation magna do veniam ea sunt qui id aliquip do eiusmod. Ipsum veniam cillum tempor labore. Est nostrud ut Lorem dolore. Id ad amet fugiat aliquip ea ut veniam nulla aliquip dolor.", + "longText": "Quis culpa quis nulla sunt proident consectetur ex reprehenderit est fugiat duis enim minim. Elit et culpa ex ipsum et amet eu quis exercitation et laborum ullamco commodo do. Tempor in elit veniam deserunt proident fugiat est ea excepteur et ipsum eu magna. Adipisicing ad elit officia ea velit veniam nostrud ullamco. Id nostrud exercitation esse labore dolore do.\r\nOfficia labore nulla amet ipsum. Reprehenderit dolore qui elit labore nisi ullamco dolor aliqua consequat sunt reprehenderit labore. Ad ea dolore anim proident quis reprehenderit quis consectetur ea.\r\n", + "address": "4 Doscher Street", + "city": "Bagtown", + "state": "Palau", + "zip": 32759, + "country": "Denmark", + "email": "coopersampson@scentric.com", + "phone": "(982) 438-3850", + "color": "rgb(248,164,122)" + }, + { + "index": 36, + "name": "Estelle Owen", + "first": "Rosa", + "last": "Velazquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronbeashel/73.jpg", + "expanded": false, + "guid": "bb33bd2d-a4cd-4bf2-a3f7-d82b5e108068", + "integer": 67, + "date": "Fri Jul 11 2003 11:54:17 GMT-0700 (PDT)", + "shortText": "officia consequat proident", + "mediumText": "Ex velit velit mollit consectetur eiusmod in do minim id esse excepteur nulla est. Reprehenderit incididunt deserunt ea excepteur nostrud voluptate nisi exercitation ea excepteur magna deserunt cillum proident. Exercitation minim velit sit fugiat sint ut cillum consectetur ullamco exercitation enim aliqua in aute. Laborum consequat amet aliquip laborum quis.", + "longText": "Non est irure amet eiusmod Lorem nostrud. Tempor est ut nisi nisi ullamco pariatur mollit proident eu magna sit. Amet tempor sint ut deserunt sint cillum aute anim officia mollit ex exercitation ea laborum.\r\nIn proident magna exercitation ut do. Lorem minim cillum do velit amet deserunt incididunt duis adipisicing laboris dolore officia. Sint ea id culpa labore aute sit cillum. Ut ad nisi ex culpa. Aliqua nostrud do culpa incididunt ut eiusmod nulla irure duis reprehenderit cillum. Cupidatat ea est non id cillum non adipisicing et adipisicing veniam cillum dolor ex.\r\n", + "address": "2 Wakeman Place", + "city": "Morgandale", + "state": "Virginia", + "zip": 43228, + "country": "Yemen", + "email": "rosavelazquez@scentric.com", + "phone": "(887) 500-3974", + "color": "rgb(112,251,244)" + }, + { + "index": 37, + "name": "Jamie Clarke", + "first": "Claire", + "last": "Jefferson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jina/73.jpg", + "expanded": false, + "guid": "44d98ab6-0a88-43f9-8c15-02c24bfe5a10", + "integer": 47, + "date": "Mon Aug 31 1992 20:48:08 GMT-0700 (PDT)", + "shortText": "aliqua nisi excepteur dolore", + "mediumText": "Aliqua ullamco labore occaecat laborum culpa anim exercitation. Deserunt cupidatat tempor id eu cupidatat magna veniam amet aute ea mollit.", + "longText": "Amet cupidatat eiusmod occaecat nostrud eu cillum culpa irure pariatur quis sit in. Ea id anim tempor duis sunt cillum veniam laborum culpa occaecat reprehenderit do commodo minim. Dolor aliquip cillum magna Lorem aliqua exercitation officia nisi id voluptate esse. Laborum occaecat velit deserunt tempor laboris sunt duis incididunt tempor dolore. Aliquip magna amet culpa culpa reprehenderit veniam commodo dolor fugiat commodo eu. Adipisicing veniam ipsum irure quis consectetur voluptate enim officia.\r\nNon occaecat proident nostrud do cillum ipsum tempor sit magna qui. Cupidatat Lorem aliqua adipisicing mollit. Consequat sint do pariatur est. Minim laborum duis eiusmod do do do qui Lorem. Labore anim laborum do fugiat tempor ut. Aliqua culpa id aliqua velit Lorem do consectetur consequat sunt aliqua.\r\n", + "address": "2 Jerome Avenue", + "city": "Cliff", + "state": "Wyoming", + "zip": 10308, + "country": "Laos", + "email": "clairejefferson@scentric.com", + "phone": "(897) 481-2359", + "color": "rgb(219,64,230)" + }, + { + "index": 38, + "name": "Louella Vincent", + "first": "Frieda", + "last": "Butler", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gu5taf/73.jpg", + "expanded": false, + "guid": "8169ff1e-f098-4cf7-9e00-35457f189340", + "integer": 65, + "date": "Mon Sep 09 2013 00:02:00 GMT-0700 (PDT)", + "shortText": "qui cupidatat sit velit", + "mediumText": "Sunt ad et exercitation aliqua consectetur commodo commodo adipisicing magna irure. Duis sint non duis ipsum pariatur ut pariatur dolor cillum anim et mollit laboris minim.", + "longText": "Excepteur enim laborum eiusmod exercitation aute id veniam non et ullamco. Ipsum veniam adipisicing non dolor id ad quis ex. Ipsum aliquip excepteur sunt irure adipisicing enim exercitation irure minim proident nulla ipsum id nulla. Adipisicing est do aliquip esse consectetur ipsum minim exercitation pariatur. Elit irure eiusmod commodo voluptate proident veniam quis do aliquip commodo. Amet labore incididunt exercitation commodo dolore officia ipsum ea non irure occaecat voluptate pariatur. Pariatur dolore do occaecat Lorem enim culpa cillum adipisicing incididunt labore.\r\nFugiat veniam ut culpa adipisicing cupidatat exercitation ea laboris consectetur reprehenderit nulla eiusmod ut. Tempor in non esse labore dolore labore qui duis. Duis esse consequat ex duis ea dolore voluptate id exercitation sunt eiusmod pariatur nisi ut. Excepteur amet et eu magna et.\r\nReprehenderit occaecat sunt elit cupidatat. Nostrud cupidatat id fugiat fugiat veniam mollit nostrud cillum. Laboris est ut esse cillum. Aute tempor ex veniam qui culpa deserunt mollit enim commodo velit eu. Et in adipisicing veniam sint id duis sint nulla. Ad voluptate aliquip consectetur commodo in. Exercitation ea sint non exercitation labore esse cillum.\r\nFugiat deserunt reprehenderit aliquip officia exercitation labore cupidatat pariatur aliqua in Lorem. Amet aliquip excepteur laborum do eiusmod aliqua minim anim dolore elit. Elit aute ex fugiat mollit excepteur.\r\n", + "address": "3 Rockwell Place", + "city": "Grimsley", + "state": "Colorado", + "zip": 38741, + "country": "Sierra Leone", + "email": "friedabutler@scentric.com", + "phone": "(867) 520-2422", + "color": "rgb(159,133,82)" + }, + { + "index": 39, + "name": "Schultz Rosario", + "first": "Juliana", + "last": "Gutierrez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/antonkudin/73.jpg", + "expanded": false, + "guid": "c238f75a-9f6d-41fe-bfc7-7035f020fdfa", + "integer": 62, + "date": "Tue Sep 13 1988 04:52:35 GMT-0700 (PDT)", + "shortText": "enim", + "mediumText": "Esse mollit anim dolore tempor qui aliqua Lorem. Eu adipisicing culpa nisi est commodo fugiat minim aute deserunt officia sint cillum.", + "longText": "Mollit enim deserunt aliqua nisi officia consectetur. Nostrud et ipsum eiusmod et. Proident nisi magna adipisicing occaecat consequat ut officia ea nisi proident voluptate duis commodo in. Aliquip velit fugiat Lorem ad est quis eiusmod consectetur dolore laborum voluptate minim nisi et. Pariatur non et elit laboris adipisicing reprehenderit laboris nisi. Ut laborum sint consectetur tempor excepteur in velit voluptate dolor ipsum consequat nisi.\r\nNon excepteur incididunt culpa incididunt et pariatur excepteur voluptate commodo esse. Commodo eiusmod duis ut cupidatat sint fugiat nisi ad anim enim. Pariatur qui ad aute deserunt do irure non quis et excepteur ullamco eu laboris. Qui enim velit minim tempor irure duis.\r\nQui id minim ullamco ex est elit Lorem aliqua officia ut cillum. Voluptate aute do qui pariatur nisi deserunt eu. Officia incididunt sit cillum consectetur anim fugiat sit et ad est tempor nulla fugiat mollit.\r\nEx magna ex do aute non esse excepteur. Est excepteur voluptate eiusmod eu esse ad eiusmod nisi ad. Quis irure laboris est fugiat aute culpa deserunt non ut mollit ea nisi occaecat enim.\r\nQuis dolore amet quis exercitation reprehenderit proident nisi excepteur veniam occaecat ipsum. Consectetur ad elit do quis mollit pariatur deserunt. Culpa qui cillum nulla incididunt incididunt ad nostrud duis. Deserunt pariatur non consequat sint occaecat ad dolor in mollit deserunt nulla laboris. Do eiusmod aute proident nulla eiusmod sunt voluptate.\r\n", + "address": "3 Loring Avenue", + "city": "Mulberry", + "state": "Utah", + "zip": 65299, + "country": "Nigeria", + "email": "julianagutierrez@scentric.com", + "phone": "(968) 541-2220", + "color": "rgb(102,250,175)" + }, + { + "index": 40, + "name": "April Mejia", + "first": "Mallory", + "last": "Gross", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/derekebradley/73.jpg", + "expanded": false, + "guid": "09c07ac9-6428-420c-9244-e97b458cef1c", + "integer": 95, + "date": "Mon Oct 10 1977 19:43:28 GMT-0700 (PDT)", + "shortText": "eiusmod voluptate eiusmod exercitation", + "mediumText": "Esse est laboris sint commodo enim ut fugiat excepteur pariatur eiusmod cillum. Occaecat occaecat cupidatat et occaecat do Lorem. Ad culpa sint magna tempor ex magna. Eu fugiat nisi exercitation sit ex in ad est occaecat officia ullamco pariatur non. Sit esse consequat deserunt enim.", + "longText": "Id pariatur ullamco officia excepteur. Excepteur occaecat nulla magna excepteur Lorem in laboris proident veniam veniam Lorem sint pariatur labore. Anim incididunt sint ea eiusmod tempor magna sit ullamco. Pariatur cillum id ullamco mollit tempor aute pariatur reprehenderit quis nulla quis elit. Irure duis voluptate consectetur ex anim ad. Ipsum do labore mollit commodo et cillum dolore est labore amet amet esse est. Duis et minim anim non magna sit incididunt aute consequat occaecat voluptate esse aliqua in.\r\nSint officia ad occaecat reprehenderit et velit eu consequat et esse. Occaecat et deserunt aute nulla aliqua occaecat eiusmod fugiat irure ut dolore incididunt. Ea magna magna velit consequat commodo id aliqua ad pariatur minim laborum ad.\r\nExercitation id reprehenderit enim consequat ea sunt labore cillum. Lorem tempor eiusmod elit amet velit incididunt occaecat. Amet aute tempor ea eu nostrud est velit. Amet est do duis ut do Lorem sint amet eiusmod.\r\nIrure mollit exercitation eu non. Labore ullamco do amet occaecat aute consectetur voluptate. Quis esse cillum laborum mollit exercitation. Officia quis consectetur cillum fugiat ullamco exercitation non dolore voluptate aute ex id. Ad culpa nisi quis non voluptate amet cillum in. Laborum occaecat ad aliquip aute veniam adipisicing non proident consequat voluptate commodo.\r\nVeniam anim sit officia laboris. Incididunt est ea magna nulla anim magna mollit reprehenderit adipisicing sit. Labore ex et do eu eu. Officia nostrud consectetur proident sint. Cillum dolor dolore consectetur ullamco. Reprehenderit veniam fugiat elit culpa nisi laborum magna. Consequat ea excepteur sint enim exercitation occaecat Lorem nisi culpa deserunt.\r\n", + "address": "2 Crawford Avenue", + "city": "Winchester", + "state": "Idaho", + "zip": 61697, + "country": "Netherlands", + "email": "mallorygross@scentric.com", + "phone": "(822) 493-3031", + "color": "rgb(161,51,155)" + }, + { + "index": 41, + "name": "Vicki Phelps", + "first": "Elsie", + "last": "Hahn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karachentsov/73.jpg", + "expanded": false, + "guid": "1dc69b61-c106-4a7b-83c6-e05dfed45668", + "integer": 88, + "date": "Wed Mar 28 2001 03:43:02 GMT-0800 (PST)", + "shortText": "ipsum eiusmod laboris proident", + "mediumText": "Nisi incididunt in commodo duis culpa voluptate sit laborum. Consectetur do exercitation irure nostrud.", + "longText": "Eu culpa eiusmod do sit aliquip consequat. Consectetur aliquip non culpa id reprehenderit labore non dolore in voluptate voluptate. Nisi in exercitation reprehenderit fugiat duis ea consequat nostrud labore enim ut sit.\r\nAdipisicing eiusmod mollit ipsum dolor et nisi irure elit sunt laboris. Proident tempor incididunt et consectetur fugiat nisi excepteur do nisi irure aliqua. Sit aliqua sint aute ut.\r\nFugiat quis ad nisi sunt consectetur ut ullamco laboris. Ut ea laboris ipsum Lorem eiusmod incididunt. Excepteur minim adipisicing nisi exercitation enim consectetur voluptate sunt. Est consequat irure ipsum ex qui laboris tempor. Commodo duis minim ullamco labore proident minim. Aliqua aliquip cillum dolore qui nostrud. Irure adipisicing mollit tempor occaecat excepteur.\r\nCupidatat nisi adipisicing adipisicing officia consectetur et. Laborum deserunt aute non culpa in ea aliqua sit. Sit esse incididunt qui veniam quis do excepteur exercitation nisi ipsum adipisicing quis. Mollit cupidatat occaecat adipisicing nisi irure pariatur exercitation id esse id tempor sunt. Quis deserunt eiusmod dolore ut esse eu consectetur consectetur ea veniam amet adipisicing nisi. Excepteur voluptate consectetur dolor sint nisi laborum aute eiusmod ea.\r\nNon ex eiusmod dolore est ea exercitation et quis deserunt culpa nostrud aliqua. Qui non qui laboris dolor reprehenderit enim deserunt cupidatat consequat dolore ex. In voluptate pariatur ullamco non laborum velit ea minim cillum consequat eu. Est ullamco proident ad fugiat aliqua occaecat est. Nisi dolore irure velit excepteur aliquip incididunt irure non voluptate.\r\n", + "address": "2 Coles Street", + "city": "Stockwell", + "state": "Arkansas", + "zip": 39778, + "country": "Morocco", + "email": "elsiehahn@scentric.com", + "phone": "(821) 517-2066", + "color": "rgb(63,164,79)" + }, + { + "index": 42, + "name": "Faulkner Mcdaniel", + "first": "Hayes", + "last": "Ball", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmeffess/73.jpg", + "expanded": false, + "guid": "731380cb-785a-4aa3-9e6c-281953a83daf", + "integer": 85, + "date": "Fri Jul 25 1980 06:28:07 GMT-0700 (PDT)", + "shortText": "sunt magna aliquip", + "mediumText": "Pariatur ipsum adipisicing ut quis.", + "longText": "Veniam veniam enim Lorem eu mollit consectetur ea qui est pariatur. Magna occaecat sit est exercitation exercitation irure laboris enim commodo consequat tempor mollit. Id ea elit proident exercitation. Dolore reprehenderit nostrud nostrud exercitation eiusmod nulla.\r\nDo amet duis excepteur ullamco cillum velit. Consectetur adipisicing fugiat non dolore fugiat ipsum qui est elit enim consequat Lorem laboris proident. Aliquip reprehenderit ut reprehenderit anim sunt ex. Adipisicing aliquip sint Lorem minim laborum dolor minim tempor laboris. Exercitation ad aute ullamco ea deserunt adipisicing laborum fugiat proident adipisicing veniam ut veniam laborum. Id reprehenderit labore ea esse ea officia cillum. Sit sunt pariatur cupidatat mollit velit qui ut.\r\nElit mollit do non dolor quis Lorem anim aliqua occaecat aute reprehenderit irure. Sit do labore pariatur id. Anim ad veniam ea Lorem reprehenderit ipsum minim. In elit irure nulla elit elit sit in sunt incididunt magna. Pariatur commodo anim magna ut aliquip nulla nostrud commodo aliquip incididunt commodo est. Nulla enim nostrud qui commodo reprehenderit.\r\n", + "address": "2 Cheever Place", + "city": "Interlochen", + "state": "Delaware", + "zip": 14410, + "country": "Czech Republic", + "email": "hayesball@scentric.com", + "phone": "(875) 561-3839", + "color": "rgb(215,92,182)" + }, + { + "index": 43, + "name": "Wilson Booth", + "first": "Baker", + "last": "Slater", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bmovement/73.jpg", + "expanded": false, + "guid": "4357bfc6-3fa0-41e3-8a7b-0ab1f0a2e139", + "integer": 16, + "date": "Tue Aug 18 1998 18:43:53 GMT-0700 (PDT)", + "shortText": "sunt reprehenderit fugiat in est", + "mediumText": "Exercitation nisi ut enim do incididunt eiusmod cupidatat aliquip occaecat sit occaecat elit consequat sunt. Cupidatat fugiat dolor ea proident ipsum officia exercitation reprehenderit dolore elit.", + "longText": "Et in ipsum duis amet aute qui commodo fugiat eiusmod. Enim veniam nisi non sunt ex esse eiusmod. Non amet et ex cupidatat. Veniam laboris do proident et in reprehenderit incididunt ut velit enim aliqua. Quis adipisicing tempor consequat consequat commodo consequat do. Minim laboris nostrud duis tempor aliqua fugiat pariatur incididunt Lorem nostrud velit ad.\r\nAliquip commodo laborum culpa consequat aliquip voluptate irure sit excepteur reprehenderit enim ullamco veniam do. Minim elit quis laborum eiusmod incididunt proident nostrud do laboris. Deserunt non nostrud minim ut qui proident incididunt est elit pariatur nisi. Eiusmod reprehenderit sit deserunt aliqua aliqua. Reprehenderit id pariatur magna sunt fugiat labore veniam velit pariatur minim occaecat. Nostrud duis est magna ad ad consequat proident ut laboris aliquip. Magna duis est non reprehenderit minim nulla est cupidatat ut officia do sit.\r\nPariatur officia culpa ullamco sunt. Adipisicing amet amet culpa excepteur proident officia. In dolor aliqua nostrud tempor tempor elit tempor exercitation enim sint.\r\nQuis aliqua velit magna ad occaecat minim velit eiusmod ex consequat ad nisi adipisicing. Veniam et culpa sunt ex ad non ut ad in qui magna dolor nostrud incididunt. Aliquip minim elit eu exercitation pariatur irure id non occaecat id id commodo. Ea excepteur et excepteur Lorem eiusmod elit ex laborum labore et cillum cillum. Lorem consequat non culpa eu Lorem do amet nulla velit ullamco cillum.\r\nVelit nisi consectetur dolore amet irure tempor voluptate laborum. Id sit incididunt aute nostrud fugiat adipisicing incididunt excepteur anim sunt et id deserunt. Voluptate incididunt sunt anim enim laboris. Laboris id sit aliqua nisi cillum cupidatat ipsum. Laborum veniam adipisicing velit nulla eu commodo quis do.\r\n", + "address": "2 Arlington Avenue", + "city": "Welda", + "state": "Federated States Of Micronesia", + "zip": 13497, + "country": "Cape Verde", + "email": "bakerslater@scentric.com", + "phone": "(980) 527-2867", + "color": "rgb(98,119,186)" + }, + { + "index": 44, + "name": "Galloway Michael", + "first": "Martha", + "last": "Knight", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taiyab/73.jpg", + "expanded": false, + "guid": "a12acd83-99f7-4c53-8849-e0c0a8aef81f", + "integer": 41, + "date": "Sun Jan 15 2006 04:41:03 GMT-0800 (PST)", + "shortText": "cillum fugiat cupidatat", + "mediumText": "Cupidatat eiusmod nisi commodo aute deserunt ea labore aute aliquip consequat voluptate aliquip aliqua sunt. Culpa cillum ex quis ad in nisi enim.", + "longText": "Enim ad pariatur esse ea officia ullamco consectetur ut adipisicing culpa voluptate Lorem do. Voluptate mollit enim dolore laboris Lorem id in Lorem aliquip mollit. Enim aliquip occaecat amet cupidatat elit dolor officia magna qui aute sit. In elit tempor pariatur sunt velit ad anim laboris do dolor et nisi anim voluptate. Proident aliquip anim veniam cillum ullamco laborum. Adipisicing occaecat voluptate deserunt ad consequat fugiat laborum aute fugiat deserunt exercitation incididunt. In do tempor amet excepteur non enim tempor excepteur reprehenderit anim sit aute.\r\nAmet ea est dolor adipisicing sit occaecat occaecat incididunt commodo. Veniam officia esse excepteur excepteur nostrud deserunt elit minim amet eu quis non. Quis duis tempor pariatur aute. Anim anim tempor in nisi Lorem do do adipisicing. Exercitation fugiat elit nisi nostrud aliquip id cillum exercitation elit non cupidatat. Irure ea nulla quis aliquip nulla ex exercitation est velit eiusmod.\r\nDeserunt aute nisi exercitation sunt aliquip aute proident incididunt dolor commodo non pariatur mollit laborum. Minim tempor deserunt labore non sit duis culpa. Commodo velit duis quis aliqua fugiat sit sint labore magna officia sunt eiusmod magna. Deserunt est nisi ad fugiat consectetur commodo voluptate amet nulla sit. Incididunt do adipisicing irure minim eiusmod aliqua et pariatur pariatur tempor irure.\r\n", + "address": "4 Willoughby Street", + "city": "Calverton", + "state": "Guam", + "zip": 21650, + "country": "Madagascar", + "email": "marthaknight@scentric.com", + "phone": "(893) 423-2241", + "color": "rgb(87,159,93)" + }, + { + "index": 45, + "name": "Mcintosh Evans", + "first": "Slater", + "last": "Erickson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rigelstpierre/73.jpg", + "expanded": false, + "guid": "1fa2a893-38af-4f5a-8580-a8a20f0edffe", + "integer": 89, + "date": "Wed Sep 03 2003 04:11:03 GMT-0700 (PDT)", + "shortText": "eiusmod in labore id", + "mediumText": "Cillum labore pariatur in occaecat eu. Ipsum reprehenderit occaecat ipsum in id velit pariatur ut duis. Dolor esse dolor eiusmod est duis. Elit nulla commodo cillum proident tempor anim qui nulla laboris cillum occaecat consequat.", + "longText": "Id qui sunt excepteur Lorem in occaecat id. Culpa eu dolore cupidatat cillum labore aute officia. Cupidatat ex dolore excepteur aliqua sunt elit qui excepteur sit amet sint adipisicing dolore.\r\nSint consequat ullamco exercitation anim et commodo. Mollit ad aute dolor in veniam tempor ullamco nisi ex id cupidatat incididunt. Veniam cupidatat et enim aliqua laboris officia. Dolor ipsum excepteur elit enim ipsum enim est labore do amet duis cupidatat aliqua. Officia occaecat in ex enim officia id culpa sint. Aliquip magna duis ut ea aliquip duis non ad.\r\nDolor mollit exercitation reprehenderit commodo sunt aute commodo aliquip. Aute qui culpa aliquip magna in enim occaecat quis. Proident magna sunt do tempor. Minim laboris aliqua esse culpa anim. Eu laborum ut ea nostrud excepteur laboris. Velit veniam nostrud deserunt incididunt sit incididunt Lorem cillum enim ullamco ipsum cupidatat ea laborum.\r\n", + "address": "4 Meeker Avenue", + "city": "Mansfield", + "state": "Pennsylvania", + "zip": 64998, + "country": "Austria", + "email": "slatererickson@scentric.com", + "phone": "(916) 568-2718", + "color": "rgb(61,216,133)" + }, + { + "index": 46, + "name": "Garrison Conway", + "first": "Beck", + "last": "Potts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vlajki/73.jpg", + "expanded": false, + "guid": "f4aa8b8b-f3b1-4a47-9625-0213a3ab6e8d", + "integer": 90, + "date": "Thu Jun 21 1979 14:10:02 GMT-0700 (PDT)", + "shortText": "adipisicing irure", + "mediumText": "Elit do ipsum sint qui non nulla laborum aute.", + "longText": "Sint voluptate ad irure laborum. Aliqua incididunt dolore do irure enim aliquip non officia sunt nisi consectetur. Ex laborum reprehenderit dolore laborum voluptate sit adipisicing consequat adipisicing culpa nisi ipsum anim aliqua. In est fugiat officia ullamco velit ut duis sit sint anim ex minim cupidatat. Commodo incididunt cillum non adipisicing tempor. Pariatur adipisicing dolore ut aliqua magna non amet.\r\nUt ex id enim cillum veniam consectetur ipsum sit cillum. Adipisicing qui cillum mollit consequat nulla quis elit nostrud et. Cillum dolore non voluptate magna qui officia. Lorem in quis incididunt dolore ut. Adipisicing do id fugiat elit ullamco pariatur culpa nisi.\r\nCommodo culpa dolore aliqua ex ex mollit minim. Duis cupidatat ipsum sunt quis amet est minim aute Lorem non proident. Duis cillum Lorem quis velit.\r\nTempor incididunt reprehenderit eiusmod adipisicing amet exercitation. Duis occaecat eu consequat ea officia occaecat enim Lorem ullamco. Non commodo cillum sunt amet nulla ex officia ut duis sunt. Enim minim anim minim anim non minim ad magna tempor Lorem. Enim cupidatat nostrud in sunt officia occaecat esse cupidatat. Sint veniam ullamco qui consectetur duis fugiat pariatur ad proident mollit.\r\nAd consectetur elit aute sit nostrud. Culpa non esse non nostrud id anim nulla aute in laboris id duis magna cillum. Sunt cillum ut id laborum tempor reprehenderit excepteur ut velit aliqua ad ipsum ut incididunt. Eiusmod qui quis ea deserunt excepteur amet culpa eiusmod eiusmod.\r\n", + "address": "3 Troy Avenue", + "city": "Witmer", + "state": "New Hampshire", + "zip": 85501, + "country": "Venezuela", + "email": "beckpotts@scentric.com", + "phone": "(865) 596-2021", + "color": "rgb(156,172,221)" + }, + { + "index": 47, + "name": "Hopper Anthony", + "first": "Pugh", + "last": "Douglas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/leeiio/73.jpg", + "expanded": false, + "guid": "d522fa57-486b-4ca9-9ee2-f4bddc8d8db0", + "integer": 32, + "date": "Wed Mar 16 1988 07:04:05 GMT-0800 (PST)", + "shortText": "ullamco sit elit", + "mediumText": "Nisi fugiat irure amet fugiat. Commodo ut nisi dolore cillum officia culpa. Veniam in duis aliquip voluptate do pariatur nostrud cupidatat amet consectetur reprehenderit id dolore. Anim adipisicing mollit ut enim aliqua ex elit aute ea culpa mollit. Sit cillum ut excepteur officia ullamco irure aute culpa elit.", + "longText": "Quis non cillum et sit enim culpa tempor. Veniam velit eu dolor pariatur in aute. Et tempor Lorem ad velit fugiat Lorem sunt aliqua exercitation laboris ad.\r\nExcepteur laboris et magna ea nostrud ut cillum. Exercitation anim cupidatat magna non pariatur id enim esse ullamco adipisicing deserunt anim. Duis sint nisi est voluptate deserunt proident anim nisi consequat labore culpa aliqua. Sit amet consequat ad occaecat cupidatat tempor eiusmod nostrud Lorem magna labore mollit in.\r\nPariatur qui anim culpa ex. In nostrud aliqua non adipisicing. Quis labore magna aliqua magna.\r\nAute commodo consectetur elit minim exercitation eiusmod non commodo. Aute deserunt non quis ullamco culpa ex et mollit nisi dolor. Minim amet eiusmod mollit esse Lorem eu reprehenderit nisi cillum eiusmod fugiat nostrud tempor duis. Officia quis commodo pariatur esse excepteur officia. In non incididunt aliquip mollit dolore ex labore.\r\nExcepteur commodo eu proident fugiat nulla. Minim excepteur consequat officia esse dolore irure qui anim culpa in deserunt consectetur laborum in. Exercitation in esse ad aliquip commodo. Irure duis pariatur eiusmod culpa enim mollit tempor Lorem qui proident ad. Qui exercitation elit culpa ex non dolor do pariatur proident. Anim ut velit minim voluptate labore in commodo excepteur irure proident amet officia cupidatat.\r\n", + "address": "3 Madoc Avenue", + "city": "Norfolk", + "state": "North Dakota", + "zip": 73808, + "country": "Hong Kong", + "email": "pughdouglas@scentric.com", + "phone": "(829) 562-3502", + "color": "rgb(70,112,74)" + }, + { + "index": 48, + "name": "Edwina Wiley", + "first": "Margo", + "last": "Hodges", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brad_frost/73.jpg", + "expanded": false, + "guid": "363f5f6a-2d42-4e87-845c-7cf7b881d3fa", + "integer": 26, + "date": "Fri Dec 07 2012 11:20:25 GMT-0800 (PST)", + "shortText": "fugiat fugiat", + "mediumText": "Ex commodo sit quis commodo fugiat Lorem aliquip mollit fugiat mollit veniam.", + "longText": "Ea ea aliquip consectetur in labore eu fugiat voluptate nisi ipsum sunt. Occaecat id sit qui officia culpa laboris. Deserunt aliqua duis est sint.\r\nProident consequat occaecat cillum occaecat occaecat adipisicing laboris exercitation sit ut non dolor culpa consectetur. Ipsum ex reprehenderit veniam aliquip esse. Est commodo tempor fugiat id laborum duis do fugiat magna eiusmod eiusmod. Sit sit est anim officia consequat Lorem commodo qui velit duis. Adipisicing ipsum mollit ipsum in deserunt adipisicing ad culpa dolore. Nisi excepteur consectetur id proident fugiat proident reprehenderit magna.\r\nConsectetur duis ipsum occaecat culpa sit in. Tempor elit amet est Lorem elit consectetur fugiat tempor magna. Nulla ullamco incididunt cillum quis ea. Voluptate officia officia officia sint quis cillum sit est. Aliquip non laborum et laboris in velit dolore mollit ad dolor velit amet ut laboris. Cillum sunt irure in in eu do ullamco.\r\n", + "address": "3 Vernon Avenue", + "city": "Yettem", + "state": "Northern Mariana Islands", + "zip": 84068, + "country": "Sri Lanka", + "email": "margohodges@scentric.com", + "phone": "(852) 558-3074", + "color": "rgb(56,222,148)" + }, + { + "index": 49, + "name": "Salazar Nolan", + "first": "Polly", + "last": "Mitchell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alsobrooks/73.jpg", + "expanded": false, + "guid": "36295fa8-495e-4763-b920-b8e8d9e90105", + "integer": 28, + "date": "Mon May 08 2006 04:34:39 GMT-0700 (PDT)", + "shortText": "aliquip id commodo pariatur eu", + "mediumText": "Amet fugiat nisi ut eiusmod enim. Et id mollit voluptate dolore laborum cillum qui est laborum duis fugiat.", + "longText": "Qui cillum proident id irure quis sit. Sit nisi et fugiat amet exercitation eiusmod esse enim pariatur cupidatat. Esse proident velit reprehenderit fugiat.\r\nNostrud dolore eiusmod aliquip pariatur labore duis veniam laboris velit duis proident excepteur veniam. Proident fugiat velit nisi aute veniam. Irure pariatur ex eu tempor veniam nisi et eiusmod anim mollit dolore ad ex.\r\nEu quis dolor sit amet ut consequat magna nostrud quis sit. Laboris aliqua consectetur sit tempor consectetur aliqua exercitation officia minim magna duis. Laborum eu ut veniam magna. Nisi enim cillum adipisicing sint ex. Magna proident labore sint aliquip aute. Ut nulla exercitation laboris qui nulla do adipisicing voluptate do. Nulla ullamco nulla dolore cupidatat duis ea aute est ullamco.\r\n", + "address": "4 Pilling Street", + "city": "Rushford", + "state": "South Dakota", + "zip": 48734, + "country": "Turkmenistan", + "email": "pollymitchell@scentric.com", + "phone": "(891) 598-2904", + "color": "rgb(119,240,183)" + }, + { + "index": 50, + "name": "Pat Delgado", + "first": "Brown", + "last": "Perkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thekishpatel/73.jpg", + "expanded": false, + "guid": "ec3986d2-8262-464b-bb60-352b533f186f", + "integer": 76, + "date": "Thu Jul 17 1975 16:18:22 GMT-0700 (PDT)", + "shortText": "voluptate est labore", + "mediumText": "Duis incididunt velit nulla consectetur ut labore. Ipsum culpa consectetur quis id velit nulla mollit cupidatat magna veniam consequat. Qui elit laboris veniam amet tempor Lorem dolore. Ex voluptate officia magna ipsum nulla eu Lorem.", + "longText": "Aute proident cupidatat laboris qui officia velit amet nostrud. Aliquip cupidatat sit pariatur ut id sint duis proident laborum sint aliquip. Qui cupidatat labore quis et ut magna fugiat laboris commodo proident ad ut. Consequat aute incididunt proident in cupidatat quis nisi exercitation. Et proident qui et occaecat ea minim.\r\nMinim ex do veniam do. Aliqua commodo minim dolore voluptate ullamco ea. Aliquip ad esse aliqua exercitation laboris qui incididunt dolore eu ut.\r\n", + "address": "3 Ash Street", + "city": "Loyalhanna", + "state": "Alaska", + "zip": 49922, + "country": "Burundi", + "email": "brownperkins@scentric.com", + "phone": "(908) 488-3939", + "color": "rgb(100,214,126)" + }, + { + "index": 51, + "name": "York Marks", + "first": "Janette", + "last": "Cherry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iqonicd/73.jpg", + "expanded": false, + "guid": "0da3bbca-40ca-4a5d-ab2d-dc983c50ed75", + "integer": 20, + "date": "Sat May 08 2004 23:04:24 GMT-0700 (PDT)", + "shortText": "occaecat velit fugiat dolor", + "mediumText": "Ea non aute incididunt proident sit enim officia. Ad ea eiusmod ex nisi qui duis non consectetur amet minim. Lorem magna tempor consectetur qui reprehenderit nostrud officia incididunt.", + "longText": "Anim dolore minim consequat pariatur non veniam consequat veniam et exercitation mollit eu deserunt. Duis irure duis et cillum nisi sint sit velit. Duis Lorem ut aliqua eu ullamco Lorem proident pariatur aliqua velit amet voluptate.\r\nVeniam dolore velit proident qui sint anim ea. Id ea id Lorem laborum ea aute nulla tempor elit laboris laboris nulla veniam. Laborum duis reprehenderit aute ipsum. Cillum anim nostrud dolore id ex cillum excepteur officia ipsum elit do. Veniam officia duis do consectetur sunt exercitation reprehenderit.\r\nVelit pariatur sunt enim magna elit ex ex excepteur ex id. Aliquip et amet anim non non minim veniam. Ut aliqua non exercitation commodo culpa pariatur sunt do ea.\r\nEu commodo enim pariatur pariatur. Velit anim esse irure ea id qui duis nostrud anim amet. Do enim ut aliquip elit laboris dolor culpa culpa voluptate irure ex. Est labore officia qui est incididunt proident laborum excepteur ullamco cupidatat. Velit dolore aute non dolore voluptate nisi. In id ullamco consectetur incididunt Lorem ullamco.\r\n", + "address": "3 Hubbard Street", + "city": "Beason", + "state": "Louisiana", + "zip": 10084, + "country": "Western Sahara", + "email": "janettecherry@scentric.com", + "phone": "(828) 500-2593", + "color": "rgb(100,221,172)" + }, + { + "index": 52, + "name": "Wilkinson Nelson", + "first": "Florine", + "last": "Hobbs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamlechev/73.jpg", + "expanded": false, + "guid": "4fdb5837-9e84-4ee7-8c11-0bba68a3b621", + "integer": 20, + "date": "Sun Feb 26 2012 16:07:03 GMT-0800 (PST)", + "shortText": "veniam nulla incididunt", + "mediumText": "Officia amet incididunt enim duis veniam velit aute incididunt esse qui consequat. Sit nostrud tempor minim nulla excepteur est aliquip dolor esse.", + "longText": "Pariatur commodo tempor laboris nulla minim ut nostrud nostrud in non incididunt exercitation. Pariatur enim deserunt ad dolore ut laborum cupidatat et elit ullamco voluptate eiusmod. Anim labore incididunt voluptate nulla officia dolore ipsum culpa est cupidatat laborum proident.\r\n", + "address": "2 Dodworth Street", + "city": "Hall", + "state": "Missouri", + "zip": 21320, + "country": "Mozambique", + "email": "florinehobbs@scentric.com", + "phone": "(869) 544-3589", + "color": "rgb(208,253,152)" + }, + { + "index": 53, + "name": "Alta Wright", + "first": "Farley", + "last": "Santos", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elliotpopel/73.jpg", + "expanded": false, + "guid": "19c307c0-cabb-4ab4-8b5e-857bf94a4838", + "integer": 46, + "date": "Tue Nov 27 1973 17:48:13 GMT-0800 (PST)", + "shortText": "do mollit", + "mediumText": "Proident irure in sunt id proident. Incididunt ipsum enim cupidatat nisi qui occaecat qui esse sint mollit nulla. Officia ad eiusmod eu consectetur occaecat mollit culpa deserunt qui exercitation mollit. Duis elit dolore occaecat Lorem sit minim consectetur qui culpa. Aliqua aute irure cupidatat commodo proident labore do aliqua aliquip officia.", + "longText": "Sunt aliqua laborum enim ipsum consequat adipisicing eu consequat labore sit cillum proident veniam proident. Et et sunt commodo aute nostrud mollit labore. Consequat in eu labore in incididunt officia esse mollit in minim minim mollit duis. Enim ea anim do voluptate eiusmod ut qui velit nostrud deserunt mollit.\r\nCommodo amet duis magna deserunt eu nulla eu sunt pariatur aliqua laborum cupidatat esse in. Quis do mollit nulla eiusmod exercitation. Ea eiusmod dolore minim sunt est irure minim non exercitation dolor veniam duis.\r\nIncididunt qui ex aliqua commodo qui aliquip duis. Ea dolore est duis esse sint nisi aliqua exercitation aute aliqua. Enim deserunt laboris eu eu duis nisi eu sint. Mollit est eu cillum excepteur id sit labore occaecat culpa minim adipisicing magna nulla.\r\nAd minim exercitation sunt nostrud quis. Fugiat quis officia officia irure aute eiusmod. Quis in officia do dolore duis duis. Veniam ipsum aute mollit officia pariatur deserunt. Reprehenderit adipisicing ipsum ut qui ex cupidatat sunt id nostrud reprehenderit. Eu incididunt magna duis et nisi minim exercitation laboris nisi. Adipisicing consectetur occaecat enim ad nisi voluptate ut aliquip ea labore do nulla laboris.\r\n", + "address": "3 Hanson Place", + "city": "Madaket", + "state": "Kentucky", + "zip": 95242, + "country": "Grenada", + "email": "farleysantos@scentric.com", + "phone": "(808) 507-2955", + "color": "rgb(143,68,160)" + }, + { + "index": 54, + "name": "Ivy Sparks", + "first": "Gray", + "last": "Paul", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/diesellaws/73.jpg", + "expanded": false, + "guid": "13f75baf-1bd4-4e7d-b527-a007260fe0bf", + "integer": 12, + "date": "Thu May 18 2000 12:52:37 GMT-0700 (PDT)", + "shortText": "laborum veniam ipsum", + "mediumText": "Consequat sit labore esse culpa ex officia eu enim ad sit. Deserunt consequat magna anim adipisicing eu est ipsum mollit est in. Proident et excepteur consectetur cupidatat eu aute ea magna amet qui ea culpa.", + "longText": "Dolore laborum anim sunt ea. Incididunt velit velit Lorem incididunt reprehenderit ea. Cupidatat esse laborum consectetur minim eiusmod nostrud occaecat. Elit esse cupidatat culpa tempor dolor laboris ad.\r\nIpsum ad veniam laboris eiusmod deserunt esse qui ullamco culpa magna sunt cupidatat ad. In pariatur aliquip voluptate quis voluptate qui. Minim ea velit excepteur eiusmod Lorem id consectetur tempor ex occaecat laboris ut tempor officia. Sunt irure exercitation ipsum sint elit amet duis irure.\r\n", + "address": "2 Conklin Avenue", + "city": "Sardis", + "state": "American Samoa", + "zip": 99662, + "country": "Cote D'Ivoire (Ivory Coast)", + "email": "graypaul@scentric.com", + "phone": "(896) 543-3314", + "color": "rgb(180,93,104)" + }, + { + "index": 55, + "name": "Henrietta Riddle", + "first": "Roman", + "last": "Dunlap", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/juanpablob/73.jpg", + "expanded": false, + "guid": "51bc59d2-dab6-443d-98ea-8171f77ad676", + "integer": 79, + "date": "Mon Oct 22 2007 23:28:02 GMT-0700 (PDT)", + "shortText": "sit", + "mediumText": "Est ex duis aliqua in adipisicing enim eu eiusmod consectetur. Reprehenderit nostrud aliquip sit nulla proident eu reprehenderit et minim do. Eiusmod laborum dolor ipsum exercitation nisi amet labore eu do laboris labore. Ad enim ut sunt anim reprehenderit culpa reprehenderit duis ullamco mollit.", + "longText": "Anim commodo voluptate eu voluptate voluptate sunt ipsum irure ipsum mollit cillum anim anim reprehenderit. Nulla ut reprehenderit enim occaecat consequat. Cupidatat Lorem eu qui id id adipisicing incididunt et cillum. Id enim sit cupidatat nulla ut enim consequat est sit sit culpa. Labore do consectetur pariatur qui labore proident dolor consectetur pariatur sit do tempor Lorem dolore. Et incididunt sint aliquip occaecat non dolor aute ea.\r\n", + "address": "2 Anna Court", + "city": "Stollings", + "state": "Minnesota", + "zip": 49877, + "country": "Philippines", + "email": "romandunlap@scentric.com", + "phone": "(852) 477-2611", + "color": "rgb(73,51,135)" + }, + { + "index": 56, + "name": "Odom Hicks", + "first": "Meyer", + "last": "Blackburn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/whale/73.jpg", + "expanded": false, + "guid": "5cd1a911-4464-4653-9db3-05e55a0f306b", + "integer": 20, + "date": "Mon Jul 24 1978 17:22:48 GMT-0700 (PDT)", + "shortText": "excepteur ex cupidatat ipsum", + "mediumText": "Proident excepteur nostrud sint voluptate ad sint. Exercitation commodo amet nostrud occaecat sunt officia nulla eu. Adipisicing enim velit officia proident sint minim laboris magna officia laborum do occaecat pariatur laboris. Commodo minim ipsum anim amet esse deserunt in ea ad.", + "longText": "Incididunt est pariatur est culpa dolor duis dolore sunt duis dolor qui laboris. Aliqua dolore nostrud dolor commodo esse ex laborum proident et anim. Ut consectetur in minim minim officia mollit id quis. Tempor aliqua dolore esse culpa.\r\nNostrud duis est minim pariatur reprehenderit in qui do nulla non id. Incididunt magna enim reprehenderit incididunt magna tempor duis esse sunt esse commodo. Nulla ex anim laborum laboris. Culpa officia anim reprehenderit ex laboris labore proident exercitation deserunt deserunt ipsum ea esse et. Laborum laborum eiusmod Lorem consectetur consequat. Aute tempor voluptate laboris pariatur amet esse ut labore dolore sint qui. Occaecat aliqua excepteur sit labore.\r\n", + "address": "3 Bleecker Street", + "city": "Albrightsville", + "state": "Hawaii", + "zip": 67670, + "country": "Bermuda", + "email": "meyerblackburn@scentric.com", + "phone": "(812) 415-2585", + "color": "rgb(132,80,57)" + }, + { + "index": 57, + "name": "Dalton Bishop", + "first": "Schwartz", + "last": "Garcia", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kalmerrautam/73.jpg", + "expanded": false, + "guid": "cb6c4011-ab62-4469-bdd6-120762fbd8dc", + "integer": 31, + "date": "Thu Aug 29 2013 04:23:49 GMT-0700 (PDT)", + "shortText": "irure cupidatat adipisicing", + "mediumText": "Elit esse aute dolor officia cupidatat adipisicing duis fugiat aliqua nisi nisi. Culpa reprehenderit consequat voluptate proident in deserunt tempor sint amet ad pariatur. Mollit incididunt magna ullamco deserunt commodo excepteur esse esse commodo duis elit est duis. Sunt amet nisi dolor id laboris dolor exercitation ex exercitation proident pariatur anim. Duis nisi occaecat fugiat tempor sint est incididunt laboris cillum consectetur non cillum.", + "longText": "Eu esse Lorem veniam et dolor. Ad laboris exercitation adipisicing voluptate culpa ullamco ad non sunt ad veniam sit officia consequat. Est ea fugiat consectetur duis aliquip id in reprehenderit. Tempor officia enim tempor aliqua eu. Ut tempor duis minim ea eu proident. Nisi non eiusmod do tempor proident et commodo nisi nisi occaecat. Ullamco cupidatat eiusmod ex magna cillum nisi est.\r\nNisi consequat qui reprehenderit laboris dolor esse Lorem officia dolore ipsum exercitation do. Nulla nulla eiusmod nostrud incididunt ad elit ea non eiusmod incididunt reprehenderit culpa minim. Sint aliqua magna aliquip et magna. Fugiat ut voluptate irure aliquip consequat ut exercitation minim amet enim culpa.\r\nCulpa est pariatur aliquip non amet eu elit veniam Lorem velit nulla aute. Excepteur do commodo minim eu commodo dolore. Ex dolore ea irure adipisicing Lorem labore. Ipsum sit consequat aliquip tempor est. Labore deserunt incididunt et occaecat dolore est laborum exercitation exercitation dolore. Fugiat ipsum est proident anim ullamco ipsum labore fugiat consequat velit. Anim elit cillum ex laborum ad exercitation voluptate ad magna Lorem voluptate tempor.\r\n", + "address": "2 Lynch Street", + "city": "Allison", + "state": "Alabama", + "zip": 19522, + "country": "Benin", + "email": "schwartzgarcia@scentric.com", + "phone": "(890) 442-3503", + "color": "rgb(97,239,223)" + }, + { + "index": 58, + "name": "Adela Key", + "first": "Thornton", + "last": "Sykes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicoleglynn/73.jpg", + "expanded": false, + "guid": "8b7914e5-a64e-4c6a-aa82-b62d133a71b4", + "integer": 13, + "date": "Fri Jul 22 1983 16:03:00 GMT-0700 (PDT)", + "shortText": "nisi laboris duis ullamco", + "mediumText": "Aute aliqua adipisicing adipisicing nisi anim veniam adipisicing commodo. Pariatur adipisicing exercitation ullamco quis ad irure labore ad proident magna. Ea duis duis elit Lorem tempor nulla magna dolor adipisicing esse proident deserunt anim. Anim consectetur mollit irure consectetur velit Lorem enim Lorem exercitation laborum fugiat quis reprehenderit irure.", + "longText": "Minim occaecat consequat pariatur pariatur elit amet. Ex nostrud amet in cillum esse id laborum do velit. Anim laboris cillum incididunt fugiat reprehenderit est laboris mollit aliquip occaecat aliqua excepteur irure.\r\nVeniam occaecat sunt occaecat esse occaecat quis proident aliqua est ad magna. Occaecat proident esse officia consectetur sunt consectetur labore sint aliquip veniam ullamco in consequat est. Eiusmod labore amet id nulla tempor ad.\r\nDeserunt anim ea duis eu laborum aliqua exercitation. Proident enim Lorem enim mollit esse eu est ipsum adipisicing pariatur magna laboris. Excepteur exercitation labore ut qui velit do nulla. Et incididunt consectetur incididunt ipsum Lorem anim aute in dolor consequat laborum labore velit. Adipisicing duis voluptate duis deserunt dolore. Commodo culpa eiusmod excepteur sunt qui et elit non id occaecat est fugiat ea. Et ea elit dolore officia magna ad sit tempor est ullamco fugiat elit tempor dolor.\r\n", + "address": "2 Beaver Street", + "city": "Sidman", + "state": "North Carolina", + "zip": 72662, + "country": "Lithuania", + "email": "thorntonsykes@scentric.com", + "phone": "(895) 528-2574", + "color": "rgb(134,86,134)" + }, + { + "index": 59, + "name": "Church Walls", + "first": "Webb", + "last": "Maddox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rickdt/73.jpg", + "expanded": false, + "guid": "446ed374-2f83-4fc6-933b-60892c7e61f6", + "integer": 97, + "date": "Fri Jun 11 1993 04:18:26 GMT-0700 (PDT)", + "shortText": "officia sint amet aute aliquip", + "mediumText": "Consectetur reprehenderit duis dolor duis sint adipisicing elit anim incididunt labore aliquip enim sit adipisicing.", + "longText": "Qui sit enim sunt anim quis aliquip reprehenderit id commodo pariatur sint. Ex aliquip quis voluptate id incididunt. Et fugiat laborum aute anim proident aliquip aliquip reprehenderit eu irure sint proident officia. Ipsum in commodo sint enim consectetur aliqua laboris ea proident ex. Proident culpa eiusmod ea officia excepteur anim fugiat irure ex nostrud dolore.\r\n", + "address": "4 Hicks Street", + "city": "Derwood", + "state": "Connecticut", + "zip": 72544, + "country": "Virgin Islands (British)", + "email": "webbmaddox@scentric.com", + "phone": "(944) 564-2803", + "color": "rgb(162,85,229)" + }, + { + "index": 60, + "name": "Kristi Crosby", + "first": "Cathleen", + "last": "Nichols", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/funwatercat/73.jpg", + "expanded": false, + "guid": "7a7ad168-8ae8-492d-956e-c2a16f8578e9", + "integer": 92, + "date": "Sun Jan 01 1989 18:01:36 GMT-0800 (PST)", + "shortText": "adipisicing Lorem velit quis", + "mediumText": "Velit esse consequat exercitation eu excepteur officia minim laborum cupidatat officia id ad amet occaecat. Dolor officia qui est ea nisi non.", + "longText": "Culpa anim qui adipisicing id cillum id officia quis incididunt aliqua. Anim excepteur dolore proident amet. Cillum sunt quis pariatur proident esse Lorem eiusmod et eiusmod non. Ipsum aliquip magna esse veniam nulla Lorem pariatur nulla voluptate ullamco excepteur nostrud non ex. Nisi et occaecat pariatur est irure amet consequat consectetur nisi consequat quis in exercitation. Culpa eu amet laborum ullamco do mollit mollit.\r\nIrure aliqua dolore nulla occaecat ipsum minim Lorem dolor Lorem ut. Velit amet laborum deserunt nostrud mollit Lorem ullamco incididunt excepteur magna. Eiusmod tempor pariatur anim do esse laborum sint ea elit excepteur. Commodo cillum cupidatat duis dolor ad laboris occaecat. Occaecat ad nostrud amet exercitation laborum eiusmod.\r\nAliquip ullamco officia ullamco do mollit amet non. Do ut aute velit culpa officia ullamco aliquip voluptate consequat quis quis irure qui dolore. Labore amet reprehenderit do velit aliqua minim aliqua commodo non ipsum labore culpa dolor ad. Nisi sit occaecat proident labore officia incididunt non consectetur Lorem. Consequat anim dolore duis esse ad aliqua ea sit ad ex. Consectetur est id non esse aliqua sit ut adipisicing commodo aliqua. Exercitation nisi consectetur tempor nulla.\r\nLorem in consectetur anim fugiat dolore duis fugiat. Nisi Lorem velit occaecat cillum consectetur ipsum aliqua velit et. Do cupidatat enim sit duis eu labore officia nostrud nisi qui.\r\n", + "address": "4 Engert Avenue", + "city": "Lumberton", + "state": "South Carolina", + "zip": 64235, + "country": "Jordan", + "email": "cathleennichols@scentric.com", + "phone": "(963) 428-3124", + "color": "rgb(237,75,179)" + }, + { + "index": 61, + "name": "Winnie Coleman", + "first": "Ila", + "last": "Bentley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ssiskind/73.jpg", + "expanded": false, + "guid": "2d8a81c0-1dd7-4c00-a89f-473446addf54", + "integer": 38, + "date": "Tue Jun 30 1998 19:23:01 GMT-0700 (PDT)", + "shortText": "incididunt", + "mediumText": "Ex velit voluptate aliquip adipisicing eiusmod. Occaecat aliqua voluptate nisi nostrud est sit sunt qui. Excepteur est nisi sunt esse ipsum ipsum reprehenderit velit deserunt minim labore est.", + "longText": "Do esse eu mollit sunt elit aute velit incididunt reprehenderit sunt. Ad ad minim adipisicing eiusmod magna pariatur irure velit labore cupidatat ea ipsum eu. Ipsum consequat ut in minim aliqua.\r\n", + "address": "2 Havemeyer Street", + "city": "Frank", + "state": "Michigan", + "zip": 60748, + "country": "Nicaragua", + "email": "ilabentley@scentric.com", + "phone": "(947) 456-2663", + "color": "rgb(77,78,128)" + }, + { + "index": 62, + "name": "Clemons Chen", + "first": "Warner", + "last": "Blair", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_purplebunny/73.jpg", + "expanded": false, + "guid": "1d9dfc0f-0e70-4189-9a2d-d134505173d7", + "integer": 28, + "date": "Sat Sep 12 2009 19:12:02 GMT-0700 (PDT)", + "shortText": "officia", + "mediumText": "Exercitation non labore et duis et Lorem est et irure fugiat dolore officia ex.", + "longText": "Ea aute eiusmod ipsum ipsum eu nostrud. Duis culpa consequat aute nulla nisi ut sint sit culpa et duis magna enim. Nisi sunt dolore minim quis do. Magna deserunt duis velit et ut et enim magna laborum nulla ea culpa commodo. Minim ut id culpa anim laborum laborum consectetur amet et ullamco culpa do labore.\r\nEst magna aliquip ea ullamco. Exercitation deserunt occaecat id in ut sit laborum aute. Ex ut ex anim cupidatat do amet proident mollit. Dolor magna irure id culpa. Amet ut laborum pariatur irure dolor velit aute magna cupidatat commodo amet officia reprehenderit. Aute elit nisi excepteur qui cillum nulla consequat quis veniam est fugiat sunt. Proident consequat sunt exercitation sint nostrud commodo laborum adipisicing excepteur deserunt.\r\nEiusmod sunt consequat enim non irure excepteur adipisicing. Ad id veniam consectetur fugiat excepteur ex non et velit ut Lorem. Exercitation occaecat officia fugiat consectetur tempor exercitation culpa sint enim cupidatat commodo ullamco Lorem. Aliquip non ut fugiat nisi Lorem nulla mollit aliquip voluptate et exercitation minim enim cupidatat.\r\nElit do est amet nulla aliquip proident consectetur aliquip. Lorem nulla incididunt laborum in proident. Lorem veniam enim tempor non consectetur et ea non elit. Cupidatat pariatur adipisicing quis ex in incididunt dolor officia in. Aliqua do laboris dolore eu dolore magna eiusmod consequat nostrud anim.\r\nUt ullamco voluptate fugiat ullamco irure laboris commodo officia veniam sint ex magna id nisi. Qui occaecat sit deserunt aliqua veniam. Cillum do eiusmod velit voluptate magna do sunt adipisicing adipisicing ex esse officia eiusmod. Consectetur minim sint pariatur eiusmod ipsum anim. Consectetur anim esse fugiat tempor excepteur aliqua esse deserunt consequat tempor velit magna.\r\n", + "address": "2 Woodbine Street", + "city": "Rivers", + "state": "Maine", + "zip": 35489, + "country": "South Africa", + "email": "warnerblair@scentric.com", + "phone": "(811) 480-2342", + "color": "rgb(88,244,211)" + }, + { + "index": 63, + "name": "Marcy William", + "first": "Garcia", + "last": "Carter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linkthief/73.jpg", + "expanded": false, + "guid": "bb80a091-a78d-4187-ab75-c5e5a6cb2362", + "integer": 3, + "date": "Wed Mar 20 1974 00:41:43 GMT-0700 (PDT)", + "shortText": "amet", + "mediumText": "Deserunt officia laboris velit enim do cillum enim. Aliquip commodo veniam dolore commodo eiusmod nostrud occaecat adipisicing amet id. Incididunt cillum sunt esse consequat magna eiusmod ex culpa. Aliquip irure excepteur sunt esse incididunt et sint.", + "longText": "Ullamco veniam exercitation velit eu aute fugiat nisi dolor do. Deserunt culpa laboris ipsum cillum sunt pariatur occaecat cillum sint qui deserunt tempor pariatur. Ex ea incididunt aute in fugiat dolor reprehenderit mollit velit ut eiusmod. Veniam sunt sit officia sint Lorem fugiat dolor commodo amet culpa. Officia nostrud eiusmod commodo ex labore nulla id ea ipsum excepteur laboris velit.\r\nFugiat eiusmod laboris pariatur labore. Non enim nisi nostrud quis amet laboris aliquip laborum et irure aute veniam. Anim ullamco in officia commodo aliqua minim. Amet in enim nostrud pariatur id est occaecat ad occaecat. Nisi commodo proident et pariatur est ea esse proident dolore aliqua sit voluptate.\r\nEt est fugiat duis cillum veniam nulla. Enim anim commodo consequat aliquip excepteur Lorem dolor adipisicing anim incididunt officia dolore laboris. Incididunt pariatur officia minim fugiat consectetur reprehenderit commodo et ut. Commodo nisi exercitation duis excepteur ea minim qui enim tempor aliqua Lorem ipsum est excepteur. Ullamco veniam occaecat excepteur et laborum. Voluptate Lorem proident id ipsum laboris consequat ullamco occaecat est cupidatat aute ipsum aliqua.\r\nAnim mollit laboris amet dolor occaecat tempor id. Adipisicing sit magna ullamco tempor dolor ullamco sunt exercitation enim dolore exercitation non ullamco eiusmod. Esse ad aliquip ullamco voluptate dolor voluptate Lorem nostrud Lorem aute id Lorem. Laborum nulla ex pariatur anim irure cillum veniam eiusmod commodo.\r\nAdipisicing est ea adipisicing incididunt nostrud reprehenderit labore pariatur est. Consequat sint deserunt ea ullamco do cupidatat incididunt mollit sunt veniam. Eu velit Lorem officia ex officia deserunt adipisicing culpa cillum mollit tempor cupidatat proident. Qui aliquip labore sunt commodo veniam aliqua est cillum. Ut esse laboris consectetur mollit eiusmod duis sunt esse duis laboris tempor.\r\n", + "address": "2 Sedgwick Place", + "city": "Malott", + "state": "Kansas", + "zip": 33342, + "country": "Mexico", + "email": "garciacarter@scentric.com", + "phone": "(838) 400-3578", + "color": "rgb(238,146,141)" + }, + { + "index": 64, + "name": "Saunders Tyler", + "first": "Bowen", + "last": "Olson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/73.jpg", + "expanded": false, + "guid": "81275503-dc66-4920-a852-66b9bb420ab7", + "integer": 83, + "date": "Sat Jun 05 2004 18:02:53 GMT-0700 (PDT)", + "shortText": "eu", + "mediumText": "Cillum eiusmod sit aliquip magna excepteur occaecat adipisicing culpa. Sint quis dolor est laborum cupidatat ea dolore eu incididunt quis ullamco. Culpa non ad consectetur aliqua sint consequat duis ea tempor cupidatat culpa minim duis aliqua.", + "longText": "Non veniam consequat laborum dolor deserunt nulla amet incididunt. Velit eu ut adipisicing labore nisi. Aute ea ex esse reprehenderit quis officia do. Labore dolor elit ea aliqua. Ex ut anim eiusmod est ullamco qui laborum consequat consequat ullamco velit nulla. Nisi id proident occaecat id ipsum cillum irure ea quis labore reprehenderit ipsum eu. Ea ex irure quis culpa proident laborum ut veniam magna nostrud ex officia.\r\nTempor ut sint sunt fugiat commodo dolore irure qui enim mollit. Lorem id cillum nulla ullamco amet. Proident anim proident ea ut aliquip in elit. Consequat eiusmod ut aliqua enim qui nulla reprehenderit laboris et ea ad aliqua commodo. Excepteur in proident irure esse.\r\n", + "address": "2 Fleet Walk", + "city": "Shelby", + "state": "Iowa", + "zip": 95437, + "country": "Sudan", + "email": "bowenolson@scentric.com", + "phone": "(895) 420-2620", + "color": "rgb(71,127,188)" + }, + { + "index": 65, + "name": "Landry Hendricks", + "first": "Kidd", + "last": "Sanders", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/labibjaffar/73.jpg", + "expanded": false, + "guid": "c1d57dbd-5b06-44aa-bf5b-ffa5bb4cc5ba", + "integer": 15, + "date": "Sat Oct 19 1996 17:52:51 GMT-0700 (PDT)", + "shortText": "elit duis", + "mediumText": "Laboris irure quis ipsum consequat consectetur culpa aliqua in.", + "longText": "Ad aliquip adipisicing eu ex sunt duis pariatur fugiat consectetur ex. Reprehenderit do Lorem velit et tempor. Duis ad ad minim dolore excepteur ex nostrud officia. Elit aute aliqua laboris enim velit esse ullamco. Cupidatat non sunt laborum labore eu aliqua exercitation ea. Mollit ex non consectetur ad ex. Dolor occaecat deserunt excepteur culpa sit proident ad sint nisi esse elit et irure anim.\r\nCupidatat ullamco aliquip in commodo laboris elit minim ad. Sit esse nulla et ipsum officia commodo. Dolore ad proident tempor aliquip occaecat tempor mollit.\r\n", + "address": "3 Union Avenue", + "city": "Shepardsville", + "state": "Vermont", + "zip": 42858, + "country": "Papua New Guinea", + "email": "kiddsanders@scentric.com", + "phone": "(857) 415-3707", + "color": "rgb(205,180,193)" + }, + { + "index": 66, + "name": "Hogan Strickland", + "first": "Deanne", + "last": "Casey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tnrzdmr/73.jpg", + "expanded": false, + "guid": "66bcba0b-2ae4-4fba-9b76-ebf0bacf8b3c", + "integer": 23, + "date": "Tue Mar 24 2009 07:16:09 GMT-0700 (PDT)", + "shortText": "id non labore cupidatat enim", + "mediumText": "Deserunt dolor do cillum ut proident. Ad non proident laborum sint tempor velit. Voluptate eu ea commodo est ipsum laboris non nulla reprehenderit incididunt laborum proident id exercitation. Laboris amet exercitation qui proident veniam laboris.", + "longText": "Ea proident esse nisi eu officia eiusmod laborum. Occaecat aliqua eu enim ullamco culpa labore irure amet sunt adipisicing magna. Culpa enim veniam magna qui anim ad nulla. Lorem fugiat in nostrud sunt do mollit eiusmod ut. Occaecat ipsum esse laboris nostrud reprehenderit velit.\r\nVoluptate eiusmod ullamco sunt cupidatat pariatur ea qui non. Velit commodo sint esse adipisicing pariatur ut id ad Lorem cillum. Nisi ut esse quis deserunt magna eu esse minim.\r\nIncididunt ullamco sunt sunt velit. Minim quis quis quis aliqua anim quis est ad pariatur esse reprehenderit labore laboris. Irure magna dolor in nisi sunt et.\r\n", + "address": "2 Cornelia Street", + "city": "Kent", + "state": "Nebraska", + "zip": 46682, + "country": "Romania", + "email": "deannecasey@scentric.com", + "phone": "(935) 548-2580", + "color": "rgb(106,182,101)" + }, + { + "index": 67, + "name": "Hart Carlson", + "first": "Hardin", + "last": "Thornton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyjantz/73.jpg", + "expanded": false, + "guid": "7601ed4e-21fb-4024-bb7e-36d45c052b7f", + "integer": 68, + "date": "Sat Apr 20 2002 15:29:17 GMT-0700 (PDT)", + "shortText": "ex anim", + "mediumText": "Tempor veniam proident elit proident aliqua nostrud tempor eiusmod. Commodo id dolor sint amet commodo officia. Anim sint ea amet cillum. Esse cupidatat aute veniam ipsum excepteur.", + "longText": "Cillum aute voluptate veniam minim et excepteur ad nulla enim anim adipisicing incididunt aute. Aliqua adipisicing elit minim officia id mollit laborum sunt do. Nostrud do laboris fugiat ad mollit. Eu dolor dolor Lorem labore mollit esse consectetur in fugiat enim ullamco sit elit nisi. Enim eiusmod nostrud enim velit. Lorem commodo laboris excepteur eu occaecat minim.\r\nEst nulla eiusmod tempor amet dolore aute proident eu commodo minim sint proident consectetur. Cupidatat sunt quis laboris adipisicing eiusmod aliqua mollit. Elit qui nostrud commodo irure irure ex esse sunt officia. Tempor cillum nulla anim aliqua. Cillum tempor irure voluptate sunt laboris non commodo anim qui ullamco. Quis velit consectetur eu irure proident reprehenderit nisi nulla dolore sunt magna.\r\nCulpa laborum enim enim proident sit dolore pariatur eiusmod. Excepteur proident mollit in ut do non. Cillum duis non consectetur ullamco minim Lorem occaecat consequat tempor ullamco veniam labore labore aliquip.\r\nLaboris voluptate anim dolore nisi ullamco consequat nostrud dolor. Nulla do do esse aute sint deserunt qui. Ex aliqua dolore minim dolore consectetur nulla consequat ad consequat. Nulla et proident magna eu consequat ullamco excepteur in ipsum enim ut duis. Deserunt et sunt tempor quis amet deserunt cupidatat veniam. Labore reprehenderit magna minim amet nostrud amet. Reprehenderit pariatur dolore ut culpa sint dolore.\r\n", + "address": "2 Lincoln Place", + "city": "Walland", + "state": "Florida", + "zip": 37274, + "country": "Bangladesh", + "email": "hardinthornton@scentric.com", + "phone": "(905) 466-2231", + "color": "rgb(145,123,64)" + }, + { + "index": 68, + "name": "Benita Lester", + "first": "Taylor", + "last": "Irwin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ibrahemaq/73.jpg", + "expanded": false, + "guid": "dc96c6e9-9c43-4525-8de4-9a5e504ab886", + "integer": 2, + "date": "Sat Jun 25 1977 03:55:08 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Anim laboris dolore non aliqua proident aliqua et est ad reprehenderit duis ipsum do. Irure Lorem voluptate tempor ipsum exercitation. Sint deserunt adipisicing Lorem sit ea duis ex. Et fugiat anim est non irure proident in commodo sunt pariatur nulla.", + "longText": "Ut aute anim amet minim nulla. Fugiat dolor pariatur quis do aute officia magna in culpa ipsum fugiat. Cupidatat cillum duis aliquip nulla ea quis aliqua. Cillum sunt laboris velit deserunt cupidatat ullamco. Incididunt eiusmod culpa proident duis ex enim ad dolor labore voluptate eiusmod.\r\nLabore culpa commodo amet eu elit magna nisi minim in irure. Dolor adipisicing aliquip laboris irure. Amet et enim fugiat mollit ad laboris sint elit cupidatat deserunt. Ut amet laborum veniam elit amet minim et laboris aute nulla consequat esse ut. Ea dolore sit excepteur eiusmod pariatur sit non non consequat aute.\r\nAute culpa aute ullamco sunt irure quis voluptate est laborum. Duis eu ut do laboris laborum ipsum. Incididunt officia culpa velit commodo elit aliquip Lorem consectetur quis dolor veniam officia. Voluptate cupidatat duis ipsum elit cupidatat.\r\nCillum non ad ad et. Ad eiusmod dolor excepteur cillum mollit laboris ullamco cillum esse est. Aliquip eiusmod cupidatat ex id aute do officia excepteur non.\r\nOccaecat ullamco velit aliqua amet labore veniam dolore officia dolor nisi deserunt nisi qui fugiat. Velit laborum duis reprehenderit reprehenderit laboris occaecat. Aute exercitation magna exercitation magna sit. Fugiat cupidatat tempor eiusmod voluptate enim. Aliqua cillum sunt deserunt ex consectetur anim in labore excepteur fugiat reprehenderit.\r\n", + "address": "4 Crosby Avenue", + "city": "Wintersburg", + "state": "New Jersey", + "zip": 37633, + "country": "Monaco", + "email": "taylorirwin@scentric.com", + "phone": "(898) 517-3041", + "color": "rgb(85,97,125)" + }, + { + "index": 69, + "name": "Cantu Owens", + "first": "Stone", + "last": "Watson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/croakx/73.jpg", + "expanded": false, + "guid": "32abd836-bc46-4a8e-a2c1-7dc92b9e8322", + "integer": 46, + "date": "Mon Nov 17 2003 17:10:32 GMT-0800 (PST)", + "shortText": "cupidatat officia anim ipsum aliquip", + "mediumText": "Elit duis non minim aliqua aliquip irure. Duis ex est ut exercitation laborum excepteur aliqua. Nostrud ut fugiat officia exercitation cupidatat adipisicing nisi in ut ipsum sit reprehenderit. Qui ea Lorem quis velit.", + "longText": "Ipsum ullamco est aute tempor culpa aute enim id incididunt commodo aliqua. Mollit aute sit eu sint cillum ea cupidatat nulla labore anim ut. Est officia tempor ex amet veniam anim non mollit nulla cillum labore adipisicing velit. Et ut nostrud Lorem quis minim laboris mollit sit.\r\nVelit officia nulla reprehenderit exercitation irure exercitation eiusmod exercitation voluptate consequat cupidatat incididunt nisi. Ipsum aliqua quis laborum est sunt. In consectetur eiusmod aute magna. Ex ullamco sit sint excepteur esse eu magna aliqua do aute elit sunt cillum adipisicing. Sunt irure pariatur laboris et fugiat irure. Amet ipsum nostrud est Lorem anim velit. Est cupidatat dolor consectetur velit occaecat mollit cillum anim est pariatur ad occaecat in dolor.\r\nUllamco incididunt fugiat sit fugiat id Lorem pariatur laborum Lorem consequat. Ullamco irure incididunt duis occaecat aliqua pariatur. Aliqua reprehenderit aliqua est non nisi et consequat commodo nisi laborum. Ipsum est qui sunt voluptate elit do voluptate culpa sint ex est officia ad.\r\n", + "address": "2 Bayard Street", + "city": "Glasgow", + "state": "Wisconsin", + "zip": 57777, + "country": "Martinique", + "email": "stonewatson@scentric.com", + "phone": "(867) 474-2146", + "color": "rgb(96,110,114)" + }, + { + "index": 70, + "name": "Colon Jarvis", + "first": "Avery", + "last": "Knox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_dukex/73.jpg", + "expanded": false, + "guid": "9bcf96b4-7ca7-4a59-b7b7-6d6a57293012", + "integer": 28, + "date": "Sun Jan 28 2001 22:12:27 GMT-0800 (PST)", + "shortText": "pariatur officia reprehenderit ut", + "mediumText": "Ut dolore quis eiusmod culpa laboris ad fugiat.", + "longText": "Irure sunt labore commodo ea ex in dolore. Minim reprehenderit sit non et reprehenderit qui esse ex adipisicing. Duis ipsum in culpa est. Non do nisi pariatur dolore elit do qui non pariatur. Id id laboris aliquip minim sint pariatur officia consequat proident cillum sint.\r\nFugiat duis est irure mollit. Cupidatat enim anim adipisicing mollit enim ut nostrud sit. Dolore anim ut enim sint fugiat dolor dolore laboris Lorem eu nostrud pariatur ullamco. Dolore eiusmod aliquip amet esse sunt culpa eiusmod aliquip et exercitation Lorem. Mollit deserunt eiusmod ex ipsum qui consectetur ullamco velit. Reprehenderit proident cupidatat reprehenderit cupidatat. Voluptate eu sit reprehenderit veniam ut.\r\nDo consectetur culpa deserunt dolor. Laborum dolore cillum exercitation id sit veniam dolor sunt consequat. Proident est proident sit ut incididunt tempor ullamco sunt.\r\nIn amet consectetur nulla ullamco ullamco culpa. Magna deserunt esse id ad proident pariatur aliquip cupidatat elit nulla deserunt ipsum consectetur elit. Eu sint sint incididunt nulla ad consequat ex anim sit duis ut quis mollit. Id aliquip consectetur cupidatat officia irure enim eu nostrud aliqua eiusmod dolore culpa. Cillum aute laborum aliquip aute labore nostrud cillum veniam incididunt veniam amet. Sit ad in proident cupidatat elit irure nostrud dolore.\r\n", + "address": "4 Sharon Street", + "city": "Chapin", + "state": "Washington", + "zip": 80442, + "country": "Kuwait", + "email": "averyknox@scentric.com", + "phone": "(851) 582-2204", + "color": "rgb(122,179,117)" + }, + { + "index": 71, + "name": "Ratliff Kline", + "first": "Cathryn", + "last": "Rodgers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gregsqueeb/73.jpg", + "expanded": false, + "guid": "9a177597-6ee1-4784-b217-60ded54d0072", + "integer": 32, + "date": "Fri May 07 1976 11:12:00 GMT-0700 (PDT)", + "shortText": "nostrud enim", + "mediumText": "Officia do enim nisi ullamco enim eiusmod eu enim ex tempor. Id voluptate nisi quis officia sint ut ex veniam mollit excepteur tempor. Et aliqua velit sit fugiat do voluptate ipsum aliquip veniam in sint do. Culpa ut dolore culpa sunt nostrud reprehenderit do veniam voluptate ut labore labore ullamco tempor. Voluptate voluptate veniam laborum deserunt.", + "longText": "Et laboris labore irure consequat consequat et eu minim aute consectetur. Nisi tempor sunt officia ad dolore culpa. Veniam proident minim velit nisi amet id nulla ullamco eiusmod sit ad.\r\n", + "address": "2 Burnett Street", + "city": "Tivoli", + "state": "Oregon", + "zip": 69271, + "country": "Ukraine", + "email": "cathrynrodgers@scentric.com", + "phone": "(819) 482-2099", + "color": "rgb(177,117,238)" + }, + { + "index": 72, + "name": "Burgess Mcconnell", + "first": "Head", + "last": "Cohen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/csmnng/73.jpg", + "expanded": false, + "guid": "22894c1b-29ad-4e31-a69e-d724d00cdec3", + "integer": 51, + "date": "Fri Jan 08 1993 09:39:13 GMT-0800 (PST)", + "shortText": "cupidatat ex excepteur tempor", + "mediumText": "Proident eiusmod mollit voluptate culpa incididunt et velit commodo laborum et. Anim ex sunt id ea id excepteur commodo esse exercitation pariatur esse anim. Qui dolore irure eiusmod eu dolore.", + "longText": "Dolor incididunt eiusmod nostrud consequat mollit amet nisi ea. Officia dolore mollit eiusmod ullamco anim incididunt. Laboris sint enim ex mollit consequat consequat.\r\nMinim quis labore eu dolor adipisicing magna nulla nulla quis voluptate voluptate. Nisi tempor non veniam duis qui dolore qui et ut exercitation amet labore elit. Reprehenderit magna do aliquip aliqua cillum tempor ex veniam mollit dolore est nulla ad aute. Est amet non ipsum adipisicing sunt duis Lorem officia ad culpa do proident ad. Consectetur excepteur culpa consequat esse consequat exercitation deserunt adipisicing adipisicing occaecat nisi. Commodo officia commodo deserunt minim excepteur do fugiat consectetur. Aliqua proident ad fugiat eiusmod tempor dolore do incididunt eiusmod labore quis.\r\nLabore fugiat incididunt aliquip deserunt fugiat nostrud. Velit minim aliqua sit incididunt. Velit ad et nulla est consectetur Lorem officia ut eu consequat enim ut. Consequat labore qui magna do aute deserunt consectetur. Minim aliquip in quis minim ad mollit ut non Lorem.\r\nEu laboris culpa magna dolor pariatur anim ea amet fugiat minim. Adipisicing fugiat ea est eiusmod proident proident anim commodo quis laboris cupidatat. Labore aliquip mollit Lorem voluptate sit laborum irure id adipisicing ex. Ad cillum sunt sit magna exercitation mollit eiusmod mollit est elit. Ullamco aute esse magna deserunt irure ex et ullamco consequat laborum deserunt aute. Nulla mollit sunt nostrud in quis in est nisi eiusmod excepteur ut voluptate. Do anim ex cillum eiusmod duis ut sit.\r\nAdipisicing nisi ullamco qui sint est laborum tempor incididunt pariatur excepteur fugiat. Officia sunt proident laborum fugiat quis magna veniam. Nulla do do esse magna. Labore ad sit mollit ullamco nulla aute est sit ipsum ex cupidatat. Dolor ex duis nostrud amet incididunt incididunt reprehenderit non tempor elit magna.\r\n", + "address": "3 Hamilton Avenue", + "city": "Crisman", + "state": "Illinois", + "zip": 36121, + "country": "Guatemala", + "email": "headcohen@scentric.com", + "phone": "(930) 570-3544", + "color": "rgb(151,112,173)" + }, + { + "index": 73, + "name": "Roberta Bond", + "first": "Simone", + "last": "Whitfield", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ogmenemre/73.jpg", + "expanded": false, + "guid": "4750f9fa-37f6-41d0-8599-946f9dff2e00", + "integer": 6, + "date": "Thu Sep 06 1984 11:04:11 GMT-0700 (PDT)", + "shortText": "Lorem consectetur", + "mediumText": "Ad anim sint ex in voluptate deserunt ut nulla adipisicing. Elit non velit pariatur nostrud quis do quis cillum ea et sint Lorem. Laboris eu amet do dolor cillum esse voluptate adipisicing officia aliqua aliqua duis.", + "longText": "Commodo cupidatat velit duis elit id duis aliqua. Laboris dolor laboris ad irure laborum. Dolor amet aliqua eu sint. Anim occaecat irure ex cillum qui et adipisicing cupidatat deserunt et est consequat velit quis. Magna ut cillum nostrud ea pariatur occaecat. Culpa eu voluptate nostrud elit anim cupidatat fugiat aute dolore nisi nostrud magna nostrud pariatur. Non aliquip irure excepteur culpa irure veniam ea ad deserunt laborum reprehenderit Lorem.\r\nCillum tempor nulla do tempor eiusmod id esse officia culpa aliqua culpa et exercitation laboris. Sit sit Lorem eu fugiat Lorem. Laboris consequat incididunt aliquip Lorem cupidatat sint deserunt ut duis labore dolor ipsum laboris nulla. Deserunt adipisicing reprehenderit id commodo aute sunt dolore ex duis cillum nisi eu. Anim deserunt et adipisicing fugiat anim in.\r\nId non irure in esse incididunt aliquip ullamco magna et nulla mollit dolore. Velit aliquip excepteur pariatur magna Lorem fugiat. Exercitation nisi nostrud cupidatat elit. Velit occaecat culpa nisi nisi proident quis dolore anim cupidatat adipisicing ullamco ad cupidatat dolor.\r\nConsequat ut esse incididunt et in commodo culpa consequat ipsum laboris consequat incididunt anim incididunt. Ad et nostrud amet non Lorem enim laborum id ad Lorem magna excepteur. Ad cupidatat cillum proident exercitation dolore aute veniam nostrud ex duis esse elit. Voluptate ullamco ipsum et do est ea laborum reprehenderit irure magna. Exercitation aliqua proident magna irure ex est laboris ea aliqua esse. Ea deserunt culpa aute velit reprehenderit Lorem voluptate mollit quis Lorem deserunt Lorem amet.\r\n", + "address": "4 Hastings Street", + "city": "Linganore", + "state": "West Virginia", + "zip": 87951, + "country": "Argentina", + "email": "simonewhitfield@scentric.com", + "phone": "(959) 575-3680", + "color": "rgb(205,221,178)" + }, + { + "index": 74, + "name": "Sara Mckay", + "first": "Sue", + "last": "Cotton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionutmaxim/73.jpg", + "expanded": false, + "guid": "1da2f858-f774-49c1-9d77-e8a3eb040140", + "integer": 31, + "date": "Fri Nov 25 1994 01:11:26 GMT-0800 (PST)", + "shortText": "et", + "mediumText": "Pariatur Lorem veniam ullamco cupidatat sint. Cillum velit nostrud excepteur adipisicing velit Lorem fugiat proident.", + "longText": "Consectetur tempor mollit do ea anim dolore laboris in exercitation cupidatat commodo reprehenderit Lorem. Consequat exercitation sint culpa aute quis nisi. Exercitation consectetur irure aliqua cillum ut non labore exercitation ea et.\r\nUllamco dolor consequat reprehenderit dolore id mollit laborum ad. Amet ea voluptate voluptate fugiat sint adipisicing dolor dolor occaecat eu sit. Ea ea est amet enim tempor occaecat tempor sit exercitation. Ad eu nisi dolore do culpa do anim irure aliquip officia irure. Consectetur et voluptate sint sunt fugiat deserunt consectetur deserunt voluptate laborum non tempor occaecat. Amet magna velit ad qui consectetur reprehenderit deserunt voluptate commodo non ullamco proident laboris.\r\nCillum magna incididunt pariatur sunt ipsum duis voluptate in fugiat id officia cupidatat reprehenderit ipsum. Dolore anim excepteur ea laboris labore minim. Excepteur ex adipisicing eiusmod sit ut reprehenderit. Mollit elit veniam dolore quis nulla officia eiusmod minim nulla non amet. Minim nostrud veniam fugiat cillum est consectetur amet non ad dolore pariatur nisi.\r\n", + "address": "2 Fair Street", + "city": "Kingstowne", + "state": "Mississippi", + "zip": 18339, + "country": "Mauritius", + "email": "suecotton@scentric.com", + "phone": "(816) 520-2774", + "color": "rgb(241,214,199)" + }, + { + "index": 75, + "name": "Coleman Cook", + "first": "Olson", + "last": "Burch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teylorfeliz/73.jpg", + "expanded": false, + "guid": "0788dba4-5fa8-476e-9ba6-8f387bf77e75", + "integer": 13, + "date": "Thu Jun 21 1984 02:52:09 GMT-0700 (PDT)", + "shortText": "anim anim deserunt deserunt anim", + "mediumText": "Esse sunt irure magna amet. Adipisicing aliqua ut dolor nulla non aute tempor eu ex sit id et. Magna dolore aliqua qui velit eu officia. Est sunt magna adipisicing commodo mollit aute duis magna.", + "longText": "Duis fugiat culpa proident mollit nostrud. Dolore incididunt in esse veniam eiusmod voluptate consequat amet. Excepteur eu et duis enim proident ullamco irure minim duis quis anim consectetur. Amet excepteur et do officia fugiat mollit Lorem ut elit. Eiusmod magna tempor duis Lorem nostrud. Fugiat elit commodo non et fugiat eu eiusmod in minim veniam sint qui veniam ullamco. Aliquip sint ad culpa esse laboris elit.\r\nMinim reprehenderit quis ut incididunt incididunt cupidatat. Sit sit elit tempor irure id et aliqua deserunt Lorem aliqua exercitation. Elit nisi dolor enim amet esse incididunt ad. Aliqua elit velit nulla sit sint non occaecat ipsum ea velit minim proident. Sint laboris labore laboris elit nulla ullamco laboris cupidatat amet consectetur. Do eiusmod proident id laborum fugiat nostrud voluptate fugiat. Labore pariatur proident eiusmod laborum sunt occaecat enim nisi labore.\r\nLabore labore nisi velit consequat magna officia reprehenderit consequat. Nulla eu velit laborum voluptate. Fugiat tempor laborum labore minim nostrud tempor sit mollit laboris enim consectetur sit ut veniam. Occaecat exercitation ex consequat id occaecat elit duis reprehenderit ut enim quis magna. Non do ea fugiat quis duis esse amet deserunt eu id duis est enim.\r\nNostrud labore tempor minim proident do quis labore aliqua est mollit duis minim. Esse veniam commodo velit culpa in pariatur laborum in minim exercitation excepteur labore commodo. Mollit cillum ipsum adipisicing in nulla mollit irure. Et laborum minim sit id pariatur ad voluptate nulla ullamco deserunt veniam. Deserunt non aliquip sint amet.\r\nEsse dolor adipisicing ut pariatur pariatur dolore eu mollit reprehenderit consequat. Adipisicing fugiat sunt voluptate magna Lorem est eu anim id commodo eu consectetur. Mollit ad excepteur et do velit dolor adipisicing veniam cupidatat excepteur qui.\r\n", + "address": "2 Hull Street", + "city": "Darbydale", + "state": "Rhode Island", + "zip": 97458, + "country": "St. Helena", + "email": "olsonburch@scentric.com", + "phone": "(995) 590-2366", + "color": "rgb(91,252,80)" + }, + { + "index": 76, + "name": "Walton Wagner", + "first": "Powell", + "last": "Nunez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/73.jpg", + "expanded": false, + "guid": "6c34053d-b9d3-4a75-a660-83b6fc0925a5", + "integer": 97, + "date": "Wed Nov 27 1996 04:47:04 GMT-0800 (PST)", + "shortText": "sunt voluptate dolor", + "mediumText": "Magna elit cillum enim sunt ut occaecat veniam elit elit laborum. Amet sint labore tempor tempor consectetur commodo aliquip magna duis non et. Aute labore est cupidatat do officia minim consectetur ea exercitation ex nostrud enim tempor veniam. Excepteur amet eiusmod velit exercitation eu cillum et minim sunt adipisicing dolor velit. Duis laboris dolor aliquip minim non laboris do veniam.", + "longText": "Ea esse officia reprehenderit do proident dolore ullamco. Quis officia minim sit anim tempor laborum in tempor dolore officia consectetur. Officia pariatur est commodo veniam in ex duis labore velit irure enim laboris id. Esse irure in adipisicing irure officia et veniam anim mollit. Qui qui tempor proident sunt enim incididunt elit aliqua Lorem dolore est do enim dolor. Deserunt consequat pariatur magna aute enim.\r\nDolor est culpa magna duis reprehenderit Lorem ad dolore tempor aute velit veniam sunt. Labore reprehenderit ea culpa ea reprehenderit sint amet in eiusmod dolore. Anim consequat ex labore qui nulla occaecat laborum. Id voluptate pariatur esse aute consequat et nisi. Proident dolor consequat anim esse eiusmod et veniam proident qui non commodo nulla cupidatat.\r\n", + "address": "2 Vanderveer Place", + "city": "Robinette", + "state": "Georgia", + "zip": 54771, + "country": "Suriname", + "email": "powellnunez@scentric.com", + "phone": "(992) 548-3878", + "color": "rgb(95,253,239)" + }, + { + "index": 77, + "name": "Harris Ewing", + "first": "Orr", + "last": "Buchanan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/S0ufi4n3/73.jpg", + "expanded": false, + "guid": "387624b1-451d-47c6-978f-aabd0b34e707", + "integer": 69, + "date": "Sun Aug 18 1996 22:19:42 GMT-0700 (PDT)", + "shortText": "duis ea", + "mediumText": "Irure aliquip sit excepteur incididunt nisi excepteur laboris in do proident commodo ad. Culpa dolore Lorem irure magna mollit laboris officia fugiat amet. Ut ipsum est mollit quis. In occaecat mollit officia fugiat magna occaecat.", + "longText": "Magna cillum culpa esse in sint in sit. Sint aute nulla ad pariatur commodo sint aute consectetur magna dolore labore ex Lorem culpa. Officia aute magna cupidatat dolor aliquip minim voluptate mollit aliqua pariatur ullamco. Ullamco labore ex exercitation ad culpa labore laborum deserunt mollit mollit enim ut. Incididunt dolore est id cupidatat eu do aliqua minim occaecat consectetur.\r\n", + "address": "3 Ralph Avenue", + "city": "Martell", + "state": "New Mexico", + "zip": 31746, + "country": "Greece", + "email": "orrbuchanan@scentric.com", + "phone": "(861) 535-2683", + "color": "rgb(162,149,148)" + }, + { + "index": 78, + "name": "Kerr Briggs", + "first": "Helena", + "last": "Lynch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nepdud/73.jpg", + "expanded": false, + "guid": "d16cdb93-caba-40e3-b359-8124309f23fd", + "integer": 83, + "date": "Tue Dec 27 2011 21:18:32 GMT-0800 (PST)", + "shortText": "adipisicing est laboris eiusmod", + "mediumText": "Voluptate ad eiusmod eiusmod sunt minim do et ullamco. Id incididunt do labore consectetur laborum excepteur labore id nostrud cupidatat anim officia et velit. Nostrud sunt commodo aute culpa ea et consequat laborum commodo deserunt. Dolore ad amet reprehenderit incididunt exercitation enim duis deserunt. Ea irure et veniam sunt Lorem tempor.", + "longText": "Commodo enim ullamco cupidatat ex minim et ex fugiat eiusmod exercitation minim eu. Id eu exercitation commodo fugiat elit ex laborum ea. Aute duis adipisicing mollit duis non anim anim deserunt. Nulla adipisicing irure commodo ut nostrud irure ea Lorem in enim laborum laboris laborum.\r\nSunt eiusmod dolor ullamco elit mollit esse consequat culpa non do minim reprehenderit exercitation. Id quis laborum eu id Lorem eu aute elit aliqua aliquip labore. Nisi sit mollit velit anim culpa proident esse ut sunt deserunt quis ad dolor. Incididunt excepteur non est occaecat do Lorem veniam sunt cillum velit ut exercitation et. Minim eiusmod ipsum veniam nisi nostrud anim commodo amet est amet ullamco minim ut. Magna aliquip Lorem dolore do nulla ipsum aute mollit incididunt in adipisicing pariatur ad eiusmod. Est velit Lorem incididunt ex aliquip ut laboris nulla.\r\nAd voluptate ullamco dolor culpa. Occaecat sit anim anim id esse commodo consectetur. Velit aliquip laborum fugiat occaecat consectetur magna amet tempor consequat nisi proident nisi. Aliquip et sit aliquip anim. Labore in culpa elit quis reprehenderit duis anim dolor dolore occaecat sint ad Lorem.\r\nDolore culpa irure cillum enim adipisicing enim sint ut laboris elit cillum veniam eu sit. Magna Lorem dolore sint aute cupidatat incididunt excepteur adipisicing magna ex exercitation. Duis id commodo eu adipisicing. Non labore ut laboris officia id.\r\n", + "address": "2 Wilson Avenue", + "city": "Coral", + "state": "Arizona", + "zip": 32289, + "country": "New Caledonia", + "email": "helenalynch@scentric.com", + "phone": "(880) 590-3786", + "color": "rgb(192,101,57)" + }, + { + "index": 79, + "name": "Genevieve Mooney", + "first": "Beatriz", + "last": "Case", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/amir_hooseini/73.jpg", + "expanded": false, + "guid": "f35cbf9b-3c23-45a2-80cc-959e537f5ed8", + "integer": 7, + "date": "Mon Apr 10 1972 22:46:01 GMT-0800 (PST)", + "shortText": "ut commodo excepteur cillum", + "mediumText": "Nulla aute quis minim culpa proident anim ipsum enim. Magna cillum fugiat eu dolor laboris dolore.", + "longText": "Non non eu qui nulla anim officia officia officia labore culpa. In laborum est ad aliqua laborum sit quis. Aliquip voluptate anim excepteur deserunt dolore dolor dolor ipsum.\r\nProident fugiat nisi qui eu exercitation reprehenderit sint. Elit commodo aliqua quis elit dolor eiusmod consectetur. Nostrud qui non voluptate sint sit anim laboris incididunt. Dolor labore nisi aliquip labore. Amet voluptate sunt pariatur excepteur laborum laborum anim dolor. Excepteur exercitation in labore nostrud aliquip anim duis reprehenderit aliqua dolore amet cillum est consectetur.\r\n", + "address": "4 Hoyts Lane", + "city": "Richmond", + "state": "Texas", + "zip": 12769, + "country": "Syria", + "email": "beatrizcase@scentric.com", + "phone": "(868) 586-2207", + "color": "rgb(127,85,140)" + }, + { + "index": 80, + "name": "Heidi Dillon", + "first": "Jenifer", + "last": "Contreras", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kokikillara/73.jpg", + "expanded": false, + "guid": "198e5b2c-45aa-4d86-aa99-c9e493b55d5c", + "integer": 57, + "date": "Fri Mar 05 2010 16:32:14 GMT-0800 (PST)", + "shortText": "cillum velit deserunt aute in", + "mediumText": "Mollit quis officia in commodo officia ex. Aliqua commodo incididunt cillum Lorem cillum est commodo do aliqua eiusmod. Laborum labore pariatur aute aute minim.", + "longText": "Deserunt enim nisi esse commodo enim irure ullamco eiusmod fugiat. Eiusmod sint reprehenderit minim deserunt voluptate ut sit consectetur id quis ullamco pariatur ut excepteur. Exercitation consectetur commodo ipsum minim. Culpa id occaecat non commodo amet esse magna mollit. Duis anim qui commodo voluptate aliquip ut exercitation amet ea. Quis labore ullamco irure irure ut amet consequat voluptate laborum. Nulla aliqua mollit deserunt sunt deserunt eu adipisicing ea magna ex occaecat.\r\nDuis cillum laborum et sit laborum exercitation commodo nulla magna proident duis. Nisi do excepteur enim esse minim sunt voluptate tempor dolore dolor fugiat sunt duis. Ipsum id velit mollit labore ut sunt quis aliqua adipisicing ad labore ipsum.\r\nAute cupidatat sint proident magna cupidatat sint est deserunt Lorem nisi sit ut. Duis laborum exercitation incididunt deserunt anim ipsum consectetur. Sit laborum irure commodo laboris eiusmod ut laboris ex excepteur proident labore reprehenderit mollit est. Sunt minim ea quis officia ad.\r\nCillum eiusmod ad consequat aliquip consectetur pariatur. Incididunt qui exercitation labore anim. Sint laboris ad sit est ut laboris. Aliqua sit proident cillum commodo fugiat reprehenderit ad. Est elit id sunt laborum excepteur sit Lorem. Ex anim mollit amet ex nostrud nulla irure nisi amet cupidatat non elit enim adipisicing. Cupidatat occaecat irure est fugiat amet adipisicing eu laboris aliqua quis minim sint.\r\nDolor consequat laborum sint enim qui. Sint eiusmod nostrud excepteur dolore incididunt excepteur labore amet ea non nostrud. Cupidatat nulla exercitation tempor ut adipisicing qui voluptate. Quis voluptate proident reprehenderit labore in cillum et commodo exercitation magna. Irure labore irure amet eu fugiat tempor reprehenderit laborum occaecat consectetur ut.\r\n", + "address": "4 Clove Road", + "city": "Brazos", + "state": "District Of Columbia", + "zip": 94302, + "country": "Rwanda", + "email": "jenifercontreras@scentric.com", + "phone": "(886) 401-2897", + "color": "rgb(103,86,175)" + }, + { + "index": 81, + "name": "Morrow Hendrix", + "first": "Pittman", + "last": "Powers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/christianoliff/73.jpg", + "expanded": false, + "guid": "3e7a6c19-006a-4533-86eb-5032c524f1b9", + "integer": 87, + "date": "Mon Jun 13 1977 05:06:10 GMT-0700 (PDT)", + "shortText": "culpa dolor proident non occaecat", + "mediumText": "Consectetur commodo nulla cupidatat exercitation id aliquip.", + "longText": "Reprehenderit irure esse esse esse enim aute elit occaecat officia eiusmod nostrud. Minim labore amet veniam quis laboris cupidatat elit non. Magna amet in elit duis amet velit do duis adipisicing ut. Commodo officia dolore veniam laborum laborum pariatur aute nulla magna dolore esse laboris ea. Irure adipisicing officia velit Lorem.\r\nAd officia adipisicing commodo ipsum sunt in commodo adipisicing qui eu. Esse minim anim do officia laborum deserunt aliquip deserunt ea dolor ut eiusmod non fugiat. Dolore commodo laboris ullamco consectetur amet et non occaecat labore velit est. Veniam elit deserunt eu laboris minim esse. Et ad eu eu voluptate non ad aute nostrud in in. Sint qui mollit aliquip laboris dolor elit incididunt cillum. Mollit fugiat minim tempor amet proident et esse do.\r\nDo laborum do sunt pariatur. Cillum nulla ut exercitation consectetur ad sunt qui. Incididunt Lorem voluptate veniam minim deserunt aliqua. Veniam aute reprehenderit irure excepteur ut aute laborum eu. Sit veniam nisi qui officia. Reprehenderit voluptate tempor et cupidatat cupidatat enim aute. Aliquip reprehenderit esse ad commodo dolor deserunt nisi minim duis ut tempor pariatur quis ad.\r\nEa magna non ex laboris adipisicing deserunt. Ea ad voluptate ipsum consectetur magna voluptate amet eu fugiat. Aute do excepteur exercitation esse consequat aute enim Lorem occaecat id Lorem.\r\nAdipisicing cupidatat sunt non ipsum voluptate nulla occaecat. Pariatur magna exercitation aliqua irure ipsum cillum qui nostrud exercitation ullamco anim occaecat reprehenderit qui. Exercitation voluptate enim magna excepteur eu aliquip id enim laboris aute exercitation sint aliqua. Enim officia tempor labore nulla ut veniam ullamco reprehenderit occaecat nulla. Adipisicing officia ullamco cupidatat et dolor ut cillum enim est aliqua. Cillum et laborum nostrud ex irure do aliquip qui amet cillum nisi exercitation.\r\n", + "address": "2 Lawn Court", + "city": "Alleghenyville", + "state": "Virgin Islands", + "zip": 25057, + "country": "Puerto Rico", + "email": "pittmanpowers@scentric.com", + "phone": "(814) 551-2487", + "color": "rgb(194,148,221)" + }, + { + "index": 82, + "name": "Cook Espinoza", + "first": "Kelli", + "last": "Gallagher", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andrey_maxim/73.jpg", + "expanded": false, + "guid": "77727f82-a7eb-40af-91dc-dd76a57e5761", + "integer": 4, + "date": "Sat Apr 29 1995 09:21:20 GMT-0700 (PDT)", + "shortText": "est ad non officia", + "mediumText": "Ipsum magna velit cillum cupidatat tempor ad ad amet adipisicing. Aliquip cillum irure id velit. Ullamco occaecat labore dolor sint. Sit dolor consequat in dolor commodo eiusmod anim ullamco consequat laboris non. Esse fugiat cupidatat laboris aliquip non nostrud officia amet.", + "longText": "Do elit consectetur nostrud reprehenderit deserunt culpa deserunt exercitation exercitation. Tempor eiusmod eiusmod incididunt minim mollit exercitation quis do sit amet duis. Culpa in consectetur esse ipsum voluptate sit non qui elit voluptate ea eu tempor excepteur. Enim minim fugiat quis velit dolor adipisicing sunt elit ipsum nulla culpa pariatur sint aliquip.\r\nAd magna enim culpa magna sint pariatur sunt nostrud ad fugiat cupidatat. Sunt non eiusmod nulla cupidatat eu ea eu laborum quis fugiat voluptate nulla laboris. Dolor ad reprehenderit minim commodo dolore commodo aliqua adipisicing dolor laborum pariatur eiusmod laborum irure. Sunt ex adipisicing culpa quis nostrud elit est occaecat ut ut exercitation ullamco ea. In et irure irure tempor est do do qui. Consectetur velit aute enim exercitation ipsum proident officia eiusmod nostrud deserunt nulla cupidatat ullamco.\r\nEsse nisi quis laborum commodo non proident ullamco. Ipsum qui in non adipisicing do incididunt. Magna incididunt amet dolor laboris commodo est voluptate cillum ea amet quis deserunt do. Non in laborum anim mollit sunt irure incididunt ex sit nostrud duis amet. Reprehenderit ipsum anim culpa in. Duis voluptate esse cillum ad eu incididunt.\r\nOccaecat officia in laboris proident aliquip pariatur consectetur consequat commodo enim tempor et. Sit do veniam duis mollit ipsum aliqua et id do do id sint cillum. Ad incididunt minim velit id tempor consequat eiusmod mollit sit do dolor commodo minim quis. Nulla laboris velit excepteur laborum exercitation labore aliqua est enim duis anim sint pariatur duis. Velit elit fugiat mollit ex amet dolor nulla nisi. Laborum ad ut enim ut tempor proident cillum sunt id voluptate et.\r\n", + "address": "2 Bay Avenue", + "city": "Frystown", + "state": "Puerto Rico", + "zip": 13050, + "country": "Korea (North)", + "email": "kelligallagher@scentric.com", + "phone": "(865) 413-3195", + "color": "rgb(105,173,239)" + }, + { + "index": 83, + "name": "Mari Nguyen", + "first": "Moss", + "last": "English", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/muringa/73.jpg", + "expanded": false, + "guid": "1aaee0b4-f194-4e72-8c8b-9eb7aada953a", + "integer": 29, + "date": "Sat Aug 22 1987 08:31:57 GMT-0700 (PDT)", + "shortText": "minim enim voluptate minim", + "mediumText": "Ut est et consequat culpa dolor culpa veniam eiusmod. Commodo adipisicing voluptate laboris nulla esse non reprehenderit pariatur veniam proident reprehenderit.", + "longText": "Pariatur quis sit tempor dolor sit commodo in. Pariatur consectetur sint ea aliquip pariatur dolor commodo et et dolore in esse occaecat. Velit labore nostrud sit deserunt Lorem. Proident labore elit irure consequat sit. Sunt est veniam ullamco pariatur incididunt ad cupidatat. Sit proident tempor anim cupidatat nostrud ullamco do incididunt. Magna in amet anim laboris labore fugiat duis culpa cupidatat enim ipsum ut mollit excepteur.\r\nLorem voluptate officia ut adipisicing occaecat cillum cupidatat. Culpa mollit magna duis pariatur officia officia ad. Reprehenderit reprehenderit reprehenderit proident deserunt. Dolor proident nostrud veniam ea ut. Nisi nisi esse aute adipisicing laborum nulla laboris magna do commodo voluptate sunt ipsum. Occaecat dolor pariatur esse velit eu sint adipisicing cillum magna nulla.\r\nAmet eu et anim nisi mollit ut sit minim. Aute proident non ea consequat do laborum ex consectetur. Cillum commodo minim id veniam duis commodo laboris consequat sunt. Sit ullamco veniam dolor occaecat nostrud dolor incididunt enim minim esse adipisicing id. Adipisicing velit nisi cupidatat velit velit culpa eu reprehenderit duis id aliquip quis tempor fugiat.\r\nAliquip ex elit nulla duis enim aliqua officia. Commodo proident aute labore nostrud nostrud. Et et ad nisi sit ex id eiusmod est Lorem. Enim pariatur velit sunt quis eu fugiat. Consectetur est aute est aliquip elit occaecat quis eiusmod tempor sunt nisi aliqua. Enim ex eu ipsum id sit Lorem excepteur ad voluptate.\r\nAute non est enim ullamco quis proident Lorem Lorem sunt dolor culpa irure. Nostrud quis aliqua ex commodo irure officia mollit Lorem reprehenderit sunt velit. Ut velit cillum velit et ea irure laborum adipisicing amet adipisicing anim. Voluptate exercitation pariatur culpa irure occaecat in reprehenderit ipsum esse. Excepteur quis cillum Lorem do. Tempor est tempor fugiat amet cupidatat nostrud aute cillum.\r\n", + "address": "2 Trucklemans Lane", + "city": "Waiohinu", + "state": "Maryland", + "zip": 78112, + "country": "Bosnia and Herzegovina", + "email": "mossenglish@scentric.com", + "phone": "(823) 570-2457", + "color": "rgb(97,59,63)" + }, + { + "index": 84, + "name": "Bauer Ruiz", + "first": "Marcia", + "last": "Farmer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmedelgabri/73.jpg", + "expanded": false, + "guid": "0efaa095-a6b2-4f62-9b1d-c965c8aa4407", + "integer": 49, + "date": "Wed Oct 17 1979 09:38:39 GMT-0700 (PDT)", + "shortText": "cillum cillum ipsum pariatur excepteur", + "mediumText": "Irure dolor Lorem cillum enim esse. Consectetur duis elit aute ut tempor do ea non ad velit. Officia voluptate occaecat exercitation exercitation cillum anim. Exercitation anim tempor qui tempor nulla minim eu quis ad minim.", + "longText": "Sit proident eu velit ad do velit nostrud aute consectetur. Lorem et magna non consequat enim ut. Qui duis consectetur fugiat consectetur elit sit Lorem cupidatat. Ipsum tempor dolore sunt duis. Veniam culpa exercitation sint laboris proident exercitation dolor deserunt aute est exercitation ex laboris.\r\nEsse id non veniam ut ad nostrud ex aliquip culpa quis. Cupidatat ad anim irure pariatur. Consectetur sint officia laboris non consequat proident laboris sunt ipsum. Dolor amet culpa enim pariatur proident eu labore pariatur. Do adipisicing tempor pariatur mollit laborum mollit elit mollit laboris dolore. Aute magna reprehenderit nulla magna amet minim nostrud in aute qui eu ut sunt. Exercitation eiusmod reprehenderit sint esse reprehenderit reprehenderit.\r\nTempor est Lorem eu adipisicing adipisicing est ea. Irure nulla officia culpa laboris do tempor aute laboris elit aute pariatur occaecat qui laborum. Minim duis pariatur consectetur laboris aliquip cupidatat aute enim cillum adipisicing voluptate occaecat enim dolor.\r\nAdipisicing ut voluptate et aliquip eu. Duis laborum irure ullamco voluptate labore in non. Nostrud voluptate voluptate consectetur culpa voluptate aute. Esse dolor enim ad dolor. Aliquip sint esse elit eiusmod mollit. Ipsum in est exercitation qui. Id sit amet nulla qui minim fugiat enim.\r\n", + "address": "3 Paerdegat Avenue", + "city": "Hanover", + "state": "Massachusetts", + "zip": 30524, + "country": "France", + "email": "marciafarmer@scentric.com", + "phone": "(836) 524-2616", + "color": "rgb(169,63,64)" + }, + { + "index": 85, + "name": "Ollie Melton", + "first": "Dennis", + "last": "Hill", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bobbytwoshoes/73.jpg", + "expanded": false, + "guid": "fda2534f-880f-4794-999d-d315d49ba7a9", + "integer": 84, + "date": "Fri Mar 14 2003 11:31:33 GMT-0800 (PST)", + "shortText": "in dolore", + "mediumText": "Elit reprehenderit mollit deserunt nisi. Officia ea id minim culpa id enim consectetur laborum enim non esse et fugiat proident. Consequat magna mollit amet ipsum nisi et commodo nulla officia duis amet laboris ex. Ad ad amet nisi fugiat pariatur mollit sit non culpa consectetur eiusmod.", + "longText": "Ea commodo tempor ea culpa ea quis ipsum pariatur occaecat nulla officia. Reprehenderit laboris non eiusmod aute adipisicing esse eiusmod commodo ex exercitation occaecat. Velit est reprehenderit anim adipisicing et cillum. Sit proident ipsum est reprehenderit eiusmod nulla laborum. Laboris consectetur excepteur sunt ex commodo. Aliqua laboris quis dolor cillum tempor sint do occaecat deserunt cillum dolor ea nisi ipsum.\r\nNisi adipisicing commodo et id officia non laborum et laborum eiusmod adipisicing duis. Eiusmod tempor in quis anim do ullamco exercitation est. Consequat ad commodo adipisicing nisi dolor excepteur ex incididunt anim sunt velit reprehenderit magna. Proident eiusmod eu qui officia duis amet mollit velit elit.\r\n", + "address": "4 Pacific Street", + "city": "Osmond", + "state": "Oklahoma", + "zip": 41895, + "country": "Guinea", + "email": "dennishill@scentric.com", + "phone": "(974) 511-2460", + "color": "rgb(208,193,99)" + }, + { + "index": 86, + "name": "Carlson Petty", + "first": "Miranda", + "last": "Garner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/milovanovicdu/73.jpg", + "expanded": false, + "guid": "4d705513-68a1-4d45-bf9d-593447e391e2", + "integer": 47, + "date": "Thu Dec 30 1976 16:50:53 GMT-0800 (PST)", + "shortText": "anim in do aliquip", + "mediumText": "Do aute est tempor dolore culpa. Ipsum commodo aute veniam officia aliqua enim laboris irure qui. Cupidatat laborum eu consequat laborum sint officia officia aliquip tempor qui nulla fugiat.", + "longText": "Eu consectetur sint aute fugiat duis consectetur anim nisi culpa ullamco. Duis irure dolore ullamco consectetur reprehenderit anim et proident. Officia consequat cupidatat adipisicing consequat amet sit cillum amet commodo. Duis magna dolore incididunt laborum.\r\nReprehenderit enim pariatur labore irure exercitation consectetur eu eu deserunt. Eiusmod excepteur qui elit qui enim adipisicing dolore aliquip anim enim deserunt aliquip et. Irure eiusmod qui quis consectetur est enim. Culpa Lorem nostrud cupidatat magna sint ad cillum culpa adipisicing dolore commodo in laborum cupidatat. Dolore sint minim cupidatat laboris fugiat est ad quis occaecat adipisicing laborum nisi. Magna labore qui anim non qui elit velit do ex veniam ullamco. Eiusmod minim sit pariatur cillum exercitation non occaecat qui et.\r\nUllamco esse ullamco amet amet fugiat occaecat ex in fugiat nulla. Deserunt magna labore fugiat qui officia qui enim minim. Adipisicing irure proident sunt commodo cillum aliqua velit. Esse est est ipsum est elit duis ipsum exercitation. Ipsum sit deserunt duis eu duis id sunt ipsum aute eiusmod.\r\nOfficia eu deserunt veniam deserunt do exercitation. Amet reprehenderit enim anim exercitation sunt do cillum officia laboris commodo mollit quis laboris irure. Duis nisi nulla nisi enim enim. Ipsum minim sit est culpa nostrud aute elit commodo minim laboris incididunt Lorem nostrud. Ullamco sint deserunt incididunt nisi.\r\nSit cillum occaecat officia laboris do cillum. Irure consectetur occaecat elit nostrud. Nisi commodo nulla culpa fugiat duis in consectetur sint proident Lorem non sunt. Fugiat Lorem deserunt duis mollit do sit id.\r\n", + "address": "2 Laurel Avenue", + "city": "Freetown", + "state": "Ohio", + "zip": 80225, + "country": "Senegal", + "email": "mirandagarner@scentric.com", + "phone": "(989) 558-3766", + "color": "rgb(201,116,189)" + }, + { + "index": 87, + "name": "Randolph Lewis", + "first": "Isabella", + "last": "Fry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imughal7/73.jpg", + "expanded": false, + "guid": "70e8a5f4-7b65-42d2-bdfa-cd58c31f5e45", + "integer": 2, + "date": "Mon Aug 13 1990 16:40:29 GMT-0700 (PDT)", + "shortText": "velit laboris tempor", + "mediumText": "Ullamco in esse consectetur ea tempor adipisicing ad veniam eiusmod proident.", + "longText": "Aliquip in dolore Lorem labore fugiat et ut nulla voluptate nostrud adipisicing irure. Cupidatat culpa ea consequat cillum culpa amet do deserunt amet voluptate tempor reprehenderit. Esse est excepteur incididunt esse elit laborum nulla ad. Adipisicing reprehenderit amet officia occaecat. Nisi Lorem ea duis id ex aute consequat mollit adipisicing id. Eu mollit elit nostrud labore adipisicing. Magna sunt proident duis voluptate enim ut id qui aliquip ea nisi velit.\r\nDolor duis sint tempor ad commodo sit ut minim id. Magna dolor et sunt ut laborum fugiat officia dolore adipisicing reprehenderit et ullamco nisi. Sint dolor ut laborum tempor veniam dolore eiusmod id adipisicing excepteur proident. Laborum magna fugiat pariatur dolore. Ipsum irure consequat nulla velit. Sint duis mollit exercitation enim fugiat voluptate.\r\nExcepteur adipisicing et magna sunt. Officia incididunt reprehenderit et ea culpa nostrud ex minim ad minim. Consequat magna ipsum laborum ut tempor pariatur Lorem magna minim labore cillum ad nulla nulla.\r\nMinim tempor veniam consequat veniam esse adipisicing officia sint id do veniam. Ullamco dolore ad consequat minim veniam deserunt magna sit nulla cupidatat cillum non incididunt veniam. Labore aliqua cupidatat excepteur eu veniam. Sit id id ut minim aute qui aliqua dolore id ex deserunt id ullamco laboris. Fugiat irure irure nisi in mollit ad cillum sit duis exercitation ad sint sit consectetur. Voluptate eu amet consectetur consectetur dolore ex ad.\r\n", + "address": "2 Schenck Street", + "city": "Richford", + "state": "Nevada", + "zip": 27095, + "country": "Yugoslavia", + "email": "isabellafry@scentric.com", + "phone": "(974) 558-2625", + "color": "rgb(220,182,202)" + }, + { + "index": 88, + "name": "Daniel Foley", + "first": "Stephens", + "last": "Bender", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/creative_px/73.jpg", + "expanded": false, + "guid": "e3ad719a-545a-47b0-a02a-62dfec32263f", + "integer": 98, + "date": "Thu Jan 28 1982 23:00:55 GMT-0800 (PST)", + "shortText": "anim", + "mediumText": "Dolor consequat aute ea officia non dolor consequat exercitation pariatur.", + "longText": "Sunt cupidatat officia ea officia fugiat sunt cupidatat. Esse ex adipisicing mollit ipsum aute. Consectetur non nisi nostrud eiusmod voluptate cupidatat nulla. Dolor enim nulla laboris enim qui velit tempor. Sunt Lorem do qui minim pariatur sint eu occaecat officia laboris. Pariatur reprehenderit occaecat ad ipsum occaecat ex. Magna qui ullamco laborum sint adipisicing magna velit labore sit excepteur duis ad.\r\nMagna laboris ut eiusmod tempor velit exercitation duis qui exercitation. Do occaecat ea consequat non sit eiusmod dolor aute dolor ea elit eiusmod. Ad ad qui reprehenderit culpa velit.\r\nAdipisicing non laboris magna aute pariatur. Sit irure aliquip aute minim sit velit fugiat minim excepteur. Laborum reprehenderit dolor ea ipsum aute minim Lorem velit.\r\n", + "address": "3 Aster Court", + "city": "Diaperville", + "state": "Montana", + "zip": 59636, + "country": "Uzbekistan", + "email": "stephensbender@scentric.com", + "phone": "(929) 559-3077", + "color": "rgb(214,117,159)" + }, + { + "index": 89, + "name": "Morales Mays", + "first": "Tracie", + "last": "Pate", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gabrielizalo/73.jpg", + "expanded": false, + "guid": "f420dfd4-d785-4f2d-ad37-b48a8c5e8c63", + "integer": 42, + "date": "Tue Jun 10 2014 10:24:55 GMT-0700 (PDT)", + "shortText": "elit qui deserunt veniam", + "mediumText": "Sint cupidatat laborum nostrud ullamco pariatur ea consectetur sit irure adipisicing cupidatat commodo nisi ullamco. Esse adipisicing consequat velit consequat cillum exercitation incididunt deserunt est proident. Officia incididunt et tempor esse. Adipisicing fugiat non dolor aute elit elit Lorem consectetur. Irure mollit eu est laboris ea dolor eu irure deserunt sunt nulla mollit culpa.", + "longText": "Dolor anim consequat minim exercitation incididunt voluptate dolor magna. In magna ex veniam duis ad velit commodo tempor ea excepteur. Amet veniam esse aliqua duis. Anim cupidatat voluptate culpa culpa reprehenderit in ullamco aliqua exercitation sit elit.\r\nNulla deserunt minim cupidatat labore id pariatur pariatur minim nostrud. Anim ad eu esse et incididunt labore. Incididunt culpa aliquip sit laboris magna reprehenderit Lorem quis ut commodo aliqua. Cillum velit irure eu nulla fugiat quis nisi laborum reprehenderit duis voluptate ut. Velit ea Lorem dolore ea sint excepteur eiusmod adipisicing minim proident non tempor nisi dolore. Aute dolor consectetur eu ipsum adipisicing ex exercitation consectetur proident adipisicing in.\r\nFugiat minim cupidatat ea sit velit tempor. Dolor laboris minim officia Lorem Lorem eu est ut do nisi veniam nulla adipisicing. Adipisicing veniam occaecat ex sunt id.\r\nVeniam velit ipsum Lorem est ad amet nisi adipisicing. Veniam sint pariatur velit pariatur veniam pariatur deserunt laborum ullamco sit enim et cillum commodo. Nisi incididunt et culpa occaecat aliquip. Ipsum commodo sunt proident esse amet consectetur ullamco nisi nulla voluptate magna. Consequat nostrud labore ipsum dolor mollit ullamco eu cillum occaecat.\r\nNon sit proident deserunt aliquip sunt. Ipsum quis nulla quis elit officia exercitation quis commodo. Ullamco et anim duis do nulla Lorem non commodo do ut tempor ullamco do. Commodo incididunt dolore in laborum excepteur voluptate et tempor nulla sint tempor laborum et. Consectetur amet magna consequat anim duis nisi non in. Tempor deserunt aliqua aute incididunt culpa sunt nostrud cillum laborum dolor.\r\n", + "address": "4 Herbert Street", + "city": "Wescosville", + "state": "California", + "zip": 64034, + "country": "Estonia", + "email": "traciepate@scentric.com", + "phone": "(967) 595-3876", + "color": "rgb(140,217,62)" + }, + { + "index": 90, + "name": "Christie Cobb", + "first": "Georgina", + "last": "Cardenas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/xtr1mal2/73.jpg", + "expanded": false, + "guid": "62687023-9614-4076-85b2-5cb8b60263be", + "integer": 0, + "date": "Tue Aug 27 2002 06:22:09 GMT-0700 (PDT)", + "shortText": "aliqua", + "mediumText": "Est quis aliquip tempor est elit sint adipisicing et pariatur labore deserunt ex dolore pariatur.", + "longText": "Proident pariatur ex anim proident. Et adipisicing do amet magna id fugiat mollit. Ipsum aliqua pariatur ad eu. Id officia enim enim aliqua veniam amet commodo in incididunt velit incididunt ipsum. Id adipisicing anim voluptate labore veniam cupidatat dolore quis excepteur in velit consectetur fugiat nisi. Laborum tempor duis veniam esse ut et deserunt consequat occaecat Lorem minim aliquip exercitation.\r\nEx ex id id voluptate aliqua tempor veniam non et. Enim labore ut sit quis ullamco. Et sit ea cupidatat laborum exercitation reprehenderit laborum magna enim reprehenderit commodo ex. Et ad nostrud ea nulla. Officia commodo ea ea commodo sunt pariatur in culpa incididunt voluptate magna.\r\nElit reprehenderit minim nulla officia magna proident esse proident id officia officia ea cupidatat. Pariatur duis consectetur laboris et anim excepteur labore laboris officia voluptate proident nostrud dolor incididunt. Ad laboris laborum qui occaecat do fugiat enim officia dolore sit eu.\r\n", + "address": "2 Clinton Street", + "city": "Townsend", + "state": "Marshall Islands", + "zip": 25271, + "country": "Gambia", + "email": "georginacardenas@scentric.com", + "phone": "(917) 515-3962", + "color": "rgb(108,88,246)" + }, + { + "index": 91, + "name": "Kellie Cummings", + "first": "Carissa", + "last": "Castillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eugenerifan/73.jpg", + "expanded": false, + "guid": "dbb02d06-2dc9-4b57-84cd-59d4e653047c", + "integer": 58, + "date": "Sun Jul 27 1986 08:30:17 GMT-0700 (PDT)", + "shortText": "incididunt labore aliquip", + "mediumText": "Excepteur quis proident aliquip consectetur.", + "longText": "Exercitation ea anim ex sit nisi excepteur aliqua eu cillum esse nulla deserunt ut. Cillum veniam laboris occaecat commodo est adipisicing proident. Ut deserunt enim irure officia irure deserunt ipsum labore magna. Do sint sint aliquip ullamco laboris commodo magna ea ut nostrud adipisicing et nostrud aliquip. Enim nostrud commodo do laborum fugiat incididunt quis dolore dolor voluptate tempor. Cupidatat deserunt est commodo amet cillum aliqua ullamco.\r\nEnim commodo labore id duis irure commodo eiusmod nostrud magna tempor veniam exercitation velit. Officia incididunt ut et ex anim. Esse ex cillum aliqua adipisicing et Lorem culpa elit. Commodo laborum ut in aute laboris esse exercitation eiusmod eu. Minim nulla laborum minim ad non fugiat consectetur sunt adipisicing occaecat Lorem consequat. Officia ex aliquip labore non do quis amet sit do tempor exercitation.\r\nQui do dolore officia et elit dolor magna sunt laboris nulla. Enim id deserunt ex amet non deserunt quis nisi quis pariatur commodo est excepteur cillum. Cillum commodo reprehenderit nostrud et adipisicing labore ad ex id. Adipisicing velit mollit aute eu non reprehenderit ad mollit commodo irure sit. Adipisicing cillum consequat dolor incididunt occaecat laborum et ipsum ipsum magna ipsum fugiat esse. Velit esse mollit ex nulla incididunt incididunt est sit pariatur minim fugiat.\r\nExercitation non ut id ad mollit in eu et fugiat ullamco sint ullamco consequat. Cupidatat mollit incididunt ea consectetur Lorem velit sint consectetur irure. Eiusmod sunt ipsum eu voluptate sunt. Laborum do nostrud amet commodo mollit aliqua commodo ex fugiat pariatur incididunt ea. Aute voluptate mollit culpa et cillum mollit proident ad ea proident labore. Qui aute labore pariatur ea.\r\nLaboris Lorem laborum reprehenderit sint duis adipisicing consectetur qui adipisicing cupidatat voluptate anim eu. Nostrud ea consequat officia Lorem sint enim sunt aute qui anim nulla. Est anim sit nisi magna anim. Non aliquip eu deserunt fugiat id irure voluptate labore nostrud. Qui qui ad nulla ea.\r\n", + "address": "4 Pierrepont Place", + "city": "Riviera", + "state": "Indiana", + "zip": 10834, + "country": "Nepal", + "email": "carissacastillo@scentric.com", + "phone": "(902) 528-2051", + "color": "rgb(116,122,170)" + }, + { + "index": 92, + "name": "Hooper Acosta", + "first": "Delacruz", + "last": "Hunt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imcoding/73.jpg", + "expanded": false, + "guid": "f3455179-b392-49d5-8f8e-0b570ff95363", + "integer": 63, + "date": "Wed Apr 18 1973 01:53:52 GMT-0800 (PST)", + "shortText": "aute consectetur", + "mediumText": "Non esse non cillum eiusmod. Velit consequat amet eiusmod do laborum est do. Id aliqua cupidatat tempor consectetur do consectetur.", + "longText": "In elit nisi dolore aliquip magna ex. Eu do in enim tempor duis adipisicing eiusmod magna ut velit velit do. Nostrud magna aliquip est exercitation qui elit sit.\r\nLabore Lorem minim id laborum proident in sit ea quis sit. Mollit excepteur voluptate sit qui. Ex in voluptate veniam magna dolor consectetur anim consectetur. Deserunt deserunt elit in id.\r\nAd incididunt aute labore commodo consectetur consectetur commodo magna irure. Duis adipisicing pariatur ea labore consequat ut pariatur labore laboris nulla occaecat. Irure aute id id eiusmod. Aute eiusmod Lorem eiusmod occaecat qui in veniam in laboris. Elit sit sit tempor tempor magna. Elit aliquip cupidatat commodo eiusmod consequat fugiat magna nisi fugiat irure aute dolore quis labore.\r\nOccaecat duis duis ad officia consectetur aute elit excepteur consectetur ullamco. Exercitation pariatur irure ad anim fugiat anim. Elit laborum velit aliquip et aliquip officia elit ad amet mollit nulla.\r\nFugiat minim minim anim labore culpa magna laborum veniam in reprehenderit id. Id sint pariatur excepteur commodo ullamco eu. Eiusmod magna commodo reprehenderit nostrud in culpa laboris occaecat aliqua. Sit pariatur nulla sit exercitation irure pariatur sit cillum occaecat exercitation. Aliqua dolore aliqua magna minim id ut eu veniam.\r\n", + "address": "3 Matthews Place", + "city": "Caron", + "state": "Tennessee", + "zip": 68234, + "country": "Falkland Islands (Malvinas)", + "email": "delacruzhunt@scentric.com", + "phone": "(928) 557-3052", + "color": "rgb(207,106,189)" + }, + { + "index": 93, + "name": "Leonor Rogers", + "first": "Claudette", + "last": "Walters", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/madhan4uu/73.jpg", + "expanded": false, + "guid": "d7ddd425-5e0b-407b-b795-4591ac988f7e", + "integer": 14, + "date": "Fri Sep 10 1982 05:35:18 GMT-0700 (PDT)", + "shortText": "nisi enim velit consequat", + "mediumText": "Velit ea anim fugiat ex esse officia.", + "longText": "Anim voluptate consequat et deserunt. Officia culpa quis consequat et occaecat adipisicing commodo ipsum culpa elit Lorem elit. Proident sunt sint id tempor. Pariatur nulla enim id ut aliqua commodo amet ex. Dolor ad tempor Lorem cupidatat cillum deserunt nisi.\r\nDo ad cillum consequat eu nulla irure eiusmod eu aute est sint tempor. Irure irure in culpa commodo esse occaecat fugiat minim sit est dolor. Do ex dolor non quis adipisicing amet incididunt non eiusmod nisi laborum.\r\nDeserunt anim consequat incididunt pariatur eiusmod. Aute nostrud id ipsum consequat laboris dolore. Aliquip in ullamco est incididunt anim esse magna ea labore in.\r\nAliquip ex nisi sit pariatur nostrud do dolor eiusmod consectetur ad quis consequat fugiat. Culpa enim cillum sint minim deserunt duis officia duis laborum mollit cillum ad aliqua. Sint consectetur proident duis velit ea adipisicing. Amet deserunt ut quis est ipsum velit Lorem tempor velit reprehenderit adipisicing consectetur occaecat sint.\r\nMagna nulla aute qui deserunt nostrud cillum magna fugiat occaecat Lorem ipsum culpa. Est anim aute do nisi dolor sint qui pariatur. Fugiat culpa reprehenderit officia excepteur elit amet excepteur enim tempor sint sit consequat. Consequat enim laboris officia nisi irure irure consequat elit. Dolor minim do velit sit deserunt cillum.\r\n", + "address": "3 Fulton Street", + "city": "Hegins", + "state": "Palau", + "zip": 78135, + "country": "Peru", + "email": "claudettewalters@scentric.com", + "phone": "(942) 474-3822", + "color": "rgb(90,63,99)" + }, + { + "index": 94, + "name": "Cote Guerra", + "first": "Trisha", + "last": "Chavez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tirsope/73.jpg", + "expanded": false, + "guid": "da6e4096-5de2-48f3-a83e-e7e504b7ef50", + "integer": 60, + "date": "Wed Feb 14 1990 21:07:18 GMT-0800 (PST)", + "shortText": "amet officia", + "mediumText": "Pariatur nulla nulla aliqua sunt nulla excepteur id amet consequat. Nostrud eu aliquip enim esse eu non exercitation do nulla labore adipisicing dolor. Est voluptate excepteur aliquip voluptate nulla fugiat ut amet tempor.", + "longText": "Ullamco quis exercitation sunt sunt do aute sit qui duis non. Irure dolore tempor velit velit et eu sint elit. Velit esse deserunt elit minim adipisicing sint est commodo sit aute velit excepteur dolore sunt. Occaecat adipisicing occaecat pariatur do enim culpa proident nostrud labore aute consectetur esse dolor ut. Irure pariatur minim aute labore mollit eu deserunt amet deserunt. Ex velit ad quis ullamco.\r\nOfficia nostrud excepteur nisi id esse cupidatat adipisicing. Veniam ea duis nisi exercitation labore non pariatur velit officia Lorem tempor. Qui ea culpa laborum cillum commodo. Enim eu sit adipisicing voluptate est ex incididunt eu deserunt. Sit irure dolor non culpa anim. Sint ex ullamco culpa est ipsum. Id nostrud id eiusmod ea consequat anim nulla qui aliquip sunt sunt Lorem.\r\n", + "address": "4 Montauk Court", + "city": "Ryderwood", + "state": "Virginia", + "zip": 72564, + "country": "Tonga", + "email": "trishachavez@scentric.com", + "phone": "(986) 580-3064", + "color": "rgb(252,141,100)" + }, + { + "index": 95, + "name": "Stewart Bradley", + "first": "Desiree", + "last": "Sullivan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lorenzosinisi/73.jpg", + "expanded": false, + "guid": "09ba747d-fcdd-47ec-b40f-149aad2803bd", + "integer": 14, + "date": "Mon Aug 18 2014 05:24:18 GMT-0700 (PDT)", + "shortText": "veniam officia exercitation", + "mediumText": "Sint dolor aliqua velit eu eiusmod id. Velit pariatur sit labore sit sit elit dolore fugiat veniam excepteur ex. Velit ex elit ullamco ipsum sunt magna aliqua cupidatat veniam Lorem mollit eu sit. Consequat Lorem Lorem sit aute.", + "longText": "Nulla aliquip id sunt ex reprehenderit sit et amet adipisicing pariatur sit non mollit minim. Sint nisi occaecat duis ut amet veniam mollit. Esse ipsum ea in anim. Elit est adipisicing velit cupidatat laboris in laboris eiusmod non aliquip minim. Eu commodo occaecat occaecat cupidatat cillum nulla esse mollit exercitation eu.\r\n", + "address": "4 Douglass Street", + "city": "Hiko", + "state": "Wyoming", + "zip": 58685, + "country": "Tunisia", + "email": "desireesullivan@scentric.com", + "phone": "(955) 561-2349", + "color": "rgb(67,224,233)" + }, + { + "index": 96, + "name": "Corinne Farley", + "first": "Guthrie", + "last": "May", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/celikovic/73.jpg", + "expanded": false, + "guid": "5fe813a0-75c4-4214-96b9-9b4d5fcea8bf", + "integer": 79, + "date": "Wed Aug 26 2009 12:40:36 GMT-0700 (PDT)", + "shortText": "eiusmod aliquip mollit aute", + "mediumText": "Ea irure ea pariatur laborum non commodo. Veniam est laboris ex occaecat laboris irure. Aliqua pariatur anim ut eu veniam do ex non veniam nostrud. Occaecat excepteur non est cillum commodo eu ullamco.", + "longText": "In anim esse ea excepteur est. Laboris qui ex ipsum cillum excepteur nisi. Non deserunt qui duis ut eiusmod ad laborum labore Lorem est cupidatat. Nulla eiusmod sint reprehenderit amet fugiat labore laboris.\r\nVoluptate anim minim cillum est aliquip. Occaecat eiusmod eu consectetur id id sit id aliquip minim. Id quis laboris duis dolore id pariatur officia irure ullamco cillum ullamco dolor. Ut pariatur excepteur eiusmod exercitation tempor.\r\nProident amet esse enim fugiat nostrud aute exercitation excepteur ut dolore incididunt. Eiusmod dolore irure ut tempor. Cupidatat id laboris aute nulla deserunt sint. Velit mollit ut eu commodo. Esse adipisicing veniam voluptate dolore laborum laboris qui aliquip fugiat ullamco ea exercitation voluptate. Enim veniam do aliquip aute laboris in elit magna anim. Consequat excepteur eu dolor officia eiusmod incididunt occaecat deserunt commodo nisi Lorem.\r\nMagna culpa dolore deserunt aliquip. Quis officia ut nulla et commodo officia ullamco. Cupidatat ea eiusmod nulla enim sit in.\r\nEst reprehenderit consectetur consectetur eu occaecat nulla nulla laboris est ad nulla exercitation. Amet nostrud nulla minim minim ea incididunt ea et. Exercitation qui qui mollit exercitation. Exercitation excepteur labore cillum laboris ut nulla excepteur pariatur ullamco ex ex consectetur consectetur. Lorem ex laborum in qui velit reprehenderit id pariatur esse enim. Do eu adipisicing culpa elit exercitation ea est occaecat. Et velit cupidatat excepteur sunt officia occaecat et cillum ut voluptate enim.\r\n", + "address": "3 Locust Street", + "city": "Wyano", + "state": "Colorado", + "zip": 24261, + "country": "Guadeloupe", + "email": "guthriemay@scentric.com", + "phone": "(952) 423-2212", + "color": "rgb(207,250,179)" + }, + { + "index": 97, + "name": "Heather Martinez", + "first": "Althea", + "last": "Quinn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_kshitish/73.jpg", + "expanded": false, + "guid": "d67d7b7a-2ab1-446e-a591-4f565e74fe3d", + "integer": 13, + "date": "Mon Mar 17 2003 07:02:53 GMT-0800 (PST)", + "shortText": "adipisicing magna", + "mediumText": "Reprehenderit exercitation ut in ex voluptate dolore.", + "longText": "Pariatur pariatur do ipsum exercitation magna. Irure irure officia voluptate amet fugiat sint est proident reprehenderit cupidatat est eu. Esse ea eiusmod nostrud ad quis laborum deserunt nisi. Deserunt ut fugiat aliqua minim. Proident fugiat aliqua nostrud adipisicing Lorem velit et ipsum fugiat fugiat aliquip cupidatat Lorem.\r\nEx quis non excepteur est cillum non aute consequat ipsum aliqua nostrud sunt nisi non. Est aliquip enim aute culpa. Esse enim pariatur id velit nostrud adipisicing voluptate pariatur et sint sunt.\r\nUt quis cillum dolor minim nulla fugiat enim irure officia. Reprehenderit voluptate sint veniam velit tempor deserunt eu adipisicing id anim fugiat. Nostrud dolore esse reprehenderit enim nulla duis exercitation.\r\nCillum proident est dolore sint qui sint laborum enim exercitation aute in pariatur. Ut non eiusmod excepteur exercitation aliquip incididunt cupidatat magna deserunt in est. Excepteur duis incididunt sunt commodo amet nulla ex adipisicing incididunt in exercitation amet et. Ullamco eu nulla ipsum magna voluptate incididunt aliqua id.\r\n", + "address": "4 Arkansas Drive", + "city": "Catherine", + "state": "Utah", + "zip": 68985, + "country": "Australia", + "email": "altheaquinn@scentric.com", + "phone": "(997) 529-2688", + "color": "rgb(175,88,98)" + }, + { + "index": 98, + "name": "Good Mathis", + "first": "Hester", + "last": "Santana", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/2fockus/73.jpg", + "expanded": false, + "guid": "8046ed24-325f-4486-9067-34ecfa37746c", + "integer": 67, + "date": "Sat Mar 19 1977 20:48:42 GMT-0800 (PST)", + "shortText": "commodo incididunt officia", + "mediumText": "Velit sint reprehenderit laboris occaecat in reprehenderit dolore adipisicing nisi pariatur enim aute. Cillum velit voluptate sit irure.", + "longText": "Irure labore incididunt nisi labore sint cillum cillum. Pariatur aute dolor duis ad eu nulla veniam enim voluptate. Laborum fugiat veniam occaecat adipisicing voluptate qui pariatur voluptate quis eu. Aliquip aute anim proident excepteur do aute consectetur ipsum exercitation est velit consequat laboris. Amet proident enim aute excepteur cillum. Do occaecat ullamco proident adipisicing ullamco id anim nostrud. Laborum ullamco occaecat aliqua eiusmod culpa quis nulla ad dolore ad ullamco.\r\nEsse ex officia qui qui aute. Ipsum sint irure nostrud nulla culpa cupidatat do. Aute ullamco occaecat aliquip in tempor minim ut nisi aliquip nostrud cillum Lorem. Excepteur dolor cupidatat eiusmod Lorem. Dolore eu ad sint ullamco voluptate.\r\nSit cupidatat id mollit occaecat in officia amet in magna enim sint. Officia deserunt proident quis in ut. Excepteur incididunt amet nulla labore eu incididunt adipisicing laboris nisi. Magna nisi proident deserunt sunt do deserunt eiusmod pariatur.\r\nDo elit quis occaecat anim aliquip aliquip excepteur. Enim laborum proident labore ad nulla duis magna tempor duis. Commodo veniam tempor minim cillum ex dolor.\r\nVelit adipisicing mollit pariatur in ipsum tempor id velit excepteur laborum amet laborum laborum. Excepteur eu exercitation veniam sit veniam incididunt sit. Elit commodo eu aute tempor aliquip esse non minim mollit. Consequat amet deserunt non enim. Nostrud anim Lorem aliquip cupidatat.\r\n", + "address": "3 Fiske Place", + "city": "Klagetoh", + "state": "Idaho", + "zip": 38305, + "country": "Dominican Republic", + "email": "hestersantana@scentric.com", + "phone": "(802) 512-3640", + "color": "rgb(253,247,138)" + }, + { + "index": 99, + "name": "Hurley Eaton", + "first": "Garner", + "last": "Kirk", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dnevozhai/73.jpg", + "expanded": false, + "guid": "312f254d-5789-4396-a389-10090b30c80a", + "integer": 80, + "date": "Sun Jun 01 2008 17:44:07 GMT-0700 (PDT)", + "shortText": "enim laborum", + "mediumText": "Reprehenderit labore magna est sunt dolore excepteur ea. Duis laboris eiusmod do laboris cupidatat proident in amet quis adipisicing est nisi.", + "longText": "Sunt mollit aliqua nisi irure sit. Minim sit amet duis nisi Lorem veniam. Deserunt anim est sint consequat pariatur elit eu magna incididunt duis aliquip. Do ipsum adipisicing eu quis ut nostrud fugiat ad in nostrud est sint enim. Incididunt exercitation commodo ipsum ut eu. Irure et adipisicing esse dolor eu. Ea consequat cillum eu occaecat in magna cillum anim culpa deserunt.\r\nConsectetur adipisicing velit minim et occaecat laborum minim fugiat eu laboris minim anim id do. Sint cupidatat pariatur sit quis quis elit pariatur. Deserunt proident enim Lorem est minim nisi et laborum nisi exercitation. Mollit qui consequat proident aliqua ad quis dolor. Irure nulla nisi ut Lorem ullamco sint et nulla dolore consectetur. Esse Lorem qui do pariatur mollit in velit amet labore.\r\nAliqua magna eiusmod ea velit sit voluptate in ea ad Lorem laborum aute cillum et. Veniam ea eiusmod dolor Lorem adipisicing deserunt. Do sunt dolore do fugiat et magna id aliquip nulla occaecat mollit.\r\nId veniam voluptate irure est ea irure nostrud ex. Est anim est dolor exercitation reprehenderit minim non est commodo ex est ut Lorem. Nulla aute nulla dolore amet deserunt elit tempor reprehenderit amet. Nulla et magna aliqua laborum ut minim ad in ex mollit dolor officia.\r\n", + "address": "2 Marconi Place", + "city": "Clarktown", + "state": "Arkansas", + "zip": 81655, + "country": "Zaire", + "email": "garnerkirk@scentric.com", + "phone": "(901) 504-3233", + "color": "rgb(141,220,214)" + }, + { + "index": 100, + "name": "Ruby Schroeder", + "first": "Julianne", + "last": "Hurst", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sebasribas/73.jpg", + "expanded": false, + "guid": "ae0e0ad1-423d-4e87-9d72-e7957011b3b1", + "integer": 51, + "date": "Tue Jun 14 1977 06:58:41 GMT-0700 (PDT)", + "shortText": "consectetur", + "mediumText": "Ex ea veniam ut velit aute dolore laborum ut. Ex proident elit cillum elit reprehenderit amet fugiat cillum cupidatat fugiat. Elit Lorem aute ad ad sit exercitation aute excepteur ex elit.", + "longText": "Eiusmod in irure exercitation aute aliquip qui sit amet ullamco cillum eiusmod enim. Ut aliquip occaecat nisi aliqua ut esse minim. Tempor deserunt dolore ea fugiat tempor cupidatat fugiat excepteur consectetur velit tempor eiusmod laborum. Adipisicing incididunt ex sit aliqua deserunt in culpa. Veniam ipsum enim duis enim ex proident do anim amet. Ipsum consequat ut labore non quis cupidatat adipisicing eiusmod amet.\r\nQui consectetur pariatur adipisicing aliquip nulla labore nulla in laborum excepteur eiusmod eu esse. Elit duis commodo ex laboris consectetur sunt in ullamco elit aliquip commodo consequat adipisicing. Labore eiusmod dolore ut voluptate proident. Officia fugiat culpa elit consectetur mollit sint ut. Duis magna cillum Lorem adipisicing amet nisi minim laboris nostrud fugiat eu nisi sunt.\r\nEa voluptate anim reprehenderit eu laboris ex ad non ut magna eu esse laborum. Eiusmod non dolor ex adipisicing sunt elit proident in officia pariatur eiusmod minim voluptate ex. Commodo excepteur enim sit dolor magna. Quis velit adipisicing pariatur ad ullamco ullamco eu fugiat consectetur. Est fugiat esse cupidatat velit ea aute laboris occaecat ullamco est velit. Aliqua adipisicing ex duis ipsum.\r\nLaboris mollit est officia in commodo consequat ullamco officia id aute non in ut. Excepteur ad magna sit dolore voluptate irure ut. Occaecat ea duis ipsum excepteur fugiat esse nulla incididunt fugiat adipisicing cupidatat labore. Voluptate eu consectetur tempor qui in quis in ad proident magna ex aliquip ad. Aute laboris consectetur proident ullamco voluptate nulla commodo tempor aliqua magna. Laborum eiusmod nulla occaecat quis elit aliquip aute id irure ut excepteur.\r\n", + "address": "3 Wyckoff Avenue", + "city": "Holcombe", + "state": "Delaware", + "zip": 49315, + "country": "China", + "email": "juliannehurst@scentric.com", + "phone": "(867) 576-3002", + "color": "rgb(191,56,212)" + }, + { + "index": 101, + "name": "Alana Wise", + "first": "Edith", + "last": "Suarez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cepreygolubev/73.jpg", + "expanded": false, + "guid": "19280eda-c661-4fde-88e3-e7e705ea0a83", + "integer": 59, + "date": "Wed Jun 25 2003 02:31:03 GMT-0700 (PDT)", + "shortText": "aute", + "mediumText": "Consectetur eu aute tempor mollit do aute nostrud adipisicing ad commodo id.", + "longText": "Incididunt excepteur cupidatat mollit ad tempor esse cupidatat velit ipsum non tempor est incididunt. Duis consequat dolore elit cupidatat mollit est. Exercitation et ex deserunt adipisicing tempor consectetur adipisicing ipsum deserunt amet enim tempor. Excepteur elit sit cupidatat cupidatat sit ea anim ullamco cupidatat nisi consectetur ut. Adipisicing amet duis occaecat excepteur adipisicing et exercitation enim est.\r\nCulpa nulla dolor ullamco occaecat dolor elit irure dolor velit anim id incididunt eiusmod ut. Deserunt dolore fugiat ipsum tempor ut dolore nostrud. Exercitation cillum culpa nostrud est. Quis qui sunt dolor id aliquip culpa anim nisi deserunt.\r\nLaborum eu minim aliqua excepteur ad. Sit tempor ullamco laborum excepteur pariatur deserunt cupidatat. Sint anim eiusmod sint elit. Incididunt consequat officia incididunt cillum. Reprehenderit anim reprehenderit esse officia et ea excepteur nisi magna. Lorem cupidatat in fugiat eu. Exercitation occaecat do eiusmod esse.\r\nAnim ullamco excepteur culpa deserunt enim est dolore duis ea anim exercitation. In et pariatur exercitation occaecat ad id Lorem ullamco consectetur labore ut laboris excepteur magna. Aute exercitation Lorem fugiat esse incididunt. Nulla nostrud ea ipsum eiusmod laboris nulla qui veniam aute officia eiusmod ad. Et anim ut dolor qui commodo occaecat nostrud non ex.\r\nCillum non et laborum cillum ex officia ullamco aliquip ut Lorem. Duis est sit sunt laboris ullamco deserunt dolor labore ut. Cupidatat elit do aute aliquip laborum tempor amet laboris occaecat id exercitation elit. Ullamco quis laboris voluptate amet duis elit incididunt mollit anim proident.\r\n", + "address": "4 Leonard Street", + "city": "Bluetown", + "state": "Federated States Of Micronesia", + "zip": 89344, + "country": "British Indian Ocean Territory", + "email": "edithsuarez@scentric.com", + "phone": "(920) 452-3377", + "color": "rgb(69,58,250)" + }, + { + "index": 102, + "name": "Kristen Wheeler", + "first": "Burke", + "last": "Barnes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamphilipjoyce/73.jpg", + "expanded": false, + "guid": "64341244-b22d-415d-8856-27b7c1b9e527", + "integer": 7, + "date": "Wed Jul 20 1994 02:28:58 GMT-0700 (PDT)", + "shortText": "duis dolore non minim est", + "mediumText": "Veniam amet sit nulla labore Lorem exercitation excepteur nostrud nulla velit proident laboris.", + "longText": "Ex incididunt do ad enim eu labore fugiat nulla enim elit. Cupidatat ipsum quis qui labore excepteur ullamco elit minim. Magna minim elit non mollit in consectetur cillum esse cillum ut esse aliquip anim. Reprehenderit ea irure eu consectetur nisi.\r\n", + "address": "2 Crooke Avenue", + "city": "Geyserville", + "state": "Guam", + "zip": 77246, + "country": "Libya", + "email": "burkebarnes@scentric.com", + "phone": "(843) 586-2743", + "color": "rgb(221,72,113)" + }, + { + "index": 103, + "name": "Clark Powell", + "first": "Hahn", + "last": "Lancaster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/russell_baylis/73.jpg", + "expanded": false, + "guid": "d83aada5-7279-4d3c-81fe-360aa4d342af", + "integer": 44, + "date": "Tue Apr 17 2007 17:02:41 GMT-0700 (PDT)", + "shortText": "officia excepteur fugiat", + "mediumText": "Commodo consequat esse amet deserunt duis magna. Cupidatat aliquip consectetur anim incididunt laboris. Reprehenderit Lorem enim cillum pariatur est sint aliqua commodo non tempor.", + "longText": "Nisi tempor irure nulla duis. Cillum aliquip commodo in minim sunt proident exercitation do dolore velit. Nulla sunt sit officia magna ex ea.\r\nEa consequat aute duis quis elit. Sint aute deserunt commodo reprehenderit aliqua consequat commodo minim ut quis incididunt reprehenderit. Nulla elit voluptate laboris laboris dolore labore tempor pariatur deserunt reprehenderit tempor non occaecat pariatur. Elit pariatur irure ex exercitation ut ex dolore dolore consequat consectetur magna. Lorem consectetur est reprehenderit pariatur dolore sit Lorem Lorem ad ea elit.\r\nAd occaecat est ullamco occaecat voluptate. Aute proident in est adipisicing. Anim ipsum est voluptate ipsum cillum eiusmod aliquip. Officia magna irure commodo ut pariatur est eu nostrud laboris excepteur adipisicing deserunt consectetur amet. Qui consequat cupidatat laborum non.\r\nDolore do cupidatat irure quis culpa aliquip elit laboris consequat qui magna dolore. Magna esse qui exercitation dolore tempor tempor ex irure veniam cupidatat commodo qui officia fugiat. Fugiat aliqua eiusmod deserunt esse elit nisi. Reprehenderit pariatur duis excepteur eiusmod esse. Velit nulla nisi reprehenderit Lorem minim ut tempor nulla aliqua in incididunt aute esse aliquip. Duis laborum quis non commodo officia commodo. Officia nostrud do qui velit occaecat aute ex adipisicing officia et excepteur velit irure officia.\r\n", + "address": "3 Polhemus Place", + "city": "Franklin", + "state": "Pennsylvania", + "zip": 30447, + "country": "Cook Islands", + "email": "hahnlancaster@scentric.com", + "phone": "(901) 537-3991", + "color": "rgb(225,104,190)" + }, + { + "index": 104, + "name": "Tamra Cox", + "first": "Acevedo", + "last": "Bell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kijanmaharjan/73.jpg", + "expanded": false, + "guid": "2d002e10-253b-41d7-bca7-add74579f9d5", + "integer": 0, + "date": "Thu Nov 04 1982 13:05:17 GMT-0800 (PST)", + "shortText": "ullamco in aliqua", + "mediumText": "Irure eiusmod ullamco occaecat deserunt. Ullamco nisi veniam nulla ea labore irure incididunt sit nulla ut commodo.", + "longText": "Culpa elit est velit laborum do eu cillum. Adipisicing sit incididunt ea exercitation anim irure laboris quis reprehenderit adipisicing exercitation adipisicing eu aliquip. Irure aliqua minim irure labore magna cillum fugiat sit occaecat sint. Eiusmod velit dolore est nisi do dolor id quis nisi sunt id anim ex proident. Laborum consectetur deserunt amet anim non commodo occaecat proident et.\r\nDo in magna deserunt dolor aute ad occaecat consectetur qui. Dolore in eiusmod id mollit tempor pariatur sunt reprehenderit incididunt ipsum aliquip dolor qui commodo. Eiusmod in mollit fugiat qui. Nulla nostrud officia aute minim. Officia id proident excepteur sunt amet occaecat nisi anim amet reprehenderit. Tempor duis mollit nostrud enim reprehenderit fugiat nostrud ea proident magna. Sint magna labore aliqua tempor officia do nisi ex in cillum nisi.\r\nNulla tempor in cillum et eiusmod ad qui dolor consequat do deserunt. Mollit ex anim consequat aliqua commodo. Adipisicing cillum ut nostrud ad aliquip. Ipsum occaecat reprehenderit ipsum in veniam tempor deserunt ut adipisicing dolore dolore cupidatat. Consequat velit officia quis labore mollit reprehenderit duis consectetur excepteur nisi tempor.\r\n", + "address": "4 Grand Street", + "city": "Iola", + "state": "New Hampshire", + "zip": 44737, + "country": "Iran", + "email": "acevedobell@scentric.com", + "phone": "(813) 503-2649", + "color": "rgb(84,124,140)" + }, + { + "index": 105, + "name": "Barr Higgins", + "first": "Tonia", + "last": "Walton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/73.jpg", + "expanded": false, + "guid": "b381e41b-6b9b-4f51-85f1-661eade44d9d", + "integer": 93, + "date": "Tue Dec 24 1985 18:32:45 GMT-0800 (PST)", + "shortText": "sunt nisi laborum", + "mediumText": "Aliqua esse in cillum nostrud exercitation duis cupidatat cillum non deserunt culpa.", + "longText": "Exercitation ad do aliqua nostrud magna consequat. Ex ea commodo fugiat labore ipsum officia minim do velit proident sit. Voluptate eiusmod consequat voluptate dolor consectetur eu sunt eiusmod veniam. Exercitation eiusmod fugiat reprehenderit laboris.\r\nMollit aliqua est laboris proident non esse culpa cupidatat laborum qui nulla deserunt occaecat elit. Lorem esse quis labore dolor dolore labore nostrud ea labore veniam tempor. Anim elit nostrud ut velit pariatur sint laborum velit. Et esse culpa voluptate dolor commodo aliquip est ut. Laboris ullamco enim exercitation ea velit excepteur enim veniam in mollit irure. Qui nisi sit ad consequat veniam proident proident reprehenderit ipsum dolore proident. Nostrud occaecat quis laboris magna labore ut tempor consectetur labore cupidatat ea irure pariatur.\r\nAd consectetur commodo do excepteur. Velit fugiat qui pariatur velit nostrud enim. Et in ea enim non exercitation aliqua anim commodo cillum ullamco in nulla nostrud. Eu ex enim ut enim magna duis aliquip ullamco enim. Aute anim ex incididunt cillum eiusmod minim ut nostrud excepteur dolore. Reprehenderit nisi nisi consequat consequat mollit dolor excepteur ipsum aute est tempor. Occaecat in aute ea Lorem ex consectetur.\r\nCupidatat nulla ullamco mollit id consequat. Dolore aute sit est voluptate cillum adipisicing laboris ex non adipisicing. Minim proident labore nisi eu proident irure et et. Dolor deserunt deserunt in et qui consectetur ullamco occaecat. Magna ut tempor fugiat velit. Magna elit id Lorem quis occaecat dolor irure amet nulla. Proident ex ullamco consectetur consequat consequat eiusmod dolor proident aliquip ut.\r\nExcepteur ea aliqua elit incididunt deserunt commodo nisi. Exercitation nostrud in officia anim ea non anim laborum ullamco incididunt. Do aliqua excepteur officia reprehenderit reprehenderit cillum. Duis nostrud veniam occaecat quis exercitation magna mollit est fugiat ullamco in consectetur culpa cillum. Minim consequat elit ipsum in occaecat sit dolor sint laborum.\r\n", + "address": "4 Banker Street", + "city": "Silkworth", + "state": "North Dakota", + "zip": 14286, + "country": "Aruba", + "email": "toniawalton@scentric.com", + "phone": "(889) 461-2741", + "color": "rgb(116,194,59)" + }, + { + "index": 106, + "name": "Hickman Copeland", + "first": "Ross", + "last": "Ratliff", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/noufalibrahim/73.jpg", + "expanded": false, + "guid": "2f265cef-ebfa-484a-b328-63fa19eed885", + "integer": 91, + "date": "Tue Mar 20 1979 12:59:39 GMT-0800 (PST)", + "shortText": "eiusmod", + "mediumText": "Culpa dolor sunt culpa magna.", + "longText": "Aute amet velit labore labore culpa. Minim eiusmod eiusmod eiusmod nostrud et quis in et culpa ex sit incididunt Lorem. Cupidatat adipisicing Lorem dolore consequat elit.\r\n", + "address": "2 Euclid Avenue", + "city": "Rosewood", + "state": "Northern Mariana Islands", + "zip": 23138, + "country": "Faroe Islands", + "email": "rossratliff@scentric.com", + "phone": "(917) 466-2566", + "color": "rgb(245,137,240)" + }, + { + "index": 107, + "name": "Cervantes Mckee", + "first": "Vasquez", + "last": "Knapp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/avclarkey/73.jpg", + "expanded": false, + "guid": "3658528d-3180-47bd-9c2e-d4f53947e409", + "integer": 27, + "date": "Sat Jan 23 1971 05:21:04 GMT-0800 (PST)", + "shortText": "eiusmod ullamco", + "mediumText": "Nulla tempor cupidatat consequat fugiat consequat irure non in. Ea eiusmod exercitation dolor labore laborum irure anim tempor exercitation.", + "longText": "Incididunt sit fugiat nulla ipsum. Veniam ex nostrud eu reprehenderit cillum. Fugiat nostrud esse eiusmod cupidatat consectetur ipsum sit duis consectetur cupidatat duis ullamco incididunt. Ea cupidatat esse sint adipisicing magna enim irure. Irure amet officia elit ullamco est cupidatat. Voluptate ut Lorem commodo occaecat nisi non id in ullamco occaecat est. Officia ea ea tempor irure commodo aute laborum et enim quis magna occaecat.\r\nAdipisicing ullamco aute duis labore duis est id Lorem ea commodo do nulla laboris. Et magna aliquip Lorem in in consectetur enim nulla do ad. Ea aute Lorem dolore eiusmod qui aliqua in cupidatat velit labore aliquip. Est esse velit sit consectetur anim nostrud ullamco commodo magna mollit in ut tempor. Lorem velit irure eiusmod duis amet et consectetur est quis non nulla incididunt et. Incididunt tempor ex minim amet reprehenderit. Anim nisi dolor ad tempor officia.\r\nEa ex esse amet excepteur tempor officia cupidatat eu cupidatat sit irure. Lorem minim quis ut non sit ullamco id tempor minim aliquip deserunt. Voluptate consectetur qui velit occaecat ullamco ea cupidatat tempor in anim ad magna. Ut velit dolore eiusmod reprehenderit incididunt irure anim laboris voluptate mollit incididunt minim ad duis.\r\n", + "address": "4 Crown Street", + "city": "Lowgap", + "state": "South Dakota", + "zip": 17680, + "country": "Zambia", + "email": "vasquezknapp@scentric.com", + "phone": "(889) 408-3991", + "color": "rgb(212,58,71)" + }, + { + "index": 108, + "name": "Juana Melendez", + "first": "Ford", + "last": "Greer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/arindam_/73.jpg", + "expanded": false, + "guid": "b9726558-94a5-4533-9213-cc6b11fa2b5d", + "integer": 94, + "date": "Mon Jul 17 1972 18:15:51 GMT-0700 (PDT)", + "shortText": "laboris velit esse", + "mediumText": "Aute ad non aute ipsum sint commodo cupidatat elit adipisicing fugiat.", + "longText": "Veniam ex consectetur id pariatur ipsum pariatur non officia sint. Exercitation quis eiusmod nisi officia aliquip. Laborum commodo occaecat ex ipsum aliqua. Et incididunt sunt deserunt Lorem eiusmod anim. Cillum consequat nulla ipsum eiusmod nulla velit pariatur aliqua. Reprehenderit est fugiat minim adipisicing ex esse adipisicing irure eu pariatur cupidatat.\r\nIn cupidatat elit reprehenderit deserunt sint mollit laborum consectetur enim anim. Consequat fugiat velit ut ipsum et duis consectetur. Aliqua velit nisi consequat mollit anim id quis cillum anim laboris exercitation adipisicing. Aliqua commodo cillum ut tempor incididunt sint ipsum incididunt nisi proident.\r\nEst qui incididunt dolore id. Culpa enim proident consectetur sunt. Ad laborum amet eiusmod mollit velit. Amet exercitation tempor nulla ullamco dolor fugiat non nostrud magna nisi veniam mollit laborum non.\r\nDuis ipsum voluptate ut laborum veniam. Commodo adipisicing sit nostrud mollit sint consequat ullamco sint amet ut enim. Anim pariatur magna reprehenderit elit fugiat culpa incididunt elit. Est irure tempor aliquip aliqua elit consequat pariatur est proident mollit tempor magna velit. Id nisi est cillum ut officia mollit deserunt nostrud ullamco.\r\nSit anim quis fugiat ullamco ipsum nulla proident sunt. Culpa est laborum veniam labore sit in mollit minim voluptate cupidatat. Elit qui sit amet qui eiusmod dolor. Irure sunt et minim culpa cillum. Minim consequat culpa ullamco excepteur duis nostrud consectetur proident dolor mollit veniam pariatur quis. Deserunt in reprehenderit eu velit ipsum excepteur pariatur deserunt officia fugiat qui exercitation magna dolor. Eiusmod cupidatat irure nisi dolor veniam aute ea quis nostrud eu esse excepteur aliquip.\r\n", + "address": "2 Crescent Street", + "city": "Valle", + "state": "Alaska", + "zip": 40517, + "country": "Albania", + "email": "fordgreer@scentric.com", + "phone": "(816) 454-3618", + "color": "rgb(249,251,66)" + }, + { + "index": 109, + "name": "Morin Franks", + "first": "Olive", + "last": "Bernard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmakardaras/73.jpg", + "expanded": false, + "guid": "9c1e0cc3-71ab-4f1f-a061-864215df9f71", + "integer": 74, + "date": "Tue Aug 17 1976 13:06:23 GMT-0700 (PDT)", + "shortText": "reprehenderit voluptate occaecat tempor", + "mediumText": "Excepteur proident officia commodo ad aute et exercitation aliqua. Consequat exercitation proident ut sit cupidatat nulla dolor occaecat sit ad fugiat. Lorem cupidatat labore tempor fugiat consequat labore. Laborum consectetur amet mollit ullamco deserunt amet cupidatat qui. Est nulla est nostrud duis proident culpa laborum ipsum mollit cupidatat proident irure nisi officia.", + "longText": "Nulla consectetur velit cupidatat dolor ex dolore pariatur ea occaecat eu quis ut non elit. Magna esse consequat eu sit laboris dolor ullamco elit dolor. Eiusmod laboris irure consequat cillum. Nisi incididunt dolor velit aliquip labore culpa voluptate proident laborum adipisicing veniam aute. Aliquip exercitation ad culpa excepteur nisi minim non quis excepteur commodo esse nostrud laborum. Enim anim do duis deserunt mollit esse laborum anim. Aliqua eiusmod sunt aliqua officia quis in voluptate deserunt magna labore enim sit laborum.\r\nVelit dolor aute est sit aliqua. Occaecat occaecat officia pariatur esse do aute aliqua. Magna nostrud consectetur amet consequat veniam magna duis non. Est eu elit pariatur minim ut sit laborum proident. Do adipisicing et est ex id dolore. Amet magna minim do dolor duis veniam ipsum ex commodo anim culpa sint.\r\n", + "address": "2 Banner Avenue", + "city": "Forbestown", + "state": "Louisiana", + "zip": 26490, + "country": "Panama", + "email": "olivebernard@scentric.com", + "phone": "(980) 446-2496", + "color": "rgb(250,59,84)" + }, + { + "index": 110, + "name": "Le Frank", + "first": "Ada", + "last": "Love", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/georgespillman/73.jpg", + "expanded": false, + "guid": "6d7f1953-73e2-4cf5-904a-467d37de4108", + "integer": 28, + "date": "Mon Aug 03 1970 01:48:44 GMT-0700 (PDT)", + "shortText": "do officia", + "mediumText": "Ad elit labore sit culpa reprehenderit non elit sunt. Officia occaecat aliquip aliqua minim eu. Lorem aute consequat sunt sint excepteur do laborum consequat do. Occaecat eu enim irure laborum occaecat elit duis. Occaecat aute ad non Lorem voluptate magna.", + "longText": "Dolore sint proident ea culpa proident ut eu ipsum pariatur culpa fugiat est nisi sunt. Voluptate ut excepteur aliquip enim adipisicing deserunt. Commodo irure irure id non officia elit do eiusmod. Voluptate ipsum dolor sint aliquip laboris fugiat cupidatat et ea proident nostrud cillum duis.\r\nAliqua eiusmod sit laboris non tempor proident ea. Ut excepteur tempor non nisi. Do id velit do non anim laborum ad est laborum consequat. Ea sunt velit do incididunt duis amet velit adipisicing exercitation anim. Duis eiusmod exercitation officia dolor aliqua officia fugiat ad fugiat dolor elit qui. Sunt reprehenderit est esse enim exercitation eiusmod et quis ea et dolore. Enim occaecat sunt sit do velit nulla cillum laboris.\r\nMinim cupidatat ex minim excepteur. Quis est enim officia proident voluptate tempor anim duis. Magna anim voluptate ullamco dolore dolore aute ipsum nulla ea est nulla exercitation eiusmod. Ex Lorem nulla et do consequat nulla ipsum enim ad amet excepteur ipsum incididunt veniam. Occaecat enim eu aliquip consectetur fugiat anim. Cillum pariatur quis ullamco minim nisi proident dolor occaecat ad ipsum commodo deserunt eu nostrud. Sunt reprehenderit et ipsum exercitation est veniam aute ut ex.\r\nAd aliquip ad et aliquip. Officia ex est qui nisi dolore velit sint. Et enim voluptate irure culpa eiusmod id incididunt minim voluptate ut eiusmod incididunt. Non occaecat cillum exercitation duis eiusmod id laboris veniam. Nisi id ut veniam excepteur.\r\n", + "address": "4 Rochester Avenue", + "city": "Chesapeake", + "state": "Missouri", + "zip": 58919, + "country": "Turks and Caicos Islands", + "email": "adalove@scentric.com", + "phone": "(895) 541-3397", + "color": "rgb(133,191,68)" + }, + { + "index": 111, + "name": "Joseph Hooper", + "first": "Sally", + "last": "Blackwell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fireupman/73.jpg", + "expanded": false, + "guid": "e86e14ac-2f06-4abd-93f2-552b79ec5e01", + "integer": 95, + "date": "Tue Jul 21 1987 11:15:23 GMT-0700 (PDT)", + "shortText": "anim duis", + "mediumText": "Amet ut occaecat do non nulla aute aliquip qui. Dolore sint sit ipsum ea minim reprehenderit irure quis magna elit exercitation mollit. Aute ullamco minim ut cupidatat incididunt aute occaecat aute ea consequat sint.", + "longText": "Officia commodo aute culpa sit ea in qui mollit laborum sunt aute eiusmod aliquip cillum. Velit commodo nisi qui consectetur eiusmod ad Lorem cupidatat irure adipisicing do adipisicing commodo. Laborum mollit cillum ad tempor. Anim proident culpa aliqua amet anim pariatur consequat aliquip anim cupidatat ut reprehenderit. Dolor reprehenderit magna enim dolore eu laborum consectetur do commodo proident. Duis voluptate dolor magna occaecat officia adipisicing duis voluptate adipisicing ex cupidatat. Ex aute adipisicing ullamco consectetur aute minim occaecat sit commodo Lorem duis.\r\nFugiat officia do do cillum ut adipisicing nisi nostrud culpa cupidatat. Magna velit ad excepteur et sunt sunt esse commodo velit consequat occaecat officia ea magna. Cillum culpa id aliqua in. Fugiat dolore elit do ea aliqua duis id eiusmod cillum amet ut. Dolor id magna id dolor aliqua veniam elit adipisicing qui nulla. Ex mollit consectetur adipisicing elit id eiusmod sunt deserunt veniam qui quis ut.\r\nProident exercitation aliqua occaecat anim tempor ullamco non laborum reprehenderit. Ullamco consectetur eiusmod ut quis cillum. Nulla officia in quis est sit consectetur eu ipsum sunt. Sunt cupidatat velit cillum non proident excepteur qui non aliquip.\r\nAd amet sit sint adipisicing dolore eu enim dolore velit sit deserunt. Esse labore non proident magna ut aliquip in id ex deserunt. Reprehenderit magna consequat irure ad ullamco pariatur magna consectetur pariatur magna voluptate non sunt.\r\nIpsum sint deserunt enim labore ea deserunt sint pariatur. Amet sit sint id minim esse quis magna fugiat dolore. Ullamco et magna ex dolor do commodo amet nostrud commodo adipisicing cillum. Dolor culpa mollit elit sit et enim ullamco fugiat proident occaecat.\r\n", + "address": "3 Congress Street", + "city": "Tedrow", + "state": "Kentucky", + "zip": 17527, + "country": "Christmas Island", + "email": "sallyblackwell@scentric.com", + "phone": "(883) 597-2036", + "color": "rgb(213,146,224)" + }, + { + "index": 112, + "name": "Shepherd Burt", + "first": "Pansy", + "last": "Young", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kylefrost/73.jpg", + "expanded": false, + "guid": "e82c95af-0ea1-4299-9f4e-131f39c1c537", + "integer": 49, + "date": "Sat May 24 2014 22:33:36 GMT-0700 (PDT)", + "shortText": "labore fugiat", + "mediumText": "Culpa eiusmod culpa nostrud voluptate eiusmod ea voluptate voluptate ex ut. Cillum consectetur voluptate tempor irure commodo id excepteur tempor laborum nisi. Proident eiusmod exercitation mollit sunt in est aliqua mollit non deserunt fugiat excepteur quis.", + "longText": "Sunt quis nisi cillum aute est reprehenderit non. Ullamco pariatur in est officia nisi laborum ad ut pariatur qui elit. Ipsum voluptate labore in et laboris amet quis esse occaecat dolore veniam cupidatat voluptate. In sint aute aliqua ea dolor Lorem quis sunt.\r\n", + "address": "2 Remsen Street", + "city": "Abrams", + "state": "American Samoa", + "zip": 37068, + "country": "Botswana", + "email": "pansyyoung@scentric.com", + "phone": "(938) 478-3164", + "color": "rgb(190,139,243)" + }, + { + "index": 113, + "name": "Brianna Peterson", + "first": "Carla", + "last": "Davidson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/quser/73.jpg", + "expanded": false, + "guid": "e7c8b790-5171-41b9-8926-16f6ba35a268", + "integer": 74, + "date": "Sun Aug 06 1989 02:58:01 GMT-0700 (PDT)", + "shortText": "sunt ex laboris cupidatat culpa", + "mediumText": "Ut duis eu quis nostrud irure excepteur quis. Cillum quis aute occaecat eu laborum non incididunt.", + "longText": "Tempor aute incididunt exercitation pariatur eu sunt magna excepteur. Do ex officia proident laborum ullamco cillum. In elit consequat anim velit commodo pariatur ad enim est nostrud anim proident amet nostrud. Proident duis incididunt ad deserunt nisi cupidatat irure eu cupidatat magna qui quis sunt.\r\nConsectetur occaecat sunt sint nostrud est dolor officia dolor occaecat ipsum labore consequat. Consequat eu ipsum voluptate et exercitation ex dolor commodo pariatur elit eu amet. In consectetur Lorem veniam est minim consectetur excepteur irure cillum. Ut Lorem incididunt laboris minim proident sit mollit tempor ad culpa amet amet. Quis duis velit ut dolor proident dolore proident ex sit adipisicing do.\r\nEsse elit occaecat pariatur nulla sint non elit aliquip est voluptate laboris. Consequat culpa fugiat ea eu. Et minim culpa voluptate amet. Sint qui cillum consequat quis velit et aliqua occaecat duis quis. Aute sunt aute in exercitation id exercitation cupidatat irure. Anim et minim cillum dolore irure enim eiusmod pariatur ad deserunt ea.\r\nIrure esse reprehenderit proident tempor non cupidatat incididunt laboris culpa eiusmod elit culpa velit non. Sit ullamco incididunt exercitation enim quis commodo id Lorem minim duis. Duis nulla sunt sit reprehenderit duis excepteur laborum in ut dolore consequat. Aliqua esse culpa nulla et amet ex fugiat sit non sunt. Elit nostrud commodo sunt veniam anim ut duis ullamco labore ex aliqua laboris.\r\n", + "address": "4 Oriental Court", + "city": "Valmy", + "state": "Minnesota", + "zip": 13895, + "country": "Algeria", + "email": "carladavidson@scentric.com", + "phone": "(995) 595-3974", + "color": "rgb(179,161,85)" + }, + { + "index": 114, + "name": "Erica Campbell", + "first": "Emilia", + "last": "Hernandez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maikelk/73.jpg", + "expanded": false, + "guid": "a14b1c62-e553-458d-ab78-cd9e278ac859", + "integer": 59, + "date": "Tue Aug 21 2012 17:43:47 GMT-0700 (PDT)", + "shortText": "ut id sit ea est", + "mediumText": "Aliquip occaecat voluptate ea dolor pariatur. Dolor amet velit adipisicing duis elit nisi aute incididunt veniam minim.", + "longText": "Id eu commodo in anim proident sit aliquip sit. Mollit dolor exercitation laborum veniam reprehenderit tempor reprehenderit. Culpa in cillum nisi occaecat elit aute duis est. Laborum quis laborum nostrud amet nulla quis exercitation non officia cupidatat culpa deserunt incididunt nulla. Exercitation exercitation ex velit ipsum excepteur esse dolor ipsum et anim non proident Lorem. Nostrud laboris consectetur et eiusmod sint. Amet adipisicing dolore Lorem deserunt ad cupidatat labore.\r\nNisi ipsum anim aliquip id sit proident reprehenderit aute. Esse duis incididunt minim nisi velit do incididunt anim nostrud. In mollit aliquip duis proident dolor. Sunt ipsum amet esse laborum.\r\nCupidatat anim enim do ut. Nostrud ipsum consectetur non ipsum officia. Aliqua commodo eiusmod eu labore laborum. Magna aliqua in est amet eu anim reprehenderit qui ullamco est anim sit et. Est deserunt tempor commodo occaecat dolore sint esse aliquip culpa sint cupidatat non cupidatat. Est reprehenderit irure esse fugiat ad pariatur fugiat. Labore non consectetur nisi aliquip adipisicing culpa incididunt ad consectetur consequat ipsum.\r\n", + "address": "2 Legion Street", + "city": "Cuylerville", + "state": "Hawaii", + "zip": 84971, + "country": "Switzerland", + "email": "emiliahernandez@scentric.com", + "phone": "(922) 599-3995", + "color": "rgb(101,247,162)" + }, + { + "index": 115, + "name": "Sheryl Waller", + "first": "Martina", + "last": "Hebert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ifarafonow/73.jpg", + "expanded": false, + "guid": "ab359e49-0653-4622-a683-fa6bb4a5e4eb", + "integer": 39, + "date": "Mon Nov 17 2008 06:44:36 GMT-0800 (PST)", + "shortText": "sunt", + "mediumText": "Nisi dolor ad enim nostrud id proident nisi elit cupidatat nisi nostrud laborum. Ea deserunt labore est in sunt id consectetur nisi.", + "longText": "Aliqua sunt enim Lorem amet enim. Nisi laboris elit veniam irure culpa nisi non aliquip. Anim dolor duis enim tempor culpa dolor reprehenderit elit. Non sunt veniam aliqua ea occaecat do pariatur occaecat ea. Exercitation nostrud cillum mollit ipsum laboris sunt est aute nostrud velit officia esse.\r\nLabore commodo ipsum proident est et sint sint deserunt. Proident qui elit eu duis et veniam excepteur eu ipsum ea consectetur consectetur fugiat sit. Aliqua aliqua laboris aute ut sit id nisi sunt reprehenderit qui deserunt. Labore laborum et ex enim dolore ullamco est excepteur dolore labore adipisicing. Commodo cupidatat non velit qui.\r\nQui exercitation esse ullamco nulla nisi labore ex ea voluptate eu consectetur et occaecat. Ullamco laborum esse labore et ullamco sunt proident eu esse proident excepteur. Qui incididunt occaecat minim elit irure ea aliquip in fugiat. Do cupidatat aliqua veniam cupidatat magna exercitation irure mollit fugiat consectetur. Sunt fugiat esse dolor mollit in fugiat reprehenderit qui tempor laborum Lorem incididunt. Exercitation do occaecat adipisicing velit aute enim enim occaecat nisi laboris quis ex minim eu. In incididunt consequat esse dolor officia eiusmod amet aliqua ad quis.\r\n", + "address": "3 Gelston Avenue", + "city": "Leeper", + "state": "Alabama", + "zip": 86800, + "country": "S. Georgia and S. Sandwich Isls.", + "email": "martinahebert@scentric.com", + "phone": "(814) 523-3612", + "color": "rgb(240,55,85)" + }, + { + "index": 116, + "name": "Frances Dalton", + "first": "Virgie", + "last": "Fuller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ananya159/73.jpg", + "expanded": false, + "guid": "1ca31b96-9723-4249-bb9a-7062701a66b0", + "integer": 81, + "date": "Tue Oct 01 1974 14:29:16 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Aliquip nisi proident id sint velit enim cillum reprehenderit ipsum nisi dolore laboris Lorem. Velit Lorem irure irure consectetur. Aliquip veniam culpa qui Lorem cupidatat non incididunt velit irure magna in do consequat do.", + "longText": "Nostrud adipisicing aute esse ipsum anim. Nisi pariatur excepteur est minim pariatur consectetur aliquip adipisicing. Adipisicing fugiat consequat proident deserunt exercitation exercitation irure sit qui deserunt. Dolor eu cillum eiusmod id incididunt consectetur nisi ullamco mollit labore. Aliqua ullamco proident adipisicing duis minim. Lorem ut fugiat cillum aliqua sit in mollit labore sunt reprehenderit.\r\nQui aliqua pariatur voluptate fugiat fugiat duis consequat occaecat laboris cillum sit. Sit officia fugiat esse ut eiusmod eu labore nostrud est incididunt fugiat. Voluptate velit laboris veniam sunt laborum ad nulla ad. Dolor deserunt ut ut culpa laboris qui elit est non cillum eu cillum anim laborum. Mollit consequat cillum id consequat sint voluptate pariatur nisi nostrud duis ipsum mollit.\r\nIncididunt dolor laborum adipisicing mollit voluptate ad labore ad do minim occaecat proident amet anim. Commodo anim pariatur dolor officia ipsum adipisicing irure excepteur irure eiusmod deserunt. Commodo veniam exercitation ex ad. Ut aliquip aliqua laboris ipsum quis duis. Amet in dolor minim veniam mollit dolore deserunt sit exercitation sint dolore consequat. Mollit anim qui dolor enim ea irure sint consectetur. Eiusmod eu exercitation incididunt Lorem dolore non cupidatat tempor do labore duis.\r\nMinim exercitation ut cupidatat est minim enim magna eiusmod aliquip ipsum incididunt in officia. Aliquip in fugiat dolor elit quis ad. Ipsum laboris sit non amet eu dolor aute velit ullamco eu proident. Consequat commodo consectetur Lorem esse duis esse exercitation adipisicing anim.\r\n", + "address": "2 Bokee Court", + "city": "Reinerton", + "state": "North Carolina", + "zip": 90734, + "country": "Brazil", + "email": "virgiefuller@scentric.com", + "phone": "(958) 511-3488", + "color": "rgb(151,135,52)" + }, + { + "index": 117, + "name": "Charity Hall", + "first": "Mitchell", + "last": "Williamson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/horaciobella/73.jpg", + "expanded": false, + "guid": "60b57acd-e17f-4c69-85e5-5df345c25c6f", + "integer": 22, + "date": "Wed Jan 19 2005 08:59:18 GMT-0800 (PST)", + "shortText": "eu nisi elit nostrud", + "mediumText": "Nisi id voluptate velit tempor voluptate laboris. Excepteur consectetur labore id ipsum anim proident ad adipisicing dolor. Magna aute excepteur veniam nulla laborum culpa et incididunt enim velit officia. Ipsum est qui minim consequat Lorem.", + "longText": "Enim consectetur quis tempor eu laboris veniam ea eu est. Ullamco commodo commodo dolor ad mollit ex in nulla. Ipsum dolor excepteur ut in sit est nulla ad nulla in tempor laboris ipsum laborum. Lorem incididunt fugiat eu laboris laborum eiusmod dolor tempor aliquip. Minim in do deserunt pariatur adipisicing id duis consectetur nostrud proident.\r\n", + "address": "4 Dover Street", + "city": "Fannett", + "state": "Connecticut", + "zip": 11138, + "country": "Anguilla", + "email": "mitchellwilliamson@scentric.com", + "phone": "(871) 435-3743", + "color": "rgb(243,134,198)" + }, + { + "index": 118, + "name": "Rodriquez Ferguson", + "first": "Shannon", + "last": "Morrow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thatdesigner/73.jpg", + "expanded": false, + "guid": "6c85f6cb-e2c6-46e0-a68a-2ebc38f0035b", + "integer": 50, + "date": "Sat Feb 10 1973 15:31:21 GMT-0800 (PST)", + "shortText": "incididunt aute aliquip laborum labore", + "mediumText": "Minim ipsum sint consequat cillum aute ipsum et ipsum sint cillum qui eiusmod.", + "longText": "Reprehenderit est consequat incididunt nostrud do eiusmod adipisicing. Nulla voluptate ullamco consectetur eu sit. Est dolore cupidatat amet culpa occaecat ullamco nisi non veniam do est ullamco aliqua. Qui irure nisi laboris labore duis nulla magna. Culpa velit dolor exercitation elit sint irure velit eu veniam exercitation Lorem. Pariatur ipsum veniam consectetur nulla laborum.\r\nAdipisicing eu amet duis nulla. Anim dolore magna eu culpa voluptate sunt aute proident. Elit veniam adipisicing commodo aliqua eiusmod velit mollit nisi quis veniam excepteur mollit laborum. Esse ipsum commodo cupidatat sint quis mollit veniam consequat do laborum nulla. Aliquip consequat proident et aliqua ea proident proident dolore laboris consequat ut reprehenderit quis duis. Enim cupidatat reprehenderit reprehenderit esse irure officia irure laboris. Consequat esse qui pariatur elit cillum culpa deserunt culpa veniam qui excepteur laborum.\r\n", + "address": "4 Newel Street", + "city": "Dubois", + "state": "South Carolina", + "zip": 52970, + "country": "Mayotte", + "email": "shannonmorrow@scentric.com", + "phone": "(926) 593-2505", + "color": "rgb(161,59,65)" + }, + { + "index": 119, + "name": "Lee Dejesus", + "first": "Yang", + "last": "Walter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/snaphappydad/73.jpg", + "expanded": false, + "guid": "bf814de3-e21d-41e7-9db1-2d541665fd2c", + "integer": 40, + "date": "Mon Feb 18 2002 15:18:34 GMT-0800 (PST)", + "shortText": "pariatur nisi", + "mediumText": "Esse dolore nulla aliqua id cupidatat ullamco commodo incididunt.", + "longText": "Ipsum cupidatat amet Lorem excepteur magna quis officia tempor enim voluptate consequat id ex. Ad labore aliqua exercitation nulla et esse nostrud pariatur. Nisi minim velit consequat dolore aliquip est labore sint.\r\nAnim non irure proident cillum eiusmod. Id anim non adipisicing consectetur qui duis. Sit culpa exercitation non nostrud.\r\nOccaecat aliquip elit anim ex nulla ut in. Aliqua ut cupidatat elit dolor id occaecat. Sit consectetur consequat eiusmod veniam tempor minim non voluptate labore ullamco esse velit proident.\r\n", + "address": "2 Krier Place", + "city": "Columbus", + "state": "Michigan", + "zip": 62839, + "country": "Northern Mariana Islands", + "email": "yangwalter@scentric.com", + "phone": "(821) 518-2276", + "color": "rgb(56,241,182)" + }, + { + "index": 120, + "name": "Wise Cannon", + "first": "Cobb", + "last": "Figueroa", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cristianovalim/73.jpg", + "expanded": false, + "guid": "e5754bf6-f162-4fd2-a3e9-e3834bad0fed", + "integer": 61, + "date": "Sun Nov 22 1970 00:54:52 GMT-0800 (PST)", + "shortText": "Lorem dolor pariatur proident", + "mediumText": "Dolor tempor veniam ad do et. Mollit enim et id veniam in irure mollit duis deserunt commodo.", + "longText": "Ex pariatur eiusmod cupidatat nisi elit ullamco Lorem. Reprehenderit minim velit laboris et incididunt tempor anim elit ad aute duis ullamco. Amet est magna consectetur in cillum duis. Sunt id Lorem laboris cupidatat aute. Cillum est ea mollit exercitation ullamco pariatur exercitation anim Lorem dolore exercitation velit ipsum.\r\nExcepteur excepteur est pariatur eiusmod quis consectetur qui aute nulla ex Lorem sunt irure. Tempor excepteur proident esse excepteur consectetur minim consequat non. Mollit nulla ea veniam excepteur eu velit.\r\n", + "address": "4 Pulaski Street", + "city": "Glenville", + "state": "Maine", + "zip": 69282, + "country": "Pitcairn", + "email": "cobbfigueroa@scentric.com", + "phone": "(901) 579-2803", + "color": "rgb(243,138,133)" + }, + { + "index": 121, + "name": "Albert Benjamin", + "first": "French", + "last": "Hays", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pmeissner/73.jpg", + "expanded": false, + "guid": "4bcb4883-f717-4bc7-b0ff-91b548b5ae5a", + "integer": 11, + "date": "Fri Jun 27 1980 15:54:19 GMT-0700 (PDT)", + "shortText": "Lorem do", + "mediumText": "Ipsum irure amet aliquip deserunt irure nisi duis fugiat et officia voluptate aliquip labore consectetur. Reprehenderit aute cupidatat tempor enim aliquip non qui consequat do qui proident id. Aliquip labore in ex consequat commodo qui adipisicing proident. Tempor veniam non laborum aute velit Lorem sunt. Fugiat anim nulla veniam anim pariatur nulla irure incididunt occaecat.", + "longText": "Enim irure eiusmod magna non tempor eu mollit nostrud anim elit. Fugiat eu officia aliqua dolore non tempor aute ipsum occaecat. Amet velit fugiat aliqua Lorem officia excepteur sunt nostrud magna est. In pariatur irure quis ea ut et esse nisi do mollit excepteur laborum minim. Nostrud sunt est duis est. In in enim Lorem tempor aliquip enim ea irure deserunt.\r\nCillum est magna fugiat dolor nostrud adipisicing mollit qui enim. Nostrud consequat amet reprehenderit commodo ut amet est aute nisi exercitation aute. Eiusmod enim reprehenderit ut ut exercitation irure proident minim commodo nostrud. Consequat ex magna aliquip cupidatat culpa excepteur non.\r\nVeniam esse esse sunt reprehenderit veniam commodo irure fugiat qui. Consequat qui dolor veniam ipsum laboris enim labore. Mollit cupidatat sit non esse voluptate in qui cupidatat qui eu. Duis incididunt ad mollit ad nisi culpa irure anim ullamco commodo tempor consectetur. Cillum pariatur labore do quis commodo non eu proident et.\r\nAmet cupidatat amet et culpa proident labore esse ipsum. Labore fugiat ea laboris irure mollit cupidatat minim exercitation occaecat velit ullamco quis. Labore esse cupidatat nulla amet et. Duis est cupidatat eu ea excepteur nulla cupidatat dolor enim ipsum sit nostrud laborum sit. Voluptate cupidatat cillum nulla reprehenderit laboris incididunt eu nostrud amet ad dolore do. Non ea eu cillum duis consectetur in. Anim consequat in adipisicing fugiat sit do anim anim aute veniam eu consectetur aliquip.\r\nMollit aliquip cillum adipisicing ipsum non laboris. Consequat mollit in incididunt mollit deserunt eiusmod nulla dolor ea fugiat. Proident reprehenderit nisi tempor nulla excepteur dolor excepteur voluptate laboris tempor consequat. Dolor et minim enim ut laboris. Ipsum ex veniam consequat cillum nisi amet nostrud. Mollit labore in consequat irure enim. Qui tempor aliquip esse enim commodo culpa mollit.\r\n", + "address": "4 Pooles Lane", + "city": "Bellfountain", + "state": "Kansas", + "zip": 98526, + "country": "Saint Vincent and The Grenadines", + "email": "frenchhays@scentric.com", + "phone": "(819) 408-2182", + "color": "rgb(238,191,114)" + }, + { + "index": 122, + "name": "Nona Salinas", + "first": "Lacey", + "last": "Donaldson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akbarbobojonov/73.jpg", + "expanded": false, + "guid": "bd1bbab7-51f1-45a4-a0c8-ad85a536c9ec", + "integer": 9, + "date": "Thu May 01 1986 06:09:47 GMT-0700 (PDT)", + "shortText": "proident ea qui culpa", + "mediumText": "Eiusmod labore in laboris eu pariatur amet. Et nulla aliqua consectetur nulla quis ad non. Aute ut sint reprehenderit et eu et sunt labore dolor.", + "longText": "Exercitation mollit commodo ad ipsum ipsum minim quis culpa cillum ut mollit labore commodo. Anim dolor eu in deserunt occaecat enim do proident mollit exercitation laborum consequat. Irure proident exercitation voluptate in. Magna officia sint occaecat pariatur irure elit cupidatat deserunt nulla ad cillum incididunt velit. Quis veniam est est id labore enim duis culpa deserunt aliquip mollit qui. Deserunt laboris proident incididunt esse velit minim sint ex excepteur. Cillum do sint commodo qui laborum occaecat dolore sint.\r\nDeserunt culpa pariatur dolore mollit dolor velit id labore incididunt eiusmod consectetur. Sunt eu duis ut eu sint sint non aliqua ullamco sunt est id irure eiusmod. Eiusmod ex cupidatat quis ut cillum elit. Lorem tempor proident elit adipisicing. Minim sunt minim esse do amet Lorem officia occaecat sit ut. In id ullamco ipsum ex sit adipisicing mollit irure non magna ad commodo proident aute. Mollit sunt mollit eiusmod voluptate consectetur magna ex ullamco.\r\n", + "address": "4 Freeman Street", + "city": "Wollochet", + "state": "Iowa", + "zip": 21774, + "country": "Iceland", + "email": "laceydonaldson@scentric.com", + "phone": "(977) 552-3200", + "color": "rgb(51,183,113)" + }, + { + "index": 123, + "name": "Karla Downs", + "first": "Cruz", + "last": "Colon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pjnes/73.jpg", + "expanded": false, + "guid": "2f9877c1-7121-400a-a476-36dfbedde48b", + "integer": 0, + "date": "Thu Feb 27 1992 08:28:41 GMT-0800 (PST)", + "shortText": "deserunt", + "mediumText": "Reprehenderit deserunt eiusmod sint laboris deserunt qui eiusmod ex aliqua et laborum duis magna deserunt. Officia tempor ullamco aute occaecat velit. Aliqua consectetur nulla eiusmod elit. Culpa enim reprehenderit labore incididunt id nostrud deserunt quis ad est irure laboris.", + "longText": "Ut qui adipisicing qui veniam irure fugiat. Cillum occaecat fugiat proident velit anim nostrud duis reprehenderit nostrud tempor aliquip veniam. Nostrud ipsum laboris eu enim id do. Adipisicing ea consequat enim et anim in fugiat amet ipsum.\r\nVoluptate tempor ut ut laborum et ad. Ea laboris duis ad pariatur commodo do et aute. Sit aliqua sint proident do consequat anim sit. Officia elit dolore exercitation elit anim ullamco excepteur deserunt quis quis proident esse fugiat voluptate. Culpa officia amet eu enim culpa sit et. Culpa incididunt adipisicing non eu in minim.\r\nDuis laborum laborum voluptate aliquip. Aliqua eu elit labore ipsum aliqua. Nulla reprehenderit aute labore aliqua est consectetur deserunt pariatur ut. Aute laboris voluptate ipsum nostrud enim proident amet ad.\r\nCulpa minim velit aliquip enim deserunt dolor. Commodo sit commodo enim adipisicing ea non aute consectetur proident eu do. Consequat elit irure minim dolor voluptate excepteur sunt eu et quis. Occaecat exercitation voluptate sunt ullamco reprehenderit ea amet magna. Cillum laborum commodo irure ad in sunt occaecat veniam non proident incididunt pariatur.\r\n", + "address": "3 Elm Place", + "city": "Richville", + "state": "Vermont", + "zip": 65904, + "country": "Andorra", + "email": "cruzcolon@scentric.com", + "phone": "(900) 475-3785", + "color": "rgb(165,150,188)" + }, + { + "index": 124, + "name": "Candace Gonzalez", + "first": "Debbie", + "last": "Moody", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/balintorosz/73.jpg", + "expanded": false, + "guid": "9d3734d9-4693-4ac0-9dba-85eb63a89032", + "integer": 1, + "date": "Fri May 06 2005 19:01:26 GMT-0700 (PDT)", + "shortText": "exercitation do mollit mollit proident", + "mediumText": "Ullamco ad quis laboris ea consectetur commodo anim ut irure. Sit id elit mollit eiusmod officia amet reprehenderit. Ea incididunt commodo officia qui eu ad exercitation occaecat ipsum ad aute laboris ea. Proident irure velit magna culpa proident qui amet.", + "longText": "Minim voluptate culpa mollit ad voluptate est mollit nisi cillum proident. Cillum ut aliqua esse ad esse qui magna anim mollit. Ipsum pariatur labore culpa velit ipsum mollit fugiat id velit in cillum sint. Voluptate aliquip irure reprehenderit incididunt ipsum magna duis proident commodo consequat. Eiusmod commodo labore ex commodo tempor veniam. Occaecat duis tempor cillum aute qui do officia excepteur et sunt eiusmod fugiat.\r\nConsectetur amet nulla sit commodo aute labore id commodo reprehenderit deserunt occaecat incididunt. Esse consectetur minim occaecat duis deserunt est magna aute aliqua veniam aute sunt nulla eu. Exercitation officia proident dolore ex aliqua officia laboris ullamco anim.\r\nReprehenderit exercitation veniam eu eu aute ullamco irure ex tempor. Irure tempor Lorem anim eu nulla proident nulla est sunt. Voluptate id dolor excepteur id ut quis duis.\r\nPariatur tempor aliquip consectetur reprehenderit qui dolore excepteur veniam. In aliqua aute veniam aliqua in officia aute nisi Lorem. Ea duis labore labore voluptate. Voluptate esse cillum excepteur reprehenderit.\r\n", + "address": "2 Duryea Court", + "city": "Bentonville", + "state": "Nebraska", + "zip": 43783, + "country": "Myanmar", + "email": "debbiemoody@scentric.com", + "phone": "(816) 429-3615", + "color": "rgb(209,130,75)" + }, + { + "index": 125, + "name": "Ayers Finley", + "first": "Janna", + "last": "Donovan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/martinhn/73.jpg", + "expanded": false, + "guid": "9910153e-54e3-4464-ab3b-2f87ff4a6574", + "integer": 29, + "date": "Wed Jun 03 1987 11:23:05 GMT-0700 (PDT)", + "shortText": "occaecat dolore sunt", + "mediumText": "Esse voluptate quis laborum voluptate ut labore tempor consequat sit. Adipisicing proident ex Lorem voluptate eu esse laborum ex laborum officia veniam aliquip enim id. Incididunt eu nisi proident pariatur ut non.", + "longText": "Incididunt do qui veniam Lorem quis. Aute culpa ut dolor incididunt deserunt consequat mollit non nulla dolore. Deserunt veniam velit tempor pariatur aliquip veniam. Duis aliquip nulla sunt ullamco esse aliqua Lorem esse aliquip veniam adipisicing. Cillum et do enim commodo aliqua ullamco exercitation exercitation. Mollit magna Lorem fugiat irure excepteur adipisicing id veniam. Sit tempor aute in minim dolore aliquip minim nisi magna.\r\nVelit aliqua ullamco ea amet culpa id. Magna velit voluptate culpa fugiat fugiat amet veniam ad labore eu in. Eu deserunt quis ipsum aliqua nulla pariatur commodo. Elit nostrud id irure eu reprehenderit est dolore sunt Lorem. Esse anim quis elit elit irure consectetur irure ut non ad ullamco magna et. Ex Lorem labore deserunt consequat consectetur officia veniam non commodo magna ut non eu in.\r\nVoluptate aliqua velit magna dolor in anim dolore ad quis. Ullamco magna officia labore ex adipisicing veniam magna adipisicing in id anim ea adipisicing mollit. Irure pariatur ea incididunt culpa ex veniam pariatur eiusmod duis ea. Ut exercitation duis aliqua quis elit reprehenderit magna veniam voluptate nostrud. Id proident nostrud consectetur occaecat nostrud nostrud nisi eu labore occaecat minim. Sint ut consequat ullamco dolor duis exercitation sint eiusmod nostrud et esse labore. Anim elit ipsum occaecat sint laborum esse.\r\nAd velit aliqua irure dolor aliquip eiusmod occaecat incididunt sunt dolore elit quis sunt. Sunt veniam quis eu anim et ut laborum. Nisi duis anim non sunt consequat labore duis sit minim velit dolor adipisicing pariatur. Qui fugiat elit non amet ad nostrud voluptate veniam proident.\r\nEnim qui non exercitation cupidatat pariatur cillum anim sunt aliqua sunt. Lorem ut excepteur consectetur ipsum dolore enim sint labore sunt. Anim dolore consectetur mollit ex consectetur ex enim eiusmod.\r\n", + "address": "2 Bank Street", + "city": "Martinsville", + "state": "Florida", + "zip": 62669, + "country": "Saint Lucia", + "email": "jannadonovan@scentric.com", + "phone": "(953) 514-3535", + "color": "rgb(140,207,218)" + }, + { + "index": 126, + "name": "Winifred Patel", + "first": "Mckenzie", + "last": "Saunders", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/73.jpg", + "expanded": false, + "guid": "0232aa09-2751-4a44-938d-2450be7353c5", + "integer": 47, + "date": "Tue May 04 2010 11:32:34 GMT-0700 (PDT)", + "shortText": "cillum culpa aliqua", + "mediumText": "Et ex ea sunt velit. Veniam amet incididunt labore consectetur incididunt do. Laborum nulla laboris commodo officia commodo fugiat voluptate aliqua ullamco occaecat adipisicing.", + "longText": "Exercitation ut commodo velit culpa veniam reprehenderit magna do amet fugiat dolor. Velit ad esse incididunt cillum eu aliquip aute in velit. Voluptate nulla veniam incididunt adipisicing commodo est aliqua irure id commodo commodo. Qui incididunt culpa culpa laborum exercitation sint eu excepteur dolore occaecat labore aute proident. Eiusmod est occaecat quis duis aliqua. Ad sit incididunt nostrud dolore velit mollit pariatur nostrud.\r\nTempor irure magna ex tempor occaecat voluptate voluptate velit eiusmod laboris enim minim quis. Id voluptate ex adipisicing eiusmod ut labore dolore qui eiusmod laborum exercitation. Irure labore laboris elit ea. Incididunt dolore ex sit id laboris eu dolor anim ullamco dolore laboris laboris ipsum. Est nulla excepteur proident enim labore. Pariatur aliquip voluptate qui amet commodo officia non.\r\nProident et minim excepteur laborum elit do laboris ipsum dolore eu nulla nulla. Id ad aliqua pariatur aliquip magna ea adipisicing occaecat. Exercitation quis Lorem consectetur eiusmod. Aliquip veniam consequat nostrud et id consectetur id consectetur eu ipsum elit incididunt. Aliquip do nostrud occaecat esse consectetur est irure nulla magna.\r\nEiusmod deserunt velit ut commodo commodo ea Lorem nisi voluptate voluptate non consequat sint sunt. Eiusmod nisi nulla minim non nisi sint excepteur ex cupidatat ipsum ex labore. Adipisicing dolore ut tempor exercitation cupidatat.\r\n", + "address": "2 Keap Street", + "city": "Blue", + "state": "New Jersey", + "zip": 62739, + "country": "Equatorial Guinea", + "email": "mckenziesaunders@scentric.com", + "phone": "(997) 545-3802", + "color": "rgb(62,238,78)" + }, + { + "index": 127, + "name": "Connie Conner", + "first": "Tracy", + "last": "York", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vovkasolovev/73.jpg", + "expanded": false, + "guid": "8996bac9-5e0b-418e-a12c-710a15bdb763", + "integer": 8, + "date": "Thu Oct 05 2000 01:32:28 GMT-0700 (PDT)", + "shortText": "nostrud id eiusmod aliqua", + "mediumText": "Irure est aliquip magna excepteur velit cillum dolore eu veniam occaecat ex. Consequat proident nulla anim culpa ullamco sint.", + "longText": "Ipsum labore enim aliquip sit id qui elit ut ex laboris. Tempor ea consequat eiusmod ullamco pariatur sit esse elit in nisi aliquip non. Velit incididunt ea reprehenderit anim anim.\r\n", + "address": "3 Seton Place", + "city": "Cloverdale", + "state": "Wisconsin", + "zip": 87279, + "country": "Tanzania", + "email": "tracyyork@scentric.com", + "phone": "(880) 459-2370", + "color": "rgb(219,127,211)" + }, + { + "index": 128, + "name": "Ladonna Sheppard", + "first": "Jennie", + "last": "Glenn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/urbanjahvier/73.jpg", + "expanded": false, + "guid": "5590b6a2-bb72-4d3e-8088-4af6a3a81dcb", + "integer": 4, + "date": "Mon Jun 04 1979 05:10:17 GMT-0700 (PDT)", + "shortText": "irure ea culpa", + "mediumText": "Est irure minim amet reprehenderit non minim et minim consequat cillum.", + "longText": "Minim laboris sint enim ea. Elit sunt esse pariatur officia voluptate deserunt cupidatat ex ad nisi dolor culpa duis. Velit nulla aute pariatur et voluptate cillum nostrud exercitation qui cillum elit occaecat. Laborum duis dolor cupidatat enim in elit occaecat quis non dolor culpa.\r\nIncididunt excepteur consequat consequat laborum. Cupidatat enim ad et qui pariatur proident ad voluptate minim quis dolore dolor veniam. Nisi sunt voluptate ut est aliqua. Irure Lorem ad non adipisicing aute quis officia dolore adipisicing quis ad minim.\r\n", + "address": "2 Bryant Street", + "city": "Harold", + "state": "Washington", + "zip": 92836, + "country": "Slovak Republic", + "email": "jennieglenn@scentric.com", + "phone": "(875) 496-3782", + "color": "rgb(60,201,252)" + }, + { + "index": 129, + "name": "Hancock Justice", + "first": "Jana", + "last": "Daugherty", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/betraydan/73.jpg", + "expanded": false, + "guid": "ac903149-dee1-4dbc-b0b4-01e15797af97", + "integer": 23, + "date": "Sun Dec 26 1976 01:33:58 GMT-0800 (PST)", + "shortText": "amet deserunt excepteur adipisicing", + "mediumText": "Mollit eu fugiat minim irure eu aliquip eiusmod do nisi elit minim anim commodo nisi. Tempor est exercitation consequat cillum nostrud consectetur ipsum qui. Proident voluptate fugiat labore minim nulla laborum sunt mollit dolore.", + "longText": "Commodo eiusmod nulla consequat Lorem ut ipsum esse cillum. Nostrud dolore proident proident ipsum sunt mollit esse amet. Et in adipisicing esse mollit consequat esse ipsum incididunt. Lorem est do id do qui non sit. Amet minim quis elit minim adipisicing et nisi nisi. Adipisicing aliqua voluptate amet velit amet excepteur id nulla excepteur laborum sit. Anim deserunt aute laboris duis deserunt aute quis veniam.\r\nAd elit fugiat id nisi nostrud esse aliquip. Ipsum esse labore laborum velit velit esse sit consequat non aliquip. Proident consequat est excepteur mollit.\r\nReprehenderit nulla sit adipisicing duis adipisicing qui amet incididunt non in. Est consectetur amet cillum minim enim commodo laborum ipsum occaecat voluptate ea excepteur. Duis mollit anim anim minim magna elit sunt.\r\nEx et quis excepteur deserunt ea occaecat in est cillum labore ad pariatur. Commodo ea anim ipsum qui laboris duis reprehenderit. Non commodo magna voluptate deserunt do. In officia excepteur exercitation qui. Cillum eu aute laboris culpa laborum eu eiusmod.\r\nLorem irure voluptate magna velit reprehenderit sint. Sint ea exercitation officia occaecat. Cillum veniam proident voluptate ullamco in nisi eu. Irure laboris voluptate veniam ea. Reprehenderit adipisicing incididunt enim aliquip ex. Dolore amet ullamco ullamco ad pariatur.\r\n", + "address": "3 Ocean Parkway", + "city": "Fairhaven", + "state": "Oregon", + "zip": 90433, + "country": "Iraq", + "email": "janadaugherty@scentric.com", + "phone": "(966) 582-2529", + "color": "rgb(210,84,143)" + }, + { + "index": 130, + "name": "Gilda Henry", + "first": "Graham", + "last": "Moore", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justme_timothyg/73.jpg", + "expanded": false, + "guid": "25728c02-6a0c-45e4-8ed5-f0b169379f13", + "integer": 39, + "date": "Thu Aug 02 2001 00:17:50 GMT-0700 (PDT)", + "shortText": "irure incididunt magna", + "mediumText": "Ea do ad culpa adipisicing culpa. Tempor ullamco laboris anim nisi exercitation ipsum deserunt voluptate incididunt sunt veniam.", + "longText": "Laborum ex ut culpa occaecat. Ex ad qui amet minim. Occaecat sunt labore id fugiat occaecat deserunt magna dolor proident. Proident eu qui ut incididunt id. Id reprehenderit labore dolore do exercitation. Commodo exercitation sint nulla ullamco. Occaecat mollit velit elit aliquip ad ex.\r\nIrure deserunt mollit deserunt id elit. Labore officia cillum consequat incididunt aliqua veniam fugiat mollit do proident irure exercitation. Exercitation duis irure sunt sit ad proident mollit elit dolore sunt. Ex est ut qui veniam ut laboris dolor deserunt ipsum Lorem ea exercitation eu. Quis labore nostrud sint proident occaecat enim quis dolor aliquip reprehenderit aute officia. Magna aute irure ullamco voluptate nisi ipsum labore.\r\nIrure sit aliquip quis eiusmod nisi occaecat amet cillum minim ex. Ipsum eiusmod ut nostrud eiusmod cillum est fugiat irure qui. Enim minim consequat ullamco minim. Cupidatat culpa mollit ut et.\r\n", + "address": "4 Stewart Street", + "city": "Rossmore", + "state": "Illinois", + "zip": 45849, + "country": "Congo", + "email": "grahammoore@scentric.com", + "phone": "(991) 514-3925", + "color": "rgb(199,144,145)" + }, + { + "index": 131, + "name": "Bates Clements", + "first": "Hatfield", + "last": "Hayden", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justinteractive/73.jpg", + "expanded": false, + "guid": "afe8d372-90a6-404f-85c7-16fd49fb9612", + "integer": 80, + "date": "Wed Feb 14 1990 23:57:58 GMT-0800 (PST)", + "shortText": "excepteur culpa voluptate consectetur", + "mediumText": "Aliqua sunt irure commodo veniam proident. Tempor qui tempor aliqua aute labore dolor consectetur magna duis proident eiusmod sit dolor officia. Eiusmod deserunt aliquip aute officia Lorem minim deserunt magna laboris ipsum et ad commodo esse.", + "longText": "Aute culpa mollit et nisi ut adipisicing et aliquip incididunt laboris dolor mollit. Deserunt elit in sit dolore ut enim eu. Lorem ut magna eu eiusmod commodo excepteur laborum mollit nostrud voluptate sit. Sunt deserunt occaecat sit ea nostrud excepteur commodo nulla qui dolor deserunt do laborum. Pariatur do qui culpa laborum velit cillum.\r\nLabore aute cillum consequat pariatur mollit eiusmod duis ex labore ut. Occaecat dolore irure excepteur mollit tempor tempor ut. Velit qui pariatur pariatur voluptate nostrud. Duis magna sint irure et labore ipsum deserunt non veniam.\r\nFugiat do sint ea ut aute consectetur tempor reprehenderit nulla nulla. Laborum cupidatat excepteur nulla dolor cupidatat duis laboris. Amet in ipsum proident deserunt consectetur in proident incididunt. Elit consectetur occaecat dolore duis aute pariatur.\r\n", + "address": "3 Bulwer Place", + "city": "Gilmore", + "state": "West Virginia", + "zip": 18380, + "country": "Cocos (Keeling Islands)", + "email": "hatfieldhayden@scentric.com", + "phone": "(907) 440-2113", + "color": "rgb(252,242,253)" + }, + { + "index": 132, + "name": "Bell Leonard", + "first": "Leticia", + "last": "Hickman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/psdesignuk/73.jpg", + "expanded": false, + "guid": "ed4df7d0-7592-4c76-b54b-edc925ddb79d", + "integer": 77, + "date": "Tue May 03 1983 09:44:10 GMT-0700 (PDT)", + "shortText": "enim consequat ad elit sit", + "mediumText": "Aute reprehenderit officia dolor sit ullamco consectetur nostrud. Sunt duis excepteur labore enim pariatur voluptate proident nulla dolore consequat ut. Commodo aliqua anim ut Lorem. Irure nostrud ad non eiusmod duis.", + "longText": "Reprehenderit esse laboris consequat aliqua nulla. Dolore do ipsum sunt incididunt. Incididunt ipsum labore eiusmod amet dolor minim sunt velit cupidatat. Sint laboris qui occaecat dolor duis ad mollit esse dolore minim. Et nostrud deserunt magna ad adipisicing nisi deserunt mollit tempor.\r\nDeserunt exercitation consequat labore veniam. Proident aliqua Lorem pariatur anim aliqua eu elit aliqua. Pariatur anim laboris reprehenderit eu nulla consequat eu tempor sint exercitation eiusmod sint excepteur voluptate. Sunt cillum ex ex occaecat aliquip ut labore voluptate cupidatat velit incididunt consectetur reprehenderit sunt.\r\nProident ex sunt eu velit magna quis quis ea nulla. Reprehenderit id eu ullamco deserunt aliqua pariatur do nisi eu anim. Enim exercitation aute culpa aute excepteur pariatur veniam. Esse labore labore anim cupidatat exercitation aliqua Lorem consequat fugiat tempor magna. Mollit ipsum irure proident adipisicing nisi eu mollit culpa aliquip id esse occaecat. Commodo amet esse nisi velit ipsum amet id cupidatat veniam. Id veniam fugiat anim fugiat nisi non in do labore esse labore est exercitation amet.\r\n", + "address": "4 Baughman Place", + "city": "Hessville", + "state": "Mississippi", + "zip": 48135, + "country": "Saint Kitts and Nevis", + "email": "leticiahickman@scentric.com", + "phone": "(986) 415-3367", + "color": "rgb(161,161,217)" + }, + { + "index": 133, + "name": "Logan Wyatt", + "first": "Bray", + "last": "Mathews", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teclaro/73.jpg", + "expanded": false, + "guid": "50c374de-c1b2-4bef-8dc9-9b47e6caf127", + "integer": 3, + "date": "Thu Jan 23 2014 19:45:54 GMT-0800 (PST)", + "shortText": "aliquip cupidatat sint ut", + "mediumText": "Esse elit anim consectetur reprehenderit ad excepteur eiusmod aute. Veniam in ullamco reprehenderit commodo consectetur tempor quis. Nisi enim tempor tempor est est amet esse mollit mollit sint officia et amet duis. Sint sit in sit et enim et eu aliquip nostrud proident.", + "longText": "Amet aliqua eiusmod enim occaecat tempor do adipisicing labore mollit culpa adipisicing dolor nisi id. Elit consequat mollit commodo minim labore excepteur nisi est consectetur. Ad ut laborum enim fugiat cillum eu labore.\r\nReprehenderit pariatur aliqua anim aliquip. Aliqua tempor labore Lorem nulla ut velit aliquip ea amet labore qui exercitation incididunt. Velit pariatur eu sunt mollit velit deserunt mollit ad veniam aute. Cupidatat laboris qui proident eu mollit do qui. Lorem id aliqua occaecat irure proident. Commodo dolor commodo laborum excepteur nisi consequat esse culpa aute laboris do in.\r\nLaborum ex excepteur incididunt sint ipsum. Aliquip cillum nulla sit labore Lorem ut do mollit Lorem. Reprehenderit commodo dolore sint mollit. Laboris et culpa sunt ut ipsum deserunt eiusmod exercitation dolore. Do Lorem deserunt voluptate reprehenderit ex deserunt labore nulla excepteur qui nisi voluptate. Amet ipsum excepteur amet qui nostrud adipisicing elit fugiat veniam nostrud deserunt id sunt laborum. Incididunt eu dolore dolore qui quis qui pariatur pariatur ad nostrud.\r\n", + "address": "2 Cherry Street", + "city": "Kieler", + "state": "Rhode Island", + "zip": 44229, + "country": "Spain", + "email": "braymathews@scentric.com", + "phone": "(945) 538-3851", + "color": "rgb(223,145,248)" + }, + { + "index": 134, + "name": "Elva Beard", + "first": "Riley", + "last": "Wallace", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eyronn/73.jpg", + "expanded": false, + "guid": "7c00ca0a-94ea-41ec-babd-533d61c3c1db", + "integer": 26, + "date": "Tue Sep 20 2005 17:05:43 GMT-0700 (PDT)", + "shortText": "incididunt", + "mediumText": "Tempor reprehenderit ullamco labore irure velit Lorem nulla excepteur sunt nostrud ea exercitation. Exercitation nisi reprehenderit consequat enim voluptate est aute qui dolor aliqua amet quis cupidatat. Elit non aliquip esse in officia enim tempor pariatur aliquip est. Reprehenderit ipsum ea voluptate commodo qui deserunt. Cupidatat nostrud magna eu nisi mollit voluptate sint qui.", + "longText": "Reprehenderit mollit eu est adipisicing amet quis id ipsum est nisi occaecat. Veniam aute aute adipisicing aliquip et ea dolor commodo cillum esse Lorem. Dolore cillum cillum ex consectetur nostrud velit elit voluptate adipisicing deserunt dolore consectetur. Amet proident aliquip enim pariatur occaecat in aliquip deserunt in occaecat qui mollit eu. Deserunt laboris dolor quis do.\r\nVelit ea voluptate culpa veniam mollit excepteur culpa laboris. Dolor est qui sint irure cillum proident labore nulla adipisicing cillum. Incididunt aliquip dolor est consectetur nulla ad aliqua esse sit elit. Eiusmod et fugiat dolore aliquip excepteur ullamco sunt sit enim do fugiat in excepteur cupidatat. Lorem nostrud irure velit quis consectetur.\r\nNulla amet do excepteur in esse reprehenderit nulla aliqua reprehenderit ipsum dolore Lorem sunt. Quis aliqua ex esse voluptate aliquip do incididunt proident exercitation commodo. Commodo enim mollit dolor laboris dolore ex fugiat sit commodo Lorem. Lorem sint mollit reprehenderit ipsum elit qui exercitation incididunt. Non excepteur non duis nulla sunt dolor in qui proident. Proident pariatur adipisicing eu sunt laboris voluptate cillum ut adipisicing. Labore ut esse consectetur in consequat velit cupidatat esse nisi.\r\nVelit Lorem ad sunt labore irure enim ut aliqua officia velit dolor. Sint tempor sunt et amet nostrud. Sint laboris eiusmod elit excepteur.\r\n", + "address": "4 Herkimer Court", + "city": "Jacumba", + "state": "Georgia", + "zip": 87900, + "country": "Guinea-Bissau", + "email": "rileywallace@scentric.com", + "phone": "(908) 527-2510", + "color": "rgb(150,183,57)" + }, + { + "index": 135, + "name": "Jeanne Walker", + "first": "Noemi", + "last": "Castaneda", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gulian/73.jpg", + "expanded": false, + "guid": "954a476d-62d8-4190-94a1-ba084f44049d", + "integer": 52, + "date": "Thu Jul 28 1977 23:23:02 GMT-0700 (PDT)", + "shortText": "duis", + "mediumText": "Aliqua nostrud excepteur est veniam cillum et aute ut. Sint ex nostrud incididunt deserunt duis. Velit laborum occaecat mollit culpa aliquip nisi aliquip ad. Laboris eu adipisicing nostrud aliquip elit consectetur ea nulla quis minim non proident laboris. Laboris exercitation laboris ut exercitation deserunt quis irure irure officia sunt sit cillum ad.", + "longText": "Ipsum occaecat veniam cupidatat enim tempor irure ea reprehenderit esse commodo non. Aliquip est sit ipsum ipsum officia aliquip mollit quis sint adipisicing nisi sint tempor esse. Occaecat fugiat minim tempor excepteur ut minim dolor non voluptate.\r\nAdipisicing sunt excepteur amet aliquip duis anim excepteur ipsum nostrud occaecat non aliquip nulla Lorem. Labore ut sint mollit anim aliquip elit. Incididunt excepteur et deserunt anim laborum voluptate quis nulla ut. Aliqua qui culpa et culpa magna consequat irure culpa Lorem veniam. Qui sit qui labore cillum sunt elit consectetur officia qui Lorem sint elit dolor veniam. Ex labore ullamco quis ut elit Lorem in excepteur officia dolore tempor aute irure. Sunt ut eu deserunt aliquip aliqua sint elit elit.\r\nDolore ex cupidatat cupidatat elit adipisicing exercitation mollit eu officia et ullamco incididunt dolor. Qui incididunt voluptate aliquip fugiat proident ea. Officia minim laboris tempor est aliqua ipsum velit aliqua et culpa voluptate quis. Sint amet commodo dolor ad excepteur veniam cillum amet ut officia commodo velit.\r\nIpsum exercitation laboris occaecat duis non nisi cupidatat ad incididunt voluptate et. Duis ea enim nostrud non reprehenderit laborum culpa sint. Ullamco dolor non in excepteur culpa amet. Consectetur occaecat eiusmod tempor ad tempor veniam dolore aliqua ad id. Exercitation in amet fugiat ea mollit ut in officia velit dolore nostrud est amet anim. Eu do dolore eu ut adipisicing qui aute aute occaecat labore esse.\r\nDo quis laborum minim aliqua non dolor cupidatat labore velit dolor eiusmod. Minim labore sint ipsum duis nisi. Nostrud duis deserunt consectetur magna laborum mollit ea laboris. Consectetur exercitation dolor eu exercitation reprehenderit non ipsum.\r\n", + "address": "4 Montague Street", + "city": "Why", + "state": "New Mexico", + "zip": 97706, + "country": "Cameroon", + "email": "noemicastaneda@scentric.com", + "phone": "(867) 475-2648", + "color": "rgb(130,190,155)" + }, + { + "index": 136, + "name": "Jasmine Talley", + "first": "Debra", + "last": "Dunn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/drebbits/73.jpg", + "expanded": false, + "guid": "d0121c9c-7074-450a-9234-7d97fd437785", + "integer": 91, + "date": "Mon Feb 01 1988 23:12:40 GMT-0800 (PST)", + "shortText": "non", + "mediumText": "Veniam in voluptate laboris exercitation labore velit enim occaecat eiusmod officia cupidatat ex non mollit. Irure occaecat adipisicing dolore labore officia aliquip in. Elit et consequat adipisicing aliquip irure qui sunt amet Lorem eiusmod fugiat tempor sint fugiat. Consectetur esse eu pariatur et cupidatat sint. Nulla enim Lorem exercitation eu id cillum sint qui est deserunt culpa.", + "longText": "Eiusmod aliquip pariatur minim commodo qui labore aliquip sint non officia consequat. Aliquip culpa anim amet id labore nulla enim cupidatat consectetur eiusmod. Dolor nulla pariatur sunt pariatur est labore excepteur velit dolore nisi.\r\nQuis amet fugiat occaecat anim. Elit aliqua non veniam commodo. Lorem enim ut laboris dolore ad esse est culpa aute aliqua aliqua. Elit deserunt ea cillum ad. Laboris ipsum cupidatat laborum veniam officia quis aute sit pariatur commodo reprehenderit in velit.\r\nEnim aliqua culpa do voluptate et deserunt velit est. Nisi elit voluptate ipsum officia mollit nulla anim labore magna laboris dolor proident. Ea excepteur laborum aute excepteur officia qui proident. Nisi ad ipsum et cupidatat sint cupidatat veniam eiusmod eu id eiusmod pariatur cupidatat. Mollit eiusmod culpa labore reprehenderit minim dolore et veniam non labore tempor sunt Lorem ex. Laborum officia Lorem duis enim magna exercitation ullamco elit ut veniam reprehenderit magna quis adipisicing. Dolor est amet commodo nulla deserunt Lorem reprehenderit consectetur.\r\n", + "address": "2 Woodpoint Road", + "city": "Shaft", + "state": "Arizona", + "zip": 57801, + "country": "Niger", + "email": "debradunn@scentric.com", + "phone": "(815) 574-3583", + "color": "rgb(79,212,186)" + }, + { + "index": 137, + "name": "Marquez Stark", + "first": "Gallegos", + "last": "Harris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alexhaniotis/73.jpg", + "expanded": false, + "guid": "2dc3bab6-4120-4941-8c99-3f350a894c8f", + "integer": 76, + "date": "Tue Jul 05 2005 22:08:38 GMT-0700 (PDT)", + "shortText": "id officia", + "mediumText": "Mollit dolor quis quis velit elit id ex esse sit cillum sit aliquip.", + "longText": "Est laboris reprehenderit nisi duis eu qui elit ipsum excepteur cillum officia. Qui dolor eiusmod nulla elit enim pariatur tempor. Sunt aliquip voluptate mollit magna nisi eu sit do adipisicing laboris. Officia fugiat id quis eu consequat nulla anim irure quis exercitation adipisicing deserunt elit.\r\nAnim minim nostrud reprehenderit aute labore irure voluptate. Laborum incididunt ipsum culpa nulla qui esse mollit veniam. Dolor commodo ad aliqua aliquip ea consequat occaecat culpa veniam consequat. Incididunt reprehenderit enim veniam deserunt laboris cillum sint occaecat labore eiusmod ullamco veniam. Dolor culpa culpa laboris id cillum. Exercitation qui id laboris minim fugiat ea do aute duis. Do velit laborum adipisicing ad amet consequat laboris Lorem pariatur.\r\nConsequat dolor amet cillum minim exercitation sit in velit fugiat id anim. Fugiat tempor laborum nostrud ea eiusmod esse laborum. Labore aliquip ullamco ipsum aliqua consectetur ipsum ad. Et voluptate incididunt id cillum labore fugiat aliquip veniam sunt sunt nisi adipisicing. Cillum nisi qui reprehenderit qui nostrud sunt.\r\n", + "address": "2 Franklin Street", + "city": "Orovada", + "state": "Texas", + "zip": 68862, + "country": "Malta", + "email": "gallegosharris@scentric.com", + "phone": "(994) 597-2534", + "color": "rgb(67,106,191)" + }, + { + "index": 138, + "name": "James Gregory", + "first": "Davis", + "last": "Burton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/twahlin/73.jpg", + "expanded": false, + "guid": "7ff8b299-328d-46dc-ab4f-b59c0d6e3ad8", + "integer": 32, + "date": "Sat Jan 08 1994 09:01:56 GMT-0800 (PST)", + "shortText": "tempor", + "mediumText": "Id nisi nulla non culpa laborum dolor adipisicing aute in. Cillum consectetur sit occaecat officia. Nulla Lorem aliqua nulla velit nisi dolore magna sint in sint incididunt sunt sit nostrud. Pariatur sunt labore Lorem est nulla minim culpa velit tempor elit ipsum in eiusmod. Ad fugiat anim incididunt sint consectetur.", + "longText": "Esse reprehenderit laborum commodo aute nostrud incididunt. Voluptate do consectetur excepteur minim laboris ea et ut cupidatat. Magna qui aute sint minim do nostrud laborum magna labore. Lorem sunt veniam ullamco cupidatat.\r\nEt ullamco aute ex cupidatat cillum laboris aliqua laborum irure. Laboris ex laboris dolore non Lorem. Reprehenderit excepteur occaecat laborum laboris voluptate exercitation eu est consectetur tempor est nisi. Cillum fugiat do deserunt non dolor eiusmod Lorem dolore voluptate. Nisi minim enim Lorem minim quis exercitation reprehenderit eu nulla qui aute.\r\nIrure anim eiusmod id adipisicing aliqua. Nulla minim laboris nulla esse do elit aliqua eiusmod aute cillum elit. Ex consequat laboris aliquip dolor dolore pariatur consequat ut reprehenderit.\r\nFugiat minim eiusmod tempor commodo amet deserunt consectetur elit aliquip ex labore laborum veniam eu. Cillum aliquip aliquip non culpa eiusmod elit non dolore. Eiusmod ullamco cillum dolor ea voluptate et adipisicing ut enim. Sunt duis ea fugiat aute qui reprehenderit ut. Ullamco minim cillum aliqua nulla amet excepteur reprehenderit ut reprehenderit. Duis eu aliqua ad dolore consectetur labore quis occaecat cillum qui sint commodo deserunt est. Duis sunt deserunt enim duis est anim commodo elit id ad magna occaecat in.\r\n", + "address": "4 Macdougal Street", + "city": "Limestone", + "state": "District Of Columbia", + "zip": 74514, + "country": "Antigua and Barbuda", + "email": "davisburton@scentric.com", + "phone": "(916) 551-3269", + "color": "rgb(215,141,197)" + }, + { + "index": 139, + "name": "Thomas Lowery", + "first": "Hutchinson", + "last": "Weeks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ntfblog/73.jpg", + "expanded": false, + "guid": "6ae3a7b3-9d8c-46bc-9d8c-af55345a1168", + "integer": 68, + "date": "Sat May 27 1978 05:40:06 GMT-0700 (PDT)", + "shortText": "irure sit", + "mediumText": "Officia proident tempor do et aliquip in cupidatat labore anim esse.", + "longText": "Labore elit laboris dolor fugiat ut sit minim aliquip adipisicing culpa nostrud. Id do adipisicing nisi adipisicing proident. Cupidatat tempor aliquip anim consequat fugiat eiusmod laborum adipisicing. Et sunt velit magna cupidatat commodo et consequat. Exercitation voluptate ex aliquip laboris. Aliqua qui voluptate anim deserunt reprehenderit.\r\nPariatur dolore pariatur laborum excepteur duis. Dolore consequat veniam fugiat sint cillum quis sit deserunt laborum eiusmod culpa id. Eiusmod incididunt magna cupidatat irure. Ex eu ad non non non consectetur sit non cillum sit anim cupidatat. Ea minim ut exercitation sint ullamco culpa cupidatat ipsum eu sit.\r\nEnim aliquip officia occaecat esse exercitation nulla esse. Commodo magna et sint sint consequat velit excepteur occaecat ex ea tempor proident. Officia laboris proident commodo eu laboris consectetur sunt pariatur aliqua pariatur. Fugiat reprehenderit reprehenderit cillum exercitation consequat duis ullamco in quis exercitation est est excepteur.\r\nEsse duis in elit cupidatat non cillum non aute sunt nulla mollit ipsum enim. Sit deserunt do nostrud quis dolor qui aliqua qui exercitation ex minim velit esse. Aliqua irure do ex eiusmod cupidatat non veniam est exercitation. Ea culpa eu Lorem id aute dolore.\r\n", + "address": "4 Hazel Court", + "city": "Lafferty", + "state": "Virgin Islands", + "zip": 50828, + "country": "Kazakhstan", + "email": "hutchinsonweeks@scentric.com", + "phone": "(930) 418-3265", + "color": "rgb(120,254,136)" + }, + { + "index": 140, + "name": "Adkins Hanson", + "first": "Gibson", + "last": "Chaney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/commoncentssss/73.jpg", + "expanded": false, + "guid": "9f6901ec-fedc-4d3c-963a-46d2245a15d6", + "integer": 63, + "date": "Thu Dec 30 1971 20:07:08 GMT-0800 (PST)", + "shortText": "elit tempor labore labore", + "mediumText": "Esse duis dolore officia voluptate velit culpa incididunt reprehenderit nisi. Eiusmod dolor ut non ea ut consequat dolor veniam aliqua ut cupidatat pariatur sunt.", + "longText": "Culpa tempor sint ullamco minim aute ad. Mollit laboris minim amet incididunt proident proident magna elit qui fugiat non velit irure. Nostrud incididunt non sunt ex veniam minim proident exercitation aliqua veniam laboris dolor est.\r\nPariatur aute adipisicing tempor occaecat. Laborum sit quis irure commodo sit. Incididunt do enim sit ad. Voluptate dolore fugiat ipsum id. Lorem Lorem laborum excepteur nostrud ut.\r\nCulpa tempor velit esse commodo eiusmod excepteur in aliqua. Quis culpa Lorem non et sunt elit. Incididunt ullamco ipsum duis laboris minim do mollit quis non minim laboris adipisicing sit Lorem. Culpa consectetur Lorem aute amet culpa deserunt fugiat. Deserunt amet officia cupidatat ea cupidatat nisi enim cupidatat reprehenderit dolore et reprehenderit nulla cupidatat. Velit ipsum ea ad exercitation eu sunt nisi nostrud ullamco nisi commodo aliqua.\r\nAdipisicing aute reprehenderit in enim do ipsum pariatur et cupidatat deserunt consectetur mollit sunt laboris. Exercitation voluptate dolor quis quis commodo. Laboris sunt consectetur veniam id fugiat magna ipsum ad cillum officia in sunt. Sunt ut magna culpa ad proident id sit in. Sint laborum commodo culpa deserunt et aliquip dolor laborum. Laboris adipisicing exercitation aliqua qui labore irure Lorem culpa aute minim Lorem aliquip. Sint nostrud et ut irure nisi non.\r\n", + "address": "4 Croton Loop", + "city": "Cresaptown", + "state": "Puerto Rico", + "zip": 63679, + "country": "Bahrain", + "email": "gibsonchaney@scentric.com", + "phone": "(973) 550-3569", + "color": "rgb(147,126,185)" + }, + { + "index": 141, + "name": "Catalina Rojas", + "first": "Angie", + "last": "Mcknight", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anissa_anwar/73.jpg", + "expanded": false, + "guid": "2a7b1f3c-602a-4977-b1d0-b2e1f3101dbd", + "integer": 61, + "date": "Sun Jan 31 1982 15:49:23 GMT-0800 (PST)", + "shortText": "in adipisicing reprehenderit cillum officia", + "mediumText": "Commodo voluptate est elit aliquip irure qui. Ullamco labore et non irure. Ea sunt excepteur ea in. Consequat deserunt sint id et aliquip officia et nisi esse amet reprehenderit quis. Ut enim quis et culpa.", + "longText": "Labore ullamco ea ipsum aute veniam adipisicing irure culpa adipisicing mollit. Qui aute velit labore veniam enim exercitation reprehenderit tempor nisi ullamco cillum tempor ea fugiat. Nulla incididunt dolore exercitation irure ut. Fugiat dolor duis ad deserunt in proident. Est elit nisi magna do culpa aliquip proident elit cupidatat. Adipisicing fugiat commodo ullamco eiusmod mollit veniam. Nisi cupidatat ullamco cillum velit qui Lorem sint ad non esse eu.\r\n", + "address": "4 Thomas Street", + "city": "Marenisco", + "state": "Maryland", + "zip": 83481, + "country": "India", + "email": "angiemcknight@scentric.com", + "phone": "(852) 571-3576", + "color": "rgb(180,187,55)" + }, + { + "index": 142, + "name": "Waller Rios", + "first": "Sherri", + "last": "Jones", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/btrig/73.jpg", + "expanded": false, + "guid": "33336c68-2dc7-4da4-83df-770c5d0ac6a1", + "integer": 23, + "date": "Thu Aug 06 2009 20:38:56 GMT-0700 (PDT)", + "shortText": "cillum ullamco deserunt", + "mediumText": "In voluptate sit consequat ex eu consectetur labore et qui in. Nostrud do enim ut non dolore cupidatat duis sint. Est laboris aute veniam mollit ea dolore occaecat pariatur. Fugiat adipisicing amet cupidatat cillum sit reprehenderit velit cillum ex anim velit tempor. Ullamco do aliquip est Lorem duis nulla ipsum.", + "longText": "Enim aliqua ut eu excepteur cupidatat nostrud dolore. Anim in ut est laboris. Id sunt ex labore commodo pariatur laborum sint labore fugiat nostrud.\r\nVelit commodo voluptate irure eu officia aute veniam et quis laboris. Nisi excepteur excepteur deserunt dolor. Sunt ex enim do eiusmod aliqua consequat aute cupidatat incididunt sint eiusmod ex ea Lorem. Fugiat nisi adipisicing ullamco anim enim quis eu fugiat.\r\nTempor aliqua consequat nisi deserunt cillum. Nulla eu fugiat nostrud aliquip ut consequat consectetur dolor labore duis ut deserunt eu. Mollit ut irure irure dolore ad occaecat cillum. Consectetur Lorem nostrud veniam fugiat. Qui mollit pariatur tempor consequat. Ut consequat veniam consequat exercitation non cillum ullamco sit velit Lorem qui aliqua anim.\r\nIrure ad minim consectetur mollit consectetur. Ex est laborum fugiat non. Aute consequat aliquip qui ex proident. Ad occaecat deserunt aliqua non sint consectetur voluptate in enim quis do mollit velit. Reprehenderit quis dolor laborum dolor mollit.\r\nIrure Lorem aliquip elit id minim sit. Exercitation laborum deserunt irure incididunt deserunt veniam ullamco dolor. Aliqua excepteur quis culpa labore in elit reprehenderit voluptate duis consectetur. Irure occaecat consequat commodo enim ex enim deserunt.\r\n", + "address": "2 Etna Street", + "city": "Gorham", + "state": "Massachusetts", + "zip": 76332, + "country": "Qatar", + "email": "sherrijones@scentric.com", + "phone": "(905) 514-2725", + "color": "rgb(167,172,139)" + }, + { + "index": 143, + "name": "Fulton Richmond", + "first": "Nannie", + "last": "Preston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ug_rick/73.jpg", + "expanded": false, + "guid": "d342e219-1ba1-46ae-aaea-371e1c50562a", + "integer": 14, + "date": "Thu Aug 06 1987 21:37:44 GMT-0700 (PDT)", + "shortText": "proident sunt tempor", + "mediumText": "Fugiat aliquip nisi eiusmod et. Adipisicing eiusmod quis magna aliquip ut ullamco nulla veniam dolor irure exercitation dolore. Lorem nostrud do non do cupidatat eiusmod ea ipsum aliqua pariatur aute Lorem voluptate.", + "longText": "Commodo adipisicing est ea do nostrud Lorem in adipisicing magna dolor pariatur consectetur. Esse adipisicing Lorem qui nostrud occaecat ipsum aute deserunt esse minim elit amet. Ad sint dolore minim consectetur enim. Cupidatat culpa amet mollit ut dolore aliqua laborum nulla voluptate voluptate eu sint voluptate Lorem. Irure et laboris tempor aute qui veniam id nulla sint nostrud eu officia ea commodo.\r\nAliquip et magna exercitation velit quis incididunt velit. Nostrud fugiat in nulla Lorem qui tempor nulla adipisicing anim eiusmod duis sunt ad ex. Nulla Lorem aliqua do esse commodo. Ea ullamco anim non magna reprehenderit id ad ut aliquip magna velit tempor est. Consequat laboris tempor cupidatat velit nulla ea reprehenderit aute excepteur commodo eu qui nisi amet. Commodo excepteur enim sint dolor tempor eu nulla elit non dolor.\r\nDo id incididunt aute consequat cillum. Voluptate sunt in ut id enim fugiat occaecat. Consectetur cillum sint tempor commodo duis veniam ad anim laboris deserunt consequat. Nisi duis aliqua consectetur ullamco nisi culpa ea aliqua.\r\n", + "address": "2 Lott Street", + "city": "Lydia", + "state": "Oklahoma", + "zip": 37848, + "country": "Vatican City State (Holy See)", + "email": "nanniepreston@scentric.com", + "phone": "(801) 531-2586", + "color": "rgb(58,230,86)" + }, + { + "index": 144, + "name": "Juanita Mcfadden", + "first": "Preston", + "last": "Koch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/blakestevenson/73.jpg", + "expanded": false, + "guid": "d10bde3c-7451-4455-bcab-d6a9467128b3", + "integer": 35, + "date": "Sat Dec 29 2007 19:47:26 GMT-0800 (PST)", + "shortText": "fugiat", + "mediumText": "Deserunt mollit proident mollit pariatur aliquip amet sit sunt ea aliquip non ad irure voluptate. Mollit eu veniam do veniam esse laboris velit dolor velit aliqua Lorem sint dolore cupidatat. Ea est irure incididunt deserunt officia Lorem culpa proident non do cillum.", + "longText": "Reprehenderit sint est consequat do. Qui irure ad voluptate proident nulla nulla quis nisi minim quis ullamco eiusmod sint. Nulla exercitation tempor incididunt qui. Adipisicing velit sit ad exercitation cillum esse exercitation sit laboris. Nostrud commodo aliquip esse quis in irure exercitation.\r\nEnim nisi in dolor cillum nulla ipsum. Qui velit cupidatat esse sit quis ullamco consequat deserunt irure exercitation. Culpa tempor ut ex id id aliqua ipsum cillum est proident ullamco nulla reprehenderit. Amet proident duis sunt proident consectetur non pariatur officia in. Voluptate enim anim eiusmod fugiat occaecat ut sunt sit nulla proident. Elit dolore consectetur velit occaecat.\r\n", + "address": "4 Jewel Street", + "city": "Washington", + "state": "Ohio", + "zip": 55293, + "country": "Malaysia", + "email": "prestonkoch@scentric.com", + "phone": "(824) 598-3313", + "color": "rgb(188,204,126)" + }, + { + "index": 145, + "name": "Hunter Morin", + "first": "Aguilar", + "last": "Willis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karalek/73.jpg", + "expanded": false, + "guid": "b6d849a7-e16f-4caf-8ddf-0232c5ccb47c", + "integer": 14, + "date": "Fri Oct 11 2013 10:09:38 GMT-0700 (PDT)", + "shortText": "mollit elit incididunt exercitation esse", + "mediumText": "Nisi tempor cupidatat do sint in nostrud nulla magna labore tempor amet. Qui ut anim adipisicing veniam veniam voluptate cupidatat culpa duis minim adipisicing veniam excepteur proident. Tempor eiusmod sint et nulla voluptate irure et quis sunt. Sit exercitation ex adipisicing consectetur sit veniam velit et laboris minim Lorem excepteur in.", + "longText": "Elit dolore dolore mollit deserunt fugiat Lorem ad nostrud occaecat magna. Sint deserunt sunt incididunt ad qui. Cupidatat nostrud ea sunt officia non sunt ea aliqua ipsum cillum adipisicing. Esse eiusmod minim magna culpa culpa.\r\n", + "address": "2 Cox Place", + "city": "Escondida", + "state": "Nevada", + "zip": 76788, + "country": "Belize", + "email": "aguilarwillis@scentric.com", + "phone": "(878) 446-2425", + "color": "rgb(137,240,219)" + }, + { + "index": 146, + "name": "Kathy Sutton", + "first": "Kendra", + "last": "Blevins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elusiveanmol/73.jpg", + "expanded": false, + "guid": "4ad8c3c8-a316-4762-a596-e9477c0fa2cd", + "integer": 31, + "date": "Thu Dec 09 2004 16:04:29 GMT-0800 (PST)", + "shortText": "nisi", + "mediumText": "Minim incididunt amet sint velit officia eiusmod cillum velit duis adipisicing magna laborum deserunt eiusmod.", + "longText": "Sunt culpa tempor deserunt ea ea labore. Occaecat consectetur anim anim ipsum dolor. Consectetur nulla commodo non velit reprehenderit cillum tempor aliquip aliqua consequat dolore.\r\nAnim minim ipsum velit consectetur sit incididunt magna cillum. Commodo deserunt consectetur esse aliqua ullamco dolor pariatur. Mollit sint voluptate aute dolor fugiat minim veniam anim ad aute. In aliquip anim ullamco dolore proident proident ipsum sunt sunt. Sint dolor pariatur aute excepteur sunt laborum magna qui.\r\nIn eu excepteur commodo eiusmod aliqua ad amet. Fugiat eu adipisicing et eu commodo nostrud elit consectetur incididunt deserunt. Non velit qui do pariatur. Lorem pariatur ullamco voluptate cillum do duis.\r\nEnim ut velit tempor nulla nostrud duis non ex amet. Fugiat cillum cillum dolore aliquip aliqua duis proident sit eu deserunt culpa esse ad. Laboris dolore nulla in ullamco ullamco ut ad. Veniam amet ea Lorem consequat officia ut consectetur ea Lorem duis cupidatat id. Irure non cupidatat ipsum do incididunt duis minim elit dolor deserunt velit. Deserunt laboris fugiat ea incididunt qui excepteur ad non irure incididunt aliquip fugiat occaecat non.\r\nElit proident exercitation quis in labore et sint ea cillum ex occaecat deserunt. Ex laboris fugiat non et excepteur. Labore non nisi exercitation do minim incididunt commodo culpa est dolor. Mollit minim proident ea id. Aliquip est nulla aliquip sint culpa eu amet magna exercitation reprehenderit culpa. Ex commodo aliqua mollit veniam fugiat officia sint duis ad sit.\r\n", + "address": "3 Prince Street", + "city": "Urbana", + "state": "Montana", + "zip": 58650, + "country": "Singapore", + "email": "kendrablevins@scentric.com", + "phone": "(956) 553-2050", + "color": "rgb(224,79,174)" + }, + { + "index": 147, + "name": "Noel Morrison", + "first": "Puckett", + "last": "Shannon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shoo7830/73.jpg", + "expanded": false, + "guid": "3257d65a-9945-47b8-8159-7e2304b15eef", + "integer": 32, + "date": "Wed Oct 31 1973 14:26:42 GMT-0800 (PST)", + "shortText": "sit enim nisi dolor occaecat", + "mediumText": "Deserunt deserunt excepteur aliquip proident aliquip sunt voluptate qui. Incididunt Lorem laboris dolore cillum incididunt. Qui magna excepteur ad id fugiat nostrud ea sunt mollit.", + "longText": "Eiusmod irure est incididunt cillum id sit enim quis. Eiusmod consequat deserunt proident fugiat velit ut pariatur mollit eiusmod tempor reprehenderit nisi. Nulla id ea occaecat culpa sit aute pariatur sit ullamco sint. Reprehenderit minim irure ut laborum irure nisi consectetur. Velit laborum aliquip eu ea quis veniam dolore nulla in mollit labore. Dolor velit est eiusmod est ullamco magna excepteur culpa deserunt aliqua culpa Lorem ea.\r\nTempor adipisicing sit elit ea commodo dolore dolore incididunt anim cillum nulla. In exercitation excepteur cupidatat nisi do. Id et aliqua incididunt officia pariatur dolor officia in eu ea. Eiusmod duis sint Lorem in officia velit sit qui labore aliqua fugiat quis magna ea. Laborum reprehenderit exercitation reprehenderit veniam anim nisi qui est. Ad velit incididunt ut labore consequat culpa nisi do voluptate aliquip.\r\nDo dolore occaecat amet aliquip excepteur aute nisi non. Cillum incididunt nostrud excepteur eiusmod consequat mollit voluptate dolor aliquip non. Veniam pariatur ad dolor commodo velit. Sunt dolore sunt dolore adipisicing pariatur sit nulla magna exercitation dolor proident amet dolore. Lorem adipisicing cillum laboris anim ex pariatur minim proident cillum deserunt incididunt est nostrud.\r\nEiusmod dolore eiusmod ad irure. Id nulla voluptate ad cillum duis aute veniam est mollit do. Dolore adipisicing cupidatat officia magna mollit incididunt ea. Ipsum commodo aute eu consequat ea sit. Pariatur cupidatat veniam voluptate est ex. Officia sint laboris voluptate anim laborum occaecat in ad. Consequat amet occaecat commodo deserunt duis.\r\nEnim minim dolor in anim enim. Sint ad adipisicing ullamco dolor cillum aute proident ea sint quis laboris sit. Dolor voluptate qui duis do ut labore magna incididunt occaecat tempor esse reprehenderit. Proident fugiat nulla tempor magna sit ut aliquip proident voluptate esse.\r\n", + "address": "2 Vanderbilt Avenue", + "city": "Nanafalia", + "state": "California", + "zip": 57562, + "country": "Trinidad and Tobago", + "email": "puckettshannon@scentric.com", + "phone": "(963) 414-2787", + "color": "rgb(74,128,154)" + }, + { + "index": 148, + "name": "Reeves Combs", + "first": "Trudy", + "last": "Newton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/oanacr/73.jpg", + "expanded": false, + "guid": "53ffc997-22cc-4acc-94b5-13907ae8737f", + "integer": 12, + "date": "Sun Feb 19 1984 10:56:10 GMT-0800 (PST)", + "shortText": "consequat quis ea laboris", + "mediumText": "Commodo minim culpa cillum proident dolor occaecat mollit.", + "longText": "Proident consectetur officia consectetur laborum eiusmod sunt. Et magna labore nostrud culpa ullamco cillum duis pariatur laboris irure. Anim laborum enim laboris velit pariatur cupidatat. Aliqua minim eu labore est ex excepteur ullamco laboris deserunt ex id tempor. Laboris dolor elit officia anim incididunt nostrud incididunt nostrud officia voluptate. Voluptate nostrud fugiat consectetur cillum adipisicing elit sint sit duis. Dolor labore do pariatur do officia ullamco.\r\nQui nulla occaecat dolore ad labore excepteur reprehenderit magna sint irure culpa est. In mollit cupidatat laborum duis ipsum mollit. Eiusmod excepteur aliquip do anim occaecat quis mollit id laborum Lorem consectetur commodo. Officia nisi Lorem veniam officia consectetur proident duis anim ullamco sunt enim nostrud. Laboris ad eu et esse sit nisi.\r\nNulla proident eu duis sunt nostrud minim laboris fugiat nisi pariatur occaecat. Et cupidatat mollit laborum ipsum sint ea amet enim aliqua. Exercitation eiusmod eu labore tempor mollit id commodo amet magna.\r\n", + "address": "3 Fayette Street", + "city": "Noxen", + "state": "Marshall Islands", + "zip": 85920, + "country": "Namibia", + "email": "trudynewton@scentric.com", + "phone": "(873) 577-2869", + "color": "rgb(219,169,181)" + }, + { + "index": 149, + "name": "Oconnor Chan", + "first": "Beasley", + "last": "Larson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elamyr/73.jpg", + "expanded": false, + "guid": "1f90bd42-2c77-42fe-aa6b-fa4cd66676e6", + "integer": 10, + "date": "Fri Dec 30 1983 09:19:48 GMT-0800 (PST)", + "shortText": "adipisicing magna dolore", + "mediumText": "Commodo fugiat enim est minim. Amet quis amet mollit ipsum. Ex laboris eiusmod ut cillum nostrud sit excepteur qui est aliquip irure.", + "longText": "Laborum aliquip ullamco id irure anim esse nisi pariatur incididunt enim tempor. Sit voluptate aliquip non duis commodo. Dolor pariatur sunt ex nulla occaecat commodo ad minim minim eiusmod laborum consectetur. Veniam aute pariatur excepteur deserunt veniam voluptate tempor magna laborum minim consectetur officia consectetur. Enim aliquip incididunt dolor qui labore.\r\nAdipisicing fugiat commodo eiusmod cillum reprehenderit amet anim id. Aute laboris irure culpa est officia eiusmod esse minim ut irure ut. Nulla eu tempor nulla est eiusmod exercitation deserunt est. Nisi commodo amet sunt laborum non dolore sint eiusmod adipisicing officia elit ea occaecat.\r\nAdipisicing do ex aliqua aute ex nisi veniam excepteur consequat proident Lorem. Occaecat sit nisi amet occaecat consectetur id cillum dolore ad do laborum fugiat eiusmod. Cillum officia mollit qui non ad occaecat ea. Aliqua do pariatur culpa ullamco aliquip nisi enim tempor tempor ad quis nisi. Elit ipsum nisi nostrud magna excepteur sunt nisi excepteur ipsum nulla proident. Adipisicing mollit anim dolore eu mollit amet tempor.\r\n", + "address": "3 Sedgwick Street", + "city": "Wyoming", + "state": "Indiana", + "zip": 32307, + "country": "Paraguay", + "email": "beasleylarson@scentric.com", + "phone": "(816) 493-2742", + "color": "rgb(72,189,192)" + }, + { + "index": 150, + "name": "Cherry Barrett", + "first": "Jodie", + "last": "Logan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hmenchaca2/73.jpg", + "expanded": false, + "guid": "cf368c96-a982-4646-9b54-5fac8d17760e", + "integer": 86, + "date": "Tue Jun 30 2009 10:25:53 GMT-0700 (PDT)", + "shortText": "minim aliqua deserunt officia reprehenderit", + "mediumText": "Sunt ea eu occaecat aliqua.", + "longText": "Do anim id incididunt enim eiusmod quis sit id anim laboris proident. Fugiat nostrud dolore ex sit excepteur aliqua ex laborum ipsum deserunt mollit in laboris excepteur. Voluptate fugiat aliquip cillum sint magna voluptate labore veniam commodo deserunt excepteur. Nisi laborum commodo magna laborum ullamco ullamco est incididunt. Fugiat ex do pariatur reprehenderit velit pariatur proident. Laborum nulla laborum fugiat minim ut est voluptate elit reprehenderit.\r\nVelit enim enim ex eiusmod quis quis. Est minim adipisicing eu labore et dolor. Occaecat non laborum sint officia aliquip. Sint voluptate est incididunt ullamco anim duis cillum nostrud consectetur consequat amet quis labore. Ullamco eu amet eu est esse. Pariatur commodo incididunt dolore commodo sint consequat qui consectetur ea eu et. Amet quis non fugiat sint nostrud magna eiusmod incididunt ullamco.\r\nConsequat Lorem id ea consectetur cupidatat veniam adipisicing quis est proident eu quis. Labore magna ut esse amet qui non commodo exercitation. Adipisicing ut fugiat dolor sit ex sint mollit aute occaecat officia ipsum ut. Dolore consectetur laboris sint ex consectetur. Labore proident Lorem sunt sunt amet. Laboris ad in consectetur laboris nostrud culpa veniam pariatur esse adipisicing.\r\nIrure qui nostrud magna elit nulla velit consequat magna aliqua. Esse in consectetur velit laborum nostrud Lorem quis. Ipsum consectetur adipisicing sint adipisicing labore sit Lorem elit veniam nisi excepteur fugiat.\r\nAliqua ut qui enim sit nulla nulla nulla labore aliqua Lorem Lorem do. Voluptate id non pariatur aliquip eiusmod sit in nisi excepteur aliquip nostrud ut. Non id sunt Lorem nostrud cillum ad incididunt. Et aliquip ipsum Lorem deserunt magna do ullamco pariatur exercitation ad id anim in. Anim fugiat nostrud eu commodo velit. Aute labore est anim duis et minim qui non voluptate velit incididunt.\r\n", + "address": "3 Kenilworth Place", + "city": "Foxworth", + "state": "Tennessee", + "zip": 15225, + "country": "Macau", + "email": "jodielogan@scentric.com", + "phone": "(804) 506-3585", + "color": "rgb(200,139,149)" + }, + { + "index": 151, + "name": "Pennington Mccormick", + "first": "Georgette", + "last": "Clay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dparrelli/73.jpg", + "expanded": false, + "guid": "c449450f-7ccb-4b65-9f9d-2b392e612960", + "integer": 15, + "date": "Tue Nov 10 1992 06:22:21 GMT-0800 (PST)", + "shortText": "adipisicing non officia", + "mediumText": "Dolore tempor qui cupidatat et velit ipsum ut officia.", + "longText": "Laboris nostrud cillum esse velit veniam non occaecat. Consequat pariatur reprehenderit qui culpa cupidatat fugiat ad amet irure non. Consequat magna laboris occaecat laborum est elit et magna voluptate cillum occaecat amet. Sit elit proident duis tempor nulla ullamco est qui nostrud. Duis non aliqua ea duis labore elit pariatur elit. Aliquip amet id ea aliqua.\r\nLorem Lorem exercitation eiusmod laboris culpa ipsum qui occaecat irure elit. Do occaecat reprehenderit pariatur non nisi magna nisi labore cupidatat anim proident quis ad ipsum. Non qui aute cupidatat irure dolor excepteur excepteur. Veniam eiusmod non nulla ex amet in minim non dolore excepteur anim. Ipsum non magna minim ea consequat officia et eu velit do. Aliqua veniam dolor officia incididunt occaecat. Ipsum est magna non fugiat mollit sunt consectetur veniam dolore id proident exercitation exercitation consectetur.\r\n", + "address": "2 Blake Avenue", + "city": "Haring", + "state": "Palau", + "zip": 47253, + "country": "Mauritania", + "email": "georgetteclay@scentric.com", + "phone": "(941) 573-3108", + "color": "rgb(166,137,160)" + }, + { + "index": 152, + "name": "Freda Coffey", + "first": "Rice", + "last": "Savage", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/okansurreel/73.jpg", + "expanded": false, + "guid": "0645d81f-1761-4eb4-b3ec-5c83f1d37a29", + "integer": 84, + "date": "Sun May 07 1978 23:30:05 GMT-0700 (PDT)", + "shortText": "deserunt voluptate officia consequat magna", + "mediumText": "Adipisicing esse tempor proident irure dolore eu sit.", + "longText": "Exercitation cupidatat voluptate exercitation quis nulla laborum. Tempor elit elit est commodo commodo ipsum elit quis minim ut cupidatat aliqua. Elit officia enim occaecat nisi fugiat nulla qui quis. Nisi cillum ullamco eu proident mollit velit.\r\n", + "address": "4 Ludlam Place", + "city": "Dotsero", + "state": "Virginia", + "zip": 28698, + "country": "Ghana", + "email": "ricesavage@scentric.com", + "phone": "(885) 508-3868", + "color": "rgb(209,117,128)" + }, + { + "index": 153, + "name": "Robin Merrill", + "first": "Harrington", + "last": "Simpson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lwilsonsmith/73.jpg", + "expanded": false, + "guid": "13382562-593b-4d3d-8633-025dec9ff8d2", + "integer": 71, + "date": "Sun Jul 15 1973 12:02:34 GMT-0700 (PDT)", + "shortText": "ad", + "mediumText": "Incididunt est minim non mollit amet est. Id nulla fugiat in pariatur nisi non aliqua deserunt cillum fugiat labore occaecat. Laborum Lorem laborum sit esse amet veniam. Occaecat exercitation anim consectetur nisi.", + "longText": "Anim nisi ex sint laboris incididunt id mollit sunt voluptate laboris qui sunt ad aliqua. Consectetur et esse aliqua in esse cupidatat pariatur ea nulla cillum ea. Exercitation commodo consectetur do quis aute officia est exercitation tempor nisi. Ut mollit Lorem anim cupidatat tempor aute consequat labore Lorem do enim reprehenderit.\r\nLorem magna tempor incididunt aliqua in magna Lorem. Fugiat qui minim est excepteur dolore laboris non consequat. Ullamco consequat eiusmod et sint aliquip et in anim.\r\nSunt incididunt nostrud nulla cillum veniam laborum proident exercitation occaecat incididunt nulla cillum. Labore exercitation in ea aliquip est anim cillum aliqua dolore aliqua adipisicing dolore. Ex et qui sint mollit nisi id aliqua nostrud nostrud eiusmod dolore ut proident qui.\r\nExcepteur cillum ea est eu ad eu exercitation commodo non amet in sint. Amet esse proident consequat elit consequat in laboris ea quis. Duis cillum do dolore sit culpa cillum irure enim tempor qui consectetur magna. Anim cillum esse cillum labore mollit reprehenderit. Sint consequat aliqua in id labore in adipisicing est non sit. Laborum esse voluptate proident excepteur occaecat.\r\n", + "address": "2 Duffield Street", + "city": "Soham", + "state": "Wyoming", + "zip": 36147, + "country": "Moldova", + "email": "harringtonsimpson@scentric.com", + "phone": "(920) 448-3636", + "color": "rgb(166,121,227)" + }, + { + "index": 154, + "name": "Petty Olsen", + "first": "Mcleod", + "last": "Oliver", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/klimmka/73.jpg", + "expanded": false, + "guid": "f4ae116d-6e1a-45dc-a540-636907772467", + "integer": 43, + "date": "Tue May 07 1991 17:32:07 GMT-0700 (PDT)", + "shortText": "proident laborum irure", + "mediumText": "Culpa laborum laboris adipisicing irure commodo.", + "longText": "Culpa incididunt dolore minim laboris eu fugiat occaecat esse cupidatat excepteur exercitation. Est quis Lorem mollit deserunt quis dolore sunt. In laboris ullamco nisi culpa velit deserunt nisi cupidatat irure adipisicing. Veniam in cupidatat irure reprehenderit mollit ut laboris esse consectetur. Ipsum dolore aliquip mollit nulla magna officia. Eiusmod est culpa eiusmod nostrud adipisicing reprehenderit proident adipisicing do velit nisi et ea do. Ut aute officia esse in ad magna voluptate magna tempor mollit labore consequat quis.\r\nUt ut cupidatat et velit magna aliquip nostrud aute nulla deserunt reprehenderit. Ex consequat labore mollit est officia sint esse labore. Consectetur nulla dolor cupidatat ad irure sint anim ea dolor ullamco ex. Amet pariatur ex reprehenderit amet sit minim eu ullamco enim commodo sunt occaecat cillum id.\r\nEnim elit nostrud exercitation qui. Laboris consequat enim cillum quis aliquip officia sint laborum nisi in reprehenderit aute velit. Duis nisi excepteur mollit nisi duis. Aliquip elit laboris anim fugiat minim. Adipisicing minim excepteur sunt ea irure velit qui voluptate commodo.\r\n", + "address": "4 Malta Street", + "city": "Irwin", + "state": "Colorado", + "zip": 85637, + "country": "Costa Rica", + "email": "mcleodoliver@scentric.com", + "phone": "(805) 533-2119", + "color": "rgb(190,184,203)" + }, + { + "index": 155, + "name": "Misty Hardy", + "first": "Barber", + "last": "Boone", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_kalibry/73.jpg", + "expanded": false, + "guid": "9c45bc8a-25cf-4c5b-8b71-30364fcf1924", + "integer": 43, + "date": "Sun Oct 16 1994 17:51:06 GMT-0700 (PDT)", + "shortText": "magna", + "mediumText": "Exercitation nulla aliquip deserunt dolore nisi.", + "longText": "Minim exercitation sint laborum nulla. Amet sunt aliquip veniam pariatur est ex qui proident mollit est. Fugiat do est elit mollit dolore enim labore aliquip tempor consectetur fugiat culpa et labore. Do anim enim incididunt sit excepteur dolore quis commodo ea reprehenderit sit eiusmod. Labore sint deserunt laborum esse deserunt voluptate sint consequat culpa duis proident. Excepteur enim ipsum minim enim enim elit nulla duis dolore reprehenderit amet enim. Sunt ea esse veniam nostrud aliquip Lorem sunt ex exercitation dolor officia ullamco.\r\nConsectetur proident magna sit est enim magna exercitation elit pariatur excepteur laborum id. Mollit nostrud est excepteur consequat aliqua ea irure. Deserunt velit dolore incididunt exercitation.\r\nLabore anim minim dolor excepteur officia est est in magna minim. Laboris pariatur aute elit esse esse ipsum eiusmod sit esse tempor voluptate irure quis adipisicing. Ea Lorem consectetur irure magna tempor ullamco eu esse magna sit Lorem mollit enim tempor. Do qui consequat dolore est sint aliquip ullamco reprehenderit ut et incididunt. Fugiat non est proident aute.\r\nSunt deserunt consequat anim aliqua aliquip minim ullamco in consectetur. Nisi fugiat cillum pariatur duis in magna pariatur eu nisi ea est esse sunt in. Occaecat proident tempor excepteur cillum.\r\nCupidatat laborum ex commodo excepteur deserunt quis nulla amet labore cupidatat. Enim ipsum id laborum duis anim nulla ex dolor eu officia incididunt aute laboris mollit. Dolore laboris do laborum magna amet minim ea eu eiusmod. Deserunt duis laboris nostrud qui.\r\n", + "address": "3 Clark Street", + "city": "Suitland", + "state": "Utah", + "zip": 21043, + "country": "El Salvador", + "email": "barberboone@scentric.com", + "phone": "(828) 457-2049", + "color": "rgb(233,144,205)" + }, + { + "index": 156, + "name": "Tessa Ward", + "first": "Janie", + "last": "Bailey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dhoot_amit/73.jpg", + "expanded": false, + "guid": "fa4f8583-7893-484e-a2fa-3daeb6c18ffc", + "integer": 38, + "date": "Thu Jun 19 1975 01:08:42 GMT-0700 (PDT)", + "shortText": "ex proident", + "mediumText": "Esse cupidatat duis non ullamco dolor aliquip aute tempor voluptate. Dolore cillum voluptate nulla eiusmod sint dolor minim consectetur.", + "longText": "Sunt occaecat officia aliqua nostrud incididunt est nisi laborum. Labore qui do sint dolore nisi qui sunt fugiat dolor Lorem adipisicing voluptate. Aliqua culpa dolor dolore nulla culpa labore duis sint ex.\r\n", + "address": "2 Wilson Street", + "city": "Rowe", + "state": "Idaho", + "zip": 55794, + "country": "Oman", + "email": "janiebailey@scentric.com", + "phone": "(949) 462-3512", + "color": "rgb(159,233,70)" + }, + { + "index": 157, + "name": "Wilda Booker", + "first": "Ramsey", + "last": "Kemp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/actionsmile/73.jpg", + "expanded": false, + "guid": "53cfead6-8964-4112-84a9-ab158fff3aef", + "integer": 66, + "date": "Sun Jun 03 2007 03:34:39 GMT-0700 (PDT)", + "shortText": "ex id", + "mediumText": "Esse veniam laborum enim exercitation nisi ut duis elit incididunt consequat. Amet anim non proident commodo. Voluptate ex irure ex occaecat veniam velit.", + "longText": "Nisi aliqua id ad et sunt esse ad sunt. Quis irure velit anim aute consequat dolore eu sunt est proident commodo magna irure. Minim ullamco ex duis sint nisi nulla occaecat quis. Dolor dolore est anim aute qui fugiat in veniam incididunt Lorem ad sint qui sit.\r\nOfficia est ullamco laborum duis eu reprehenderit do excepteur Lorem pariatur sit consectetur excepteur deserunt. Sit magna laborum nulla exercitation et ex laboris est incididunt minim. Ipsum cupidatat sint minim do commodo minim ea laboris ea occaecat ut exercitation qui anim. Reprehenderit voluptate sit voluptate occaecat commodo. Adipisicing nisi ipsum eiusmod exercitation non. Nostrud ad incididunt laboris fugiat veniam esse ex laboris enim.\r\nElit fugiat minim nostrud in proident ex nisi ea eiusmod sint adipisicing anim reprehenderit culpa. Exercitation anim do id ad. Nulla esse aliquip sint qui occaecat excepteur irure incididunt dolor. Aliquip commodo veniam laborum enim quis enim dolor laboris excepteur. Laborum consequat tempor reprehenderit elit velit magna pariatur officia nostrud tempor quis elit laboris pariatur. Id consequat reprehenderit in dolor aliquip enim officia occaecat et labore labore.\r\n", + "address": "2 Denton Place", + "city": "Hartsville/Hartley", + "state": "Arkansas", + "zip": 66806, + "country": "Belgium", + "email": "ramseykemp@scentric.com", + "phone": "(856) 582-2727", + "color": "rgb(83,54,244)" + }, + { + "index": 158, + "name": "Owens Bowman", + "first": "Tyson", + "last": "Bowers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/craftified/73.jpg", + "expanded": false, + "guid": "77abfb3a-ed05-4caf-bf96-82e827a650f0", + "integer": 14, + "date": "Wed Mar 28 1990 07:53:40 GMT-0800 (PST)", + "shortText": "qui ullamco pariatur incididunt", + "mediumText": "Laborum pariatur sit pariatur veniam aliqua sint exercitation esse.", + "longText": "Occaecat nostrud sint nisi reprehenderit. Irure est enim esse irure dolor eu pariatur aute ea dolor id nulla. Adipisicing culpa elit adipisicing velit elit cillum sint nisi et deserunt eu.\r\nAd anim fugiat amet commodo do anim ea adipisicing irure ad aliquip cupidatat deserunt. Nulla consequat ut sit consectetur ea non ut aliqua. Nulla nisi sit anim incididunt cillum laborum. Quis deserunt velit ullamco esse non do eu aliquip aliqua consequat quis. Occaecat in in et occaecat proident commodo aliqua mollit magna elit mollit adipisicing elit aute. Consectetur culpa exercitation cillum aliqua cillum proident pariatur enim ut ea amet. Voluptate adipisicing enim esse laborum elit duis consequat labore sunt officia adipisicing adipisicing.\r\nEt magna commodo aute duis ipsum et exercitation eiusmod quis do ipsum. Tempor adipisicing incididunt deserunt eu adipisicing id anim Lorem est. Elit proident esse sunt tempor eiusmod dolor Lorem irure mollit. Qui sit proident duis quis magna qui. Tempor id velit fugiat elit duis nostrud velit id amet velit minim deserunt laboris aute.\r\nAliqua voluptate minim elit consectetur laborum ex proident. Commodo minim tempor veniam duis veniam irure sint do aliqua ut reprehenderit velit ut sunt. Ea nostrud irure Lorem est officia ea esse ad. Ipsum fugiat voluptate irure consequat veniam quis commodo fugiat.\r\nPariatur commodo ex anim nostrud consectetur tempor. Ipsum minim Lorem nostrud elit voluptate ullamco eu labore ipsum Lorem. Excepteur magna ea tempor deserunt eu aliquip pariatur excepteur. Minim fugiat proident quis incididunt laboris. Est nisi esse consectetur pariatur.\r\n", + "address": "4 Canda Avenue", + "city": "Crayne", + "state": "Delaware", + "zip": 12406, + "country": "Kyrgyzstan", + "email": "tysonbowers@scentric.com", + "phone": "(951) 408-3515", + "color": "rgb(163,140,145)" + }, + { + "index": 159, + "name": "Violet Salazar", + "first": "Roy", + "last": "Rosa", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aleksitappura/73.jpg", + "expanded": false, + "guid": "dd706aa0-2c9a-4b30-8ada-4c21111ff80c", + "integer": 60, + "date": "Wed Jun 24 1998 10:59:00 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Amet aute amet occaecat enim cupidatat excepteur mollit et aute fugiat. In labore Lorem elit mollit aliquip est adipisicing excepteur ullamco. Velit reprehenderit magna et minim exercitation duis laborum ut consectetur minim. Enim duis adipisicing nostrud ea esse occaecat reprehenderit anim Lorem exercitation anim consequat sint non. Nisi duis occaecat excepteur consequat ullamco et nostrud laboris fugiat elit pariatur sit consequat mollit.", + "longText": "Est veniam irure excepteur aliquip excepteur aliqua fugiat. Labore aliquip anim fugiat est mollit dolor aute incididunt duis. Quis exercitation eiusmod laboris ullamco velit dolor deserunt cillum eiusmod ea. Excepteur velit ullamco reprehenderit fugiat laborum quis velit.\r\nCupidatat adipisicing irure cillum esse non ullamco incididunt amet adipisicing nisi. Consequat enim excepteur voluptate magna laborum incididunt in do incididunt duis. Minim qui Lorem velit incididunt cillum sunt quis aute nulla dolore pariatur labore ipsum. Amet in non amet et cillum duis exercitation aliqua et. Velit et voluptate excepteur amet anim deserunt mollit eu. Lorem commodo proident labore elit mollit cillum ad et et quis. Magna sint ut proident nisi duis.\r\nVoluptate ad dolor incididunt ex esse enim deserunt incididunt commodo esse irure laboris labore. Occaecat ad deserunt do et. Fugiat do sint nulla incididunt elit nulla est nulla et fugiat nulla nostrud in. Consectetur aute et nulla excepteur tempor do ut Lorem. Consequat magna qui adipisicing eiusmod irure amet laboris ea Lorem eu ut deserunt consectetur do.\r\nConsequat sunt incididunt sit voluptate proident minim anim. Aute est adipisicing occaecat officia cupidatat Lorem labore officia nulla culpa non elit ipsum. Commodo amet amet id enim cupidatat amet. Anim minim duis deserunt veniam sit sint sint ullamco magna.\r\n", + "address": "3 Royce Street", + "city": "Leroy", + "state": "Federated States Of Micronesia", + "zip": 13161, + "country": "Swaziland", + "email": "royrosa@scentric.com", + "phone": "(805) 581-2201", + "color": "rgb(150,213,255)" + }, + { + "index": 160, + "name": "Laurel Harvey", + "first": "Yvonne", + "last": "Foster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicollerich/73.jpg", + "expanded": false, + "guid": "1fb04afe-2620-4b3d-bf7d-c0ae6504d91a", + "integer": 27, + "date": "Sun May 20 1973 10:47:10 GMT-0700 (PDT)", + "shortText": "sit officia", + "mediumText": "Lorem laboris sit dolore nulla est enim eu eu. Enim fugiat officia elit cillum fugiat nostrud nostrud aute non aliquip laborum culpa amet fugiat. Elit esse laboris aliquip labore reprehenderit elit fugiat nostrud duis aliquip consequat.", + "longText": "Commodo elit amet sit irure id. Deserunt laboris commodo aute incididunt nisi esse occaecat irure non magna. Irure nisi nisi irure consequat dolore fugiat dolor reprehenderit veniam qui cupidatat ipsum. Cillum sint in ut quis ullamco eu ut laborum exercitation reprehenderit culpa. Consectetur dolor duis exercitation irure et eiusmod.\r\n", + "address": "3 Matthews Court", + "city": "Chesterfield", + "state": "Guam", + "zip": 42757, + "country": "Slovenia", + "email": "yvonnefoster@scentric.com", + "phone": "(981) 600-2987", + "color": "rgb(131,169,121)" + }, + { + "index": 161, + "name": "Mills Cruz", + "first": "Lydia", + "last": "Trevino", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrmartineau/73.jpg", + "expanded": false, + "guid": "cd0f0296-ec14-4221-a846-ca3bf425bbbc", + "integer": 86, + "date": "Sun Feb 10 2002 20:01:40 GMT-0800 (PST)", + "shortText": "est dolore pariatur", + "mediumText": "Duis non quis tempor enim non sunt mollit esse. Irure ipsum ea elit commodo aute dolore ad sint reprehenderit. Velit aute ad commodo sint nisi ipsum. Sunt ex nostrud laboris anim amet tempor exercitation laboris in commodo non excepteur. Ea duis cupidatat eu enim est veniam.", + "longText": "Amet anim eu fugiat amet. Non cillum veniam consectetur nulla proident eu minim enim irure et. Proident exercitation est laboris ullamco anim. Commodo consectetur nostrud labore irure.\r\nDolore sunt id mollit aliquip. Nulla ullamco sint eu et reprehenderit nulla nostrud officia sint. Culpa consequat qui nulla dolore aliquip ipsum aliqua occaecat. Et ea ad magna ipsum magna tempor. Aliquip laborum proident cillum ut aliquip irure minim ut ad nostrud aliquip. Id veniam duis aliqua fugiat aliquip amet tempor ut deserunt proident eu pariatur anim pariatur.\r\n", + "address": "3 Rutherford Place", + "city": "Jeff", + "state": "Pennsylvania", + "zip": 59522, + "country": "Mali", + "email": "lydiatrevino@scentric.com", + "phone": "(958) 545-3599", + "color": "rgb(58,191,253)" + }, + { + "index": 162, + "name": "Craft Gould", + "first": "Simon", + "last": "Durham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kuldarkalvik/73.jpg", + "expanded": false, + "guid": "fddbf917-d75d-4698-8f07-cad884331664", + "integer": 58, + "date": "Sat Apr 02 1983 08:39:43 GMT-0800 (PST)", + "shortText": "excepteur", + "mediumText": "Magna tempor do quis est pariatur culpa aliqua tempor ipsum. Laborum velit irure qui nostrud aute non amet est consectetur esse deserunt ad elit. Eiusmod velit proident culpa labore anim velit ex.", + "longText": "Ad tempor excepteur id incididunt. Elit culpa dolor ullamco exercitation non minim proident ex ipsum. Dolore veniam sit non Lorem aute ipsum enim deserunt nostrud est labore. Amet minim ut magna pariatur. Velit qui ipsum irure excepteur eiusmod sint. Irure sit dolor deserunt do proident ex aliquip anim enim. Ipsum nulla sunt ex magna sunt et enim exercitation.\r\n", + "address": "4 Love Lane", + "city": "Weedville", + "state": "New Hampshire", + "zip": 37752, + "country": "Cyprus", + "email": "simondurham@scentric.com", + "phone": "(934) 533-3438", + "color": "rgb(168,60,232)" + }, + { + "index": 163, + "name": "Michelle Thomas", + "first": "Gretchen", + "last": "Carson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erickmazer/73.jpg", + "expanded": false, + "guid": "f7385e18-ca3a-4a01-b518-4de10115efad", + "integer": 17, + "date": "Sun Mar 23 1980 04:08:07 GMT-0800 (PST)", + "shortText": "eiusmod officia ex", + "mediumText": "Officia ipsum in tempor amet fugiat sunt ex id ullamco anim pariatur. Sint eu ad consequat tempor mollit dolor est minim duis. Nulla esse amet dolore veniam exercitation aute velit laboris aute ex velit nostrud officia. Enim Lorem elit laboris culpa ut minim ut veniam enim aliqua dolor quis sunt consectetur.", + "longText": "Id esse dolor laborum magna reprehenderit ut culpa enim. Sit dolore aute culpa nisi. Nulla qui quis culpa nostrud duis sint proident mollit velit pariatur.\r\nIrure commodo consequat anim in sunt. Commodo nisi fugiat ullamco sunt excepteur cillum reprehenderit veniam dolor cillum proident exercitation pariatur. Adipisicing consectetur aliquip veniam nostrud ex qui duis amet non quis elit. Ad non consectetur pariatur occaecat occaecat tempor magna.\r\nCillum enim proident dolore dolore eiusmod consectetur consectetur eiusmod in dolor. Deserunt exercitation incididunt esse non excepteur laborum elit tempor deserunt et officia. Ut magna mollit occaecat anim irure nulla aliqua consequat minim. Officia qui mollit veniam do cillum non non. Enim fugiat nostrud fugiat velit exercitation ea. Sunt eu officia non laborum anim occaecat qui tempor eu consectetur ad ipsum dolor.\r\n", + "address": "2 Irwin Street", + "city": "Brandywine", + "state": "North Dakota", + "zip": 74057, + "country": "Georgia", + "email": "gretchencarson@scentric.com", + "phone": "(963) 572-3829", + "color": "rgb(206,131,97)" + }, + { + "index": 164, + "name": "Fowler Kirby", + "first": "Christi", + "last": "Rivas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guischmitt/73.jpg", + "expanded": false, + "guid": "1a236923-53b2-47df-88a0-9304e14dcc9c", + "integer": 4, + "date": "Tue Jul 06 1971 07:33:44 GMT-0700 (PDT)", + "shortText": "ut sunt incididunt ea", + "mediumText": "Enim ea excepteur nostrud id commodo do pariatur ipsum dolore excepteur incididunt. Id commodo id fugiat commodo incididunt sint laboris proident quis reprehenderit. Fugiat labore magna do in consequat cillum commodo sint laborum. Ex cillum sint dolor eiusmod dolore in voluptate voluptate ut reprehenderit.", + "longText": "Excepteur elit ad esse incididunt nulla in duis. Ut Lorem labore nulla aute ipsum occaecat esse voluptate enim in sit officia magna. Qui aliquip excepteur laborum esse nostrud et deserunt consectetur reprehenderit aliquip enim nulla. Eiusmod magna consequat sit officia aliquip laboris laborum aliquip non irure.\r\nIncididunt dolor officia exercitation sit sit tempor enim proident qui anim reprehenderit amet aliqua anim. Amet consectetur laboris occaecat labore aliquip veniam sunt do esse nostrud fugiat ex quis. Ex irure tempor laboris eiusmod qui id pariatur dolor tempor cillum et aute culpa aliqua.\r\n", + "address": "2 Clara Street", + "city": "Bladensburg", + "state": "Northern Mariana Islands", + "zip": 47563, + "country": "Djibouti", + "email": "christirivas@scentric.com", + "phone": "(934) 580-3784", + "color": "rgb(163,213,79)" + }, + { + "index": 165, + "name": "Coleen Alford", + "first": "Bobbie", + "last": "Wells", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mariosmaselli/73.jpg", + "expanded": false, + "guid": "a38427b2-d0ac-4dae-aae3-2c4504338bf7", + "integer": 72, + "date": "Fri Aug 23 1985 16:39:58 GMT-0700 (PDT)", + "shortText": "sit labore cupidatat nulla", + "mediumText": "Magna ullamco in nulla officia dolor in mollit labore proident nulla do officia dolor.", + "longText": "Enim mollit proident magna adipisicing laborum duis magna officia exercitation incididunt mollit. Id Lorem in nostrud sit ut est culpa. Nulla mollit cillum reprehenderit fugiat ipsum occaecat occaecat qui nostrud.\r\nExcepteur consectetur eu aliqua aliqua esse cupidatat do excepteur quis culpa officia culpa aute cupidatat. Lorem id officia irure cillum cupidatat duis duis enim officia duis nisi anim. Elit ipsum nulla aliqua magna dolore eiusmod veniam est laborum. Veniam laboris deserunt duis voluptate. Laborum est eu ullamco exercitation non commodo minim minim nostrud irure deserunt deserunt cupidatat.\r\n", + "address": "4 Lyme Avenue", + "city": "Orick", + "state": "South Dakota", + "zip": 76909, + "country": "Tokelau", + "email": "bobbiewells@scentric.com", + "phone": "(968) 545-3385", + "color": "rgb(144,250,135)" + }, + { + "index": 166, + "name": "Victoria Hull", + "first": "Velasquez", + "last": "Buck", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_ahmadyunus/73.jpg", + "expanded": false, + "guid": "f0102b51-dc32-496c-984f-1df5f9e71231", + "integer": 19, + "date": "Fri Jul 04 2003 19:23:27 GMT-0700 (PDT)", + "shortText": "occaecat reprehenderit nostrud cupidatat ullamco", + "mediumText": "Aute proident minim amet amet.", + "longText": "Dolor deserunt nulla ex occaecat. Pariatur consequat culpa ex nostrud. Pariatur laborum voluptate tempor do qui aliqua esse aliquip nisi aliquip aute. Deserunt sit ex cupidatat mollit mollit ipsum eiusmod.\r\nAliquip do ullamco pariatur elit. Qui aliqua pariatur excepteur minim aute anim consequat ipsum esse pariatur laboris eu dolore ea. Adipisicing velit cillum est deserunt ea magna laboris irure. Pariatur reprehenderit cupidatat aliqua laborum excepteur sunt eiusmod nulla. Consequat ex Lorem consequat eu laboris est cupidatat.\r\nCupidatat ea reprehenderit sint minim ipsum anim culpa Lorem enim elit proident quis cupidatat cillum. Elit est et cupidatat irure labore minim est. Dolor veniam consectetur commodo id in anim. Fugiat et qui ex aliquip magna fugiat excepteur id. Qui mollit non veniam excepteur. Lorem adipisicing anim ullamco excepteur officia proident ea.\r\n", + "address": "4 Vermont Street", + "city": "Klondike", + "state": "Alaska", + "zip": 29219, + "country": "San Marino", + "email": "velasquezbuck@scentric.com", + "phone": "(872) 448-3197", + "color": "rgb(113,227,172)" + }, + { + "index": 167, + "name": "Kimberly Allen", + "first": "Valencia", + "last": "Duran", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anggit_pradito/73.jpg", + "expanded": false, + "guid": "8bfa6dca-8fd4-4050-b184-2e523d1bdc9e", + "integer": 59, + "date": "Thu Nov 29 2012 14:27:53 GMT-0800 (PST)", + "shortText": "non adipisicing aliqua aliquip", + "mediumText": "Dolor dolor ea sit id elit aute dolore. Commodo amet ut fugiat tempor in aliquip.", + "longText": "Sunt fugiat duis nulla laborum excepteur. Cupidatat consequat consectetur Lorem elit velit mollit cillum dolore duis culpa. Commodo elit adipisicing ut tempor proident reprehenderit. Excepteur laboris occaecat labore dolor enim in. Elit et sunt minim deserunt ex adipisicing sit Lorem deserunt sit eu amet dolore eiusmod. Dolor ullamco elit sint quis ex sunt consequat id est mollit aliqua cupidatat magna dolore. Adipisicing laborum cupidatat id deserunt eu velit Lorem aliquip aliquip amet minim culpa nulla ex.\r\nLaboris ipsum Lorem tempor labore anim fugiat quis velit. Sint sunt incididunt anim cupidatat eiusmod ea aute exercitation tempor Lorem. Nulla amet eu voluptate eu in ut veniam dolor elit ullamco. Labore elit eu id tempor esse. Incididunt cupidatat cillum do non amet ullamco cillum nulla Lorem. Mollit fugiat ea et sit veniam nulla qui duis laboris non magna irure consectetur dolor. Id eu officia mollit est dolore voluptate anim ex.\r\nIrure ipsum commodo reprehenderit labore et nulla. Sunt et nulla id commodo quis laboris ipsum irure elit ad officia. Aute Lorem anim dolore non est occaecat in esse quis duis.\r\n", + "address": "2 Judge Street", + "city": "Bedias", + "state": "Louisiana", + "zip": 39058, + "country": "Vanuatu", + "email": "valenciaduran@scentric.com", + "phone": "(933) 441-3632", + "color": "rgb(160,71,158)" + }, + { + "index": 168, + "name": "Gill Meadows", + "first": "Diann", + "last": "Fox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/saschamt/73.jpg", + "expanded": false, + "guid": "a9cbf409-9e60-457a-a048-b16302e1615a", + "integer": 88, + "date": "Sat Oct 13 2001 11:08:26 GMT-0700 (PDT)", + "shortText": "quis ea et amet sint", + "mediumText": "Dolor reprehenderit duis nulla ea cupidatat sit cupidatat Lorem fugiat. Cupidatat laborum fugiat eu do incididunt id adipisicing aute laborum minim occaecat. Culpa pariatur culpa dolor anim ullamco sit proident Lorem ex sunt fugiat mollit proident elit. Culpa mollit nulla aute fugiat qui ad ut incididunt veniam dolor officia irure esse.", + "longText": "Occaecat do proident enim et. Dolore minim mollit eiusmod exercitation exercitation eu laborum laboris laborum ipsum eiusmod. Reprehenderit pariatur sint dolor consequat.\r\nElit consectetur enim aute sit culpa. Nostrud irure do et voluptate nostrud. Officia et magna occaecat nisi excepteur sit veniam ipsum ipsum eiusmod culpa. Id sunt excepteur culpa et. Eu sunt aute aliquip excepteur labore incididunt laborum cupidatat. Eu deserunt occaecat culpa Lorem aliquip excepteur cillum et esse est.\r\nAdipisicing non est voluptate anim proident tempor. Pariatur est eiusmod magna id consectetur consectetur nostrud in est id exercitation commodo minim nostrud. Aute esse veniam tempor sint sunt. Ut elit exercitation laborum voluptate voluptate. Id eu proident nostrud laborum exercitation elit commodo non aliquip quis irure.\r\nAnim quis eu sit qui esse deserunt ut. Officia voluptate deserunt cupidatat sint nostrud anim. Ipsum ut eiusmod ullamco irure exercitation aliqua incididunt in nostrud. Eu fugiat nulla esse deserunt et laboris consequat. Ipsum occaecat quis irure exercitation magna duis elit reprehenderit ad sunt cillum est do. Id qui ipsum dolor laboris commodo voluptate exercitation commodo. Laborum veniam culpa minim culpa eiusmod nulla est commodo dolor minim irure minim cupidatat.\r\nEx eu duis sit velit. Laborum excepteur nisi voluptate sunt adipisicing irure pariatur incididunt ullamco proident ea labore. Culpa velit occaecat ea pariatur esse amet proident nostrud cillum velit qui elit ullamco commodo. Pariatur ad qui ad in qui in est laborum enim incididunt qui. Commodo excepteur commodo veniam est Lorem veniam velit quis veniam incididunt laborum esse in proident. Id aliquip aliquip exercitation labore dolore in laboris nostrud enim.\r\n", + "address": "3 Poplar Avenue", + "city": "Day", + "state": "Missouri", + "zip": 72123, + "country": "Somalia", + "email": "diannfox@scentric.com", + "phone": "(862) 462-3513", + "color": "rgb(115,148,158)" + }, + { + "index": 169, + "name": "Peggy Sandoval", + "first": "Kathleen", + "last": "Ryan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anasnakawa/73.jpg", + "expanded": false, + "guid": "5c6b1295-b453-4328-a4f4-e137d434c520", + "integer": 52, + "date": "Sat Feb 04 1978 00:31:29 GMT-0800 (PST)", + "shortText": "esse laborum duis fugiat dolore", + "mediumText": "Reprehenderit quis ut incididunt laborum sint non culpa tempor. Sint irure voluptate consectetur irure amet.", + "longText": "Ipsum mollit nostrud tempor amet nostrud aliqua ea eiusmod. Consequat exercitation consectetur mollit qui reprehenderit. Incididunt irure deserunt deserunt eu ullamco non proident et velit. Adipisicing ea ad dolore aliquip sint qui ut. Eiusmod laboris cupidatat dolore aliquip ullamco cillum exercitation.\r\nEsse non fugiat ex culpa. Veniam aliquip amet elit qui culpa commodo duis. Ad officia culpa ut adipisicing aliqua adipisicing consequat non mollit. Quis exercitation aute exercitation esse duis do. Velit consectetur ipsum magna incididunt proident fugiat laborum aliqua irure occaecat sit. Excepteur aliquip qui est nostrud deserunt velit ullamco aute ipsum enim mollit deserunt. Consectetur velit velit Lorem exercitation laboris irure mollit sunt voluptate ex cupidatat non occaecat culpa.\r\nConsequat occaecat magna aliqua reprehenderit velit excepteur incididunt. Incididunt est ea ea proident consectetur excepteur non minim minim pariatur adipisicing deserunt ipsum. Reprehenderit amet non quis esse reprehenderit. Enim et elit Lorem id sit in culpa eiusmod aliquip ipsum.\r\nSunt sit aliquip ullamco laborum voluptate officia laborum nisi commodo deserunt sint. Sit nostrud sit eu nisi dolor sit voluptate duis exercitation. Eiusmod mollit nulla labore ea labore et labore tempor ad magna in sunt.\r\n", + "address": "2 Lake Avenue", + "city": "Hamilton", + "state": "Kentucky", + "zip": 57827, + "country": "Maldives", + "email": "kathleenryan@scentric.com", + "phone": "(868) 529-3500", + "color": "rgb(213,148,139)" + }, + { + "index": 170, + "name": "Julia Palmer", + "first": "Harrell", + "last": "Galloway", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/just_watt/73.jpg", + "expanded": false, + "guid": "8de12a66-7b83-4add-91a8-87d6b817555b", + "integer": 3, + "date": "Sat Oct 15 1994 03:18:04 GMT-0700 (PDT)", + "shortText": "elit occaecat", + "mediumText": "Veniam sunt elit id ad amet ut. Quis in reprehenderit qui amet mollit exercitation sint esse anim. Reprehenderit anim ex sint adipisicing dolor dolore quis.", + "longText": "Exercitation consequat incididunt amet ad nisi anim ipsum aliqua velit do excepteur laborum eiusmod veniam. Mollit do est adipisicing ipsum Lorem elit consequat sunt aliquip aliquip nisi enim incididunt. Reprehenderit adipisicing ea in aliquip consectetur non nostrud aliquip irure aliqua irure irure. Ad officia adipisicing nisi laboris non esse officia cillum voluptate proident magna minim ad voluptate. Eu aute dolore sit elit proident est id in. Esse eiusmod reprehenderit consequat labore proident incididunt est ut.\r\nOfficia non voluptate non quis fugiat deserunt consequat ullamco dolor et enim eu. Ullamco eu reprehenderit tempor Lorem aliqua amet duis ullamco laborum. Exercitation ad aliqua tempor cillum excepteur adipisicing Lorem velit.\r\nMinim ipsum proident labore esse duis adipisicing eu cillum nostrud tempor. Esse commodo enim officia amet dolore esse. Incididunt tempor labore sit culpa aliqua est ut do anim.\r\nVoluptate in sint eu sint culpa do aliqua incididunt ullamco consequat duis. Est esse dolore excepteur aute Lorem consequat enim nulla in nisi ex proident dolore. Ad velit eiusmod esse do minim commodo duis occaecat aute eiusmod adipisicing qui non nostrud.\r\nDolor do sit culpa amet irure occaecat nisi aliquip est ad. Dolor ullamco officia anim amet occaecat elit minim. Anim exercitation elit ipsum magna sit ut sunt aliqua. Do quis occaecat culpa mollit aute qui. Irure officia dolor cillum veniam esse. Exercitation sint fugiat sint sint in aliquip commodo magna mollit minim irure deserunt.\r\n", + "address": "2 Guider Avenue", + "city": "Tonopah", + "state": "American Samoa", + "zip": 59756, + "country": "Israel", + "email": "harrellgalloway@scentric.com", + "phone": "(824) 588-3680", + "color": "rgb(122,79,220)" + }, + { + "index": 171, + "name": "Luann Gates", + "first": "Gwendolyn", + "last": "Weaver", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/caiifr/73.jpg", + "expanded": false, + "guid": "f87dd269-a351-4ca6-864e-d1262763c0ed", + "integer": 35, + "date": "Wed Feb 26 1992 22:47:04 GMT-0800 (PST)", + "shortText": "nulla esse do consequat", + "mediumText": "Veniam cupidatat ut tempor amet. Cillum amet irure aliquip non.", + "longText": "Incididunt amet adipisicing eiusmod ipsum sit et aute voluptate veniam nostrud. Ea ex ullamco sint minim. Proident minim quis aute nulla minim nisi sunt. Incididunt sit irure duis exercitation anim deserunt sunt Lorem ex enim incididunt. Non et sint amet minim culpa fugiat ut esse. Dolor do commodo minim incididunt laborum do magna cillum commodo mollit consectetur labore id exercitation.\r\nNon fugiat Lorem enim cillum duis voluptate. Exercitation aliqua irure consequat amet sint occaecat aliqua sunt ea tempor ut reprehenderit. Occaecat pariatur duis adipisicing consequat. Amet sunt qui veniam mollit officia ea magna.\r\nEnim esse amet cillum mollit fugiat laborum Lorem. Consectetur anim labore dolor velit magna magna nisi dolore deserunt ad eu eu ex velit. Pariatur magna esse ipsum veniam ipsum sint tempor magna consectetur dolor eiusmod nulla eiusmod. Eiusmod veniam et ex incididunt ea sunt quis dolor ex. Laborum deserunt elit ullamco quis amet adipisicing magna eiusmod ad nostrud amet culpa sint eiusmod. Id Lorem occaecat in velit ex cupidatat aliquip dolore reprehenderit laboris. Consequat nostrud magna non occaecat ut laboris aliqua amet anim.\r\nNisi veniam id anim minim elit elit veniam. Do id voluptate mollit duis adipisicing mollit officia do enim eu consectetur. Culpa duis ad tempor laborum proident sint commodo aliquip sunt occaecat eu culpa. Eu ullamco exercitation excepteur aute voluptate mollit ex.\r\n", + "address": "2 Claver Place", + "city": "Moraida", + "state": "Minnesota", + "zip": 14017, + "country": "Reunion", + "email": "gwendolynweaver@scentric.com", + "phone": "(926) 595-3032", + "color": "rgb(170,147,167)" + }, + { + "index": 172, + "name": "Tyler Gardner", + "first": "Collins", + "last": "Warner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/briandiazme/73.jpg", + "expanded": false, + "guid": "e9934a5e-c84e-4920-979e-2c6496359125", + "integer": 41, + "date": "Sat Jun 23 1990 16:08:31 GMT-0700 (PDT)", + "shortText": "esse velit commodo", + "mediumText": "Est consequat velit elit exercitation irure laboris commodo do cillum proident commodo. Laborum fugiat aute Lorem reprehenderit exercitation.", + "longText": "Sint enim est amet nulla anim consequat duis nostrud id excepteur ut. Dolor cillum sit do duis nostrud laborum. Id mollit enim id ad nostrud culpa reprehenderit mollit enim exercitation minim fugiat. Eiusmod esse aliqua aute aliquip ullamco aute est in in veniam cillum ipsum aute. Laboris tempor mollit non veniam officia velit ea. Laboris cillum fugiat id consectetur labore proident est. Fugiat mollit ullamco do fugiat nulla incididunt commodo nisi aliqua consectetur voluptate.\r\nIncididunt velit quis mollit laborum esse occaecat id. Aute ut tempor et commodo magna anim consequat reprehenderit tempor proident eu. Et deserunt aliquip est fugiat anim nostrud exercitation Lorem sint labore non nisi. Magna nostrud do culpa aliqua consequat proident in sunt consequat qui Lorem sunt magna culpa. Id velit in consequat pariatur irure cupidatat ipsum eiusmod Lorem fugiat et.\r\nEiusmod proident amet cupidatat ea et. Veniam minim consectetur dolor officia aliquip exercitation culpa. Sunt et tempor magna laboris sunt aliquip excepteur ea nostrud aliqua. Laboris pariatur commodo tempor in dolor aliqua fugiat elit deserunt tempor esse.\r\n", + "address": "2 Dearborn Court", + "city": "Avoca", + "state": "Hawaii", + "zip": 49354, + "country": "Taiwan", + "email": "collinswarner@scentric.com", + "phone": "(803) 510-3885", + "color": "rgb(192,229,65)" + }, + { + "index": 173, + "name": "Ruthie Mcintyre", + "first": "Rowena", + "last": "Sellers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/productpeopletv/73.jpg", + "expanded": false, + "guid": "e7f9037c-1145-4e46-a079-2b461a550ad8", + "integer": 21, + "date": "Mon Aug 25 2014 19:53:08 GMT-0700 (PDT)", + "shortText": "occaecat velit", + "mediumText": "Lorem ut adipisicing deserunt quis fugiat aute.", + "longText": "Exercitation quis exercitation magna dolor elit cillum sit sint. Officia consequat dolore ex proident exercitation labore qui aliquip. Exercitation adipisicing sit culpa ullamco laborum.\r\nIpsum veniam amet occaecat incididunt officia consectetur ullamco fugiat quis dolor incididunt. Ea deserunt id ipsum labore exercitation enim officia aliquip labore anim eiusmod. In sint dolore cupidatat sint fugiat culpa ipsum veniam sunt sit consequat nisi labore nulla.\r\n", + "address": "3 Varanda Place", + "city": "Drummond", + "state": "Alabama", + "zip": 57942, + "country": "Cuba", + "email": "rowenasellers@scentric.com", + "phone": "(969) 592-2871", + "color": "rgb(181,199,125)" + }, + { + "index": 174, + "name": "Nguyen Stewart", + "first": "Robert", + "last": "Russell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/darioalbini/73.jpg", + "expanded": false, + "guid": "28ef7fb5-18c4-4dd2-927c-3ddc4d9199c4", + "integer": 75, + "date": "Wed Sep 06 1972 12:28:29 GMT-0700 (PDT)", + "shortText": "in minim qui veniam nulla", + "mediumText": "Esse laboris aliquip ex est deserunt ut minim Lorem Lorem non proident minim. Est et ad Lorem laborum laboris nostrud tempor eu magna. Incididunt sint mollit ullamco sint sunt fugiat voluptate ut nostrud.", + "longText": "Irure est cillum duis pariatur et ut. In laborum Lorem velit ad anim voluptate sit amet laboris consectetur officia aliquip. Do ex proident id ullamco velit incididunt in proident ut duis amet sunt voluptate nisi. Et nostrud eiusmod laboris ipsum ad. Officia anim laborum commodo et excepteur quis consectetur et labore amet commodo ea consectetur esse. Laboris ea sit officia pariatur est enim irure consequat non consectetur commodo mollit reprehenderit incididunt.\r\n", + "address": "3 Pierrepont Street", + "city": "Ferney", + "state": "North Carolina", + "zip": 89796, + "country": "Turkey", + "email": "robertrussell@scentric.com", + "phone": "(833) 512-2279", + "color": "rgb(198,215,99)" + }, + { + "index": 175, + "name": "Acosta Herman", + "first": "Becker", + "last": "Le", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_pandajs/73.jpg", + "expanded": false, + "guid": "fc0ce1b2-66dd-4e0a-8a4d-192b563ab3af", + "integer": 17, + "date": "Mon Jul 25 2011 16:50:08 GMT-0700 (PDT)", + "shortText": "veniam officia ipsum ad do", + "mediumText": "Mollit do laborum aliquip elit occaecat qui do. Ullamco mollit velit pariatur amet exercitation.", + "longText": "Excepteur voluptate irure proident enim nulla eiusmod anim enim nisi id et incididunt velit. Id anim excepteur excepteur aliquip elit ex. Voluptate id veniam sunt occaecat consequat ad aliquip sunt aliquip esse aute tempor. Mollit cupidatat reprehenderit et eu excepteur sint amet elit ad veniam nostrud laboris. Voluptate sint amet anim cupidatat velit ut incididunt ex laborum ea. Et minim pariatur laboris nostrud cillum aute Lorem ipsum adipisicing dolore nulla magna. Incididunt incididunt occaecat consequat proident sint sit mollit qui nulla sint.\r\n", + "address": "2 Moore Place", + "city": "Cavalero", + "state": "Connecticut", + "zip": 55194, + "country": "Solomon Islands", + "email": "beckerle@scentric.com", + "phone": "(968) 520-2781", + "color": "rgb(220,63,86)" + }, + { + "index": 176, + "name": "Lucy England", + "first": "Wilma", + "last": "Spencer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wellnext/73.jpg", + "expanded": false, + "guid": "912d4bf7-1356-4736-9560-45d3c9f56f54", + "integer": 99, + "date": "Fri Jun 24 1977 07:55:22 GMT-0700 (PDT)", + "shortText": "qui exercitation reprehenderit", + "mediumText": "Ipsum voluptate ex cupidatat sunt sit fugiat amet quis irure ex. Esse esse deserunt magna non occaecat ullamco aliqua do laboris ad exercitation elit mollit enim. Enim irure commodo enim excepteur officia officia esse tempor fugiat nisi cillum. Reprehenderit nulla sunt exercitation est sunt laboris aliquip excepteur in eu anim.", + "longText": "In et labore id deserunt do non dolor reprehenderit nisi magna veniam veniam eiusmod. Deserunt Lorem non adipisicing non pariatur. Est cillum sint proident sint proident eu aliqua commodo. Pariatur qui laboris eiusmod amet mollit ullamco amet. Voluptate cillum quis aliquip elit ad et nulla sit et mollit irure voluptate. Et in ullamco in adipisicing deserunt. Tempor consectetur exercitation mollit incididunt et sunt minim.\r\n", + "address": "4 Milford Street", + "city": "Wacissa", + "state": "South Carolina", + "zip": 79777, + "country": "Malawi", + "email": "wilmaspencer@scentric.com", + "phone": "(850) 473-3863", + "color": "rgb(73,237,50)" + }, + { + "index": 177, + "name": "Selena Beach", + "first": "Florence", + "last": "Charles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/skylark64/73.jpg", + "expanded": false, + "guid": "ed115112-8db3-4cae-a08d-983100a10c85", + "integer": 88, + "date": "Wed Jun 19 1996 04:58:57 GMT-0700 (PDT)", + "shortText": "quis nulla", + "mediumText": "Duis dolor id et elit nostrud eiusmod labore eiusmod incididunt eu ex enim magna exercitation. Velit do elit pariatur proident.", + "longText": "Eiusmod qui voluptate do commodo exercitation ex proident laborum ullamco. Laboris ad officia dolore duis minim. In proident ullamco et duis qui ullamco exercitation. Exercitation est consectetur minim exercitation commodo sunt officia exercitation laboris. Laborum elit in incididunt quis et pariatur adipisicing.\r\nLorem esse ea sit nostrud adipisicing laborum nostrud tempor commodo adipisicing. Et officia dolore do ex sit in laborum officia occaecat laboris duis irure voluptate. Labore mollit reprehenderit ullamco ut velit voluptate. Amet adipisicing Lorem officia laboris enim nostrud velit non velit culpa et Lorem. Deserunt qui pariatur occaecat sit cillum cupidatat deserunt dolore ut anim labore in ut. Minim velit do dolor deserunt duis. Velit ad aliquip exercitation nulla voluptate dolore exercitation velit laborum.\r\n", + "address": "2 Chester Avenue", + "city": "Faxon", + "state": "Michigan", + "zip": 60214, + "country": "Samoa", + "email": "florencecharles@scentric.com", + "phone": "(854) 538-2605", + "color": "rgb(142,199,175)" + }, + { + "index": 178, + "name": "Leon Reilly", + "first": "Trevino", + "last": "Schneider", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lisekyle/73.jpg", + "expanded": false, + "guid": "f0c018ba-4648-46ab-bd0f-3d92f2370954", + "integer": 92, + "date": "Fri May 13 1983 05:44:49 GMT-0700 (PDT)", + "shortText": "sunt", + "mediumText": "Mollit velit id proident ex pariatur ea.", + "longText": "Enim ex tempor ad esse cupidatat officia aute. Ea duis Lorem culpa voluptate duis deserunt pariatur tempor Lorem aliqua nostrud et Lorem minim. Et consequat adipisicing esse labore. Sunt consequat cupidatat proident magna dolore. Labore irure magna est do sint et labore pariatur laboris tempor sint aute tempor. Quis nulla non qui eiusmod Lorem nulla.\r\nUllamco cillum magna exercitation reprehenderit cupidatat officia nostrud veniam laborum ad adipisicing. Sint laborum sit enim nostrud sint proident consectetur. Culpa reprehenderit ullamco est eiusmod qui non eiusmod elit deserunt nisi exercitation velit occaecat quis. Commodo est qui velit irure eiusmod officia.\r\nDolor Lorem officia qui sint duis nostrud esse qui magna qui. Duis ullamco irure labore ut mollit. Deserunt in laboris proident culpa sit eu.\r\nAnim minim excepteur id reprehenderit laboris adipisicing Lorem non. Aliqua anim anim cillum aliqua excepteur elit ut. Tempor aliqua qui esse nulla fugiat minim proident dolore ea officia culpa reprehenderit ullamco cupidatat.\r\n", + "address": "2 Barbey Street", + "city": "Spelter", + "state": "Maine", + "zip": 33752, + "country": "United Kingdom", + "email": "trevinoschneider@scentric.com", + "phone": "(919) 571-3870", + "color": "rgb(199,207,59)" + }, + { + "index": 179, + "name": "Margie Caldwell", + "first": "Drake", + "last": "Frost", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zumwalt/73.jpg", + "expanded": false, + "guid": "1c2ba2bb-24b8-4fa7-8755-0fd72201985e", + "integer": 26, + "date": "Thu Oct 27 1977 23:39:23 GMT-0700 (PDT)", + "shortText": "aliqua labore id excepteur", + "mediumText": "Sit in irure voluptate ex sint cillum sint duis cillum.", + "longText": "Reprehenderit eiusmod adipisicing officia consectetur ullamco. Aliqua reprehenderit esse do labore mollit mollit non tempor anim anim incididunt. Id reprehenderit amet laborum do.\r\nEa eu nisi do tempor exercitation exercitation aliquip cupidatat ut veniam esse aliqua nostrud ea. Laboris in laborum nostrud proident duis elit fugiat in labore. Cupidatat exercitation culpa elit sit do fugiat. Id eiusmod est ut deserunt tempor quis. Est sint sunt occaecat exercitation aliquip mollit minim aute non esse. Ex officia Lorem qui eu adipisicing occaecat do. Aute cupidatat incididunt velit ut cillum id proident labore id pariatur mollit fugiat.\r\nIncididunt deserunt cillum officia eiusmod enim elit laboris. Labore elit excepteur adipisicing eiusmod consectetur proident exercitation pariatur. Lorem labore excepteur cillum duis ea adipisicing fugiat adipisicing sit cupidatat. Culpa proident proident aute nostrud ad occaecat velit in. Labore non ad cillum adipisicing quis sit. Occaecat minim cupidatat reprehenderit veniam est incididunt sunt ut aliquip adipisicing.\r\nQui sunt exercitation aute sint pariatur. Id do do dolore sunt ad sit velit exercitation proident adipisicing proident ea qui. In quis excepteur incididunt in. Enim adipisicing laborum nulla nisi commodo incididunt non ipsum ex sint aliquip. Elit labore ex ullamco veniam id.\r\n", + "address": "4 Wortman Avenue", + "city": "Cetronia", + "state": "Kansas", + "zip": 73451, + "country": "French Guiana", + "email": "drakefrost@scentric.com", + "phone": "(993) 559-2273", + "color": "rgb(240,117,178)" + }, + { + "index": 180, + "name": "Floyd Whitehead", + "first": "Monique", + "last": "Barron", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_winslet/73.jpg", + "expanded": false, + "guid": "5505bea5-acce-4d67-b22e-850228beae52", + "integer": 30, + "date": "Wed Jul 15 2009 01:03:18 GMT-0700 (PDT)", + "shortText": "id eu", + "mediumText": "Quis et sit amet reprehenderit esse ex velit. Id Lorem ea irure consectetur deserunt excepteur. Consectetur reprehenderit qui eu pariatur proident do adipisicing consectetur nulla amet nulla ea laboris magna. Occaecat ut commodo non esse aliqua est velit amet deserunt sit enim adipisicing in. Mollit aliquip nostrud nisi esse.", + "longText": "In enim consectetur aliqua tempor do sint fugiat officia ea proident esse cillum. Lorem magna ipsum amet aute deserunt. Pariatur aliqua dolor veniam in. Consequat dolore et cillum ea mollit esse dolor. Ipsum aute officia pariatur id do fugiat nisi incididunt mollit labore voluptate deserunt duis.\r\nNulla in sit incididunt nisi ad laborum tempor ipsum irure aliquip aliquip id nostrud officia. Pariatur fugiat consequat excepteur aliqua enim. Sunt minim dolore elit esse nostrud. Laboris eiusmod officia incididunt Lorem ullamco non amet ut in veniam cupidatat. Id nisi cupidatat ea esse exercitation fugiat minim sit ex exercitation.\r\nExercitation non reprehenderit ipsum aliqua quis. Qui labore mollit voluptate aliqua nostrud ex id sit pariatur nostrud veniam in qui. In consequat ullamco commodo deserunt magna Lorem labore ullamco velit deserunt veniam cupidatat elit. Dolor fugiat ea in magna dolor occaecat aliquip cillum id. Ipsum amet veniam dolore incididunt nostrud cupidatat velit velit exercitation cupidatat ad enim do deserunt. Mollit officia sit anim elit. Veniam ipsum nulla culpa occaecat non mollit.\r\nAute ex quis est et laborum dolore duis velit. Dolor laborum Lorem occaecat consectetur eu deserunt cillum ea culpa culpa est enim culpa. Ut veniam do anim consectetur sit id. Officia fugiat ad dolor veniam eu deserunt eiusmod proident enim veniam nulla. Exercitation proident aute esse fugiat veniam cupidatat. Proident non incididunt duis eiusmod officia nulla elit eiusmod adipisicing est.\r\nIn qui aliqua nisi eiusmod proident exercitation ad in sit elit minim amet. Culpa est Lorem Lorem irure exercitation et dolore. Qui sit dolor velit do laborum voluptate excepteur qui nostrud.\r\n", + "address": "4 Pershing Loop", + "city": "Floriston", + "state": "Iowa", + "zip": 14548, + "country": "Latvia", + "email": "moniquebarron@scentric.com", + "phone": "(944) 573-3509", + "color": "rgb(215,200,175)" + }, + { + "index": 181, + "name": "Langley Kidd", + "first": "Lowe", + "last": "Luna", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kikillo/73.jpg", + "expanded": false, + "guid": "5934f42f-1f3e-41a3-8465-8453fbd97653", + "integer": 87, + "date": "Sat Jul 27 2002 15:35:16 GMT-0700 (PDT)", + "shortText": "ex laborum", + "mediumText": "Proident excepteur duis dolor nostrud aute in aliquip excepteur exercitation laboris fugiat consectetur amet.", + "longText": "Elit ea pariatur aliqua minim enim voluptate est voluptate dolore eiusmod mollit dolor voluptate nisi. Qui et ex fugiat irure velit voluptate. Deserunt sunt enim et dolor dolor occaecat magna est aliquip officia tempor minim et. Ex aliquip duis labore nisi amet deserunt et quis non elit consequat et fugiat.\r\nAd est irure veniam aliqua sint ad. Cillum quis ex tempor ex irure proident duis id pariatur ipsum irure. Id ea ad excepteur enim voluptate consectetur id. Non cupidatat do in tempor aute commodo in magna. Non irure minim Lorem sunt ex nulla cillum.\r\nEx commodo proident tempor incididunt velit velit mollit sint excepteur quis adipisicing nostrud laboris irure. Commodo proident nisi enim ipsum nostrud ullamco elit aliquip velit fugiat eiusmod. Ipsum do qui nostrud amet ullamco et adipisicing aliquip voluptate voluptate laborum. Laborum ex aute tempor esse velit ut.\r\nVeniam esse cillum ut cupidatat reprehenderit minim eu elit minim velit aute consequat tempor tempor. Nisi et aute ea elit veniam sit dolore proident minim. Ut tempor aute dolor aliquip. Do consequat tempor nulla tempor labore duis eu commodo aliquip commodo id fugiat tempor enim.\r\n", + "address": "3 Caton Place", + "city": "Stevens", + "state": "Vermont", + "zip": 87533, + "country": "Netherlands Antilles", + "email": "loweluna@scentric.com", + "phone": "(996) 562-3285", + "color": "rgb(206,231,90)" + }, + { + "index": 182, + "name": "Eunice Pace", + "first": "Margaret", + "last": "Mueller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hndragnwn/73.jpg", + "expanded": false, + "guid": "3f9b897f-6674-476f-9dd8-31c86f3401c7", + "integer": 98, + "date": "Mon Jan 19 1970 12:04:31 GMT-0800 (PST)", + "shortText": "exercitation eu ipsum ipsum cillum", + "mediumText": "Ullamco ullamco velit sit et elit et excepteur laboris reprehenderit.", + "longText": "Officia cupidatat consectetur tempor amet. Excepteur aute elit do eiusmod aute voluptate quis est voluptate occaecat ut pariatur. Aliqua incididunt cillum proident aute quis deserunt. Voluptate do magna nulla reprehenderit ea eiusmod minim aliquip do est laboris. Velit consequat ut veniam ut cillum dolore tempor nostrud eu. Non Lorem Lorem non nostrud minim commodo minim qui non. Velit aliqua duis occaecat dolor laborum sint est culpa nulla elit occaecat reprehenderit consectetur culpa.\r\nSunt non id labore Lorem do Lorem enim. Adipisicing deserunt excepteur est ipsum nulla deserunt in. Proident tempor dolore sint ullamco proident velit. Nisi Lorem enim ullamco elit culpa occaecat labore officia consequat enim. Eu consectetur ad anim incididunt sit excepteur exercitation cupidatat enim proident irure sunt non cupidatat. Id aute cupidatat irure pariatur laboris nostrud. Est enim commodo quis anim incididunt nostrud proident occaecat anim.\r\n", + "address": "4 Erasmus Street", + "city": "Watrous", + "state": "Nebraska", + "zip": 91145, + "country": "Colombia", + "email": "margaretmueller@scentric.com", + "phone": "(881) 442-3317", + "color": "rgb(248,53,68)" + }, + { + "index": 183, + "name": "Hess Ross", + "first": "Knowles", + "last": "Drake", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fc987/73.jpg", + "expanded": false, + "guid": "b34d191e-f646-4fd0-8e89-ed523ceb5127", + "integer": 73, + "date": "Tue Jul 11 2006 08:13:58 GMT-0700 (PDT)", + "shortText": "quis reprehenderit amet", + "mediumText": "Id ut laboris aliquip dolor aliqua incididunt cillum dolore qui aliqua. Tempor officia esse aliquip irure cillum ipsum esse ea ea. Aliqua pariatur laboris cillum do ad ea pariatur nostrud amet amet do.", + "longText": "Tempor mollit exercitation sit elit duis magna et veniam nisi ex. Sit amet veniam velit commodo ad proident duis exercitation consequat eiusmod officia pariatur. Tempor occaecat consequat aliquip cupidatat veniam ad qui enim pariatur.\r\nIpsum dolor occaecat in minim sint eu. Non duis anim quis pariatur qui adipisicing sunt laborum sunt cillum exercitation sit. Reprehenderit amet elit labore ad culpa excepteur. Cillum commodo eu dolore dolor ea velit id. Eu Lorem nostrud esse elit aliqua in deserunt elit exercitation sunt sunt aliquip eu amet. Cupidatat incididunt aliquip anim proident magna velit in veniam tempor.\r\nEx non ex irure exercitation sint ad commodo commodo. Exercitation eiusmod qui est labore non velit velit velit voluptate id. Nisi est velit ut do velit quis ipsum voluptate. In consequat esse tempor cillum fugiat ex. Ut est mollit consequat duis esse non magna incididunt eu laboris velit incididunt ullamco. Adipisicing enim sint amet velit do irure. Exercitation labore deserunt pariatur est exercitation veniam laborum ad.\r\n", + "address": "2 Indiana Place", + "city": "Lawrence", + "state": "Florida", + "zip": 64631, + "country": "Wallis and Futuna Islands", + "email": "knowlesdrake@scentric.com", + "phone": "(995) 490-2638", + "color": "rgb(50,148,194)" + }, + { + "index": 184, + "name": "Terri Mayo", + "first": "Rachael", + "last": "Sharp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lettershoppe/73.jpg", + "expanded": false, + "guid": "c14b363a-8dae-4656-908d-6fe410ad32e5", + "integer": 98, + "date": "Sat Mar 10 1973 06:27:24 GMT-0800 (PST)", + "shortText": "occaecat consequat minim enim aute", + "mediumText": "Officia ex pariatur velit sint officia sunt deserunt nisi. Exercitation sit commodo sit quis dolor esse pariatur.", + "longText": "Eiusmod culpa voluptate eiusmod excepteur pariatur mollit enim irure ad commodo. Irure reprehenderit ea officia eu ullamco occaecat ad exercitation aute reprehenderit est adipisicing adipisicing est. Exercitation pariatur cillum exercitation laborum sint pariatur do mollit ipsum cillum exercitation. Non duis aliquip veniam occaecat fugiat cupidatat Lorem eu.\r\n", + "address": "3 Jamison Lane", + "city": "Hayden", + "state": "New Jersey", + "zip": 21158, + "country": "Bouvet Island", + "email": "rachaelsharp@scentric.com", + "phone": "(920) 458-2923", + "color": "rgb(224,219,109)" + }, + { + "index": 185, + "name": "Lorie Stephenson", + "first": "Vaughan", + "last": "Hardin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akashsharma39/73.jpg", + "expanded": false, + "guid": "3277febc-0447-4b3c-ac7a-f98c0a22432d", + "integer": 43, + "date": "Sat Mar 30 1974 11:23:57 GMT-0700 (PDT)", + "shortText": "qui pariatur voluptate eiusmod elit", + "mediumText": "Tempor mollit fugiat ex quis excepteur.", + "longText": "Elit eiusmod eu irure nostrud labore enim. Incididunt esse aliquip amet in nulla mollit amet nostrud est mollit. Eiusmod cupidatat et esse ea quis sunt ex. Ut duis fugiat laboris eiusmod excepteur. Occaecat do incididunt mollit officia. Enim ea sunt ad amet labore enim esse nulla occaecat eiusmod.\r\n", + "address": "2 Truxton Street", + "city": "Caroleen", + "state": "Wisconsin", + "zip": 98807, + "country": "Niue", + "email": "vaughanhardin@scentric.com", + "phone": "(954) 576-2820", + "color": "rgb(76,217,135)" + }, + { + "index": 186, + "name": "Jacqueline Estes", + "first": "Gale", + "last": "Hutchinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fgin69/73.jpg", + "expanded": false, + "guid": "07994b68-513f-4c9d-a92d-edfc3ade4825", + "integer": 17, + "date": "Sun Jul 16 2000 16:12:37 GMT-0700 (PDT)", + "shortText": "sunt laboris tempor ut do", + "mediumText": "Nulla consequat dolore enim velit excepteur. Qui ipsum elit occaecat ea in. Laborum irure ipsum consectetur ullamco quis consectetur enim. Dolore laboris nisi excepteur nostrud. Aliqua ipsum nostrud velit labore tempor nisi eu.", + "longText": "Adipisicing ipsum exercitation culpa consectetur voluptate aliqua proident fugiat ut laborum ex deserunt. Et ullamco non sint tempor do officia cillum ex quis enim dolor aliqua. Cupidatat id incididunt irure ad quis commodo ut laborum labore. Dolore cillum reprehenderit adipisicing nulla qui in ea cillum enim excepteur quis sit sint non. Duis reprehenderit consequat eu eiusmod id.\r\nQui velit aliquip fugiat reprehenderit eiusmod mollit ex commodo mollit anim occaecat excepteur duis. Eiusmod nisi et in ex laborum. Nulla officia nulla nostrud ullamco proident ut ipsum excepteur. Occaecat et quis est eu aliqua. Labore enim esse ullamco est laborum nulla incididunt fugiat cillum pariatur sit et. Sunt irure duis laborum id ea Lorem sint.\r\nExercitation anim duis ad minim eiusmod eiusmod dolor mollit enim qui laborum ad aliquip magna. Reprehenderit veniam exercitation minim incididunt excepteur exercitation tempor. Pariatur do esse consequat do. Voluptate do pariatur qui aliqua laboris aute consequat eu reprehenderit dolore. Laborum amet in veniam sit. Adipisicing sint labore officia deserunt nulla do cillum aliquip ipsum minim anim.\r\nDolore sit pariatur dolore proident est minim irure do qui laborum laboris. Sunt quis nisi consequat tempor est ullamco amet sunt dolor. Minim voluptate cupidatat eu pariatur aliquip esse minim voluptate commodo esse. Nulla non minim eu sunt nostrud aliquip. Elit ullamco do sunt mollit labore officia quis proident fugiat amet labore. Culpa elit nisi incididunt ipsum anim non. Cupidatat exercitation laboris pariatur reprehenderit culpa.\r\n", + "address": "3 Columbia Street", + "city": "Clayville", + "state": "Washington", + "zip": 55909, + "country": "Sweden", + "email": "galehutchinson@scentric.com", + "phone": "(853) 433-2272", + "color": "rgb(234,208,240)" + }, + { + "index": 187, + "name": "Linda Steele", + "first": "Weber", + "last": "Barlow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pdugan19/73.jpg", + "expanded": false, + "guid": "39847382-b9bd-4f9d-823a-9a8ff0b6a952", + "integer": 57, + "date": "Sun May 24 1992 04:47:58 GMT-0700 (PDT)", + "shortText": "aliqua ut", + "mediumText": "Ea excepteur consequat Lorem aute. Id nisi est ad ipsum enim. Consequat elit do mollit cillum. Ea voluptate tempor laborum sit. Culpa ex officia mollit et in ullamco.", + "longText": "Culpa deserunt velit enim amet excepteur. Labore anim laboris aliquip nisi amet ad. Irure duis cillum exercitation labore do deserunt ullamco nulla ea do mollit. Et ut dolor cillum laboris ex dolor.\r\n", + "address": "2 Bragg Court", + "city": "Rehrersburg", + "state": "Oregon", + "zip": 16492, + "country": "Bolivia", + "email": "weberbarlow@scentric.com", + "phone": "(816) 478-3071", + "color": "rgb(253,113,243)" + }, + { + "index": 188, + "name": "Humphrey Rocha", + "first": "Watson", + "last": "Martin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluehaus/73.jpg", + "expanded": false, + "guid": "bf36a00a-c264-4e8c-b2cf-37b558a6331d", + "integer": 56, + "date": "Wed Feb 18 1981 11:26:50 GMT-0800 (PST)", + "shortText": "ad sint", + "mediumText": "In ea ea aute est aute. Ex fugiat ullamco duis deserunt quis eiusmod non do quis enim officia ea consequat. Lorem cupidatat nisi officia irure veniam consectetur commodo cupidatat et laborum exercitation exercitation veniam proident. Enim minim non velit dolore esse aute ullamco officia cillum ea deserunt magna ut.", + "longText": "Aliqua laborum non officia aute deserunt deserunt voluptate sunt sint do do culpa. Adipisicing anim qui id elit consectetur ad veniam nostrud magna. Culpa dolor culpa irure minim elit occaecat eiusmod.\r\nDo dolore cillum incididunt reprehenderit laboris proident mollit occaecat laborum eu. Tempor aute aliqua aute Lorem velit sunt sint ad ad. Eu minim adipisicing duis nulla nulla et excepteur occaecat. Consectetur aliqua excepteur reprehenderit eu reprehenderit mollit veniam adipisicing ut culpa consectetur enim. Nisi consequat sit fugiat anim ut anim. Culpa et occaecat consectetur reprehenderit. Id sunt mollit labore ipsum eiusmod est adipisicing dolor esse.\r\n", + "address": "3 Main Street", + "city": "Chumuckla", + "state": "Illinois", + "zip": 25127, + "country": "Barbados", + "email": "watsonmartin@scentric.com", + "phone": "(870) 511-2367", + "color": "rgb(180,100,61)" + }, + { + "index": 189, + "name": "Carter Berry", + "first": "Copeland", + "last": "Fernandez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/angeloffonline/73.jpg", + "expanded": false, + "guid": "c95f429b-45ba-4d2e-9fb0-990a65f0f1ed", + "integer": 94, + "date": "Mon Sep 10 1973 19:09:26 GMT-0700 (PDT)", + "shortText": "nostrud elit", + "mediumText": "Sint ullamco ipsum commodo nisi duis exercitation reprehenderit minim id elit ipsum incididunt id minim.", + "longText": "Ea et officia cillum labore consectetur proident fugiat veniam. Adipisicing proident quis nulla duis consectetur culpa deserunt. Aliquip ea non incididunt nisi. Culpa irure adipisicing est aute excepteur sunt laboris minim officia. Minim dolor incididunt deserunt aliqua qui velit laborum. Sint eu sunt ut ea ut cillum tempor excepteur sit voluptate.\r\nLorem nostrud sit dolor dolor consectetur labore anim ad excepteur ipsum eu sunt consequat dolore. Velit irure officia esse mollit voluptate aliquip fugiat enim ipsum minim occaecat. Consectetur tempor irure sint quis irure anim. Nulla esse adipisicing nulla eiusmod dolor eu id dolor ipsum qui nostrud. In excepteur eiusmod ipsum commodo eu labore duis irure adipisicing in deserunt commodo.\r\nExcepteur ullamco ex est occaecat sit Lorem eu. Amet pariatur dolor reprehenderit irure dolor et culpa. Laboris cupidatat est esse veniam qui consectetur eu eu irure. Exercitation eiusmod ipsum ipsum non esse consectetur nostrud enim nostrud eu adipisicing culpa. Lorem aliquip duis tempor proident do aliqua cillum. Esse aliquip fugiat veniam aliquip magna pariatur.\r\n", + "address": "3 Cooke Court", + "city": "Brethren", + "state": "West Virginia", + "zip": 48527, + "country": "Haiti", + "email": "copelandfernandez@scentric.com", + "phone": "(916) 428-2390", + "color": "rgb(225,220,78)" + }, + { + "index": 190, + "name": "Mcgee Price", + "first": "Christian", + "last": "Brown", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/yalozhkin/73.jpg", + "expanded": false, + "guid": "25386af0-7fef-4915-afcb-e29e3996bfc1", + "integer": 99, + "date": "Fri Jun 10 1977 22:37:49 GMT-0700 (PDT)", + "shortText": "velit aliqua qui", + "mediumText": "Proident velit et consequat qui veniam et eiusmod officia sint laborum Lorem sit exercitation. Voluptate dolore qui excepteur eu tempor et irure ea id consectetur. Nostrud ullamco quis nulla laboris labore qui ullamco occaecat veniam. Ut excepteur tempor in non cillum deserunt dolor velit magna excepteur est ullamco. Officia quis adipisicing aliquip Lorem consectetur veniam labore non exercitation.", + "longText": "Anim officia fugiat aliquip deserunt enim culpa commodo. Amet mollit labore tempor adipisicing cupidatat aute sunt incididunt sit duis cupidatat fugiat nisi labore. Eiusmod non sunt commodo laborum ex cillum anim eu mollit. Duis in duis cillum commodo officia qui Lorem duis do exercitation amet occaecat.\r\nNisi culpa magna dolore ut tempor amet commodo. Nisi ut mollit et sint id aliquip Lorem quis ipsum non sunt. Ad adipisicing qui ad nulla cillum id culpa. Occaecat duis magna deserunt dolor adipisicing ex in Lorem dolor occaecat enim laboris cupidatat eiusmod.\r\nDo velit occaecat cupidatat labore ut qui et ipsum pariatur excepteur aliqua sunt ad. Ut eu eu consectetur ut laborum aute culpa. Consequat qui irure ad magna qui exercitation nostrud ex ullamco Lorem consequat. Esse sunt do sunt consectetur tempor.\r\n", + "address": "4 Withers Street", + "city": "Aberdeen", + "state": "Mississippi", + "zip": 14870, + "country": "Heard and McDonald Islands", + "email": "christianbrown@scentric.com", + "phone": "(981) 586-2200", + "color": "rgb(211,68,198)" + }, + { + "index": 191, + "name": "Browning Harrison", + "first": "Wanda", + "last": "Dorsey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/solid_color/73.jpg", + "expanded": false, + "guid": "18e2fdcf-33bc-447e-9d9e-95cd992f3b01", + "integer": 99, + "date": "Fri Apr 12 1996 19:22:55 GMT-0700 (PDT)", + "shortText": "nostrud", + "mediumText": "Minim velit ex mollit officia deserunt mollit.", + "longText": "In enim culpa ea quis occaecat Lorem voluptate voluptate. Ad occaecat dolore cillum exercitation laborum. Amet ex labore in sint dolor Lorem eiusmod elit voluptate magna. Dolore quis dolore ullamco velit. Occaecat incididunt ex laboris nulla sit amet sit. Proident nisi elit exercitation sunt incididunt ipsum ex laboris aliquip elit id fugiat id. Sint nulla irure labore mollit reprehenderit irure cupidatat exercitation.\r\nProident aliqua aliquip irure reprehenderit aliquip et nulla in ea do cillum. Anim esse culpa adipisicing do reprehenderit aliquip elit sunt fugiat velit aliqua excepteur. Irure nulla nulla elit esse qui magna qui adipisicing eu consectetur ea. Sint magna labore esse occaecat ad est. Voluptate ex sit anim ipsum consequat est aliquip quis. Quis eu anim officia reprehenderit dolore veniam labore.\r\nEiusmod quis cillum nisi officia. Consequat laborum amet enim deserunt occaecat cillum. Labore cupidatat eu sit officia ea.\r\nCillum mollit occaecat dolor labore dolore sint laborum irure commodo magna id officia. Ullamco minim reprehenderit nulla ea non commodo. Amet eu fugiat officia quis labore pariatur. Duis anim ad eiusmod magna ad voluptate dolore anim anim exercitation reprehenderit cillum labore. Nulla esse nisi ipsum cillum. Nulla incididunt consequat ut elit aute et Lorem ea enim do sint id proident. Voluptate et magna dolor deserunt sint laborum eu.\r\nAliquip laborum labore exercitation culpa duis sunt magna consequat excepteur. Sunt incididunt ad consectetur ullamco sit esse et fugiat mollit irure adipisicing. Ipsum enim enim sunt est. Ipsum officia incididunt dolore aute elit elit fugiat est commodo esse. Sunt minim et cillum excepteur deserunt. In id mollit quis et occaecat cupidatat irure velit dolor reprehenderit in commodo ad velit. Excepteur est et magna elit fugiat amet cupidatat ea anim.\r\n", + "address": "4 Irving Street", + "city": "Winesburg", + "state": "Rhode Island", + "zip": 33983, + "country": "United States", + "email": "wandadorsey@scentric.com", + "phone": "(857) 473-2997", + "color": "rgb(188,149,116)" + }, + { + "index": 192, + "name": "Beth Clark", + "first": "Stuart", + "last": "Potter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/panghal0/73.jpg", + "expanded": false, + "guid": "885c3d9f-8acb-4fa6-82d0-3b1f8066fa8e", + "integer": 90, + "date": "Fri Sep 25 1998 20:49:56 GMT-0700 (PDT)", + "shortText": "ipsum voluptate qui est", + "mediumText": "Elit proident mollit qui reprehenderit labore minim aliquip ut ea dolore aliquip qui. Commodo sint non minim pariatur veniam.", + "longText": "Aliqua deserunt officia pariatur fugiat dolore magna pariatur exercitation elit esse elit. Ad enim consectetur nisi est amet irure aliqua nulla labore consequat cillum. In cupidatat laborum deserunt aliqua veniam mollit veniam nulla ex.\r\nEiusmod sint nostrud duis ad minim magna sit consequat commodo nostrud do laborum mollit id. Consequat exercitation dolore mollit exercitation aute id. Veniam minim laboris Lorem enim aliqua nulla et. Aliquip dolor officia duis cupidatat enim ad velit ad. Fugiat irure Lorem sunt deserunt consectetur id cillum elit. Nulla officia commodo enim labore sit dolore ipsum ad sint nisi consectetur esse.\r\n", + "address": "4 Dewitt Avenue", + "city": "Somerset", + "state": "Georgia", + "zip": 62165, + "country": "Jamaica", + "email": "stuartpotter@scentric.com", + "phone": "(868) 542-3034", + "color": "rgb(93,172,196)" + }, + { + "index": 193, + "name": "Neal Mcgee", + "first": "Daisy", + "last": "Lucas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/renettarenula/73.jpg", + "expanded": false, + "guid": "a86f246d-1555-4d68-b633-713d56a7357a", + "integer": 66, + "date": "Wed Jan 22 1975 14:12:25 GMT-0800 (PST)", + "shortText": "aliquip quis", + "mediumText": "Pariatur nostrud irure dolor ad et. Commodo tempor mollit nisi consequat officia ex exercitation.", + "longText": "Velit deserunt ipsum Lorem id laboris et laborum in. Aute ea consequat elit magna sit ad voluptate nostrud dolor pariatur labore ipsum mollit consectetur. Fugiat velit ipsum et aute elit. Aliqua Lorem ullamco ad mollit ex. Sint cupidatat esse minim exercitation. Laborum ipsum quis ut commodo proident elit et et. Duis excepteur ut sit duis cupidatat mollit mollit.\r\nVeniam pariatur minim duis esse est mollit exercitation esse enim. Esse aliqua labore velit minim qui cillum excepteur qui occaecat excepteur quis Lorem sint. Culpa sint do commodo pariatur reprehenderit et adipisicing. Dolore Lorem minim in pariatur nulla incididunt magna amet qui. Excepteur velit adipisicing cupidatat aliquip cupidatat consectetur adipisicing consequat fugiat eiusmod consectetur consequat. Ea laborum occaecat voluptate do.\r\nCommodo minim adipisicing cupidatat labore velit. Commodo eu officia sunt ea sit exercitation nisi quis fugiat non Lorem duis. Culpa adipisicing mollit aliqua dolore aute mollit veniam non qui occaecat sunt.\r\n", + "address": "3 Cadman Plaza", + "city": "Kula", + "state": "New Mexico", + "zip": 50567, + "country": "Sao Tome and Principe", + "email": "daisylucas@scentric.com", + "phone": "(922) 417-2649", + "color": "rgb(242,147,241)" + }, + { + "index": 194, + "name": "Wall Vasquez", + "first": "Kara", + "last": "Avery", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kevin_granger/73.jpg", + "expanded": false, + "guid": "4ca5b46e-7470-4364-8a00-55922d238841", + "integer": 2, + "date": "Sun Oct 27 2002 02:24:06 GMT-0800 (PST)", + "shortText": "consequat ut", + "mediumText": "Culpa id occaecat pariatur eu id adipisicing est non adipisicing nisi et nostrud eu voluptate. Reprehenderit sit adipisicing eiusmod ex excepteur occaecat Lorem consectetur. Mollit exercitation ex adipisicing culpa non ullamco aute aliqua laborum anim deserunt id. Est magna do Lorem Lorem Lorem officia ullamco in eiusmod ut.", + "longText": "Nostrud eu elit voluptate consequat nisi. Dolor qui consequat minim ea sit eiusmod duis aliquip ex. Labore aliquip culpa quis velit id fugiat. Veniam exercitation exercitation aliquip magna eiusmod ad cupidatat sint ullamco consequat pariatur est consequat deserunt. Dolore qui nostrud velit labore magna proident enim in aliquip velit. Mollit ullamco sunt ut do do reprehenderit nostrud do.\r\nConsequat eiusmod adipisicing qui exercitation do minim consequat deserunt non elit sint. Elit dolore ullamco nostrud duis fugiat minim mollit Lorem. Occaecat incididunt officia do tempor dolor velit excepteur laborum. Occaecat cillum aliquip cupidatat anim. Laborum nostrud occaecat irure qui. Id tempor nulla enim irure cillum non culpa non ea enim ad tempor.\r\nQui qui laborum aliquip irure ipsum excepteur do tempor est pariatur nisi. Enim tempor et cupidatat tempor pariatur officia excepteur aliqua. Culpa incididunt laborum ea cupidatat culpa reprehenderit occaecat. Qui do dolor officia aliqua fugiat quis est ex irure. Proident dolor proident dolore proident amet duis labore sunt enim.\r\nSit incididunt deserunt veniam et velit. Eu voluptate esse dolor ullamco nisi sint reprehenderit. Excepteur pariatur est eiusmod eiusmod irure nostrud aliqua aliqua anim. Elit nisi aliqua incididunt tempor dolor commodo eiusmod sit sit ea nostrud eiusmod adipisicing ad. Et occaecat non enim proident nostrud voluptate reprehenderit veniam do exercitation pariatur ut quis. Minim labore ea deserunt deserunt eiusmod anim irure aliquip irure qui sit tempor ad.\r\nSunt sint nulla duis cupidatat. Culpa Lorem eu Lorem eu enim veniam voluptate irure nostrud est ullamco proident non. Aliqua tempor adipisicing proident aliquip cillum do esse laboris. Voluptate eu sint pariatur velit nisi dolore.\r\n", + "address": "2 Clinton Avenue", + "city": "Konterra", + "state": "Arizona", + "zip": 98633, + "country": "Belarus", + "email": "karaavery@scentric.com", + "phone": "(870) 572-3252", + "color": "rgb(192,119,159)" + }, + { + "index": 195, + "name": "Booker Mcgowan", + "first": "Olga", + "last": "Tucker", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maxsmeagol/73.jpg", + "expanded": false, + "guid": "06e837ae-b847-48ce-8b91-832435eb8867", + "integer": 72, + "date": "Sat May 02 2009 00:56:50 GMT-0700 (PDT)", + "shortText": "anim commodo exercitation", + "mediumText": "Elit id enim esse ad Lorem irure laboris in laborum dolore aliquip.", + "longText": "Deserunt eu aute cillum excepteur dolore do do enim fugiat veniam ad. Dolore dolor eu aliquip et. Culpa excepteur aliqua excepteur nisi id eiusmod Lorem eiusmod duis est proident dolor occaecat anim. Aliqua laboris in incididunt sint labore. Incididunt eiusmod quis nostrud occaecat fugiat do cupidatat eu ex reprehenderit nostrud ea proident. Ad reprehenderit consequat laborum eu elit qui occaecat. Quis non magna duis minim amet consequat sunt.\r\nEa consequat do ex qui laboris amet mollit amet nulla. Veniam in sit nisi ad pariatur nulla cillum et ea ad eiusmod. Tempor aliqua eu amet esse dolore nisi pariatur cillum in.\r\nLaborum in ipsum dolor fugiat. Nostrud consectetur nostrud proident aliqua veniam et esse. Occaecat culpa et adipisicing magna ea sint sit fugiat consectetur.\r\nUllamco amet pariatur ipsum duis incididunt laborum ad commodo. Voluptate laborum ea culpa esse nulla dolor reprehenderit duis ut laboris ullamco minim adipisicing aute. Commodo id ad dolor nulla non aliquip eiusmod sint tempor cillum enim.\r\n", + "address": "4 Monroe Place", + "city": "Waterloo", + "state": "Texas", + "zip": 94273, + "country": "Russian Federation", + "email": "olgatucker@scentric.com", + "phone": "(902) 400-3059", + "color": "rgb(136,215,127)" + }, + { + "index": 196, + "name": "Blankenship Henson", + "first": "Staci", + "last": "King", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jvhleb/73.jpg", + "expanded": false, + "guid": "c0bdad68-d176-4514-8d66-d4ae0ae03bdf", + "integer": 41, + "date": "Wed Jan 10 1990 09:56:54 GMT-0800 (PST)", + "shortText": "elit velit exercitation deserunt", + "mediumText": "Labore exercitation excepteur non incididunt. Et reprehenderit anim exercitation ipsum id eu eu irure magna et adipisicing occaecat quis.", + "longText": "Officia nulla cillum duis nostrud labore mollit eiusmod labore ut aliqua elit incididunt. Minim exercitation consequat non eiusmod sint magna voluptate incididunt ex consectetur labore sunt nulla anim. Commodo ipsum aute ipsum mollit veniam reprehenderit reprehenderit irure amet. Nisi voluptate esse consectetur cillum. In eu in duis culpa deserunt ea tempor elit. Nisi tempor fugiat pariatur irure.\r\nQuis ex sunt cupidatat anim aliqua aliquip tempor minim incididunt fugiat officia. Et sunt eiusmod eu culpa incididunt aute culpa. Excepteur Lorem ipsum dolore labore amet occaecat elit fugiat. Eiusmod velit aute occaecat sunt qui ad irure in do id consequat sunt amet cupidatat. Non dolor sunt elit velit excepteur anim deserunt ut occaecat culpa aute aute.\r\n", + "address": "2 Beach Place", + "city": "Slovan", + "state": "District Of Columbia", + "zip": 43413, + "country": "Croatia (Hrvatska)", + "email": "staciking@scentric.com", + "phone": "(964) 422-3068", + "color": "rgb(123,169,84)" + }, + { + "index": 197, + "name": "Essie Hoover", + "first": "Lourdes", + "last": "Mayer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nbirckel/73.jpg", + "expanded": false, + "guid": "d4eca4a8-9d42-4800-9776-b3f2f858b3e5", + "integer": 7, + "date": "Wed Jul 02 1986 21:56:11 GMT-0700 (PDT)", + "shortText": "incididunt nisi minim id officia", + "mediumText": "Ex sint esse labore sit cillum cupidatat cupidatat consequat dolor aliquip elit sunt fugiat quis.", + "longText": "Minim veniam dolor tempor cupidatat nostrud dolore quis sint Lorem duis eiusmod consectetur. Incididunt irure consequat ipsum id cillum culpa qui ad magna nisi. Consequat quis adipisicing dolor consequat reprehenderit incididunt ipsum enim laborum duis. Dolor sit do ex magna do culpa dolor anim incididunt tempor nisi ipsum ex voluptate. Quis exercitation dolore voluptate veniam amet nostrud dolore consequat nulla quis anim amet. Veniam ut do incididunt culpa eiusmod proident in sint nostrud voluptate.\r\nVeniam sint excepteur laboris duis nostrud. Eiusmod commodo mollit est ex incididunt fugiat labore proident. Ea enim commodo non tempor non aliquip culpa non laborum. Anim veniam sit sunt adipisicing adipisicing ea cillum duis incididunt excepteur ut ad non ad. Ex in nulla exercitation laborum Lorem ex deserunt commodo esse dolore nostrud.\r\nOccaecat reprehenderit Lorem culpa tempor dolor et dolore nulla nostrud eiusmod dolor magna voluptate aliquip. Dolore consectetur exercitation proident aliquip cupidatat veniam ea ad anim nostrud enim nulla labore. Incididunt duis deserunt laborum mollit veniam irure est ad enim commodo eiusmod.\r\nCulpa consequat duis deserunt magna laborum magna amet eiusmod. Ut ipsum id aute duis reprehenderit. Nulla nisi sint mollit amet ex esse laborum nulla ullamco cupidatat nostrud. Enim consequat aute tempor veniam adipisicing aliqua laborum irure duis mollit Lorem eu ipsum quis. Dolor culpa est et reprehenderit occaecat. Amet ex ad do mollit sint mollit non culpa nisi laborum qui aliquip sit. Laborum officia ullamco pariatur non sit esse est sint duis reprehenderit laborum aute qui.\r\nLabore dolor occaecat anim deserunt anim duis Lorem incididunt anim amet amet ut eu dolore. Consequat commodo laborum ipsum id magna non occaecat adipisicing et non. Deserunt cupidatat culpa in reprehenderit mollit aliqua aute amet.\r\n", + "address": "2 Merit Court", + "city": "Curtice", + "state": "Virgin Islands", + "zip": 27446, + "country": "Indonesia", + "email": "lourdesmayer@scentric.com", + "phone": "(844) 447-3638", + "color": "rgb(56,235,218)" + }, + { + "index": 198, + "name": "Bridget Wilcox", + "first": "Danielle", + "last": "Delacruz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/irida168/73.jpg", + "expanded": false, + "guid": "4072c5a4-5842-4c17-85c4-d9c472e32f5d", + "integer": 1, + "date": "Thu Mar 18 1993 10:26:24 GMT-0800 (PST)", + "shortText": "quis", + "mediumText": "Lorem in aliquip ullamco labore consequat elit nisi ex tempor. Enim exercitation cupidatat in laborum nulla.", + "longText": "Veniam ea qui pariatur laborum minim. Duis tempor commodo ad qui tempor est. Do enim incididunt Lorem elit proident ex nulla elit exercitation voluptate ex laborum ullamco deserunt. Ad voluptate mollit dolore sint exercitation anim laborum voluptate Lorem deserunt. Anim ullamco minim commodo non consequat est qui nostrud ullamco laboris mollit. Ipsum laborum anim ex labore laboris cillum cupidatat elit ex enim quis.\r\nAliquip anim ea fugiat aute nostrud occaecat culpa magna ut nisi ea tempor ex. Quis dolore aute cupidatat officia esse anim occaecat. Anim occaecat incididunt sit ea enim mollit consectetur aute anim. Voluptate sint et occaecat adipisicing eiusmod excepteur aliquip eu. Cillum enim et aliquip non cupidatat eu consequat voluptate culpa veniam esse. Commodo officia enim excepteur id cupidatat.\r\nSunt reprehenderit id voluptate deserunt irure veniam fugiat elit ipsum exercitation excepteur ut. Elit ut eu in Lorem reprehenderit reprehenderit aliqua duis dolor. Velit voluptate aute magna voluptate id do mollit enim nisi consequat veniam elit cupidatat et.\r\nEt sint adipisicing officia ipsum commodo do ea sunt anim. Laborum ullamco elit aute occaecat adipisicing exercitation labore nulla ipsum. Cupidatat sit eiusmod aliqua esse eu ullamco in. Laborum eiusmod excepteur ad magna exercitation occaecat amet ad sint ullamco aliquip excepteur. Nisi sit consequat laboris nulla consequat dolore fugiat. Lorem cupidatat adipisicing do esse nisi fugiat eu culpa fugiat ullamco quis elit in.\r\nMagna in cupidatat duis dolor quis cillum occaecat. Pariatur minim ipsum irure qui officia veniam incididunt adipisicing consectetur Lorem. Ex esse cillum ut sint minim. Esse ex excepteur id do culpa laboris nisi nisi non. Exercitation minim consectetur dolor aliqua culpa commodo dolor. Ut tempor sint mollit Lorem incididunt laborum laboris sit cupidatat ex esse. Enim amet sunt sit anim veniam fugiat ea mollit.\r\n", + "address": "4 Leonora Court", + "city": "Bradenville", + "state": "Puerto Rico", + "zip": 59719, + "country": "Nauru", + "email": "danielledelacruz@scentric.com", + "phone": "(952) 548-3787", + "color": "rgb(168,148,116)" + }, + { + "index": 199, + "name": "Mccarthy Fletcher", + "first": "Janis", + "last": "Fischer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kevin_py/73.jpg", + "expanded": false, + "guid": "010c3410-51e3-409d-ae76-1ef43f546c53", + "integer": 21, + "date": "Thu Feb 27 2014 18:02:21 GMT-0800 (PST)", + "shortText": "non ullamco exercitation voluptate", + "mediumText": "Ea velit ullamco ullamco excepteur culpa est in nisi cillum amet deserunt quis laborum. Tempor in duis cupidatat proident.", + "longText": "Labore reprehenderit deserunt sint reprehenderit officia et culpa sunt exercitation velit ipsum cupidatat veniam. Cupidatat ut elit cillum cupidatat qui sit tempor veniam consequat labore dolor minim. Ad duis laboris ad voluptate ea non velit elit excepteur sint elit consectetur non. Velit tempor officia quis cillum duis et culpa voluptate ipsum.\r\nMinim labore nostrud deserunt ipsum est qui aliqua Lorem ullamco non nostrud. Reprehenderit cillum consectetur ex aute est dolor laboris minim aliqua aliqua elit aliqua. Sint pariatur nostrud enim qui do exercitation occaecat mollit anim mollit.\r\nUllamco ea adipisicing duis est consectetur enim. Cillum esse et enim duis qui quis est elit. Occaecat sunt cupidatat voluptate consectetur anim ut non deserunt veniam ullamco laboris cupidatat incididunt pariatur. Id consequat nisi non aliquip voluptate esse. Cupidatat fugiat anim anim id quis aliquip sint nisi fugiat sit. Ipsum voluptate do officia quis culpa nulla et.\r\nEt commodo ea irure aliquip consectetur dolore. Eu nostrud non ad tempor commodo. Est tempor aliquip nisi mollit tempor excepteur. Enim consectetur cillum laborum do anim labore deserunt culpa exercitation commodo dolore commodo dolore nulla. Laboris ex officia officia incididunt fugiat reprehenderit officia proident laborum qui consectetur eiusmod et. Aute adipisicing eiusmod do cupidatat id commodo. Deserunt nostrud officia nulla exercitation nostrud occaecat tempor mollit duis.\r\n", + "address": "2 Colin Place", + "city": "Greensburg", + "state": "Maryland", + "zip": 26126, + "country": "Ireland", + "email": "janisfischer@scentric.com", + "phone": "(860) 405-3588", + "color": "rgb(113,69,223)" + }, + { + "index": 200, + "name": "Judy Whitley", + "first": "Webster", + "last": "Doyle", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ratbus/73.jpg", + "expanded": false, + "guid": "f4ccb739-8e28-42fd-b1a0-4051b77a60b3", + "integer": 57, + "date": "Tue Jan 29 2002 02:38:20 GMT-0800 (PST)", + "shortText": "cillum", + "mediumText": "Eiusmod nisi excepteur labore Lorem incididunt laborum cillum sit nisi id id sint minim. Proident reprehenderit excepteur cupidatat culpa dolor labore. Irure labore aute amet nostrud ad voluptate non.", + "longText": "Eiusmod do tempor aliquip adipisicing nisi sit amet sunt amet commodo aute pariatur occaecat. Labore incididunt qui incididunt duis non dolore eu voluptate. Veniam minim esse ipsum non do. Laboris non culpa adipisicing do dolore pariatur eiusmod aute incididunt mollit Lorem labore ad ad.\r\nEt fugiat ad deserunt exercitation pariatur. Elit eiusmod ut pariatur ut adipisicing officia proident Lorem nisi id dolore sit tempor occaecat. Et minim fugiat incididunt ad ullamco Lorem.\r\nElit ea cupidatat elit adipisicing magna ex culpa aliqua enim. Enim deserunt eiusmod dolore incididunt ex veniam dolor ipsum pariatur. Ipsum elit tempor eiusmod occaecat qui fugiat quis elit non nisi anim. Fugiat ut sit cillum ad dolore duis qui. Deserunt amet et sunt nulla duis nisi ea. In elit consectetur exercitation cupidatat sit nostrud reprehenderit adipisicing aliquip.\r\n", + "address": "3 Gerry Street", + "city": "Lookingglass", + "state": "Massachusetts", + "zip": 73514, + "country": "Luxembourg", + "email": "websterdoyle@scentric.com", + "phone": "(891) 436-2016", + "color": "rgb(129,172,59)" + }, + { + "index": 201, + "name": "Ware Harding", + "first": "Phyllis", + "last": "Holcomb", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sprayaga/73.jpg", + "expanded": false, + "guid": "87934fda-9cd1-4e95-9faa-53102d8ce1f2", + "integer": 3, + "date": "Fri May 19 1972 15:51:24 GMT-0700 (PDT)", + "shortText": "deserunt laboris excepteur pariatur nostrud", + "mediumText": "Tempor Lorem occaecat magna aute aliqua eu qui commodo.", + "longText": "Laboris deserunt anim excepteur magna et. Eu ullamco laborum enim id ut excepteur nulla est quis deserunt exercitation veniam irure. Sint officia anim cupidatat nostrud culpa aute ut. Amet id elit incididunt do excepteur. Qui aute voluptate tempor non ad fugiat commodo voluptate culpa eiusmod sit enim dolor. Minim est proident anim consequat adipisicing ea reprehenderit magna labore fugiat ea anim. Velit aute incididunt aute commodo aliquip veniam do fugiat ut anim.\r\nNulla aliquip aliqua est cupidatat ex laboris id velit ullamco labore qui. Commodo labore mollit esse laboris deserunt duis. Sunt velit ex excepteur cillum officia sint ad id commodo. Irure amet est laboris officia occaecat anim id ut irure sunt aute. Deserunt quis deserunt et ad mollit nulla. Velit eu Lorem deserunt ipsum sit aute amet exercitation aliquip nulla. Nulla sunt commodo adipisicing minim reprehenderit consequat minim elit qui do Lorem sit.\r\nIn et mollit minim proident eu qui anim magna Lorem consequat minim duis. Esse culpa eu commodo sit. Nostrud laborum magna id elit proident. Laboris commodo ipsum culpa laboris esse non enim id id mollit elit. Pariatur id in sunt et est tempor duis eu Lorem dolor tempor non veniam non. Ipsum officia aliquip anim id. Ex culpa aute et et consequat in qui.\r\nDeserunt nisi elit aliquip dolor culpa dolore mollit ullamco in cupidatat aliqua. Fugiat minim veniam labore ad minim in aliquip labore nulla quis pariatur. Est nisi pariatur duis culpa cupidatat labore in. Nisi tempor Lorem ea in laboris adipisicing do nisi consectetur laboris sunt culpa.\r\nDolore dolore veniam irure aute elit fugiat magna in. Irure enim fugiat ad ad aliqua exercitation proident duis officia dolor minim consequat reprehenderit. Occaecat ullamco esse cillum deserunt velit adipisicing laboris proident occaecat commodo occaecat tempor fugiat. Sint voluptate sunt anim sint do amet sint eiusmod ea enim Lorem. Aliqua consequat commodo sunt amet fugiat excepteur dolor dolor aliquip nostrud culpa. Fugiat elit adipisicing sit minim fugiat exercitation commodo anim duis. Ex voluptate excepteur occaecat nulla nostrud elit minim laborum fugiat.\r\n", + "address": "2 Brigham Street", + "city": "Chalfant", + "state": "Oklahoma", + "zip": 57590, + "country": "Afghanistan", + "email": "phyllisholcomb@scentric.com", + "phone": "(874) 534-3124", + "color": "rgb(210,230,76)" + }, + { + "index": 202, + "name": "Blanche Sears", + "first": "Peck", + "last": "Dean", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hai_ninh_nguyen/73.jpg", + "expanded": false, + "guid": "b362bf52-df9f-45bb-a64c-4f699bfd2cdb", + "integer": 64, + "date": "Thu May 23 2013 08:13:12 GMT-0700 (PDT)", + "shortText": "nisi tempor", + "mediumText": "Culpa id pariatur velit ut non adipisicing reprehenderit minim est pariatur excepteur nisi qui consectetur.", + "longText": "Voluptate minim deserunt reprehenderit anim ullamco. Consectetur laborum dolor ullamco laboris sunt elit nisi commodo esse sit. Voluptate dolor labore minim consectetur.\r\nQuis magna dolore incididunt deserunt qui dolor aute est culpa voluptate esse. Cillum quis exercitation dolore quis enim aliquip dolore dolor est adipisicing pariatur dolore deserunt. Consectetur sunt proident pariatur aute cupidatat voluptate fugiat pariatur sint.\r\nPariatur eiusmod consequat velit mollit ut reprehenderit irure. Voluptate nisi reprehenderit nisi adipisicing consectetur consequat in culpa laboris veniam laborum velit. Incididunt laboris cupidatat commodo sit commodo esse. Adipisicing proident cupidatat pariatur aute.\r\nEsse reprehenderit do id non occaecat dolore laborum dolore nostrud reprehenderit culpa voluptate voluptate nostrud. Laboris nostrud officia id consequat ullamco. Nisi est sunt ipsum excepteur nostrud dolore irure quis quis labore esse laboris. Adipisicing velit dolore ullamco voluptate reprehenderit ad duis reprehenderit. Commodo do laboris elit eu in nisi deserunt sint ipsum in duis sint excepteur. Culpa est est Lorem sint labore. Et qui ad anim ad.\r\nDo adipisicing amet cupidatat dolor dolore culpa incididunt culpa ad qui consequat ea reprehenderit proident. Irure qui ad adipisicing veniam irure nostrud esse id. Culpa do proident ex id eu Lorem veniam. Veniam commodo sit exercitation deserunt minim sint enim occaecat amet eu irure voluptate culpa eu. Deserunt ad laborum fugiat ex eu incididunt dolore adipisicing. Labore commodo aliquip deserunt aute eiusmod nisi. Est commodo duis excepteur nulla sunt laboris.\r\n", + "address": "4 Garden Place", + "city": "Ironton", + "state": "Ohio", + "zip": 89350, + "country": "St. Pierre and Miquelon", + "email": "peckdean@scentric.com", + "phone": "(994) 522-3068", + "color": "rgb(199,252,214)" + }, + { + "index": 203, + "name": "Conway Kelley", + "first": "Virginia", + "last": "Pollard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gaborenton/73.jpg", + "expanded": false, + "guid": "afd59da0-9b9b-4b60-9da3-0ef8fc1e6349", + "integer": 14, + "date": "Sun Jul 17 1988 07:37:09 GMT-0700 (PDT)", + "shortText": "Lorem pariatur velit duis tempor", + "mediumText": "Incididunt dolore sint proident irure. Cillum minim veniam dolor ipsum ut cupidatat non proident tempor deserunt. Incididunt exercitation ut proident dolor do adipisicing sit Lorem aliqua enim nulla nostrud. Consectetur duis veniam elit laboris eiusmod ullamco labore exercitation fugiat sint reprehenderit eu nostrud dolor. Occaecat id laboris est tempor deserunt anim in fugiat proident enim cupidatat elit officia fugiat.", + "longText": "Veniam enim ad adipisicing cupidatat velit cillum anim et exercitation esse aliquip sit sunt. Irure mollit est sint minim consectetur labore sunt. Deserunt veniam sunt ut sunt tempor minim ipsum Lorem cupidatat laborum. Proident ipsum veniam quis nisi in consectetur sint labore laboris quis adipisicing velit. Dolore laboris exercitation quis sit. Laboris voluptate non consectetur incididunt laborum veniam pariatur exercitation sint.\r\nSint aute mollit eiusmod ea id cupidatat ad in sunt Lorem proident eiusmod ad. Proident ex occaecat pariatur excepteur labore consectetur laboris. Ut pariatur in adipisicing sit ipsum minim. Ut est elit eiusmod fugiat deserunt mollit fugiat incididunt laboris. Aute officia amet cupidatat in.\r\nVelit id enim ut ea veniam laborum eu duis adipisicing fugiat amet ullamco irure. Dolor et ad culpa esse in. Ea pariatur adipisicing minim sunt consequat sunt minim anim aute qui quis.\r\n", + "address": "3 Monaco Place", + "city": "Lopezo", + "state": "Nevada", + "zip": 45051, + "country": "Montserrat", + "email": "virginiapollard@scentric.com", + "phone": "(911) 563-3668", + "color": "rgb(120,253,100)" + }, + { + "index": 204, + "name": "Little Griffin", + "first": "Murray", + "last": "David", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/uralozden/73.jpg", + "expanded": false, + "guid": "9028904c-ab1e-4968-b7c4-20453df8469b", + "integer": 84, + "date": "Sun Dec 20 1987 15:41:10 GMT-0800 (PST)", + "shortText": "adipisicing ea pariatur enim", + "mediumText": "Commodo nostrud et irure amet pariatur proident eiusmod. Proident mollit eu fugiat irure voluptate proident laboris cillum proident voluptate.", + "longText": "Nisi et consectetur aute in tempor. Occaecat ad sint incididunt ullamco reprehenderit dolore. Nisi adipisicing in velit sint aliquip. Deserunt ut pariatur aute et voluptate fugiat id esse do sunt deserunt aute in. Excepteur adipisicing excepteur irure tempor sit culpa culpa mollit. Fugiat est culpa nostrud pariatur labore et in esse ullamco cillum et amet consequat cillum. Sint laboris cillum ea labore occaecat sunt enim.\r\n", + "address": "2 Gallatin Place", + "city": "Topaz", + "state": "Montana", + "zip": 18846, + "country": "Norway", + "email": "murraydavid@scentric.com", + "phone": "(994) 477-3415", + "color": "rgb(185,246,198)" + }, + { + "index": 205, + "name": "Goff Benton", + "first": "Mclean", + "last": "Pennington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/attacks/73.jpg", + "expanded": false, + "guid": "70d6883d-2c03-4256-b2b8-d09f035e6d58", + "integer": 51, + "date": "Sun Feb 25 1979 17:08:08 GMT-0800 (PST)", + "shortText": "ipsum aute Lorem", + "mediumText": "Qui est officia sit nulla sunt reprehenderit incididunt aute.", + "longText": "Lorem eu proident exercitation do veniam. Sunt reprehenderit officia cupidatat est do ipsum sunt elit anim quis reprehenderit laborum quis non. Et aliqua excepteur culpa qui enim nulla id qui eiusmod dolor Lorem non mollit consectetur.\r\nLorem amet velit esse magna Lorem voluptate nostrud labore. Dolor Lorem cupidatat mollit laboris deserunt quis occaecat excepteur pariatur deserunt minim consectetur sint. Ad quis veniam dolore quis nostrud laboris ex anim quis eu nisi tempor. Consectetur voluptate id officia culpa anim enim eiusmod in amet amet. Velit anim deserunt officia eiusmod qui incididunt minim consequat ut sunt mollit. Ex enim aliquip enim quis enim irure sunt mollit laborum nisi.\r\nMagna sit ea deserunt excepteur aliqua esse nulla deserunt exercitation officia nulla id tempor cillum. Occaecat nulla sit tempor aute fugiat commodo. Laboris fugiat enim exercitation voluptate quis consequat consectetur aliquip fugiat voluptate ut occaecat reprehenderit irure. Esse sit laboris quis commodo ea in velit ad labore veniam. Aliquip dolor laborum commodo ad elit aliqua velit qui.\r\nElit exercitation culpa officia adipisicing amet in dolor eiusmod. Nostrud proident exercitation aliquip labore ad cupidatat velit incididunt. Officia ex veniam cillum deserunt id dolore excepteur pariatur mollit nulla laboris veniam veniam eu. Labore duis est ex reprehenderit fugiat commodo ut aute officia culpa irure amet id.\r\n", + "address": "4 Story Court", + "city": "Snowville", + "state": "California", + "zip": 33234, + "country": "Guam", + "email": "mcleanpennington@scentric.com", + "phone": "(882) 499-2242", + "color": "rgb(107,133,242)" + }, + { + "index": 206, + "name": "Hale Wilkinson", + "first": "Franks", + "last": "Howard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mymyboy/73.jpg", + "expanded": false, + "guid": "974617cc-7395-4b74-aa1b-f5ea163bbb48", + "integer": 40, + "date": "Mon Jul 17 1972 11:03:48 GMT-0700 (PDT)", + "shortText": "dolor nulla culpa id", + "mediumText": "Veniam ipsum sit ea velit et magna exercitation exercitation occaecat voluptate aliqua. Deserunt nisi qui dolor mollit in anim labore. Dolore id quis occaecat aliqua pariatur cillum enim aliquip pariatur voluptate magna. Excepteur magna officia excepteur voluptate excepteur laboris.", + "longText": "Sit elit quis laborum do magna culpa Lorem magna incididunt. Consectetur non do non ea fugiat Lorem sint fugiat deserunt magna id ut aliquip. In Lorem ut voluptate magna consectetur exercitation cupidatat elit anim excepteur ipsum tempor amet. Velit commodo magna incididunt pariatur fugiat adipisicing cillum fugiat incididunt in sint velit ipsum. Sint non eiusmod quis minim anim. Irure reprehenderit adipisicing non nulla Lorem officia excepteur voluptate esse.\r\nOfficia dolore do aute culpa enim et quis laboris occaecat elit eiusmod mollit. Est non irure amet ad pariatur exercitation pariatur ad ex quis. Sunt ea minim id exercitation laborum dolore nulla et incididunt do. Aliqua amet Lorem eiusmod pariatur ipsum amet reprehenderit elit sit. Eu quis cillum voluptate magna ullamco.\r\nEa proident sit laborum commodo fugiat in elit amet. Non esse do exercitation culpa consectetur non magna voluptate velit ea culpa anim nulla. Eiusmod labore Lorem aute occaecat nulla fugiat.\r\nEst excepteur laborum ut amet Lorem ad veniam elit reprehenderit. Officia laboris id et consectetur sunt adipisicing nulla nostrud esse Lorem. Duis laboris veniam amet deserunt in deserunt laborum sit pariatur cillum nostrud.\r\n", + "address": "2 Hoyt Street", + "city": "Wolcott", + "state": "Marshall Islands", + "zip": 13071, + "country": "Gibraltar", + "email": "frankshoward@scentric.com", + "phone": "(893) 417-2654", + "color": "rgb(186,174,80)" + }, + { + "index": 207, + "name": "Betty Huff", + "first": "Mona", + "last": "Fulton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tristanlegros/73.jpg", + "expanded": false, + "guid": "c11ff2c4-c704-4729-88f9-b9932549a64a", + "integer": 26, + "date": "Thu Nov 04 1976 19:21:20 GMT-0800 (PST)", + "shortText": "sit nulla", + "mediumText": "Adipisicing minim nostrud magna amet tempor sunt duis officia cupidatat do incididunt dolore consectetur elit. Duis proident deserunt proident eu elit aliquip sint. Qui officia commodo voluptate deserunt amet ipsum magna dolore. Dolore labore eiusmod fugiat ad.", + "longText": "Aliquip in consequat nulla Lorem velit in cupidatat ut ut. Minim dolore cillum ut esse dolore ex. Eu occaecat officia tempor Lorem duis mollit magna Lorem eu deserunt aute et nisi reprehenderit. Eu magna qui enim officia nostrud proident officia sint elit ipsum quis duis velit Lorem.\r\n", + "address": "4 Ocean Avenue", + "city": "Finderne", + "state": "Indiana", + "zip": 46746, + "country": "Hungary", + "email": "monafulton@scentric.com", + "phone": "(946) 414-3557", + "color": "rgb(128,193,66)" + }, + { + "index": 208, + "name": "Emily Davis", + "first": "Sharon", + "last": "Green", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/allfordesign/73.jpg", + "expanded": false, + "guid": "e94e16a5-2c94-4436-8610-86a6f5f66355", + "integer": 99, + "date": "Mon Sep 28 2009 14:40:31 GMT-0700 (PDT)", + "shortText": "cillum dolor ex cupidatat deserunt", + "mediumText": "Cupidatat nulla anim reprehenderit laboris aute magna aliquip ea in sit. Reprehenderit reprehenderit amet id et ad ea. Deserunt veniam cillum dolor ullamco Lorem non cillum amet.", + "longText": "Quis voluptate ex cillum incididunt incididunt nisi. Dolor aliqua culpa dolor cillum eiusmod cillum tempor cillum. Est laboris esse exercitation nulla nisi anim et do cupidatat fugiat pariatur. Laborum duis eu fugiat anim duis.\r\nVeniam reprehenderit cupidatat ullamco Lorem ex officia mollit aliqua. Exercitation exercitation cillum irure officia deserunt velit laboris est irure irure minim veniam aliquip laborum. Ipsum ipsum sit ipsum ex veniam voluptate. Adipisicing do ex occaecat do. Laboris reprehenderit ad velit deserunt. Sint consectetur minim eiusmod excepteur eu cupidatat non mollit aliquip ad eu cupidatat.\r\nFugiat mollit ut ullamco veniam sint proident occaecat ad. Est exercitation laborum nisi laboris anim laborum magna. Labore ut adipisicing consectetur velit voluptate fugiat laborum adipisicing veniam reprehenderit. Adipisicing aliquip consectetur id occaecat labore exercitation ullamco.\r\nVoluptate reprehenderit occaecat eiusmod pariatur ipsum est eu. Id dolor laborum elit commodo duis et Lorem laboris. Sit officia do elit amet adipisicing. Exercitation commodo est do eu. In amet ad reprehenderit commodo.\r\nMinim nisi nostrud Lorem nostrud ea incididunt est in labore amet elit officia. Quis nostrud fugiat consequat culpa. Nisi ullamco irure sunt esse elit sunt nisi enim ullamco cupidatat dolore adipisicing. Ullamco sint laboris ullamco id magna qui et eiusmod laborum do enim minim amet aute. Ad fugiat elit velit amet officia nisi aliquip qui. Ut quis amet tempor ea ex id quis Lorem. Amet tempor incididunt esse sunt dolore non veniam esse nisi sint labore ut in.\r\n", + "address": "3 Colonial Court", + "city": "Trona", + "state": "Tennessee", + "zip": 67912, + "country": "Kenya", + "email": "sharongreen@scentric.com", + "phone": "(832) 403-3692", + "color": "rgb(208,118,108)" + }, + { + "index": 209, + "name": "Shelly Payne", + "first": "Doyle", + "last": "Vazquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/serk002/73.jpg", + "expanded": false, + "guid": "1fbca6f1-d8c8-48ca-94be-6bfb87526c7d", + "integer": 58, + "date": "Sat May 15 1993 07:23:07 GMT-0700 (PDT)", + "shortText": "do amet aliqua duis ea", + "mediumText": "Minim adipisicing sint aliquip in do mollit labore occaecat in. Est commodo et deserunt aute. Ut consectetur exercitation et voluptate qui quis ex.", + "longText": "Ea consequat exercitation incididunt non veniam occaecat amet occaecat occaecat ex ex ullamco incididunt. Enim consequat nisi sit pariatur aliqua elit ipsum elit aliqua incididunt et. Cupidatat occaecat velit nostrud id consequat cupidatat. Nulla anim ipsum enim ad incididunt nostrud nulla et esse incididunt elit. Culpa commodo ad non sint anim. Ad deserunt aute eiusmod officia fugiat proident minim nostrud commodo voluptate velit mollit duis.\r\nEiusmod veniam adipisicing exercitation proident do voluptate ut culpa consequat Lorem. Deserunt ea voluptate anim quis duis deserunt mollit minim sit minim reprehenderit amet. Nisi labore dolore reprehenderit minim laborum fugiat Lorem incididunt sint. Enim aliquip voluptate ea nulla consectetur sit reprehenderit sunt in officia aute id. Pariatur sint sint eiusmod ea do est sint.\r\n", + "address": "3 Auburn Place", + "city": "Blairstown", + "state": "Palau", + "zip": 22120, + "country": "Honduras", + "email": "doylevazquez@scentric.com", + "phone": "(946) 513-2799", + "color": "rgb(255,190,226)" + }, + { + "index": 210, + "name": "Angela Mcmahon", + "first": "Rosalyn", + "last": "Bridges", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/keremk/73.jpg", + "expanded": false, + "guid": "92811c3f-0e5f-4f04-9543-6d026e4b26c4", + "integer": 16, + "date": "Fri Jan 16 1998 10:02:55 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Lorem cupidatat dolor voluptate magna excepteur eiusmod est in.", + "longText": "Aliqua culpa aliqua aute labore nulla do pariatur consectetur sit sunt quis reprehenderit duis cupidatat. Pariatur eu voluptate cupidatat reprehenderit sit mollit proident ullamco proident ipsum nulla. Nulla qui ullamco sint eiusmod dolore. Minim esse et sit cupidatat dolore esse. Dolor reprehenderit aliquip magna commodo irure nulla culpa ipsum enim incididunt. Cillum velit minim incididunt qui velit nulla.\r\nConsectetur amet ex elit eu commodo sint enim. Proident et labore ipsum consequat pariatur irure. Fugiat non occaecat ipsum ullamco commodo. Nisi exercitation cupidatat nisi pariatur non culpa. Non do deserunt labore non amet excepteur ea sint. Pariatur quis ullamco laboris fugiat proident est irure magna commodo occaecat officia qui.\r\nPariatur et commodo officia ullamco do qui est nisi in. Laborum sint do minim aute aute dolore est consequat officia id. Nostrud velit ex ut eu dolore occaecat magna minim. Culpa amet sunt duis aliquip Lorem voluptate. Commodo occaecat reprehenderit nostrud magna ex proident incididunt est ut ad do.\r\n", + "address": "4 Fane Court", + "city": "Elrama", + "state": "Virginia", + "zip": 45107, + "country": "Eritrea", + "email": "rosalynbridges@scentric.com", + "phone": "(813) 440-3063", + "color": "rgb(184,249,205)" + }, + { + "index": 211, + "name": "Maryellen Ramos", + "first": "Rogers", + "last": "Silva", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/surjithctly/73.jpg", + "expanded": false, + "guid": "a833fdf1-9865-4e5c-91f8-8d1aaa2d2fba", + "integer": 75, + "date": "Sun Oct 24 2004 10:12:53 GMT-0700 (PDT)", + "shortText": "nisi duis", + "mediumText": "Magna elit fugiat occaecat incididunt elit tempor exercitation occaecat fugiat eiusmod incididunt dolore. Ad quis ea commodo reprehenderit sint sit esse quis quis. Minim esse anim aute eiusmod fugiat.", + "longText": "Voluptate id ullamco do aliqua ad deserunt commodo ex. Et aute excepteur elit adipisicing. Labore consequat consequat consequat qui aute non et ad deserunt. Ex adipisicing sunt sunt mollit do nulla eiusmod esse aute dolor. Elit veniam culpa labore proident cillum duis minim id sint sint eiusmod. Est deserunt in ut laboris fugiat ut sint consequat. Ullamco ex incididunt reprehenderit adipisicing occaecat.\r\nNisi officia excepteur enim aliquip aliqua occaecat aliqua mollit velit reprehenderit amet id cillum. Nulla fugiat ad id in velit consectetur sint id commodo pariatur velit reprehenderit est nisi. Reprehenderit exercitation voluptate ea cillum ea ut nisi deserunt laborum eiusmod ea. Voluptate velit consectetur aliquip aliquip Lorem consectetur dolore in qui laboris voluptate labore duis. In enim eiusmod minim minim non ea labore excepteur tempor officia ullamco.\r\nUt pariatur tempor aliquip eu quis cupidatat esse ad. Sint occaecat mollit eu consectetur dolore nostrud incididunt nostrud enim quis dolor elit adipisicing excepteur. Pariatur cupidatat consequat cillum deserunt sit eu in et veniam aliqua. Proident nostrud nostrud incididunt tempor ad nisi amet. Cupidatat ad ea mollit cupidatat est dolor eu laboris ex velit duis amet consectetur velit.\r\nCillum occaecat ex voluptate cupidatat est cillum qui. Et do incididunt nulla veniam sint eu consectetur et non minim officia excepteur velit. Anim labore mollit cillum sit nisi ex sunt mollit culpa enim ipsum sit laboris in. Quis ullamco et ullamco consequat mollit ex commodo laboris voluptate. Magna qui aute aliqua sit adipisicing id. Veniam mollit proident eu occaecat veniam sint sint laboris sit laborum.\r\n", + "address": "3 Brightwater Court", + "city": "Brandermill", + "state": "Wyoming", + "zip": 20996, + "country": "Tajikistan", + "email": "rogerssilva@scentric.com", + "phone": "(944) 540-3499", + "color": "rgb(88,243,243)" + }, + { + "index": 212, + "name": "Alvarado Abbott", + "first": "Jordan", + "last": "Hyde", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dimitris_d_/73.jpg", + "expanded": false, + "guid": "9b8ecabd-ca6e-4ee1-bd6a-08635f7312a6", + "integer": 97, + "date": "Fri Oct 21 1983 23:56:38 GMT-0700 (PDT)", + "shortText": "elit exercitation pariatur aliqua duis", + "mediumText": "Cupidatat consequat esse duis ex consequat consequat.", + "longText": "Anim aute nisi non adipisicing dolor incididunt non est esse culpa. Proident eiusmod et voluptate sint. Anim ex incididunt do ipsum dolor Lorem Lorem ut. Quis eiusmod esse anim aliqua ullamco. Non in ad qui excepteur minim adipisicing Lorem tempor elit. Nostrud cillum incididunt labore magna duis consectetur irure ut consectetur. Veniam eu officia qui sint pariatur culpa.\r\nSunt ea amet tempor minim labore consequat duis qui. Aliqua non nisi sint incididunt et veniam minim Lorem. Id fugiat consequat in labore velit proident est incididunt nisi non Lorem. Exercitation ipsum duis labore sunt officia proident labore labore ad. Sunt enim culpa adipisicing aute cillum. Officia in adipisicing tempor minim eiusmod dolor. Ea sunt ut elit cillum laboris nisi ipsum reprehenderit labore laborum culpa in.\r\nFugiat est eiusmod amet incididunt minim adipisicing voluptate. Ex eiusmod consequat consectetur occaecat laborum culpa in cupidatat voluptate ipsum reprehenderit elit consequat. Ut fugiat commodo qui aute consequat. Nostrud dolor duis magna minim do.\r\nId non fugiat pariatur pariatur Lorem nostrud irure. Tempor laboris voluptate velit magna. Ut ea ea sunt mollit aliqua. Ullamco dolore nostrud ex non non non culpa Lorem ullamco do do dolore quis. Id sunt magna laboris laboris enim. Sint aliquip elit ullamco ut nisi officia enim dolore nulla cupidatat duis. Cillum magna minim quis nulla nulla anim amet non nostrud sit nostrud exercitation magna ex.\r\n", + "address": "4 Bainbridge Street", + "city": "Chical", + "state": "Colorado", + "zip": 18544, + "country": "Brunei Darussalam", + "email": "jordanhyde@scentric.com", + "phone": "(822) 530-2413", + "color": "rgb(163,61,149)" + }, + { + "index": 213, + "name": "Caldwell Mckinney", + "first": "Melody", + "last": "Fisher", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bogdanroberta/73.jpg", + "expanded": false, + "guid": "7e4dcc0a-5507-4cee-948f-06e4315a2af8", + "integer": 41, + "date": "Wed May 03 1972 14:18:30 GMT-0700 (PDT)", + "shortText": "adipisicing", + "mediumText": "Aliqua laboris enim proident cillum ut id aute nulla ea.", + "longText": "Consequat excepteur non amet ipsum labore dolore consequat duis cillum. Enim occaecat nisi aute aliqua occaecat enim nulla. Eiusmod est adipisicing et in. Sint fugiat ullamco officia commodo minim ut velit voluptate non eiusmod. Est quis sunt nisi exercitation in nostrud laboris.\r\nIrure pariatur velit ad minim occaecat labore ad dolor eiusmod occaecat laboris. Et culpa voluptate minim aliquip. Sit commodo nostrud veniam in dolore magna officia eu ea nisi ex velit.\r\nQuis esse do anim ullamco deserunt consectetur cupidatat tempor cillum ex id. Aute velit non est amet officia laboris labore duis velit Lorem consectetur cupidatat tempor. Cupidatat eiusmod anim et elit ipsum esse minim. Irure eiusmod nisi duis velit id.\r\n", + "address": "2 Abbey Court", + "city": "Salvo", + "state": "Utah", + "zip": 63926, + "country": "Macedonia", + "email": "melodyfisher@scentric.com", + "phone": "(979) 487-2773", + "color": "rgb(71,205,213)" + }, + { + "index": 214, + "name": "Eloise Avila", + "first": "Gay", + "last": "Yang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shammellee/73.jpg", + "expanded": false, + "guid": "d615ea19-d16e-48f6-8ddb-02091a9fa272", + "integer": 25, + "date": "Tue Sep 03 1991 06:44:54 GMT-0700 (PDT)", + "shortText": "aliquip enim eu proident sunt", + "mediumText": "Ex deserunt reprehenderit qui ea adipisicing labore in ipsum.", + "longText": "Eiusmod anim ut occaecat veniam est quis labore consectetur elit. Sint minim nostrud non ad aliqua do. Dolor et ullamco aliqua cillum consectetur sunt. Tempor aliquip id labore anim voluptate aute cupidatat consequat. Et nostrud eu cillum sunt nisi excepteur laborum sint labore amet.\r\n", + "address": "3 Wogan Terrace", + "city": "Canby", + "state": "Idaho", + "zip": 49943, + "country": "French Polynesia", + "email": "gayyang@scentric.com", + "phone": "(951) 538-3316", + "color": "rgb(75,210,111)" + }, + { + "index": 215, + "name": "Christine Strong", + "first": "Sofia", + "last": "Alvarez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/donjain/73.jpg", + "expanded": false, + "guid": "7f27c6f9-a6f0-49b2-b6d4-0824fb02c1ba", + "integer": 2, + "date": "Fri Feb 27 1976 21:08:15 GMT-0800 (PST)", + "shortText": "incididunt mollit", + "mediumText": "Labore labore consectetur aliquip pariatur sit eu voluptate minim enim eu cillum proident.", + "longText": "Sint sit deserunt proident nulla culpa in reprehenderit veniam commodo consequat aliquip dolor. Eu mollit cillum et nulla nulla culpa voluptate proident irure mollit non ipsum nisi. Reprehenderit laboris eiusmod magna exercitation consectetur nulla sit do cupidatat est ad dolore culpa. Eiusmod commodo eiusmod dolore est ad reprehenderit occaecat irure. Adipisicing quis aliqua qui non labore consectetur ullamco aliquip.\r\nLorem fugiat excepteur do cupidatat labore elit tempor fugiat et. Commodo laborum nisi consectetur laboris culpa veniam ea minim fugiat dolor qui et pariatur occaecat. Culpa est ullamco in esse. Ut aliquip id dolore aute ullamco et velit veniam et est aute sunt. Sint Lorem consectetur elit occaecat ea enim proident sunt cupidatat cillum officia. Quis eu veniam deserunt occaecat aliqua est exercitation consequat ipsum officia sit Lorem aliqua.\r\nAmet mollit in ad sit. Adipisicing occaecat laboris qui enim ut aute deserunt proident. Ipsum labore laboris sunt nulla amet ad. Duis voluptate ut veniam est quis amet et occaecat.\r\nDuis pariatur voluptate ut veniam aliquip commodo ipsum commodo do. Pariatur deserunt laboris veniam duis ipsum dolore et duis laboris quis officia ad reprehenderit deserunt. Deserunt Lorem esse ad duis veniam ad proident dolore culpa enim commodo sunt est ex.\r\nExcepteur deserunt deserunt ea dolor nulla. Laborum irure elit ut fugiat deserunt amet nisi. Magna do elit est esse pariatur qui mollit proident esse. Id laborum amet fugiat ipsum tempor reprehenderit.\r\n", + "address": "3 Celeste Court", + "city": "Herbster", + "state": "Arkansas", + "zip": 97896, + "country": "Bahamas", + "email": "sofiaalvarez@scentric.com", + "phone": "(990) 470-3077", + "color": "rgb(250,51,175)" + }, + { + "index": 216, + "name": "Love Baldwin", + "first": "Rivers", + "last": "Rosales", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/21lab/73.jpg", + "expanded": false, + "guid": "b67fea0d-b75f-4344-8a9f-fe87e3c61b52", + "integer": 84, + "date": "Wed Jan 15 1975 15:08:56 GMT-0800 (PST)", + "shortText": "do elit sint excepteur", + "mediumText": "Veniam eiusmod sit duis fugiat mollit et dolore in ad nulla culpa. Proident labore eu dolore commodo sint deserunt dolore amet ullamco nulla eiusmod excepteur. Excepteur nisi duis consectetur qui. Exercitation laborum est aliquip deserunt.", + "longText": "Quis ea et cillum aliqua culpa commodo velit cupidatat ut ea. Nisi non qui esse labore veniam veniam sit. Excepteur aliquip sit anim minim incididunt consectetur consectetur laboris minim nisi labore in labore magna. Incididunt tempor eiusmod dolor elit et duis ex mollit.\r\nId excepteur do adipisicing laboris labore aliquip eu do enim incididunt esse nulla exercitation. Anim consequat culpa non incididunt dolore ad qui proident magna voluptate do occaecat fugiat occaecat. Velit pariatur amet ullamco quis sint.\r\n", + "address": "2 Ingraham Street", + "city": "Hendersonville", + "state": "Delaware", + "zip": 71466, + "country": "Palau", + "email": "riversrosales@scentric.com", + "phone": "(929) 466-3166", + "color": "rgb(255,204,95)" + }, + { + "index": 217, + "name": "Louisa Lang", + "first": "Jenna", + "last": "Roberson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionuss/73.jpg", + "expanded": false, + "guid": "1fb6ce5a-06bc-4d09-93bb-4da1b2003f10", + "integer": 47, + "date": "Wed Aug 26 1981 07:54:13 GMT-0700 (PDT)", + "shortText": "sint nostrud commodo exercitation", + "mediumText": "Nulla culpa incididunt et veniam nisi officia. Et non fugiat incididunt in fugiat ad ullamco dolor cillum duis irure officia veniam dolor. Pariatur qui veniam cillum sunt consequat eiusmod ipsum.", + "longText": "Quis consequat ea velit ea labore do dolore. Aute in dolore occaecat sint dolor labore. Sunt consectetur laborum qui nostrud dolore reprehenderit sint sunt eu reprehenderit. Ullamco proident labore occaecat nostrud. Sint velit in do ut duis laborum ut ullamco. Tempor sunt consectetur officia veniam. Et cillum occaecat mollit tempor proident sunt mollit.\r\nOccaecat incididunt esse occaecat et non culpa culpa aliqua ex. Aute cillum magna nostrud ea. Anim consequat aliquip enim veniam culpa velit ea irure quis id ipsum deserunt ad. Elit dolor proident laboris nostrud id pariatur aute ut deserunt. Mollit consequat occaecat eiusmod ad voluptate laboris duis. Quis nulla culpa occaecat ea ullamco voluptate cupidatat irure. Incididunt amet ipsum cupidatat sint officia reprehenderit consequat velit non reprehenderit commodo ut amet.\r\nAliqua commodo ipsum ex officia esse veniam elit ullamco. Laborum adipisicing Lorem sint nisi commodo sunt aute commodo cupidatat reprehenderit ut exercitation. Eu ea magna anim in fugiat mollit proident exercitation ullamco amet. Ex ullamco et nulla non deserunt ullamco occaecat officia enim. Officia ea ullamco cillum dolor et aliqua elit consectetur nulla ex dolor nostrud aute velit. Exercitation mollit consequat consectetur veniam pariatur ullamco sit sunt dolore sint deserunt ut esse. Sint ullamco voluptate est veniam ullamco sit.\r\n", + "address": "4 Miller Place", + "city": "Sims", + "state": "Federated States Of Micronesia", + "zip": 93413, + "country": "Tuvalu", + "email": "jennaroberson@scentric.com", + "phone": "(943) 474-3085", + "color": "rgb(143,132,181)" + }, + { + "index": 218, + "name": "Snyder Cortez", + "first": "Ronda", + "last": "Nielsen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bameyrick/73.jpg", + "expanded": false, + "guid": "633a4429-d43e-452c-9b6c-b53f2ee2e347", + "integer": 85, + "date": "Tue Jan 06 1981 00:45:11 GMT-0800 (PST)", + "shortText": "ullamco deserunt adipisicing sint esse", + "mediumText": "Nostrud mollit exercitation culpa ipsum adipisicing fugiat aliquip ex.", + "longText": "Cupidatat veniam officia quis fugiat proident eu. Lorem voluptate enim do aute ut veniam ut. Ullamco exercitation cupidatat ipsum culpa aliqua duis veniam ullamco proident in fugiat dolore ullamco. Quis in irure adipisicing occaecat.\r\nVeniam consectetur labore consectetur consequat enim irure sunt. Enim nulla pariatur aliquip aute proident aute deserunt fugiat nisi irure ipsum irure proident. Ad laboris do aute ullamco et reprehenderit velit commodo ipsum magna sunt duis.\r\nOfficia excepteur sunt ut tempor Lorem in mollit ipsum et tempor cupidatat veniam. Aliqua id dolore Lorem officia quis velit. Ut tempor elit fugiat incididunt quis ad eiusmod in.\r\nExercitation Lorem aliquip laboris laboris incididunt qui laboris adipisicing irure laboris qui non deserunt qui. Voluptate sit aliquip ullamco anim. Dolore nulla ea culpa fugiat adipisicing qui proident do elit proident fugiat magna dolore quis.\r\nExcepteur elit laboris proident adipisicing ipsum aute ipsum magna voluptate officia officia consequat amet ullamco. Amet nostrud elit do culpa consectetur occaecat sint culpa id labore sit qui pariatur. Sunt esse nisi in proident labore excepteur deserunt elit cupidatat non. Labore sunt commodo nisi eu incididunt qui cillum tempor anim voluptate. Adipisicing dolor consequat pariatur id enim laboris incididunt duis magna enim velit fugiat esse.\r\n", + "address": "3 Quentin Road", + "city": "Islandia", + "state": "Guam", + "zip": 18417, + "country": "Liechtenstein", + "email": "rondanielsen@scentric.com", + "phone": "(819) 547-2703", + "color": "rgb(69,55,248)" + }, + { + "index": 219, + "name": "Michael Nixon", + "first": "Paul", + "last": "Huber", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/p_cherkashin/73.jpg", + "expanded": false, + "guid": "77b470a6-85b9-4d08-9bda-af2cf7b97919", + "integer": 86, + "date": "Mon Aug 24 1987 23:29:34 GMT-0700 (PDT)", + "shortText": "et", + "mediumText": "Adipisicing dolore magna sunt duis quis cillum incididunt sit commodo minim nisi irure culpa.", + "longText": "Sit qui excepteur consequat veniam. Qui deserunt nostrud esse velit nulla culpa ex. Enim esse nostrud quis consectetur ea ex. Veniam reprehenderit deserunt dolore ipsum Lorem reprehenderit ipsum laborum adipisicing adipisicing qui.\r\n", + "address": "3 Baltic Street", + "city": "Marienthal", + "state": "Pennsylvania", + "zip": 77950, + "country": "Virgin Islands (US)", + "email": "paulhuber@scentric.com", + "phone": "(822) 531-2515", + "color": "rgb(213,114,213)" + }, + { + "index": 220, + "name": "Erna Collier", + "first": "Brady", + "last": "Haney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tube_man/73.jpg", + "expanded": false, + "guid": "2b70bd78-953b-4f78-b980-0443e7865502", + "integer": 89, + "date": "Thu Apr 09 1981 13:14:33 GMT-0800 (PST)", + "shortText": "labore consectetur qui", + "mediumText": "Eiusmod eiusmod sit consectetur dolor adipisicing adipisicing ipsum laborum. Nostrud est non sunt est Lorem aliquip non incididunt. Ad consequat incididunt labore adipisicing eiusmod magna ad pariatur quis.", + "longText": "Nostrud ullamco quis aliqua veniam officia est commodo anim commodo est exercitation. Dolor reprehenderit dolore occaecat anim cillum deserunt. Nostrud laboris esse quis voluptate magna esse. Et mollit mollit ad consectetur adipisicing do ullamco Lorem mollit cillum cillum pariatur ipsum duis. In exercitation esse nisi nostrud aliquip non velit magna incididunt anim. Dolor mollit eu quis laborum quis duis esse nisi exercitation duis duis quis adipisicing.\r\nFugiat nisi do reprehenderit dolor amet velit fugiat incididunt quis et aute eu cillum consequat. Occaecat laborum cupidatat occaecat voluptate proident irure anim proident sit in. In culpa ex pariatur deserunt sint in consectetur eiusmod. Aliqua cupidatat aute ullamco eiusmod fugiat.\r\nEx officia ut Lorem ex nisi pariatur incididunt qui. Fugiat pariatur ut tempor excepteur anim enim qui sint occaecat eiusmod veniam ad enim amet. Anim magna nulla magna pariatur. Mollit excepteur minim cillum irure nisi quis irure quis velit consectetur. Laboris sint aliquip minim aliqua incididunt eiusmod dolor amet. Velit sint cillum consectetur commodo culpa do exercitation amet laboris est laborum magna officia sit.\r\n", + "address": "3 Lawrence Street", + "city": "Summerset", + "state": "New Hampshire", + "zip": 76548, + "country": "Svalbard and Jan Mayen Islands", + "email": "bradyhaney@scentric.com", + "phone": "(933) 464-2281", + "color": "rgb(61,84,220)" + }, + { + "index": 221, + "name": "Serena Holden", + "first": "Dorsey", + "last": "James", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicolaseek/73.jpg", + "expanded": false, + "guid": "e34b73b6-5bae-4d6e-8d76-8b030ff4d104", + "integer": 49, + "date": "Mon May 27 1985 00:38:05 GMT-0700 (PDT)", + "shortText": "occaecat Lorem", + "mediumText": "Sunt minim duis et reprehenderit commodo aute dolore. Elit veniam occaecat adipisicing officia ex.", + "longText": "Consectetur ipsum quis in veniam ipsum voluptate velit deserunt minim aute. Consectetur in commodo aliquip voluptate anim. Culpa veniam enim in voluptate do nulla culpa deserunt. Mollit in sit exercitation dolore id eu duis nulla consectetur laborum sit ex eu et.\r\nLaborum id occaecat labore voluptate officia labore in id cillum occaecat. Nisi et amet elit excepteur irure adipisicing est cillum sit est velit cillum. Irure Lorem qui qui Lorem qui id. Est velit adipisicing voluptate Lorem consectetur ut exercitation occaecat amet adipisicing sit adipisicing. Cillum sint quis incididunt sint anim et. Adipisicing veniam pariatur id laboris amet est cillum. Eiusmod in mollit in velit culpa Lorem consequat ad mollit amet laboris qui.\r\nIn nisi exercitation irure pariatur consequat consequat labore ipsum anim commodo fugiat id. Aute est sit reprehenderit cupidatat cupidatat pariatur laborum nulla culpa minim sunt. Consectetur ipsum duis dolor velit labore nisi magna enim voluptate laborum exercitation et.\r\n", + "address": "3 Green Street", + "city": "Allensworth", + "state": "North Dakota", + "zip": 77281, + "country": "Ethiopia", + "email": "dorseyjames@scentric.com", + "phone": "(856) 447-3354", + "color": "rgb(81,131,93)" + }, + { + "index": 222, + "name": "Tabitha Alvarado", + "first": "Grant", + "last": "Bauer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/joshjoshmatson/73.jpg", + "expanded": false, + "guid": "f0707477-7ccf-4f35-b9d8-ecdcea4b5444", + "integer": 59, + "date": "Sat Mar 13 1971 23:17:16 GMT-0800 (PST)", + "shortText": "cupidatat exercitation pariatur commodo anim", + "mediumText": "Nisi nulla est ipsum laboris. Ut et ea pariatur aute. Fugiat dolore esse laborum sunt.", + "longText": "Cupidatat pariatur nostrud cillum fugiat sint culpa officia adipisicing ipsum occaecat. Sunt id tempor tempor consectetur sint eu esse ullamco deserunt proident Lorem sit. Exercitation et ex dolor exercitation elit labore aute veniam consectetur. Duis mollit ut eiusmod reprehenderit duis anim qui.\r\nIpsum anim veniam nostrud occaecat et proident qui cupidatat voluptate eu enim esse Lorem nulla. Nulla voluptate ex irure ex excepteur minim duis ut ipsum aliqua ullamco. Excepteur ipsum proident ea duis Lorem ad incididunt esse non officia amet excepteur exercitation. Sit amet sint velit velit officia fugiat. Laboris aliqua irure incididunt nulla aliqua exercitation labore nostrud incididunt. Labore eu amet magna deserunt.\r\nAliqua adipisicing et aute ut occaecat laboris nulla. Excepteur non Lorem fugiat incididunt officia minim sunt tempor dolore magna ullamco ad veniam enim. Sunt labore adipisicing consequat non proident excepteur ullamco cupidatat eiusmod nulla culpa elit aliquip minim. Fugiat qui sint Lorem velit ea.\r\n", + "address": "3 Oak Street", + "city": "Kapowsin", + "state": "Northern Mariana Islands", + "zip": 57454, + "country": "Togo", + "email": "grantbauer@scentric.com", + "phone": "(985) 414-2281", + "color": "rgb(61,94,134)" + }, + { + "index": 223, + "name": "Tami Berger", + "first": "Rocha", + "last": "Ayers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jacopobassan/73.jpg", + "expanded": false, + "guid": "e0993984-2847-4494-bcec-273869d52b83", + "integer": 68, + "date": "Sun Nov 14 1971 20:32:38 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Sit pariatur pariatur commodo magna fugiat aliquip proident qui. In tempor eu commodo id elit qui. Dolore do irure Lorem officia minim sit nostrud ad qui enim enim. Ut est nisi voluptate qui quis anim dolor sunt ad duis commodo. Fugiat nostrud minim pariatur do occaecat aliqua id proident veniam dolor nisi dolor.", + "longText": "Ad culpa eu proident mollit est duis eu ad et tempor dolore. Amet exercitation nostrud dolore nulla fugiat veniam dolor. Velit sit tempor aliquip ut officia. Excepteur commodo anim veniam esse amet tempor ipsum magna ut cillum eiusmod. Aute eiusmod in aliqua Lorem do aliqua ut id aliquip consectetur ut. Deserunt irure veniam voluptate eu esse in ea eiusmod.\r\nOfficia ipsum laboris proident mollit deserunt esse tempor laborum. Fugiat sit aliqua occaecat est dolore amet incididunt ullamco exercitation qui sit dolore ullamco. Dolore est cupidatat commodo veniam pariatur aliqua cillum cillum sunt et enim exercitation. Ut eu consequat culpa anim. Adipisicing enim et deserunt ullamco adipisicing dolor eu. Laboris velit labore labore consectetur ea pariatur quis.\r\nCulpa anim consectetur ad sint tempor aliquip. Ad magna cillum ut Lorem exercitation esse id labore sint nulla enim. Pariatur in reprehenderit consectetur mollit ullamco irure Lorem Lorem anim fugiat. Aliquip est elit sunt nisi labore. Voluptate reprehenderit excepteur ullamco tempor id ut excepteur laborum tempor. Proident dolore voluptate sunt ullamco qui sint culpa consectetur anim velit.\r\nPariatur consectetur excepteur anim elit do consectetur sint aute veniam duis quis. Ut ipsum mollit amet culpa laborum. Dolor nostrud commodo commodo deserunt dolore quis voluptate occaecat voluptate deserunt. Anim ipsum proident non eu eu ea nulla aliqua aliqua amet sit officia ut. Proident tempor ullamco elit cillum occaecat reprehenderit fugiat minim pariatur laborum anim ipsum. Velit Lorem Lorem do mollit occaecat ullamco adipisicing ut officia. Exercitation culpa magna duis proident magna velit culpa laboris eiusmod cupidatat sunt cillum.\r\n", + "address": "3 Benson Avenue", + "city": "Alfarata", + "state": "South Dakota", + "zip": 99292, + "country": "Zimbabwe", + "email": "rochaayers@scentric.com", + "phone": "(912) 557-3383", + "color": "rgb(237,77,56)" + }, + { + "index": 224, + "name": "Toni Hubbard", + "first": "Manuela", + "last": "Matthews", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benhalllondon/73.jpg", + "expanded": false, + "guid": "6a196cdc-9694-4c30-a010-23fe19d05ccf", + "integer": 64, + "date": "Wed Mar 30 1994 01:18:27 GMT-0800 (PST)", + "shortText": "amet laboris do pariatur", + "mediumText": "Quis quis ex anim ea officia anim aute. Duis nostrud adipisicing consectetur dolor aute laboris deserunt eu. Tempor reprehenderit occaecat dolor Lorem minim laboris adipisicing cupidatat veniam eu laborum amet qui. Do Lorem anim do cupidatat.", + "longText": "Sit cupidatat ullamco esse sit Lorem laboris. Nisi culpa excepteur aute ad consectetur. Ad mollit dolor incididunt nostrud elit laboris nostrud nulla officia. Exercitation cillum proident deserunt aute minim proident.\r\n", + "address": "2 Autumn Avenue", + "city": "Hebron", + "state": "Alaska", + "zip": 68123, + "country": "Azerbaijan", + "email": "manuelamatthews@scentric.com", + "phone": "(802) 454-3368", + "color": "rgb(190,58,156)" + }, + { + "index": 225, + "name": "Mcmillan Burris", + "first": "Tisha", + "last": "Reese", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/umurgdk/73.jpg", + "expanded": false, + "guid": "4c6aa7ad-4530-4d0d-a5d2-bc8d25596090", + "integer": 19, + "date": "Tue Mar 08 2005 12:31:16 GMT-0800 (PST)", + "shortText": "deserunt elit occaecat", + "mediumText": "Duis veniam voluptate sint nulla adipisicing ea eiusmod qui eiusmod sunt sunt amet labore.", + "longText": "Dolor sint nostrud velit sit deserunt dolore. Duis velit commodo do tempor enim. Ex non occaecat ea commodo sint id officia aute. Eu eiusmod irure cupidatat reprehenderit ea duis qui velit nulla quis duis. Adipisicing fugiat consequat officia quis commodo reprehenderit cillum consectetur consectetur ut. Labore elit elit proident et aute voluptate ex sit quis voluptate commodo voluptate cupidatat commodo. Nulla deserunt elit in non cillum fugiat laborum pariatur esse in.\r\nQui aliqua quis eu enim cillum occaecat labore. Qui cupidatat nisi cillum commodo. Lorem nisi eu sint esse excepteur do.\r\nIncididunt quis deserunt in dolor dolore in mollit commodo sint tempor. Ullamco pariatur magna ad amet voluptate mollit aliquip. Ad ad irure magna anim id esse exercitation ipsum velit fugiat voluptate culpa ipsum. Officia ullamco fugiat minim dolor aliqua nulla amet eu nulla commodo. Duis ea et sunt laborum.\r\nLabore excepteur non aliquip sunt ad anim. Consectetur ipsum officia amet consectetur est. Fugiat duis exercitation nulla aliqua esse tempor aliquip et sunt qui.\r\nDeserunt nostrud sunt elit enim id id pariatur proident enim duis. Duis aute cillum sunt id commodo sint aute ipsum Lorem sint magna commodo. Dolor cillum cupidatat laboris incididunt amet excepteur voluptate occaecat excepteur. Veniam et nulla non tempor.\r\n", + "address": "3 Graham Avenue", + "city": "Brenton", + "state": "Louisiana", + "zip": 80517, + "country": "French Southern Territories", + "email": "tishareese@scentric.com", + "phone": "(886) 572-2143", + "color": "rgb(148,208,184)" + }, + { + "index": 226, + "name": "Conrad Holder", + "first": "Rebecca", + "last": "Cole", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_vectorhugo/73.jpg", + "expanded": false, + "guid": "2db95cdc-541c-4e6c-bb8a-9afb329188a9", + "integer": 96, + "date": "Thu Sep 30 1971 17:22:25 GMT-0700 (PDT)", + "shortText": "cillum minim aute laboris", + "mediumText": "Anim ullamco labore do labore nisi id cillum.", + "longText": "Ipsum enim minim fugiat voluptate quis consequat eiusmod aliquip exercitation ad sit labore nostrud. Dolore qui enim irure dolore anim enim amet et cupidatat. Id nisi fugiat proident Lorem sunt sunt voluptate mollit mollit sit elit veniam sint Lorem. Consectetur pariatur commodo ullamco duis nostrud. Reprehenderit elit labore consectetur incididunt veniam quis adipisicing enim ea ut do enim.\r\nTempor in pariatur reprehenderit occaecat anim labore aliqua elit irure. Duis fugiat deserunt commodo occaecat pariatur sint. Dolore aliqua aute ut aliqua qui.\r\n", + "address": "2 Butler Place", + "city": "Grazierville", + "state": "Missouri", + "zip": 37800, + "country": "Finland", + "email": "rebeccacole@scentric.com", + "phone": "(863) 438-3293", + "color": "rgb(252,113,153)" + }, + { + "index": 227, + "name": "Finley Norman", + "first": "Kemp", + "last": "Ramsey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/traicyer/73.jpg", + "expanded": false, + "guid": "8d123ac2-6255-4f83-a056-c073a8853e3c", + "integer": 94, + "date": "Mon Nov 19 1979 06:35:50 GMT-0800 (PST)", + "shortText": "dolor id consequat occaecat", + "mediumText": "Magna cupidatat incididunt non excepteur deserunt eiusmod reprehenderit aliquip aute et. Culpa mollit laboris qui et veniam reprehenderit do eu sit id.", + "longText": "Mollit minim culpa ipsum aute ullamco. Tempor esse dolor exercitation in enim culpa ipsum sint eu laborum. Ea enim laboris veniam non duis quis. Laboris tempor culpa aliquip eiusmod tempor est ea mollit anim aute voluptate ea. Adipisicing incididunt irure cillum nisi sunt enim duis. Fugiat nostrud officia enim ea.\r\nNisi ullamco Lorem minim deserunt cillum esse officia labore anim commodo incididunt. Eu veniam consectetur ea commodo esse deserunt Lorem ex voluptate ad ad fugiat quis. Velit magna mollit eiusmod fugiat nulla ipsum cupidatat anim non eu nisi. Sint esse est ullamco eiusmod dolore et velit mollit pariatur fugiat sunt ipsum occaecat. Proident quis magna in occaecat aliqua nisi exercitation ea in.\r\n", + "address": "4 Fay Court", + "city": "Libertytown", + "state": "Kentucky", + "zip": 74614, + "country": "United Arab Emirates", + "email": "kempramsey@scentric.com", + "phone": "(983) 496-2931", + "color": "rgb(56,255,141)" + }, + { + "index": 228, + "name": "Tara Campos", + "first": "Roach", + "last": "Dodson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brunodesign1206/73.jpg", + "expanded": false, + "guid": "777f0227-f8c4-47a4-b0d6-5b0b0703a74d", + "integer": 47, + "date": "Mon Aug 12 1974 17:16:53 GMT-0700 (PDT)", + "shortText": "aliquip nostrud", + "mediumText": "Culpa aute ut ea nisi excepteur reprehenderit consectetur veniam proident deserunt adipisicing excepteur tempor. Laboris adipisicing elit eu proident amet aliquip tempor elit in ut eiusmod proident ea. Aliquip sint quis sit nulla esse ut ullamco qui nostrud nisi sit. Velit cupidatat tempor sit esse. Anim ad officia dolore do mollit et excepteur cupidatat veniam.", + "longText": "Exercitation mollit et Lorem qui aliqua ex pariatur aliquip. Quis elit amet esse eiusmod labore. Excepteur sint sunt aute qui eiusmod ullamco commodo dolore duis ea eiusmod.\r\nConsequat irure minim mollit id amet pariatur qui. Exercitation aute nostrud veniam minim Lorem commodo velit. Nostrud sunt officia dolor aliquip veniam veniam cupidatat. Nisi ut nostrud occaecat cupidatat laborum amet ad reprehenderit voluptate nulla quis nostrud in. Mollit reprehenderit qui sit esse duis laboris sunt fugiat aute qui ex eiusmod non nisi. Dolore veniam ad anim veniam cillum nulla incididunt exercitation velit.\r\nNostrud tempor deserunt est minim aute anim dolore. Minim enim cillum voluptate officia tempor tempor excepteur duis non est elit velit do. Excepteur eiusmod cillum sunt deserunt reprehenderit labore eu aliquip commodo fugiat. Consequat minim exercitation eu fugiat occaecat aliquip elit elit dolore aliquip ea ea. Aliqua ex irure cillum labore ut mollit esse veniam sit.\r\nAliqua nisi non eu ad est enim reprehenderit culpa laborum. Mollit aute esse velit est labore quis irure. Nostrud tempor labore labore aliquip laboris excepteur ad. Lorem incididunt proident pariatur laboris do. Officia magna nostrud eiusmod velit commodo incididunt magna reprehenderit ullamco. Dolore culpa culpa cillum minim voluptate in.\r\n", + "address": "2 Agate Court", + "city": "Genoa", + "state": "American Samoa", + "zip": 48715, + "country": "Portugal", + "email": "roachdodson@scentric.com", + "phone": "(878) 581-2211", + "color": "rgb(224,94,95)" + }, + { + "index": 229, + "name": "Glass Navarro", + "first": "Potter", + "last": "Lowe", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/michalhron/73.jpg", + "expanded": false, + "guid": "181d7287-30f7-4285-bfa9-e21d28869bd0", + "integer": 86, + "date": "Wed Aug 11 1971 11:38:44 GMT-0700 (PDT)", + "shortText": "eu mollit sit", + "mediumText": "Aliquip nulla excepteur elit fugiat. Aliqua do enim eu dolor ipsum nostrud exercitation et veniam ad dolor. Culpa cillum labore aliquip sint do aliqua occaecat culpa ad officia eiusmod irure qui. Occaecat nostrud ad ullamco consequat.", + "longText": "Labore adipisicing pariatur nostrud in irure quis culpa culpa proident. Nulla et est exercitation id Lorem quis in. Culpa non veniam velit do dolore culpa commodo sunt consectetur ullamco laboris. Aliqua est fugiat reprehenderit occaecat qui. Et do Lorem veniam anim cillum do ullamco tempor elit amet.\r\nAliqua exercitation in aute excepteur aute elit nisi ex minim. Proident ex quis eiusmod cupidatat laboris esse consectetur dolor Lorem reprehenderit commodo labore nostrud consectetur. Ea duis tempor proident ad ea mollit adipisicing nisi exercitation voluptate irure ipsum irure velit. Tempor anim eiusmod sint aliquip cillum consectetur deserunt.\r\nAdipisicing laboris ex eiusmod elit ipsum cupidatat anim qui dolor fugiat quis nisi culpa. Sint consequat irure laborum in enim elit irure incididunt sit. Magna consequat quis deserunt ad mollit deserunt. Non id anim consectetur culpa ut do anim do sint veniam. Est amet ea minim minim labore Lorem.\r\n", + "address": "2 Allen Avenue", + "city": "Kilbourne", + "state": "Minnesota", + "zip": 75102, + "country": "Comoros", + "email": "potterlowe@scentric.com", + "phone": "(987) 576-3068", + "color": "rgb(171,255,82)" + }, + { + "index": 230, + "name": "Amparo Pope", + "first": "Maribel", + "last": "Burks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/itskylemacey/73.jpg", + "expanded": false, + "guid": "f12a9fbc-2a4f-4fa5-8a07-f9241aa3cab1", + "integer": 91, + "date": "Sat Jun 12 2010 19:41:10 GMT-0700 (PDT)", + "shortText": "qui laborum ipsum est", + "mediumText": "Reprehenderit esse occaecat et incididunt ut eu cillum exercitation ut veniam irure. Sunt eu ullamco enim exercitation amet pariatur adipisicing nulla cillum.", + "longText": "Ipsum aliqua eu anim cupidatat tempor cillum tempor in officia anim. Culpa tempor adipisicing qui elit culpa eiusmod aliquip commodo. Dolore commodo consequat mollit ex nostrud aute incididunt officia anim incididunt reprehenderit. Labore Lorem labore minim et consectetur quis laboris incididunt pariatur esse nostrud. Dolore aute mollit esse esse.\r\nIncididunt sunt cillum nisi ea. Fugiat culpa excepteur id est magna sit proident labore commodo. Nostrud cupidatat consectetur nisi ipsum reprehenderit minim sint Lorem consequat cillum eiusmod aliqua pariatur Lorem. Proident magna est sit elit est eiusmod aliquip occaecat ullamco ea officia occaecat ut esse. Sunt tempor cupidatat enim ad reprehenderit incididunt voluptate aute dolor occaecat pariatur dolor.\r\n", + "address": "2 Gerritsen Avenue", + "city": "Westerville", + "state": "Hawaii", + "zip": 56057, + "country": "Central African Republic", + "email": "maribelburks@scentric.com", + "phone": "(843) 435-2675", + "color": "rgb(79,131,175)" + }, + { + "index": 231, + "name": "Dillard Johns", + "first": "Viola", + "last": "Pruitt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mikaeljorhult/73.jpg", + "expanded": false, + "guid": "9b589ef4-79b4-4bc1-89ea-0b50bf8f5dad", + "integer": 74, + "date": "Thu Aug 21 1980 02:27:46 GMT-0700 (PDT)", + "shortText": "id nisi", + "mediumText": "Magna excepteur laboris enim magna quis ea sint. Velit ex nisi elit reprehenderit nostrud amet quis eu cillum exercitation. Ex elit adipisicing exercitation esse.", + "longText": "Sint nisi cillum ipsum laboris. Reprehenderit irure occaecat reprehenderit excepteur adipisicing exercitation incididunt sunt dolore. Deserunt elit reprehenderit tempor elit ex ea consequat eiusmod incididunt velit et consectetur officia quis. Id sunt enim quis ex nulla in ullamco voluptate anim esse nulla. Eu excepteur dolore deserunt consectetur esse et esse do cupidatat deserunt pariatur irure deserunt sunt.\r\nNon ut tempor Lorem fugiat cupidatat nostrud pariatur veniam fugiat sunt incididunt ut. Exercitation anim officia incididunt irure nulla sunt commodo eu non. Consectetur amet est laboris amet ipsum reprehenderit non exercitation non exercitation duis ut.\r\nEu laborum dolor amet sint deserunt mollit officia est. Velit minim id et deserunt ullamco sint elit tempor dolore consectetur. Cillum aute ut consequat aliqua laboris. Fugiat aute aliqua id ipsum laboris labore labore tempor mollit sunt sint. Sunt consectetur exercitation pariatur commodo occaecat voluptate velit dolore. Exercitation consectetur dolore reprehenderit aliqua eu consequat minim dolore ullamco nisi amet deserunt amet. Occaecat amet nulla incididunt ut cupidatat.\r\nPariatur irure sunt duis Lorem ad veniam ea duis. Anim irure amet commodo proident incididunt laborum elit in voluptate occaecat minim occaecat consequat. Dolore Lorem ex ipsum nulla deserunt dolore aute. Voluptate consectetur irure ea reprehenderit mollit eiusmod occaecat sunt ea adipisicing cupidatat. Proident laboris magna duis aliquip fugiat pariatur exercitation mollit laboris amet sint ea. Sit ex ex consequat sit.\r\nExcepteur amet in id pariatur ullamco excepteur excepteur proident in. Veniam non labore nostrud culpa excepteur sit enim ad duis non commodo nulla. Minim incididunt in ad reprehenderit. Culpa esse magna duis exercitation laboris. Adipisicing eiusmod consectetur culpa cupidatat nostrud sint veniam adipisicing.\r\n", + "address": "2 Grove Street", + "city": "Matthews", + "state": "Alabama", + "zip": 12918, + "country": "Gabon", + "email": "violapruitt@scentric.com", + "phone": "(908) 451-2708", + "color": "rgb(144,170,102)" + }, + { + "index": 232, + "name": "Jeanie Huffman", + "first": "Karyn", + "last": "Edwards", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ryoseptiian/73.jpg", + "expanded": false, + "guid": "7e4ee6b2-7816-43c3-9885-e74857955244", + "integer": 20, + "date": "Sat Apr 12 1975 06:27:04 GMT-0700 (PDT)", + "shortText": "ut sint consectetur", + "mediumText": "Cillum id mollit deserunt officia sint aliquip. Do duis reprehenderit voluptate cupidatat cupidatat Lorem quis fugiat incididunt ut occaecat mollit.", + "longText": "Fugiat sunt proident consequat culpa eiusmod consequat reprehenderit enim sunt. Sit ea ex ex qui labore in. Laborum sint occaecat proident eiusmod ex sit sint commodo officia aliqua culpa. Aliqua reprehenderit exercitation labore Lorem mollit fugiat.\r\nOfficia laborum reprehenderit amet laboris ex. Ullamco qui adipisicing ex laboris do minim proident veniam. Quis voluptate deserunt elit in culpa. Lorem id sint ut exercitation non qui.\r\nEu officia do irure veniam proident in veniam irure. Dolore sint do ad amet proident velit labore incididunt pariatur proident ea velit mollit adipisicing. Anim dolor in reprehenderit sunt ea nostrud est pariatur non do ad.\r\nConsequat amet reprehenderit cillum incididunt et ullamco consequat consequat proident irure. Est veniam tempor ea ad. Reprehenderit sunt tempor exercitation laborum labore anim ad duis consequat.\r\n", + "address": "2 Linden Boulevard", + "city": "Ripley", + "state": "North Carolina", + "zip": 45918, + "country": "Cambodia", + "email": "karynedwards@scentric.com", + "phone": "(877) 447-2061", + "color": "rgb(177,244,78)" + }, + { + "index": 233, + "name": "Alfreda Neal", + "first": "Dunlap", + "last": "Mcclure", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/olivierpineda/73.jpg", + "expanded": false, + "guid": "c5d9f660-404e-4dd8-a4e9-8ebd95a6d6eb", + "integer": 83, + "date": "Sun Dec 31 1978 03:35:38 GMT-0800 (PST)", + "shortText": "fugiat aliquip", + "mediumText": "Eu nulla fugiat dolor magna commodo veniam laboris sint minim Lorem pariatur do. Do elit esse magna voluptate aute nisi cillum. Voluptate culpa aliquip ea quis sunt cillum dolore cupidatat.", + "longText": "Lorem exercitation et mollit tempor Lorem consectetur irure anim. Irure officia elit tempor consequat irure non qui labore id consequat nisi cupidatat. Voluptate labore id adipisicing mollit consequat nulla mollit aute ut occaecat sint incididunt est irure. Tempor irure eiusmod commodo cillum. Officia quis reprehenderit quis elit mollit ea pariatur eu aliquip non aute. Incididunt amet consequat ad velit consequat dolore elit velit qui ea. In qui non adipisicing id anim eiusmod commodo qui Lorem deserunt culpa adipisicing.\r\n", + "address": "2 Bogart Street", + "city": "Shrewsbury", + "state": "Connecticut", + "zip": 80957, + "country": "New Zealand", + "email": "dunlapmcclure@scentric.com", + "phone": "(913) 592-3075", + "color": "rgb(208,154,61)" + }, + { + "index": 234, + "name": "Livingston Osborn", + "first": "Mathis", + "last": "Webster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronalfred/73.jpg", + "expanded": false, + "guid": "c008efb7-14cd-4e64-96a7-2ea18524bdcd", + "integer": 54, + "date": "Sat Mar 01 1986 18:24:28 GMT-0800 (PST)", + "shortText": "ut eiusmod", + "mediumText": "Do mollit cupidatat nostrud esse ex velit esse adipisicing elit labore laboris enim anim. Magna dolore nulla cillum qui laborum et sint anim culpa non aute et. Tempor nisi eiusmod laboris ex aliquip commodo id. Eiusmod aliqua aliqua sunt non ipsum veniam aliqua consequat.", + "longText": "Elit do reprehenderit eiusmod minim quis cillum ad culpa. Cupidatat eu laborum amet duis consectetur culpa fugiat dolore aute. Lorem veniam exercitation cupidatat veniam et nulla. Veniam occaecat exercitation minim nisi dolor proident adipisicing sit non. Occaecat dolore ea minim in deserunt.\r\nSint aliqua magna Lorem nostrud nisi consequat mollit. Labore Lorem amet consectetur reprehenderit duis est ullamco velit eu officia ut labore esse id. Deserunt officia ea est enim nisi elit amet deserunt do labore duis anim. Aliquip non dolore cillum dolore dolor ex tempor velit aliqua enim.\r\nIncididunt consectetur commodo irure et ut adipisicing proident velit. Qui quis consequat id irure. Mollit amet proident irure incididunt deserunt magna.\r\nLaboris ut sint incididunt sit proident officia ex non. Consequat laborum Lorem aute voluptate est laborum quis Lorem nulla. Id velit est cillum elit adipisicing aliquip occaecat nulla nulla pariatur incididunt. In veniam occaecat occaecat ad amet culpa tempor. Non cupidatat pariatur officia et cillum adipisicing veniam elit sint. In cillum minim in occaecat adipisicing. Exercitation labore in ipsum veniam non veniam amet quis.\r\n", + "address": "4 Beverly Road", + "city": "Greer", + "state": "South Carolina", + "zip": 53490, + "country": "Lebanon", + "email": "mathiswebster@scentric.com", + "phone": "(862) 466-2481", + "color": "rgb(99,84,116)" + }, + { + "index": 235, + "name": "Stephenson Blanchard", + "first": "Kirkland", + "last": "Washington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrebay007/73.jpg", + "expanded": false, + "guid": "8dc10004-46f6-432d-ad1a-b1e2ed707ea2", + "integer": 48, + "date": "Mon Feb 20 2012 00:23:49 GMT-0800 (PST)", + "shortText": "officia", + "mediumText": "Incididunt cupidatat non esse ut adipisicing mollit aliquip ipsum eiusmod ullamco id aute nostrud veniam. Labore ipsum sunt duis elit labore dolor incididunt et consequat enim veniam. Ullamco quis nulla culpa ad labore laborum reprehenderit enim aliqua sit ad duis laboris. Proident non voluptate amet pariatur veniam laborum culpa sint anim mollit.", + "longText": "Nostrud mollit aliquip consectetur voluptate cillum. Qui labore aute adipisicing exercitation officia sint ipsum pariatur consectetur magna ad ad proident. Aute commodo esse veniam deserunt elit. Quis magna occaecat culpa eiusmod ipsum elit occaecat culpa. Excepteur laborum tempor ad consequat consectetur quis tempor anim. Mollit ex magna mollit ad voluptate excepteur.\r\nAmet incididunt veniam sunt deserunt non dolor. Tempor duis laboris laboris amet ullamco labore culpa sit id veniam aliquip adipisicing sunt nisi. Laboris et irure veniam pariatur quis anim officia ad. Ullamco labore anim ipsum labore ex velit nisi fugiat. Ea aliquip sunt fugiat eiusmod ex ullamco id reprehenderit pariatur nulla non sunt ad ullamco. Aliqua enim occaecat tempor ex eu magna eu nulla ex exercitation aute.\r\nQui excepteur dolore aute sunt. Laborum ea do reprehenderit adipisicing ullamco sunt nulla deserunt labore. Adipisicing eiusmod consequat in velit proident voluptate cillum. Ipsum eu adipisicing dolore aute dolor fugiat id deserunt aute veniam. Labore irure sunt non aliqua ut est cupidatat eiusmod ipsum occaecat veniam amet ex fugiat. Consequat voluptate et dolor sint cupidatat anim eiusmod enim veniam.\r\nIncididunt quis non quis ea exercitation. Cupidatat sint duis est commodo sit nulla aliqua ut amet quis fugiat. Amet aliquip aliqua duis minim aute fugiat. Quis veniam sunt ipsum voluptate. Laborum fugiat officia reprehenderit aliqua ad do quis consectetur laboris in consectetur amet anim proident. Deserunt veniam ut pariatur sunt magna aute sit pariatur. Cupidatat dolor mollit aliqua est occaecat dolore laboris sint.\r\n", + "address": "3 Humboldt Street", + "city": "Bath", + "state": "Michigan", + "zip": 99644, + "country": "Armenia", + "email": "kirklandwashington@scentric.com", + "phone": "(927) 536-3348", + "color": "rgb(161,139,176)" + }, + { + "index": 236, + "name": "Mary Bolton", + "first": "Shawn", + "last": "Bean", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thisisgordon/73.jpg", + "expanded": false, + "guid": "9a1ae6b3-19d6-49d3-ade8-41d80ef9a7f9", + "integer": 89, + "date": "Tue Jan 23 1973 17:15:25 GMT-0800 (PST)", + "shortText": "sunt eu amet proident tempor", + "mediumText": "Commodo elit commodo sit sit consectetur excepteur ipsum id exercitation officia amet. Enim amet occaecat reprehenderit ipsum cillum tempor.", + "longText": "Eiusmod quis enim excepteur ipsum magna mollit adipisicing proident deserunt velit ea consequat. Cillum cillum commodo sit ipsum enim ullamco elit consequat non. Ullamco adipisicing occaecat ullamco duis enim velit voluptate eiusmod quis ipsum sunt eu.\r\nEiusmod consectetur id ea ut velit ad eu. Cillum adipisicing id nostrud qui aliquip excepteur anim. Non nulla dolor proident culpa. Adipisicing ea laborum minim occaecat cupidatat sint. Id commodo ipsum laboris ullamco esse excepteur. Duis deserunt consequat proident irure sit ad fugiat.\r\nEx ipsum amet minim cillum ut mollit minim ullamco. Dolor nostrud non dolor est tempor ad ipsum. Minim pariatur ut reprehenderit Lorem.\r\nUllamco eu tempor id fugiat officia in eu incididunt ut elit culpa. Amet eiusmod tempor eiusmod sunt. Nostrud eiusmod eiusmod exercitation sit voluptate dolore. Sint magna officia et consectetur aute nostrud qui. Officia est non non laborum aliqua eu nisi magna do id. Do amet sit culpa pariatur do sunt et eiusmod veniam. Laborum voluptate est ad est eiusmod do commodo aliqua proident id incididunt.\r\n", + "address": "2 Rapelye Street", + "city": "Steinhatchee", + "state": "Maine", + "zip": 24857, + "country": "Cayman Islands", + "email": "shawnbean@scentric.com", + "phone": "(881) 597-2110", + "color": "rgb(52,77,146)" + }, + { + "index": 237, + "name": "Jaime Horn", + "first": "Nina", + "last": "Larsen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rainfalls/73.jpg", + "expanded": false, + "guid": "2d358e80-f8a9-4f14-879c-3e0d6dc7d398", + "integer": 6, + "date": "Tue Jan 10 2006 08:17:15 GMT-0800 (PST)", + "shortText": "do pariatur irure laborum qui", + "mediumText": "Magna aliquip cupidatat laborum fugiat. Et consequat est magna minim veniam mollit nulla ipsum dolore anim adipisicing enim in. Sit veniam sint velit tempor dolor laboris aute deserunt laboris incididunt aute.", + "longText": "Irure fugiat consectetur velit dolor commodo voluptate aliquip irure incididunt veniam. Cillum ipsum cupidatat qui velit consequat. Dolor laboris voluptate irure exercitation aute fugiat. Eu reprehenderit eu Lorem ex. Sint non exercitation mollit non officia nostrud non pariatur cupidatat sit enim dolor in.\r\nId qui pariatur labore commodo ex irure amet. Ex eiusmod esse consequat consequat. Irure culpa occaecat id nostrud id laborum Lorem nulla nostrud nostrud. Velit nulla voluptate cupidatat laboris do. Nisi amet anim fugiat irure esse anim exercitation non. Incididunt in id sit Lorem anim consectetur tempor ex do. Lorem pariatur do consectetur non consectetur velit magna sit eiusmod fugiat irure veniam eiusmod.\r\nMinim consequat ad nostrud sint occaecat et ea non ad et. Nostrud Lorem laborum esse amet ad dolore dolore fugiat commodo consectetur. Fugiat sint et incididunt nulla et est laborum esse ad aliqua. Quis est cupidatat sit ad reprehenderit eu commodo. Id occaecat adipisicing excepteur proident proident aliquip duis ea nostrud consectetur. Ex amet velit ad ipsum minim commodo cillum aliqua magna aliquip eiusmod nisi anim.\r\nIrure reprehenderit non aute laboris ipsum nostrud adipisicing amet voluptate. Eiusmod laborum veniam aliqua laboris consectetur do esse et mollit laborum esse. Quis excepteur officia sunt eu eiusmod enim laboris in aute. Minim nisi ipsum labore laborum. Officia eiusmod nostrud qui consectetur.\r\n", + "address": "3 Grimes Road", + "city": "Stagecoach", + "state": "Kansas", + "zip": 54299, + "country": "Italy", + "email": "ninalarsen@scentric.com", + "phone": "(833) 427-3141", + "color": "rgb(238,80,95)" + }, + { + "index": 238, + "name": "Ewing Prince", + "first": "Burch", + "last": "Hinton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eldelentes/73.jpg", + "expanded": false, + "guid": "c51adfad-516d-4572-a27b-d5029bf01030", + "integer": 70, + "date": "Sun Aug 28 2005 15:03:02 GMT-0700 (PDT)", + "shortText": "labore labore", + "mediumText": "Deserunt elit sint laborum occaecat qui mollit. In anim ad ea dolor enim nisi ut veniam. Adipisicing nisi dolore quis excepteur labore sit commodo officia qui irure elit. Ipsum commodo consectetur reprehenderit magna excepteur reprehenderit laborum culpa ullamco Lorem eu tempor eiusmod non.", + "longText": "Aliqua enim eu do veniam excepteur consequat non cillum elit consequat ipsum ea esse. Elit sit et nulla laboris ad consectetur minim ut tempor consequat do. Enim aute pariatur nostrud aliqua nulla amet adipisicing.\r\nCulpa nulla dolore exercitation dolore nulla officia. Consequat ut mollit eu cillum qui nisi consequat deserunt tempor ut fugiat. Commodo reprehenderit dolore mollit ut. Et irure consequat qui ad ipsum enim cillum in in. Aute exercitation in sunt exercitation consequat aliquip culpa ipsum deserunt esse cupidatat id.\r\nQuis deserunt quis deserunt reprehenderit sint do. Qui cillum ut minim officia amet ullamco eu nulla eu laborum ipsum excepteur. Enim aliqua occaecat commodo non anim pariatur sunt aute minim eiusmod nisi eu est. Minim esse duis nisi exercitation id dolor. Duis ullamco proident exercitation proident duis laborum irure enim ut amet.\r\n", + "address": "3 Downing Street", + "city": "Dyckesville", + "state": "Iowa", + "zip": 40075, + "country": "Lesotho", + "email": "burchhinton@scentric.com", + "phone": "(876) 448-2187", + "color": "rgb(251,248,74)" + }, + { + "index": 239, + "name": "Sharlene Bryan", + "first": "Celina", + "last": "Jimenez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/robinclediere/73.jpg", + "expanded": false, + "guid": "fc6767db-fb4a-4de3-bcc2-5a503cd8bbe6", + "integer": 40, + "date": "Mon Oct 02 1972 11:23:02 GMT-0700 (PDT)", + "shortText": "id", + "mediumText": "Exercitation exercitation exercitation proident adipisicing quis. Non aliquip dolore nostrud amet exercitation officia do elit duis nisi. Proident sit sunt magna pariatur commodo in culpa exercitation nostrud culpa adipisicing.", + "longText": "Officia adipisicing aliquip duis amet enim officia fugiat non aute exercitation. Elit ut cillum incididunt exercitation veniam id aliqua nulla voluptate reprehenderit sunt deserunt officia adipisicing. Sint ullamco eiusmod occaecat velit cupidatat ullamco pariatur ut duis fugiat. Non ullamco non aliqua cupidatat occaecat ipsum ea ut. Tempor enim ut voluptate laborum laborum reprehenderit cillum ea voluptate tempor magna ullamco enim amet. Dolor cupidatat sint do mollit.\r\n", + "address": "4 Putnam Avenue", + "city": "Fairfield", + "state": "Vermont", + "zip": 49521, + "country": "Mongolia", + "email": "celinajimenez@scentric.com", + "phone": "(853) 562-3172", + "color": "rgb(187,177,206)" + }, + { + "index": 240, + "name": "Anastasia Marquez", + "first": "Mcdonald", + "last": "Goff", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/73.jpg", + "expanded": false, + "guid": "356dd512-ac27-409d-a8ae-9a518b9f0d09", + "integer": 71, + "date": "Sun Aug 11 2013 06:10:11 GMT-0700 (PDT)", + "shortText": "eu esse tempor", + "mediumText": "Excepteur esse voluptate ut officia nulla excepteur minim enim. Dolore tempor dolore ex sunt pariatur irure.", + "longText": "Irure consequat qui labore nulla veniam. Adipisicing magna eiusmod quis anim et nostrud occaecat fugiat pariatur id esse commodo et ad. Sunt adipisicing tempor Lorem tempor eiusmod ut fugiat laboris voluptate sunt. Cillum ipsum voluptate duis veniam consequat nostrud pariatur commodo aute quis. Sit aute ex quis voluptate minim incididunt veniam. Excepteur nulla qui proident id est. Id aliquip excepteur proident culpa sunt enim non ad.\r\nNon nulla proident adipisicing non nulla adipisicing magna laboris ad duis occaecat duis velit. Sunt eiusmod nulla laboris quis adipisicing adipisicing excepteur. Ea ea labore magna labore consectetur eiusmod laboris qui dolore aliquip aliquip. Reprehenderit Lorem voluptate sunt tempor non reprehenderit officia duis quis tempor.\r\nEt laboris incididunt excepteur laborum ad eu aliqua commodo pariatur. Esse in fugiat elit voluptate ad excepteur magna cillum ipsum ipsum et non fugiat ipsum. Adipisicing ut ut ex in qui fugiat incididunt exercitation excepteur consequat adipisicing.\r\nExcepteur mollit amet enim dolore ad laborum esse exercitation. Aute deserunt ullamco culpa nostrud dolore sunt nisi laboris esse Lorem culpa irure. Irure consectetur nulla Lorem laborum enim ut ut incididunt id pariatur. Est eiusmod velit ad magna deserunt excepteur sunt ex tempor elit aliquip amet. Exercitation laborum sit commodo nostrud velit pariatur Lorem cupidatat exercitation.\r\nEiusmod ex mollit aute sint aliqua nulla ea irure eiusmod dolore proident aute officia voluptate. Ipsum consequat sunt ea aliquip ea enim sint irure Lorem. Incididunt enim consequat mollit amet et occaecat qui est cupidatat ad. Cupidatat voluptate consequat cupidatat et amet in. Cupidatat id laboris duis nostrud et reprehenderit fugiat. Sit laborum non duis et.\r\n", + "address": "3 Corbin Place", + "city": "Nadine", + "state": "Nebraska", + "zip": 41484, + "country": "Germany", + "email": "mcdonaldgoff@scentric.com", + "phone": "(891) 532-3564", + "color": "rgb(165,152,170)" + }, + { + "index": 241, + "name": "Faith Hayes", + "first": "Lessie", + "last": "Garza", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hsinyo23/73.jpg", + "expanded": false, + "guid": "97574a4a-fc23-4e79-add5-5296baa4336a", + "integer": 36, + "date": "Mon Oct 29 1984 10:50:51 GMT-0800 (PST)", + "shortText": "enim consequat velit occaecat", + "mediumText": "Exercitation aute eu cupidatat labore laboris ut incididunt voluptate quis sint sit. Enim id incididunt officia aliqua adipisicing ipsum. Et duis laboris tempor velit fugiat.", + "longText": "Magna do nisi exercitation qui. Amet nostrud magna magna deserunt Lorem consectetur consectetur. Laborum exercitation magna occaecat ex commodo. Proident reprehenderit Lorem et fugiat deserunt eiusmod proident pariatur aute sint dolor. Nisi deserunt labore mollit labore eiusmod. Culpa ad aute deserunt occaecat fugiat. Ad qui labore exercitation do sint aliquip culpa ex nulla enim laboris voluptate ad.\r\nLaborum proident sit laborum excepteur. Eiusmod id in dolore sunt pariatur laboris esse. Consectetur in officia non ea aute id occaecat adipisicing nulla velit. Qui reprehenderit cupidatat quis quis elit aute tempor amet incididunt incididunt qui pariatur.\r\nConsequat veniam labore laborum cillum nostrud. Aute sit enim tempor occaecat magna ea reprehenderit consectetur sint consectetur cillum. Qui proident eiusmod quis quis duis. Ex ex laboris elit culpa laborum laboris dolore nisi id ipsum pariatur quis cupidatat. Velit id fugiat Lorem veniam. Elit pariatur culpa incididunt eiusmod anim ullamco dolore. Magna deserunt cillum non cupidatat nulla exercitation ullamco ipsum adipisicing consequat pariatur.\r\n", + "address": "2 Billings Place", + "city": "Fowlerville", + "state": "Florida", + "zip": 63875, + "country": "Thailand", + "email": "lessiegarza@scentric.com", + "phone": "(853) 436-2778", + "color": "rgb(129,67,86)" + }, + { + "index": 242, + "name": "Berg Ray", + "first": "Greer", + "last": "Turner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/axel/73.jpg", + "expanded": false, + "guid": "0fbc2172-5658-40d0-babd-9610530bf605", + "integer": 78, + "date": "Thu Apr 29 2004 02:33:23 GMT-0700 (PDT)", + "shortText": "reprehenderit labore quis voluptate magna", + "mediumText": "Veniam et magna fugiat ut ex pariatur deserunt non. Ullamco dolor esse esse ut laboris reprehenderit eiusmod amet enim. Proident sit cupidatat est consequat ex excepteur fugiat cupidatat aliquip. Veniam non sit dolor ea proident consequat elit nulla elit incididunt labore ullamco. Ut proident incididunt laboris esse.", + "longText": "Dolor tempor duis veniam excepteur nulla nostrud. Officia consectetur est adipisicing do duis quis laborum. Tempor proident proident qui consequat eu. Voluptate magna adipisicing non nulla non dolor cupidatat fugiat irure. Pariatur Lorem culpa ex sunt cupidatat. Non incididunt cupidatat mollit esse Lorem. Est et laborum enim et laborum officia non amet aliquip deserunt.\r\nMinim cupidatat eiusmod cupidatat ad amet incididunt deserunt duis velit excepteur ipsum culpa qui. Tempor eiusmod incididunt voluptate dolore id dolor dolor. Eu enim deserunt eu laborum sunt excepteur excepteur aliquip exercitation occaecat nulla magna. Est officia proident irure quis consectetur. Ut magna veniam aliquip laborum fugiat ex ea ut sint laboris sint. Quis exercitation sit nostrud proident sint et do cillum sunt duis excepteur anim aute non.\r\n", + "address": "2 Schermerhorn Street", + "city": "Century", + "state": "New Jersey", + "zip": 72260, + "country": "Seychelles", + "email": "greerturner@scentric.com", + "phone": "(962) 538-2574", + "color": "rgb(215,92,57)" + }, + { + "index": 243, + "name": "Gates Bush", + "first": "Cohen", + "last": "Sweet", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/traneblow/73.jpg", + "expanded": false, + "guid": "6dd5c482-2b39-4e90-9158-ad1ef6027185", + "integer": 69, + "date": "Tue Nov 02 1982 15:17:04 GMT-0800 (PST)", + "shortText": "anim culpa culpa", + "mediumText": "Commodo et fugiat adipisicing voluptate est. Occaecat laborum ad reprehenderit in nulla dolore. Quis aute excepteur fugiat aute laboris. Ex sint consectetur dolore magna exercitation velit reprehenderit labore irure proident aliquip cupidatat aute. Ad eiusmod anim id magna elit aliqua.", + "longText": "Proident amet commodo elit sunt aliqua et irure officia. Eu quis pariatur dolore mollit esse cupidatat ut do. Officia laborum laboris quis ullamco minim adipisicing proident ullamco occaecat elit amet. Ad magna ea est dolore. Nulla irure nostrud et commodo veniam ad veniam culpa culpa adipisicing velit qui enim nostrud. Nostrud labore labore proident voluptate do quis deserunt aute ad minim velit amet ad cillum.\r\nIncididunt in fugiat incididunt tempor reprehenderit commodo ipsum aute labore laboris duis. Deserunt fugiat fugiat ipsum minim dolore ex excepteur sit cillum duis sint velit aute est. Adipisicing occaecat ut esse ullamco sint enim eu magna tempor laboris. Pariatur aute nisi id dolore mollit do occaecat ad. Consequat proident eiusmod tempor veniam incididunt commodo culpa eiusmod minim enim duis aliquip. Dolore irure eiusmod laboris nostrud ipsum laborum Lorem. Amet proident enim exercitation id duis dolor officia sunt.\r\nIn ea fugiat pariatur mollit proident fugiat do labore id Lorem aute. Nostrud sit duis minim duis laborum laboris adipisicing cillum veniam adipisicing commodo exercitation ex in. Aliqua enim velit consequat do tempor enim laborum dolore sit. Non quis irure laborum sunt cupidatat exercitation culpa reprehenderit id excepteur ullamco magna dolor aute. Nostrud nisi amet pariatur esse dolor elit aliquip dolore esse do dolor officia laboris officia. Anim voluptate sint quis sit veniam non aliqua ipsum proident qui nostrud mollit. Consectetur sunt duis ex tempor laborum eiusmod velit commodo aute laborum.\r\nAliqua commodo commodo non do occaecat esse culpa minim fugiat in labore consequat reprehenderit proident. Laboris pariatur proident ut et veniam cillum Lorem consequat qui eiusmod. Enim veniam nisi enim aliquip exercitation cillum fugiat.\r\nProident dolor ipsum aliqua amet sit do labore aute commodo. Laboris fugiat id laboris occaecat. Qui dolor id aliqua elit ex non adipisicing culpa tempor duis et laboris officia. Eu dolore pariatur est voluptate incididunt ea proident duis non incididunt minim et nulla ex. Exercitation excepteur incididunt fugiat id anim deserunt consequat nisi veniam laboris officia consectetur fugiat. Eu excepteur esse anim reprehenderit dolor enim reprehenderit aliqua consectetur cillum quis. Nisi sint quis incididunt commodo duis sit deserunt dolor laborum dolore labore ex commodo cillum.\r\n", + "address": "4 Hunterfly Place", + "city": "Osage", + "state": "Wisconsin", + "zip": 10229, + "country": "Chad", + "email": "cohensweet@scentric.com", + "phone": "(961) 506-3669", + "color": "rgb(223,99,51)" + }, + { + "index": 244, + "name": "Rosella Sharpe", + "first": "Hilary", + "last": "Jacobs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thimo_cz/73.jpg", + "expanded": false, + "guid": "b8a9b448-8f16-4879-88a7-b438a45e7dcc", + "integer": 36, + "date": "Mon Feb 09 1998 12:55:02 GMT-0800 (PST)", + "shortText": "labore consectetur", + "mediumText": "Ullamco deserunt sunt consectetur irure adipisicing nostrud incididunt incididunt cillum. Amet aute dolor labore pariatur aliquip reprehenderit sunt.", + "longText": "Nisi ad esse nulla reprehenderit elit. Occaecat amet qui consectetur quis occaecat reprehenderit ea ad ex fugiat nulla. Voluptate et velit ullamco aliquip adipisicing qui pariatur deserunt deserunt minim. Amet elit ullamco ea adipisicing aute enim non culpa quis officia exercitation pariatur.\r\nMollit qui ut nulla elit. Consectetur qui mollit adipisicing aute ad irure culpa reprehenderit proident labore. Lorem aliquip consequat tempor laborum duis id dolore aliqua. Ullamco culpa culpa adipisicing duis labore irure proident qui elit proident dolor dolor sit. Nisi nisi velit dolore ipsum Lorem cillum aute occaecat excepteur labore enim exercitation mollit non.\r\nCillum consectetur deserunt duis nulla pariatur laborum adipisicing. Nisi magna duis irure aute irure proident tempor aliquip quis sunt amet. Veniam excepteur laborum culpa nostrud id et consequat ut aliqua velit. In quis enim sunt minim esse est proident elit consequat. Ipsum id ad pariatur officia pariatur cupidatat qui sunt. Irure ut officia magna mollit et quis labore amet esse deserunt tempor Lorem duis. Duis exercitation officia ea est ipsum sunt.\r\nEiusmod Lorem officia velit elit cupidatat aliqua occaecat non aute ut nulla do pariatur. Mollit enim ad officia eiusmod sint qui ex non incididunt. Eiusmod irure voluptate aliquip nisi dolore adipisicing incididunt Lorem aute minim ea labore aute. Occaecat fugiat esse velit sit cupidatat non occaecat ex laborum qui magna enim. Laboris eu nisi nostrud incididunt est. Id dolore in adipisicing non et velit exercitation Lorem elit excepteur deserunt.\r\n", + "address": "2 Emerald Street", + "city": "Basye", + "state": "Washington", + "zip": 84048, + "country": "Uruguay", + "email": "hilaryjacobs@scentric.com", + "phone": "(850) 481-3931", + "color": "rgb(175,197,147)" + }, + { + "index": 245, + "name": "Ballard Mason", + "first": "Nell", + "last": "Harper", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/majksner/73.jpg", + "expanded": false, + "guid": "4367e70e-505b-4a00-b33c-8ad5dbef5274", + "integer": 22, + "date": "Tue Feb 21 1995 19:57:05 GMT-0800 (PST)", + "shortText": "labore incididunt", + "mediumText": "Sit culpa ipsum eu nulla quis id in nostrud tempor officia tempor voluptate enim. Anim ut ullamco reprehenderit eu. Enim veniam do labore eiusmod enim elit dolor.", + "longText": "Duis do esse cillum ea esse ad. Quis incididunt nulla commodo eiusmod. Magna ipsum reprehenderit sit dolor non esse culpa anim aliquip. Esse adipisicing nostrud pariatur consectetur aliqua reprehenderit ad. Cupidatat incididunt cupidatat sit proident consequat enim duis consequat mollit elit deserunt qui. Deserunt dolor do nisi quis laboris dolor irure esse excepteur. Ex consequat incididunt id et in esse officia laboris nostrud.\r\nDolor labore nulla nisi ex sit nisi qui sit aliqua dolore elit dolore incididunt. Laboris qui do duis ipsum pariatur nulla magna. Elit reprehenderit veniam reprehenderit laboris proident amet mollit sunt minim et deserunt sint nulla minim. Nisi sunt eu aute ea ut pariatur est magna voluptate tempor anim. Do id laboris Lorem magna commodo voluptate nostrud magna cupidatat proident irure nostrud laboris sunt.\r\nQui occaecat excepteur ea magna quis enim magna consectetur nostrud consequat non veniam tempor nostrud. Mollit et ex aute aute consectetur veniam aute ut sunt culpa eu. Ullamco amet voluptate adipisicing nulla consectetur in. Minim excepteur enim aliquip nisi velit duis ea. Consectetur minim fugiat nostrud reprehenderit minim et proident id pariatur Lorem proident ipsum eiusmod. Ea nulla enim ullamco aute do. Laborum consequat sint ipsum consectetur.\r\nIrure ullamco dolore aute occaecat excepteur proident dolor. Nulla ut sunt adipisicing dolor elit duis sit laboris commodo do est. Do cillum est voluptate tempor mollit officia cupidatat ad pariatur elit officia ullamco. Eu esse aute officia est duis commodo aliquip ipsum officia cupidatat do magna Lorem. Cillum incididunt adipisicing minim aliquip ea esse adipisicing laborum proident deserunt. Deserunt Lorem excepteur enim id nisi pariatur tempor eiusmod proident nisi.\r\n", + "address": "2 Boynton Place", + "city": "Gerber", + "state": "Oregon", + "zip": 35064, + "country": "Burkina Faso", + "email": "nellharper@scentric.com", + "phone": "(978) 583-3962", + "color": "rgb(114,234,175)" + }, + { + "index": 246, + "name": "Alexis Kramer", + "first": "Koch", + "last": "Carpenter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/angelcreative/73.jpg", + "expanded": false, + "guid": "27db3441-a52c-4633-9e2e-c1b68bbab9ab", + "integer": 18, + "date": "Wed May 05 2010 06:16:29 GMT-0700 (PDT)", + "shortText": "amet fugiat ut", + "mediumText": "Ad cupidatat amet ullamco ullamco officia cillum sit id duis non non. Eiusmod pariatur ea ipsum et exercitation enim minim eu nostrud voluptate. Reprehenderit nostrud nisi aliquip elit ea culpa laborum irure aliqua deserunt labore ea. Minim occaecat id quis consectetur irure nostrud exercitation laborum. Nostrud est nostrud anim reprehenderit enim dolore irure laborum enim est deserunt incididunt laboris magna.", + "longText": "Magna ex exercitation dolor ex et sit enim fugiat ad sint velit officia sunt. Sint officia dolor fugiat minim id amet dolore commodo reprehenderit aute veniam. Eu non do irure proident consequat velit pariatur amet voluptate dolor exercitation. Deserunt sunt sunt sunt eiusmod qui culpa irure anim dolor aute consequat adipisicing. Enim velit est esse ea laboris Lorem do.\r\nLabore est aliqua exercitation minim et. Proident occaecat eu aliquip minim sit mollit Lorem. Lorem aute consectetur incididunt ullamco ut et labore laboris labore. Exercitation aute ullamco velit duis.\r\nUt velit tempor proident ut. Laboris cillum enim ut aliqua amet minim et do cupidatat elit commodo veniam aliquip culpa. Duis minim consectetur proident excepteur aliquip sint quis ex sunt laboris veniam deserunt commodo aute. Commodo ipsum laborum quis exercitation nostrud aute ad laboris. Anim sint sit et minim amet officia. Pariatur labore exercitation proident veniam duis sit exercitation cupidatat cillum Lorem ea duis non.\r\nEa veniam ad voluptate labore dolore esse in. Occaecat et est sint sint tempor non culpa veniam proident elit eiusmod proident adipisicing. Proident cupidatat et nulla amet nulla.\r\nEx est duis consequat proident est. Adipisicing enim elit labore eu in ipsum qui consectetur do veniam labore. Nostrud ullamco mollit cillum Lorem labore labore mollit non amet voluptate ullamco magna. Ex id quis eiusmod eiusmod Lorem est. Velit Lorem velit pariatur fugiat irure ad est cillum cupidatat tempor sit exercitation. Lorem ea cillum aliqua nisi veniam nostrud excepteur. Magna cillum aliquip anim irure dolor.\r\n", + "address": "2 Hudson Avenue", + "city": "Hiseville", + "state": "Illinois", + "zip": 75977, + "country": "Greenland", + "email": "kochcarpenter@scentric.com", + "phone": "(912) 523-3269", + "color": "rgb(254,230,133)" + }, + { + "index": 247, + "name": "Larson Mcguire", + "first": "Earnestine", + "last": "Curry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcus3de/73.jpg", + "expanded": false, + "guid": "0e87dcfe-dfe9-4c49-9da7-37fac49566fb", + "integer": 69, + "date": "Wed Apr 27 1977 14:45:51 GMT-0700 (PDT)", + "shortText": "aute quis minim laborum", + "mediumText": "Fugiat deserunt ea do sint pariatur anim.", + "longText": "Ex ullamco ut irure quis dolore aliqua ex reprehenderit culpa non do. Amet mollit dolore esse anim velit. Dolore et laborum excepteur voluptate deserunt voluptate occaecat officia consequat veniam ad aliquip. Nisi commodo in Lorem consequat ut irure fugiat quis deserunt dolore.\r\nEiusmod tempor in reprehenderit ut ut do in labore minim consectetur laboris sunt ullamco. Eu ut fugiat enim magna elit proident. Velit laborum ipsum pariatur laborum elit pariatur quis.\r\n", + "address": "3 Blake Court", + "city": "Riceville", + "state": "West Virginia", + "zip": 44569, + "country": "Fiji", + "email": "earnestinecurry@scentric.com", + "phone": "(947) 457-2441", + "color": "rgb(192,84,251)" + }, + { + "index": 248, + "name": "Elisa Gilbert", + "first": "Opal", + "last": "Rush", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lizpradal/73.jpg", + "expanded": false, + "guid": "af31a9db-6478-45f9-b053-48ea4d2c7ad2", + "integer": 12, + "date": "Sun Aug 17 1986 13:15:07 GMT-0700 (PDT)", + "shortText": "et nulla incididunt in in", + "mediumText": "Occaecat cupidatat proident cupidatat officia exercitation veniam exercitation nisi.", + "longText": "Ex enim magna pariatur eiusmod aliqua ad id sit in culpa adipisicing sint ut anim. Ex duis consequat non voluptate exercitation qui nostrud dolore quis ipsum esse. Exercitation nisi tempor ut labore fugiat incididunt cupidatat non sunt esse. Anim mollit nisi ut veniam amet voluptate labore eiusmod adipisicing fugiat ullamco aute amet duis. Ea fugiat dolore ipsum dolore ex velit laborum aliquip eu mollit minim. Eu non dolor adipisicing sint elit labore eiusmod et aliqua.\r\nIpsum cupidatat laborum consequat excepteur quis fugiat ex veniam sint tempor ullamco sit ut aliquip. Magna ex exercitation duis proident anim ipsum esse commodo in dolor irure. Ullamco occaecat culpa elit aliquip do.\r\n", + "address": "2 Belmont Avenue", + "city": "Manitou", + "state": "Mississippi", + "zip": 31901, + "country": "Viet Nam", + "email": "opalrush@scentric.com", + "phone": "(944) 429-3751", + "color": "rgb(73,188,227)" + }, + { + "index": 249, + "name": "Richardson Pena", + "first": "Lauri", + "last": "Macias", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mironcatalin/73.jpg", + "expanded": false, + "guid": "d2190b02-e2b9-47da-9a5d-43ab822a4242", + "integer": 1, + "date": "Sat Apr 25 1981 19:27:16 GMT-0800 (PST)", + "shortText": "dolor culpa", + "mediumText": "Veniam excepteur elit esse ex mollit. Aliquip adipisicing consectetur occaecat aliquip consectetur nisi ut est ipsum tempor cillum eiusmod excepteur.", + "longText": "Sint labore cillum sit elit consequat est sunt voluptate. Irure velit enim anim elit ea culpa ut consequat aute magna dolore. Sit reprehenderit elit eiusmod in enim. Sint elit officia laborum qui do eiusmod voluptate sunt et consequat. Duis laboris consequat culpa excepteur sunt qui irure est cupidatat eiusmod dolor mollit. Eiusmod est irure quis ut ad aliqua consectetur fugiat consectetur.\r\nDeserunt voluptate laboris occaecat pariatur elit. Ad eiusmod pariatur incididunt cillum irure duis labore labore. Nostrud nostrud minim aliquip nostrud eiusmod sunt ipsum reprehenderit labore enim ea tempor. Nostrud laboris mollit enim eu labore deserunt.\r\nOfficia non reprehenderit laborum quis cupidatat sit. Consectetur dolore est non tempor Lorem sint eu ea cupidatat occaecat dolor. Culpa sunt aliquip id dolore mollit aliquip esse qui culpa in amet sit incididunt. Ullamco est laborum aliqua incididunt. Aliquip id mollit minim proident sit.\r\nCulpa nostrud culpa deserunt culpa Lorem laborum minim sit sit. Ullamco qui do sunt est duis. Voluptate magna deserunt ipsum esse laborum dolor cillum. Magna cillum laborum sit veniam.\r\nQuis enim deserunt et mollit adipisicing. Eu sunt in esse adipisicing eu consequat magna dolore commodo labore culpa elit. Consequat elit fugiat ullamco in non dolor. Eu irure adipisicing laborum nisi commodo ipsum consequat officia ipsum in dolore laboris culpa.\r\n", + "address": "2 Atkins Avenue", + "city": "Bynum", + "state": "Rhode Island", + "zip": 45405, + "country": "France, Metropolitan", + "email": "laurimacias@scentric.com", + "phone": "(889) 487-2711", + "color": "rgb(140,77,221)" + }, + { + "index": 250, + "name": "James Christensen", + "first": "Atkinson", + "last": "White", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/michaelbowden3/73.jpg", + "expanded": false, + "guid": "5b8652f2-a3c4-4f58-b4ae-df90d92002f2", + "integer": 99, + "date": "Tue Jan 30 1979 23:03:56 GMT-0800 (PST)", + "shortText": "veniam mollit ad nisi", + "mediumText": "Labore veniam anim aliqua duis deserunt dolor aliquip. Excepteur est non labore eiusmod id duis. Exercitation occaecat occaecat excepteur sit sint sit nisi labore ex tempor consequat duis.", + "longText": "Excepteur laborum velit eu irure dolor magna sit proident. Sint minim cillum commodo pariatur anim reprehenderit laborum occaecat reprehenderit pariatur ullamco. Cupidatat consectetur est incididunt enim exercitation.\r\nDeserunt tempor aliqua velit laboris qui dolore nulla culpa. Minim exercitation ut minim laborum anim aliquip minim eu dolore veniam. Ut anim do elit fugiat fugiat ad dolor ea sit velit qui dolor. Excepteur voluptate ea anim ullamco labore tempor aliqua sunt cillum occaecat cupidatat irure tempor. Consectetur fugiat elit ullamco nisi reprehenderit exercitation. Ipsum adipisicing ullamco laboris pariatur consectetur eu amet reprehenderit. Veniam aliqua sit aute pariatur sit.\r\nAdipisicing esse ad non laboris irure dolore Lorem adipisicing. Voluptate pariatur sit et eiusmod. Est do aute elit ipsum. Non velit irure magna amet sunt ex.\r\nVeniam sint labore velit ad eu velit deserunt occaecat elit exercitation dolor. Aute proident sit nisi incididunt laborum consectetur ea minim nisi anim mollit do ipsum. Consectetur ullamco nulla eu elit non ex pariatur magna labore. Nisi reprehenderit Lorem quis commodo sit elit sunt eu occaecat ad velit excepteur irure. Exercitation reprehenderit aute consectetur velit dolore incididunt elit quis anim dolore aliqua laboris ex.\r\nDo ut in mollit sunt irure id enim cillum nulla elit cupidatat. Duis nulla enim mollit in in incididunt est anim occaecat commodo ea magna. Tempor enim excepteur nostrud nostrud non nostrud non esse. In id incididunt labore pariatur veniam ipsum Lorem.\r\n", + "address": "4 Kay Court", + "city": "Veyo", + "state": "Georgia", + "zip": 60806, + "country": "Uganda", + "email": "atkinsonwhite@scentric.com", + "phone": "(912) 432-3782", + "color": "rgb(177,214,156)" + }, + { + "index": 251, + "name": "Berry Greene", + "first": "Carey", + "last": "Hawkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bermonpainter/73.jpg", + "expanded": false, + "guid": "6f4e5523-3a13-4b9c-98c4-99a1f8a24e7e", + "integer": 50, + "date": "Tue Sep 23 1980 15:29:12 GMT-0700 (PDT)", + "shortText": "id pariatur eu ut dolor", + "mediumText": "Mollit aute aliquip veniam irure do enim commodo excepteur culpa occaecat commodo eiusmod in reprehenderit. Non reprehenderit sint officia aliqua. Nostrud fugiat minim pariatur dolore in minim ea ut cillum do pariatur mollit proident.", + "longText": "Ad amet sunt ea aliqua incididunt ea non tempor cillum et et tempor. Esse ullamco consectetur tempor fugiat fugiat fugiat. Ex elit consequat nisi quis ut anim cillum sit ipsum esse. Tempor ex adipisicing ea culpa aute do ipsum et. Ipsum eu fugiat velit dolore exercitation sunt Lorem minim dolore quis ut nulla fugiat. Ut consectetur commodo aute nulla reprehenderit voluptate dolor fugiat ullamco.\r\nQui excepteur fugiat incididunt Lorem exercitation dolore dolore magna qui. Eiusmod non adipisicing sit et nisi occaecat pariatur sint elit esse et aute laborum pariatur. Commodo sit ut esse irure incididunt non veniam labore occaecat commodo aliquip.\r\nCommodo incididunt ex deserunt exercitation reprehenderit. Exercitation consequat amet cillum incididunt enim aute nostrud. Sit esse reprehenderit nulla Lorem magna in.\r\nTempor fugiat ipsum sint excepteur enim magna fugiat irure fugiat ad nulla anim minim. Exercitation et veniam exercitation aute nulla do quis reprehenderit sint nostrud duis Lorem qui enim. Cillum pariatur aliqua et ex irure exercitation elit id minim nostrud in. Eiusmod do fugiat veniam cupidatat deserunt amet velit enim adipisicing.\r\nCupidatat est et labore fugiat eu elit consectetur et culpa voluptate. Exercitation dolor excepteur veniam eiusmod ullamco laboris et deserunt velit proident aliquip. Adipisicing Lorem do amet sunt enim. Pariatur labore qui aliquip elit excepteur culpa nulla velit ea laborum consequat commodo ipsum proident. Est est reprehenderit incididunt sint officia ex quis dolor enim et veniam.\r\n", + "address": "2 Tillary Street", + "city": "Fivepointville", + "state": "New Mexico", + "zip": 85127, + "country": "Antarctica", + "email": "careyhawkins@scentric.com", + "phone": "(868) 519-2817", + "color": "rgb(74,226,202)" + }, + { + "index": 252, + "name": "Melva Frederick", + "first": "Haley", + "last": "Morris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/parasenak/73.jpg", + "expanded": false, + "guid": "0280cd72-ee64-4c9c-aa16-67f76f572d10", + "integer": 13, + "date": "Thu Aug 27 1992 14:36:33 GMT-0700 (PDT)", + "shortText": "magna incididunt duis adipisicing consequat", + "mediumText": "Ea exercitation voluptate mollit consequat voluptate eu minim. Quis aute ullamco labore reprehenderit non elit laboris aute sunt mollit mollit sunt. Do velit ad enim nulla reprehenderit laboris mollit.", + "longText": "Ullamco eu cupidatat eiusmod aute. Ex non aute ea fugiat duis qui velit. Culpa est duis consequat pariatur ad dolor exercitation. Elit nostrud cillum officia esse incididunt. Excepteur et in ex nulla eiusmod anim aliqua qui Lorem do amet. Anim voluptate sint culpa aute esse exercitation ex proident ullamco elit deserunt duis. Qui culpa tempor exercitation anim ipsum.\r\nReprehenderit cupidatat est pariatur adipisicing ad laboris cillum aute laboris adipisicing exercitation fugiat. Nisi reprehenderit fugiat nulla et proident ut enim excepteur commodo. Laboris laborum quis fugiat consequat et do. Minim adipisicing reprehenderit tempor laborum voluptate occaecat incididunt in aliqua ipsum reprehenderit est duis deserunt. Mollit cillum cupidatat Lorem incididunt duis laborum aute incididunt do. Nisi ea amet excepteur sit aliqua nulla. Sunt fugiat consequat commodo nostrud deserunt sunt nostrud ad esse dolor.\r\n", + "address": "2 Anthony Street", + "city": "Vivian", + "state": "Arizona", + "zip": 87173, + "country": "Kiribati", + "email": "haleymorris@scentric.com", + "phone": "(914) 569-3745", + "color": "rgb(77,218,207)" + }, + { + "index": 253, + "name": "Moses Leach", + "first": "Margret", + "last": "Baird", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/duyvk/73.jpg", + "expanded": false, + "guid": "2da52347-1212-4146-ad5b-1d770195f05c", + "integer": 57, + "date": "Sat May 31 1980 05:14:11 GMT-0700 (PDT)", + "shortText": "veniam voluptate minim elit amet", + "mediumText": "Voluptate in elit laborum commodo quis do proident pariatur aliqua velit exercitation cupidatat consequat. Sint quis ex aliqua velit commodo non cillum amet magna velit laborum amet reprehenderit ipsum.", + "longText": "Mollit nostrud cillum duis do ipsum duis cillum sint veniam ipsum. Qui ad ex ad id do labore enim proident est aute. Lorem quis pariatur pariatur id dolore id. Nulla esse ullamco eu enim eu Lorem et adipisicing est nisi eiusmod proident. Nostrud deserunt duis qui ad ad. Adipisicing esse aute amet consectetur aliquip incididunt laboris id est quis.\r\nEsse sint cillum commodo deserunt elit anim excepteur elit nostrud exercitation consequat ad. Aliqua consequat ea minim sunt dolor nulla elit sunt. Ut id do culpa amet adipisicing aliqua ipsum. Reprehenderit velit ad aliquip ullamco mollit elit ea. Deserunt quis labore aliquip culpa id cupidatat irure duis aliqua nostrud tempor.\r\n", + "address": "2 Orange Street", + "city": "Rosine", + "state": "Texas", + "zip": 86725, + "country": "Ecuador", + "email": "margretbaird@scentric.com", + "phone": "(991) 577-2455", + "color": "rgb(212,247,87)" + }, + { + "index": 254, + "name": "Mindy Mendoza", + "first": "Valdez", + "last": "Mack", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/abdullindenis/73.jpg", + "expanded": false, + "guid": "c19cb89a-c62c-4a3b-a815-dc686df99a69", + "integer": 97, + "date": "Sun Sep 28 2008 12:27:09 GMT-0700 (PDT)", + "shortText": "aliqua laborum", + "mediumText": "Ea commodo et minim id consectetur ipsum ad sit dolor. Laborum laborum in irure ex cillum sunt officia. Ullamco quis cupidatat labore occaecat amet elit consequat aute aliquip esse.", + "longText": "Cillum eu mollit ex Lorem est duis sint incididunt est ullamco. Pariatur amet sit sunt et sint officia dolor elit aliqua laboris officia. Sunt duis non sint ea ut adipisicing ut Lorem ut velit do ad culpa mollit. Irure magna elit dolore do officia mollit commodo id aute. Culpa nostrud esse officia exercitation.\r\nAliqua aliqua aute reprehenderit aute cupidatat veniam. Aliquip sint veniam deserunt amet. Quis adipisicing tempor id officia non. Laborum tempor cupidatat reprehenderit ut reprehenderit quis proident veniam ipsum. Mollit voluptate officia exercitation proident enim nisi eiusmod veniam do id sint eu.\r\n", + "address": "3 Woodside Avenue", + "city": "Skyland", + "state": "District Of Columbia", + "zip": 24057, + "country": "Bulgaria", + "email": "valdezmack@scentric.com", + "phone": "(831) 594-3993", + "color": "rgb(223,79,247)" + }, + { + "index": 255, + "name": "Charles Sosa", + "first": "Ashley", + "last": "Adams", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/umutahmet29/73.jpg", + "expanded": false, + "guid": "26a576e9-cccf-480d-8ed3-bb6f7da211ef", + "integer": 89, + "date": "Thu Apr 03 1975 03:38:57 GMT-0700 (PDT)", + "shortText": "anim adipisicing", + "mediumText": "Do minim excepteur aliquip id sit non laboris sint reprehenderit. Consectetur eu pariatur et commodo velit Lorem labore consequat quis reprehenderit commodo nisi. Adipisicing deserunt consectetur non reprehenderit deserunt elit esse elit culpa sunt.", + "longText": "Et ea anim tempor labore magna tempor est deserunt eu ullamco ipsum elit. Dolore nulla ipsum do exercitation. Sit fugiat pariatur ullamco sit tempor amet reprehenderit consectetur magna.\r\nCommodo do exercitation amet deserunt eu ea mollit. Sint labore sint occaecat reprehenderit cillum sint qui pariatur et deserunt adipisicing. Mollit excepteur qui minim culpa tempor ea. Qui esse labore dolore occaecat. Cillum duis dolor id cupidatat veniam non pariatur voluptate deserunt laboris. Quis proident occaecat veniam nulla occaecat proident occaecat ullamco. Aliqua laborum aliqua enim mollit quis.\r\n", + "address": "3 Kensington Street", + "city": "Dana", + "state": "Virgin Islands", + "zip": 96003, + "country": "American Samoa", + "email": "ashleyadams@scentric.com", + "phone": "(903) 572-3575", + "color": "rgb(125,107,131)" + }, + { + "index": 256, + "name": "Turner Franco", + "first": "Norman", + "last": "George", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pinceladasdaweb/73.jpg", + "expanded": false, + "guid": "ab082048-531a-4b8d-8801-29979233e2c1", + "integer": 41, + "date": "Sun Nov 19 1989 19:54:28 GMT-0800 (PST)", + "shortText": "consequat mollit qui aute laboris", + "mediumText": "Sint in reprehenderit commodo ex cillum ipsum est Lorem dolore amet. Eu consequat nisi nostrud est velit et ex cupidatat quis sint duis do. Irure eiusmod amet esse occaecat proident occaecat sit laborum incididunt adipisicing amet enim. Ut ex ut sunt eu eu eiusmod duis do dolor occaecat commodo deserunt exercitation.", + "longText": "Aliqua sit tempor et consequat irure elit incididunt et id sint ex ad ipsum aliquip. Aliqua fugiat sint sint reprehenderit proident pariatur nostrud. Excepteur in do non minim sunt exercitation magna et sint quis aliqua eiusmod Lorem. Nostrud exercitation proident in velit aliqua dolore nisi irure veniam quis adipisicing et excepteur. Duis dolore dolor non et reprehenderit cillum commodo. Deserunt officia labore nostrud anim id fugiat anim ex voluptate dolore esse do commodo sit.\r\nEsse ut sunt commodo sint exercitation consequat ex ea exercitation reprehenderit. Nulla in laboris qui eiusmod adipisicing ex occaecat qui qui culpa aliquip magna quis. Fugiat reprehenderit exercitation ipsum reprehenderit et Lorem cillum. Lorem et dolor minim est et et.\r\nNisi ullamco ea minim ad nulla deserunt eu aute culpa ipsum ut voluptate. Ea cupidatat eiusmod est cillum amet velit aliqua esse sunt cupidatat eu aliqua reprehenderit. Voluptate voluptate proident duis ipsum minim qui. Id ex esse excepteur reprehenderit. Eiusmod adipisicing minim quis laboris aute nostrud irure officia velit fugiat. Ad minim tempor enim commodo exercitation elit cillum proident nulla cupidatat aliqua.\r\nLaboris amet aliqua nisi ut sint ex minim ullamco voluptate in. Sunt consequat ea proident occaecat aliquip est quis officia. Cillum Lorem laboris nostrud aliquip nulla laborum dolore quis aliqua nulla. Anim sint eiusmod ea in Lorem magna aliquip cillum velit.\r\nCommodo sunt nostrud deserunt id mollit do aliqua ullamco incididunt et et sunt sunt ad. Reprehenderit consequat consectetur aliquip non in. Eiusmod dolore id labore voluptate do aute ut et amet tempor tempor. Do irure laborum reprehenderit elit eiusmod cupidatat id sunt. Nisi cupidatat cillum eu sint duis et proident aliquip commodo id minim ullamco. Magna laborum exercitation elit minim dolore irure eu velit commodo Lorem.\r\n", + "address": "2 Fanchon Place", + "city": "Siglerville", + "state": "Puerto Rico", + "zip": 95024, + "country": "Angola", + "email": "normangeorge@scentric.com", + "phone": "(909) 404-3929", + "color": "rgb(236,187,197)" + }, + { + "index": 257, + "name": "Mandy Mann", + "first": "Mccoy", + "last": "Daniels", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chris_gooley/73.jpg", + "expanded": false, + "guid": "119c0379-dc8c-4fdf-a4ca-4dd7e8367fcd", + "integer": 8, + "date": "Sat Jul 18 1970 18:24:18 GMT-0700 (PDT)", + "shortText": "pariatur nulla", + "mediumText": "Sint mollit amet elit consectetur culpa. Exercitation minim laboris culpa reprehenderit est ut deserunt in est eiusmod nostrud nostrud esse. Labore laboris incididunt sit voluptate id ut. In incididunt mollit reprehenderit ea dolor commodo anim aliquip.", + "longText": "In cupidatat enim aliquip velit nisi. Elit deserunt ad excepteur deserunt consectetur nisi proident ea exercitation laboris tempor sunt. Lorem sint incididunt proident mollit est et.\r\n", + "address": "2 Lamont Court", + "city": "Rew", + "state": "Maryland", + "zip": 15110, + "country": "Bhutan", + "email": "mccoydaniels@scentric.com", + "phone": "(912) 520-2618", + "color": "rgb(135,249,131)" + }, + { + "index": 258, + "name": "Arlene Dominguez", + "first": "Felecia", + "last": "Hines", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jodyferry/73.jpg", + "expanded": false, + "guid": "280bf6b0-99d1-4792-acc8-8dde2e0f0deb", + "integer": 34, + "date": "Sat Feb 15 1992 18:16:30 GMT-0800 (PST)", + "shortText": "do non", + "mediumText": "Qui velit nulla adipisicing mollit. Officia adipisicing laboris veniam dolor enim eu laboris eu nulla tempor. Id id velit magna anim sint tempor. Voluptate nostrud anim elit laborum ut labore anim reprehenderit. Dolore ipsum do proident quis nostrud fugiat.", + "longText": "Quis veniam reprehenderit nulla quis aute deserunt cillum mollit commodo voluptate consectetur. Officia nostrud nulla tempor nulla. Dolor ipsum eu magna cillum amet velit enim amet voluptate id Lorem velit qui.\r\nProident ex amet voluptate cupidatat laborum. Laboris sint reprehenderit in minim exercitation dolor cupidatat ut proident. Aute consectetur id sunt aute pariatur velit excepteur reprehenderit adipisicing pariatur labore ea nulla mollit. Anim nulla aliqua quis minim exercitation amet sunt nulla commodo est nostrud non tempor veniam. Mollit aliquip officia consequat ex minim voluptate cillum esse. Eu sint adipisicing proident eiusmod adipisicing non. Ut excepteur mollit cupidatat anim elit sint aute magna ullamco Lorem duis dolor ullamco occaecat.\r\nDeserunt esse reprehenderit ullamco cillum velit mollit. Duis aliquip aliquip id incididunt officia magna nisi deserunt laboris magna. Enim exercitation mollit do elit voluptate minim. Sint aute incididunt Lorem nulla.\r\nConsectetur consequat nostrud et voluptate est sint ullamco adipisicing laboris. Do cillum velit enim quis reprehenderit tempor. Enim commodo duis deserunt ex et in. Voluptate Lorem qui amet anim nulla enim. Nisi voluptate do ad ea minim laborum ullamco aute amet velit officia ad et. Consequat dolore pariatur nostrud nisi ut et consequat fugiat. Occaecat aute ea officia incididunt.\r\nConsequat mollit laborum reprehenderit sit minim sunt et. Elit mollit magna in mollit cupidatat enim magna exercitation elit pariatur quis. Amet cupidatat in reprehenderit elit consectetur cillum ea aute ad exercitation quis. Velit enim officia do pariatur ex eiusmod.\r\n", + "address": "3 Howard Alley", + "city": "Corinne", + "state": "Massachusetts", + "zip": 62986, + "country": "Dominica", + "email": "feleciahines@scentric.com", + "phone": "(800) 422-3688", + "color": "rgb(143,174,64)" + }, + { + "index": 259, + "name": "Hollie Boyer", + "first": "Steele", + "last": "Schwartz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/reetajayendra/73.jpg", + "expanded": false, + "guid": "45ab7abb-8d65-4596-9843-554f49ed1ab3", + "integer": 87, + "date": "Sun Jun 06 1971 17:15:13 GMT-0700 (PDT)", + "shortText": "veniam exercitation do est laborum", + "mediumText": "Irure sunt voluptate esse minim dolor adipisicing fugiat occaecat in cupidatat do laborum. Sunt consequat nulla pariatur sit labore velit cillum cillum quis id laboris ipsum.", + "longText": "Adipisicing culpa excepteur excepteur labore. Duis esse occaecat pariatur velit qui fugiat occaecat magna et in duis. Pariatur consectetur dolore culpa esse anim cillum sint ad non adipisicing labore duis. Nisi eiusmod laboris adipisicing ea veniam cupidatat duis ad ut incididunt deserunt cupidatat. Incididunt aliqua cillum mollit dolor amet laboris dolor. Ea laborum qui Lorem duis ipsum deserunt dolore velit adipisicing minim veniam nostrud et. Irure officia Lorem labore irure ullamco.\r\nAdipisicing ullamco exercitation labore in ut. Sunt ex aliquip voluptate dolor qui ipsum est cillum magna. Dolore magna proident officia exercitation. Velit occaecat laborum laboris veniam excepteur nisi duis aliquip dolore. Consequat pariatur elit pariatur eiusmod. Minim occaecat aliquip exercitation sunt nisi dolor elit. Anim esse fugiat commodo minim.\r\nLorem incididunt aute exercitation enim qui aute. Dolore minim do proident laborum sit nulla ullamco excepteur quis sit consectetur dolore nisi. Voluptate Lorem aliqua enim aliqua mollit tempor et laborum ut aute dolor enim. Ipsum laborum anim deserunt aliquip occaecat nisi fugiat esse non cupidatat excepteur ut. Laboris velit Lorem quis aute nostrud elit dolor ullamco eiusmod exercitation. Exercitation eu ullamco cillum Lorem Lorem irure aliqua cillum anim. Adipisicing enim dolore id non enim reprehenderit voluptate velit voluptate Lorem officia.\r\n", + "address": "3 Thames Street", + "city": "Denio", + "state": "Oklahoma", + "zip": 28577, + "country": "Egypt", + "email": "steeleschwartz@scentric.com", + "phone": "(951) 401-2034", + "color": "rgb(203,161,146)" + }, + { + "index": 260, + "name": "Maxwell Levine", + "first": "Rutledge", + "last": "Vang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/namankreative/73.jpg", + "expanded": false, + "guid": "ae81b7e2-6532-41e4-b7a5-0336231f8d86", + "integer": 22, + "date": "Tue Feb 28 1989 01:26:44 GMT-0800 (PST)", + "shortText": "id sunt eiusmod", + "mediumText": "Sunt nulla aliquip ex ullamco magna mollit laborum ea cillum. Ea ad voluptate excepteur dolor tempor nulla pariatur pariatur.", + "longText": "Dolor quis magna dolor id irure laborum cillum irure. Minim ea ipsum ipsum aute officia. Commodo adipisicing aliqua voluptate eiusmod ipsum incididunt quis dolor culpa velit. Id quis duis tempor ipsum cillum do velit adipisicing do excepteur culpa magna laboris. Voluptate enim do id laborum veniam. Excepteur do adipisicing eiusmod ea laboris laborum. Nostrud sunt fugiat ut velit ex magna nisi non magna sint pariatur eiusmod minim.\r\nElit dolore nulla ipsum ullamco deserunt deserunt amet incididunt. Reprehenderit eiusmod adipisicing commodo duis eu id ad esse dolor consequat cupidatat elit. Aliquip eu fugiat consequat non sit nisi quis est id. Proident amet culpa sunt irure nostrud do ad aliqua sunt. Ut amet eiusmod ea eu aute cupidatat minim laboris qui consequat deserunt consectetur quis reprehenderit. Occaecat id proident in amet adipisicing elit tempor esse veniam elit.\r\nAdipisicing qui fugiat nostrud et magna do eu commodo minim excepteur non qui. Magna do do fugiat sint irure elit tempor deserunt. Ullamco aliqua ullamco nostrud qui incididunt cupidatat. Nisi reprehenderit in cupidatat velit et tempor. Lorem ut Lorem elit quis deserunt ut. Aliquip do Lorem eu ipsum amet eu laborum pariatur aliquip minim. Id id eu exercitation consequat.\r\n", + "address": "4 Scholes Street", + "city": "Rodanthe", + "state": "Ohio", + "zip": 39404, + "country": "Chile", + "email": "rutledgevang@scentric.com", + "phone": "(827) 440-2145", + "color": "rgb(207,158,249)" + }, + { + "index": 261, + "name": "Jimenez Mullins", + "first": "Hines", + "last": "Cooley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/paulfarino/73.jpg", + "expanded": false, + "guid": "c3fd3b86-c437-427d-9f1d-0dd5cc03af2a", + "integer": 31, + "date": "Thu Jul 22 1999 00:58:27 GMT-0700 (PDT)", + "shortText": "nisi", + "mediumText": "Eiusmod enim irure cupidatat consectetur aliquip ut labore fugiat exercitation Lorem et irure.", + "longText": "Reprehenderit duis cupidatat duis commodo enim pariatur ut ea ex elit ut adipisicing consectetur. Fugiat fugiat veniam sit esse laborum commodo laboris ipsum magna pariatur. Ipsum laborum proident mollit exercitation labore. Laborum voluptate pariatur eiusmod ad excepteur minim tempor non adipisicing consectetur proident amet.\r\nAute occaecat excepteur voluptate reprehenderit ea. Officia consequat proident et quis aliqua. Dolor et et cupidatat sit consectetur. Aute sit cillum excepteur reprehenderit enim sint voluptate occaecat.\r\n", + "address": "2 Clay Street", + "city": "Lisco", + "state": "Nevada", + "zip": 95904, + "country": "Norfolk Island", + "email": "hinescooley@scentric.com", + "phone": "(871) 552-3958", + "color": "rgb(236,51,80)" + }, + { + "index": 262, + "name": "Lesley Ashley", + "first": "Williamson", + "last": "Glass", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/overcloacked/73.jpg", + "expanded": false, + "guid": "a3928300-14e0-42c0-9f8b-600a529a789b", + "integer": 17, + "date": "Wed May 25 2005 15:38:13 GMT-0700 (PDT)", + "shortText": "labore esse pariatur nulla excepteur", + "mediumText": "Eiusmod elit eiusmod deserunt enim irure Lorem sint culpa ea. Esse proident in dolor sit qui pariatur Lorem. Culpa consequat minim ullamco sit culpa voluptate occaecat consequat. Ex ex non voluptate excepteur irure ut consectetur tempor.", + "longText": "Ullamco ex id nostrud esse. Exercitation adipisicing eu est ipsum commodo. Aute aliqua exercitation eiusmod ex nulla. Enim cillum nisi tempor id. Irure proident ipsum commodo reprehenderit tempor eu ut officia labore tempor sit tempor.\r\nFugiat ut sit tempor ut aliquip ea irure. Ullamco irure nulla reprehenderit id amet fugiat. Anim Lorem ullamco ea elit esse nisi id elit occaecat. Elit voluptate aute dolore anim aliquip veniam laborum. Duis esse aliquip aute pariatur fugiat veniam velit anim irure ipsum laboris. Duis nostrud occaecat ipsum eu non mollit. Fugiat exercitation sunt ullamco sunt mollit.\r\nLabore eiusmod mollit voluptate sunt duis id enim excepteur eiusmod elit quis voluptate enim aliqua. Minim nostrud excepteur voluptate ipsum id aliqua esse pariatur consequat. Dolore aliqua Lorem veniam deserunt pariatur tempor do nisi veniam nulla voluptate. Ut velit consectetur deserunt eiusmod cupidatat. Non culpa pariatur enim eu et ut irure labore. Ut nisi aute voluptate excepteur sint culpa ad id adipisicing ut enim.\r\nQui do consectetur laborum laborum ipsum eu ex do fugiat duis est irure sunt sunt. Ullamco in velit minim veniam ea do veniam anim adipisicing in sunt occaecat in aliquip. Aliquip nisi elit fugiat cupidatat enim mollit ex mollit. Aute laborum consequat anim deserunt. Cillum est sint dolor irure laboris ad eiusmod. Lorem aliquip in est et deserunt nostrud est consequat duis ad minim. Magna qui est ullamco sit cillum cupidatat eu amet mollit commodo esse.\r\n", + "address": "4 Village Court", + "city": "Southmont", + "state": "Montana", + "zip": 63679, + "country": "Japan", + "email": "williamsonglass@scentric.com", + "phone": "(915) 505-2620", + "color": "rgb(119,251,208)" + }, + { + "index": 263, + "name": "Robertson Mcintosh", + "first": "Constance", + "last": "Sexton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maysundays/73.jpg", + "expanded": false, + "guid": "0dd239a2-9d56-4eec-a3e1-94411aacdc3f", + "integer": 71, + "date": "Sat Aug 01 1970 03:44:02 GMT-0700 (PDT)", + "shortText": "excepteur ut labore", + "mediumText": "Incididunt proident mollit elit velit sit in ipsum dolor duis ex labore aliqua culpa. Cupidatat amet ea proident ad duis. Id occaecat aliquip quis fugiat dolor aliqua consectetur.", + "longText": "Sunt ullamco culpa quis cillum mollit. Exercitation amet magna magna velit pariatur aliquip laborum ad est cupidatat. Nostrud elit irure ullamco occaecat id. Anim elit laborum ad pariatur occaecat minim tempor ullamco. Deserunt exercitation elit commodo sint reprehenderit sit proident ut labore. Eu eu officia nulla labore aliquip ut ex.\r\nVeniam non tempor laborum ea dolor nostrud laboris cupidatat deserunt sit est. Reprehenderit aliquip sint nostrud eu pariatur laborum ea. Aute id laboris esse in in amet excepteur ea laborum. Cupidatat commodo minim nostrud in aute in aute culpa eiusmod.\r\nAmet dolore commodo aute commodo commodo non voluptate officia elit amet est sint sit. Nulla est occaecat elit magna elit esse mollit cillum anim exercitation. Adipisicing non occaecat nisi irure duis aliquip occaecat culpa consectetur ex mollit aute nostrud. Et mollit nisi ad culpa dolor tempor nisi Lorem culpa aliqua. Sunt ut minim dolore voluptate sit. Minim enim ex elit excepteur voluptate.\r\nProident proident esse commodo qui laboris. Enim laboris cillum fugiat exercitation elit. Nostrud ea labore sit culpa. Reprehenderit amet minim mollit ea nulla duis duis veniam est tempor enim ut proident. Tempor consectetur culpa occaecat exercitation id ea nulla ea. Duis culpa ea labore sint culpa consectetur eu proident esse.\r\nLaborum nulla excepteur commodo sint irure veniam nisi. Duis ex ad anim et anim voluptate commodo eiusmod ea magna ut do magna ut. Mollit anim nulla ullamco et aute excepteur qui aute. Exercitation aliquip proident labore tempor consequat aute officia esse ut dolor eu mollit. Veniam occaecat amet velit in irure Lorem excepteur aliquip sunt sit. Dolor nulla sit ad anim officia cillum minim ipsum ad dolor qui sint. Incididunt velit qui ea fugiat.\r\n", + "address": "3 Driggs Avenue", + "city": "Goldfield", + "state": "California", + "zip": 10392, + "country": "Saudi Arabia", + "email": "constancesexton@scentric.com", + "phone": "(923) 433-2666", + "color": "rgb(246,200,148)" + }, + { + "index": 264, + "name": "Audra Ortega", + "first": "Anne", + "last": "Crawford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_iamnyasha/73.jpg", + "expanded": false, + "guid": "a1000f3b-0edd-4f94-8864-4f0567d089ef", + "integer": 74, + "date": "Thu Oct 19 1978 15:43:40 GMT-0700 (PDT)", + "shortText": "et voluptate", + "mediumText": "Quis nulla minim do deserunt commodo laborum laboris veniam sint pariatur voluptate ullamco eu. Laboris adipisicing ex dolore voluptate ea occaecat duis enim nulla eiusmod.", + "longText": "Voluptate velit duis reprehenderit est tempor dolor dolor deserunt ullamco. Sit proident eiusmod consectetur occaecat dolore in laborum in aliqua id sint. Aute aliqua eu est aliqua officia aliqua minim do sint ullamco voluptate tempor velit ex. Adipisicing mollit velit non cillum exercitation sunt sunt ipsum ex irure laboris ut. Fugiat aliquip aliquip ad deserunt minim minim nisi dolore ea et. Dolore magna fugiat commodo veniam commodo do deserunt. Irure sint reprehenderit nulla sunt est nostrud id do excepteur mollit nostrud ea.\r\nId pariatur nisi eu deserunt nisi minim in deserunt deserunt ex. Adipisicing excepteur officia sint exercitation mollit deserunt non velit ex fugiat laboris id. Sit eiusmod excepteur occaecat id dolore laborum fugiat ea. Commodo velit non incididunt enim aliquip magna irure. Nulla aute ipsum veniam fugiat duis cupidatat et exercitation laboris Lorem culpa. Do reprehenderit ullamco occaecat id veniam sunt non nulla excepteur exercitation.\r\n", + "address": "2 Wallabout Street", + "city": "Waikele", + "state": "Marshall Islands", + "zip": 86465, + "country": "Micronesia", + "email": "annecrawford@scentric.com", + "phone": "(986) 502-2226", + "color": "rgb(235,169,166)" + }, + { + "index": 265, + "name": "Francis Carver", + "first": "Gallagher", + "last": "Britt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/culttm/73.jpg", + "expanded": false, + "guid": "0556fe07-8214-442d-9f9c-08231097de52", + "integer": 6, + "date": "Sun Nov 28 2010 03:23:33 GMT-0800 (PST)", + "shortText": "sint ex in aliquip excepteur", + "mediumText": "Laboris anim ad nulla tempor dolor quis tempor ipsum incididunt eiusmod aute. Ea irure ea laboris irure do et aliquip dolor exercitation excepteur. Exercitation sunt dolor excepteur sunt id quis velit esse non dolore ut nostrud officia.", + "longText": "Ad ipsum minim tempor velit Lorem irure cupidatat. Minim laborum laboris esse sunt voluptate amet amet nostrud sint esse. Irure incididunt et reprehenderit magna. Mollit esse non Lorem excepteur ad. In labore ad minim id commodo tempor non irure nisi.\r\nLaboris ut veniam cillum eiusmod ad ut reprehenderit. Ad pariatur ad ea culpa. Ad est irure enim ex Lorem nulla irure do adipisicing nulla non aute. Fugiat irure quis veniam consequat ea ullamco reprehenderit ipsum.\r\nTempor cillum culpa in sint enim sit irure consequat Lorem labore deserunt. Magna magna est sunt magna mollit laboris minim irure incididunt deserunt. Est pariatur adipisicing reprehenderit mollit ea aute dolor deserunt aute ut proident eiusmod.\r\nIrure in adipisicing culpa pariatur qui aliquip amet id. Veniam deserunt labore mollit in quis. Quis nostrud dolor ullamco ut reprehenderit nisi.\r\nCillum veniam laboris ut nulla commodo est nulla reprehenderit cupidatat. Voluptate adipisicing aute magna dolore consequat dolor enim veniam Lorem incididunt pariatur amet. Qui anim pariatur et voluptate labore incididunt. Amet duis velit eu in proident ipsum culpa et nulla eu Lorem aliquip ut. Lorem fugiat aute veniam Lorem ea sit. Nisi pariatur qui excepteur ad ullamco ea non culpa non incididunt sint ex. Et nulla velit elit adipisicing sit non irure et.\r\n", + "address": "2 Oakland Place", + "city": "Brookfield", + "state": "Indiana", + "zip": 53481, + "country": "Liberia", + "email": "gallagherbritt@scentric.com", + "phone": "(835) 444-3138", + "color": "rgb(204,219,96)" + }, + { + "index": 266, + "name": "Fischer Simmons", + "first": "Gertrude", + "last": "Stephens", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pollobrav0/73.jpg", + "expanded": false, + "guid": "829192ff-f636-4781-b023-9f3085717193", + "integer": 31, + "date": "Thu Nov 01 2007 09:01:49 GMT-0700 (PDT)", + "shortText": "et cupidatat ad", + "mediumText": "Ad esse officia proident adipisicing sunt excepteur. Culpa ad sint dolor aute aute est. Proident aliqua fugiat officia mollit. Minim sunt consequat irure ut tempor laborum dolor cupidatat est aliqua consequat et.", + "longText": "Officia non fugiat tempor ad enim dolor. In irure commodo culpa ut Lorem aliqua laborum. Qui in cupidatat consequat eiusmod Lorem occaecat consectetur fugiat quis sit pariatur proident. Lorem sint reprehenderit pariatur eiusmod veniam reprehenderit incididunt. Cupidatat reprehenderit in sit consectetur sint. Et excepteur sit do aliquip ea veniam eu reprehenderit deserunt non sunt magna mollit anim.\r\nAmet cupidatat culpa dolore elit minim adipisicing veniam laboris. Reprehenderit exercitation et et velit qui ea nostrud. Exercitation esse nostrud cupidatat dolor dolor fugiat cupidatat eu magna commodo velit ex.\r\nMagna sint voluptate veniam in occaecat aliquip duis nisi. Aliqua elit veniam ea nostrud nisi id cillum esse ullamco eiusmod reprehenderit culpa. Lorem velit id culpa aliquip voluptate dolore nulla officia dolore mollit in aliquip velit elit.\r\n", + "address": "4 Stoddard Place", + "city": "Whitmer", + "state": "Tennessee", + "zip": 27389, + "country": "Korea (South)", + "email": "gertrudestephens@scentric.com", + "phone": "(940) 497-2705", + "color": "rgb(171,153,217)" + }, + { + "index": 267, + "name": "Boyd Blake", + "first": "Delaney", + "last": "Anderson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlosblanco_eu/73.jpg", + "expanded": false, + "guid": "031a10d0-2fe9-4ef3-af8e-f7b7c611cb73", + "integer": 33, + "date": "Mon Aug 10 1970 14:35:08 GMT-0700 (PDT)", + "shortText": "adipisicing fugiat qui dolore aute", + "mediumText": "Sit sunt pariatur incididunt est aute consectetur quis laboris nisi cillum deserunt in dolore. Sit fugiat labore enim consequat amet elit aliquip adipisicing. In excepteur laboris irure dolor laborum esse id. Minim nulla adipisicing in eiusmod enim dolor pariatur mollit velit amet proident mollit sunt.", + "longText": "Nisi laboris culpa in sit veniam anim nisi pariatur pariatur adipisicing non occaecat reprehenderit ut. Laborum nulla occaecat laboris qui aliqua laborum excepteur excepteur commodo. Fugiat anim proident proident exercitation esse nulla aute. Adipisicing in laborum fugiat eu tempor ullamco qui qui Lorem cupidatat sint ipsum aliqua. Labore commodo amet consequat officia incididunt cillum proident deserunt sint excepteur. Enim nostrud occaecat ipsum sint adipisicing quis sunt pariatur et sunt eu. Veniam nulla cupidatat officia culpa.\r\n", + "address": "3 Branton Street", + "city": "Ada", + "state": "Palau", + "zip": 48926, + "country": "Pakistan", + "email": "delaneyanderson@scentric.com", + "phone": "(879) 508-2698", + "color": "rgb(181,108,214)" + }, + { + "index": 268, + "name": "Foreman Jennings", + "first": "Nieves", + "last": "Browning", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/giakodes/73.jpg", + "expanded": false, + "guid": "f3328487-a346-46cd-986a-180b1336ce46", + "integer": 34, + "date": "Thu Aug 18 1977 11:28:15 GMT-0700 (PDT)", + "shortText": "culpa laborum nostrud proident qui", + "mediumText": "Tempor sunt anim occaecat in irure occaecat enim cupidatat voluptate ex laboris enim. Exercitation fugiat ad eu culpa est pariatur ea laboris aliquip laboris exercitation proident consectetur. Enim officia laboris elit quis. Occaecat fugiat tempor ea labore exercitation irure sint elit sint elit reprehenderit. Cupidatat anim sit eu nulla exercitation Lorem ipsum veniam.", + "longText": "Esse aute reprehenderit enim officia culpa. Reprehenderit duis mollit voluptate exercitation officia Lorem laborum laborum irure pariatur. Exercitation ex laboris magna excepteur qui labore culpa. Ut esse incididunt aliqua incididunt dolor deserunt esse. Et magna magna quis ipsum cupidatat voluptate incididunt aute sint consectetur officia.\r\nConsequat elit nostrud laborum veniam. Pariatur id consectetur duis et id adipisicing velit et ipsum pariatur proident nostrud reprehenderit. Culpa ad amet eiusmod quis reprehenderit aute eiusmod.\r\nPariatur nulla veniam amet sit fugiat ipsum velit fugiat consequat eu irure est labore. Ut veniam excepteur excepteur nisi fugiat. Ipsum enim excepteur pariatur est laboris deserunt aliqua velit fugiat. Irure ut duis laboris culpa quis ad deserunt sunt fugiat adipisicing. Aute est consectetur ad minim deserunt do.\r\n", + "address": "3 Berriman Street", + "city": "Chaparrito", + "state": "Virginia", + "zip": 46246, + "country": "Guyana", + "email": "nievesbrowning@scentric.com", + "phone": "(876) 426-2122", + "color": "rgb(247,203,76)" + }, + { + "index": 269, + "name": "Corine Woodard", + "first": "Santana", + "last": "Everett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/komplexb/73.jpg", + "expanded": false, + "guid": "92e47eb5-8a17-4884-9c8b-2789bc456ed9", + "integer": 84, + "date": "Tue Dec 26 1978 20:05:16 GMT-0800 (PST)", + "shortText": "Lorem aute", + "mediumText": "Qui irure duis reprehenderit duis. Ut consectetur mollit sint sint occaecat id nulla sint aute consectetur anim laborum aliquip commodo.", + "longText": "Ea officia culpa cupidatat enim fugiat mollit in quis excepteur culpa. Tempor et nulla irure nostrud qui adipisicing nulla consequat dolor veniam. Ex qui et duis anim irure laboris.\r\nDo commodo aute ipsum ullamco. Velit pariatur est sit laboris reprehenderit nisi voluptate consequat voluptate laborum sunt dolor velit. Occaecat cillum ex ad anim sint. Voluptate cupidatat magna labore veniam. Cupidatat ea nostrud est ipsum in. Deserunt sint adipisicing incididunt sint labore duis minim velit tempor. Lorem sint anim sunt sunt ipsum esse ea reprehenderit elit dolore aute sint.\r\nMagna commodo cupidatat nisi aute. Qui consequat culpa enim elit minim exercitation qui amet in cillum officia. Amet amet nulla aute elit sit irure pariatur proident est sint labore.\r\nProident dolore ut mollit enim veniam aliqua minim ex voluptate Lorem ullamco amet enim. Officia laborum enim sit aute incididunt nisi nulla magna Lorem officia aute mollit. Ullamco commodo incididunt excepteur sunt. Tempor veniam commodo minim dolore eu dolore est deserunt veniam ullamco.\r\nMagna dolor voluptate sint dolor tempor anim dolore quis aute magna reprehenderit ad. Incididunt fugiat aliqua culpa ullamco quis duis pariatur ullamco consequat voluptate enim velit. Duis aute qui qui voluptate elit ut amet elit anim. Excepteur esse proident laborum occaecat.\r\n", + "address": "4 Melrose Street", + "city": "Chelsea", + "state": "Wyoming", + "zip": 81598, + "country": "Poland", + "email": "santanaeverett@scentric.com", + "phone": "(993) 537-2899", + "color": "rgb(144,158,112)" + }, + { + "index": 270, + "name": "Maria Stokes", + "first": "Chambers", + "last": "Riggs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/migl40d/73.jpg", + "expanded": false, + "guid": "cacd37bf-31ec-400b-bc9e-7ecb3a35d9be", + "integer": 9, + "date": "Thu Feb 06 2003 08:01:13 GMT-0800 (PST)", + "shortText": "veniam magna enim ullamco", + "mediumText": "Eiusmod culpa laboris est consequat in proident eiusmod occaecat consequat sit et mollit. Dolor aliquip anim ex laboris id non occaecat nisi amet eu anim ipsum proident eiusmod. Consequat esse Lorem quis aliquip duis quis minim quis duis. Occaecat commodo nulla minim ipsum do velit laborum consectetur id.", + "longText": "Dolor anim velit labore duis sunt nostrud duis sint ex irure. Voluptate laboris ipsum deserunt nisi voluptate dolor magna. Voluptate veniam amet reprehenderit laborum amet incididunt elit voluptate minim pariatur incididunt aute. Nulla excepteur eiusmod ad amet magna velit eu ea sit do Lorem ex nulla qui. Officia labore ut sint nostrud quis consectetur labore. Et quis voluptate non duis adipisicing quis sunt veniam incididunt velit consectetur.\r\nAdipisicing sit non consequat qui consequat commodo pariatur tempor consectetur. Adipisicing dolore aliquip ipsum nulla in incididunt mollit nulla. Pariatur non cillum do voluptate aliqua non aliquip esse qui voluptate aliquip magna esse. Dolor aliquip esse deserunt velit adipisicing adipisicing. Veniam in dolore do mollit ad exercitation commodo veniam eu. Magna non nulla proident occaecat.\r\nOccaecat magna magna ex culpa. Aliquip commodo laboris amet anim cillum elit officia esse id. Dolor mollit adipisicing velit excepteur anim commodo aute proident sunt. Irure reprehenderit ullamco amet id minim commodo tempor aute exercitation laboris amet incididunt et. Nostrud laborum mollit aliquip non eiusmod sint exercitation eiusmod labore cillum duis enim aute occaecat. Amet aute ea eiusmod dolore. Magna sit veniam nisi ullamco culpa.\r\n", + "address": "4 Jamaica Avenue", + "city": "Lupton", + "state": "Colorado", + "zip": 55948, + "country": "Canada", + "email": "chambersriggs@scentric.com", + "phone": "(825) 422-3231", + "color": "rgb(211,239,230)" + }, + { + "index": 271, + "name": "Montoya Battle", + "first": "Susanne", + "last": "Stein", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erwinhines/73.jpg", + "expanded": false, + "guid": "386137ac-8367-4191-bca0-0385b64defbc", + "integer": 1, + "date": "Tue Feb 18 1986 07:03:21 GMT-0800 (PST)", + "shortText": "aliqua amet", + "mediumText": "Enim aliqua minim ipsum amet incididunt labore nulla labore enim. Esse eu ea occaecat consectetur labore exercitation do ut consequat est dolor Lorem. Do dolor nostrud nostrud labore.", + "longText": "Officia qui tempor cupidatat nostrud sunt cillum qui commodo pariatur non. Aliqua consectetur commodo ad consequat in est nisi. Cupidatat in eiusmod deserunt veniam. Sunt incididunt enim ex sunt aliqua excepteur non quis deserunt magna eiusmod anim. Enim ex proident laborum excepteur ea anim sint. Consectetur anim esse et id ut incididunt sunt officia consectetur sunt anim do ea ipsum. Magna Lorem ullamco ad eu amet deserunt consectetur.\r\nEa consectetur aute laborum commodo irure excepteur ipsum cupidatat reprehenderit duis. Deserunt exercitation labore quis adipisicing amet reprehenderit ad minim esse eu esse. Qui adipisicing aliquip sunt laborum duis occaecat.\r\nPariatur eiusmod nostrud nostrud excepteur non ex anim non do voluptate. Nulla ut deserunt deserunt in aliqua duis laborum ex. Eiusmod eiusmod nostrud esse eiusmod deserunt ullamco adipisicing aute non nulla. Eiusmod eiusmod consequat proident culpa ullamco laborum.\r\nDo non veniam aliquip officia. Amet dolor excepteur qui exercitation voluptate laboris culpa laboris Lorem ullamco fugiat mollit exercitation excepteur. Esse occaecat magna reprehenderit in eiusmod magna fugiat sit occaecat consectetur velit consequat veniam aliquip. Excepteur aliquip ipsum duis sunt enim aliqua elit exercitation eu in cillum deserunt. Qui fugiat exercitation eu elit minim officia minim ex enim adipisicing incididunt ut.\r\n", + "address": "3 Porter Avenue", + "city": "Bentley", + "state": "Utah", + "zip": 67531, + "country": "US Minor Outlying Islands", + "email": "susannestein@scentric.com", + "phone": "(972) 556-2548", + "color": "rgb(176,88,163)" + }, + { + "index": 272, + "name": "Antoinette Cooper", + "first": "Stout", + "last": "Ferrell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chelseabeachem/73.jpg", + "expanded": false, + "guid": "b2443100-77a3-48fc-825f-671f2f386da1", + "integer": 35, + "date": "Tue Sep 09 2008 23:36:55 GMT-0700 (PDT)", + "shortText": "tempor mollit", + "mediumText": "Eiusmod aliqua irure velit nostrud dolor nostrud.", + "longText": "Amet voluptate dolor sunt culpa eiusmod ipsum Lorem officia eiusmod est nulla. Ut minim veniam veniam sunt excepteur. Fugiat ut amet deserunt ex voluptate ex. Aute deserunt adipisicing ipsum eiusmod eiusmod duis eiusmod laborum voluptate ut commodo.\r\n", + "address": "2 Cortelyou Road", + "city": "Websterville", + "state": "Idaho", + "zip": 50360, + "country": "East Timor", + "email": "stoutferrell@scentric.com", + "phone": "(884) 588-3785", + "color": "rgb(207,67,59)" + }, + { + "index": 273, + "name": "Chavez Rhodes", + "first": "Jennifer", + "last": "Solomon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bouyghajden/73.jpg", + "expanded": false, + "guid": "cf0294a4-b641-4b2a-94ce-7db7921d670c", + "integer": 62, + "date": "Fri Oct 04 1996 10:43:24 GMT-0700 (PDT)", + "shortText": "nostrud id eiusmod", + "mediumText": "Qui dolore nisi ut eu ea duis elit ipsum aliquip aliqua. Sunt cupidatat ut reprehenderit sit nulla laborum consectetur fugiat magna elit esse nulla.", + "longText": "Sit irure nulla excepteur ad velit excepteur exercitation enim eu fugiat deserunt duis. Amet veniam adipisicing aliquip tempor irure. Mollit non culpa amet tempor magna sint esse ad proident. Duis cupidatat nostrud esse veniam pariatur voluptate cupidatat dolor ullamco occaecat magna aliquip sunt esse.\r\nNostrud deserunt proident velit tempor esse exercitation ex ipsum velit proident aute ullamco amet velit. Occaecat veniam sit ipsum do dolore nisi aute occaecat. Amet pariatur occaecat aliqua sint velit aliquip non consequat eiusmod occaecat qui aliquip enim exercitation. Id labore duis quis voluptate nulla aute occaecat. Sunt amet dolore ad minim laborum sit officia amet eu dolore Lorem quis adipisicing esse. Non quis consequat anim nostrud id in in. Sit et esse nostrud quis eu aute excepteur qui.\r\nIrure non sint sint Lorem occaecat quis aliquip exercitation adipisicing amet tempor Lorem sint consequat. Commodo tempor consectetur commodo labore et veniam sunt. Cupidatat commodo anim reprehenderit qui culpa aliqua aliquip enim dolor.\r\nDolore do nisi est exercitation nisi irure et et Lorem sint ullamco non enim duis. Sint nostrud ipsum veniam anim et dolor id amet id fugiat consequat non. Sunt laboris culpa ut deserunt ut ut irure fugiat dolore eiusmod fugiat quis.\r\nDeserunt qui veniam nostrud in nostrud adipisicing sunt veniam consequat consectetur duis esse magna ipsum. Deserunt anim dolore ullamco aute fugiat mollit adipisicing sit exercitation Lorem. Incididunt Lorem duis qui enim adipisicing sint anim. Ex velit ullamco commodo pariatur amet. Sit et voluptate occaecat mollit fugiat pariatur id elit.\r\n", + "address": "3 Ruby Street", + "city": "Goochland", + "state": "Arkansas", + "zip": 63056, + "country": "Denmark", + "email": "jennifersolomon@scentric.com", + "phone": "(852) 542-2938", + "color": "rgb(234,125,93)" + }, + { + "index": 274, + "name": "Sanchez Summers", + "first": "Osborne", + "last": "Buckley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butusai/73.jpg", + "expanded": false, + "guid": "6afd5e1c-3a29-4134-b7a5-7196eb7798a4", + "integer": 76, + "date": "Sat Oct 07 1995 23:24:37 GMT-0700 (PDT)", + "shortText": "enim do voluptate quis sit", + "mediumText": "Quis amet id irure elit eu ad duis id veniam. Qui in mollit in consectetur reprehenderit ex est. Id non tempor minim aliqua commodo dolore do mollit Lorem eu non amet est.", + "longText": "Eiusmod non velit eiusmod adipisicing ut velit est adipisicing in. Eiusmod dolore et non dolore esse velit id anim proident nisi commodo. Amet fugiat magna cupidatat est esse duis et.\r\n", + "address": "3 Seigel Street", + "city": "Thatcher", + "state": "Delaware", + "zip": 98441, + "country": "Yemen", + "email": "osbornebuckley@scentric.com", + "phone": "(930) 530-3501", + "color": "rgb(53,175,123)" + }, + { + "index": 275, + "name": "Melinda Herrera", + "first": "Paula", + "last": "Clemons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ainsleywagon/73.jpg", + "expanded": false, + "guid": "1d0ee711-59d7-4c1f-9420-3fab9a5b62f6", + "integer": 0, + "date": "Sun Aug 23 1970 02:12:34 GMT-0700 (PDT)", + "shortText": "proident laborum dolor magna laboris", + "mediumText": "Minim duis magna cillum dolore excepteur eiusmod eiusmod officia est laboris veniam. Officia amet occaecat esse non dolor. Esse quis labore ad occaecat adipisicing consequat nisi in et sunt excepteur aute consequat.", + "longText": "Mollit magna nulla exercitation commodo excepteur amet. Duis fugiat Lorem mollit adipisicing anim adipisicing adipisicing anim fugiat nulla anim. Eu adipisicing irure Lorem qui enim nisi velit exercitation duis. Aliquip ea labore commodo et nostrud. Aute sit consequat reprehenderit nulla aliquip ipsum esse esse qui exercitation pariatur cupidatat quis cillum. Do esse in ad id est id laboris incididunt.\r\nQui non quis ipsum qui fugiat pariatur. Dolore incididunt sunt eiusmod laboris nisi nulla. Qui fugiat irure consequat culpa ad non do labore commodo ut est velit nostrud. Cillum dolor aliquip elit est enim tempor consectetur. Id nostrud duis et irure nostrud do enim laboris fugiat fugiat eu eiusmod nisi.\r\nCommodo pariatur in officia cupidatat consequat eiusmod ad Lorem dolore enim aliquip elit. Ex in commodo enim sunt eiusmod. Labore consequat culpa quis voluptate aliqua. Fugiat reprehenderit cupidatat esse eiusmod duis consequat. Quis est veniam reprehenderit consectetur cupidatat aliquip in amet dolor.\r\nMagna est esse excepteur sint enim Lorem nisi deserunt pariatur non. Dolor enim officia dolore deserunt consequat quis ea adipisicing cillum aliqua anim laboris irure. In do consectetur est culpa. Sunt occaecat voluptate pariatur dolor id velit magna do veniam duis excepteur ut ad voluptate. Ut excepteur laboris ea ut.\r\nEu eiusmod excepteur reprehenderit duis ipsum commodo ullamco cillum officia incididunt esse eu nulla reprehenderit. Aliquip elit consequat dolor labore. Laborum proident ullamco excepteur dolor esse occaecat et aliqua. Commodo ad exercitation minim ad occaecat ullamco. Veniam id dolor aliquip cupidatat. Voluptate voluptate aliqua nulla aliquip adipisicing fugiat aute laboris quis amet officia magna Lorem labore.\r\n", + "address": "3 Beadel Street", + "city": "Thornport", + "state": "Federated States Of Micronesia", + "zip": 81284, + "country": "Laos", + "email": "paulaclemons@scentric.com", + "phone": "(807) 420-2457", + "color": "rgb(173,67,66)" + }, + { + "index": 276, + "name": "Mara Ortiz", + "first": "Pace", + "last": "Hunter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chadbercea/73.jpg", + "expanded": false, + "guid": "65b9988b-b552-44e7-8e59-7a490e0aa83b", + "integer": 45, + "date": "Wed Oct 25 2006 06:16:29 GMT-0700 (PDT)", + "shortText": "dolor ipsum", + "mediumText": "Dolore laborum non magna voluptate cillum irure ipsum ad eu aute. Proident mollit nostrud laboris ad sunt laboris aliquip quis aute duis id mollit. Commodo qui anim adipisicing anim. Eu deserunt dolor Lorem elit quis laboris nulla enim.", + "longText": "Sunt adipisicing ea dolore ea id veniam eiusmod consequat cupidatat nulla ullamco magna mollit. Excepteur qui do aliquip consequat incididunt fugiat nostrud pariatur eiusmod nostrud quis reprehenderit officia adipisicing. Consequat mollit esse eiusmod culpa qui in officia irure in enim veniam.\r\n", + "address": "2 Broome Street", + "city": "Hobucken", + "state": "Guam", + "zip": 15780, + "country": "Sierra Leone", + "email": "pacehunter@scentric.com", + "phone": "(929) 573-3129", + "color": "rgb(228,124,211)" + }, + { + "index": 277, + "name": "Hannah Mercado", + "first": "Velazquez", + "last": "Snider", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/devinhalladay/73.jpg", + "expanded": false, + "guid": "13ecf233-dc36-43ed-8b27-00fa6f367502", + "integer": 53, + "date": "Tue Dec 26 1995 12:29:11 GMT-0800 (PST)", + "shortText": "nulla cillum dolore amet", + "mediumText": "Sunt cillum deserunt ipsum est ea occaecat deserunt ex cillum ut magna do laboris minim.", + "longText": "Nostrud non aute culpa eu consectetur nisi incididunt deserunt deserunt laborum duis ad consequat. Ad tempor mollit duis deserunt anim voluptate reprehenderit proident non dolore anim dolor. Reprehenderit excepteur mollit culpa Lorem dolore. Exercitation incididunt id non esse magna qui nostrud ad.\r\n", + "address": "2 Thatford Avenue", + "city": "Rosburg", + "state": "Pennsylvania", + "zip": 18264, + "country": "Nigeria", + "email": "velazquezsnider@scentric.com", + "phone": "(948) 461-3658", + "color": "rgb(146,114,59)" + }, + { + "index": 278, + "name": "King Murray", + "first": "Lawrence", + "last": "Floyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mateaodviteza/73.jpg", + "expanded": false, + "guid": "48e5fed4-514a-4e9e-8842-57a2e92a654c", + "integer": 33, + "date": "Fri Aug 10 2012 11:19:30 GMT-0700 (PDT)", + "shortText": "consequat", + "mediumText": "Proident nisi exercitation amet reprehenderit cupidatat ad exercitation eu ad nostrud ex sunt.", + "longText": "Elit anim consequat minim officia reprehenderit ex voluptate incididunt Lorem. Incididunt qui incididunt Lorem do pariatur. Id aute anim elit amet labore non eiusmod sint culpa sunt ullamco irure. Adipisicing officia ea ad aliqua. Proident officia occaecat velit est amet pariatur duis esse cillum quis. Et mollit culpa ipsum ad do adipisicing sint amet.\r\nCulpa aliqua do sunt veniam laboris adipisicing pariatur mollit anim. Fugiat cupidatat labore eu eu do ea. Voluptate quis dolore ex quis culpa. Nostrud ea enim elit reprehenderit. Sint veniam commodo officia et quis laboris labore culpa quis ullamco ullamco. Labore occaecat nulla et incididunt consectetur.\r\nSit sit commodo amet cupidatat velit velit qui sint culpa magna magna proident. Adipisicing deserunt anim ullamco eiusmod aliqua laboris aliquip incididunt. Ipsum nisi velit nulla ex elit sit nostrud qui. Magna irure laboris quis Lorem enim culpa. Enim velit enim culpa nisi adipisicing officia voluptate cupidatat qui et. Sit deserunt incididunt ullamco deserunt non aliquip ut laborum Lorem dolor ullamco.\r\nAute esse dolore nisi ut sit fugiat dolore aute aliqua. Aliqua est voluptate enim dolor ullamco quis nisi qui esse nisi tempor do. Do deserunt veniam aliquip qui veniam ex nostrud incididunt culpa in magna non.\r\n", + "address": "3 Hunts Lane", + "city": "Ola", + "state": "New Hampshire", + "zip": 33769, + "country": "Netherlands", + "email": "lawrencefloyd@scentric.com", + "phone": "(813) 569-3499", + "color": "rgb(116,205,80)" + }, + { + "index": 279, + "name": "Camille Massey", + "first": "Short", + "last": "Hensley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vickyshits/73.jpg", + "expanded": false, + "guid": "08757590-e154-4bf1-b5a4-3a8763c63417", + "integer": 8, + "date": "Tue Dec 26 1989 15:35:16 GMT-0800 (PST)", + "shortText": "officia", + "mediumText": "Sint excepteur adipisicing veniam consectetur incididunt nostrud duis nulla velit laborum. Eu incididunt qui duis deserunt veniam. Culpa mollit nostrud magna dolor reprehenderit esse in consequat irure ad.", + "longText": "Occaecat magna ex ex qui exercitation adipisicing ea aliqua laboris est est adipisicing Lorem dolore. Sunt cillum labore ea amet eiusmod sunt qui. Duis deserunt do irure sit quis voluptate eu duis eiusmod. Ad incididunt anim fugiat esse ipsum aliquip ut cillum tempor eiusmod.\r\nEt Lorem amet cillum ipsum laboris sit deserunt esse duis sit dolore dolor commodo. Labore nulla cillum ad minim proident reprehenderit eu in duis consectetur amet. Aliquip velit nisi culpa ipsum qui sint ut elit id pariatur Lorem anim labore.\r\n", + "address": "2 Greene Avenue", + "city": "Dragoon", + "state": "North Dakota", + "zip": 18599, + "country": "Morocco", + "email": "shorthensley@scentric.com", + "phone": "(959) 437-3887", + "color": "rgb(61,124,231)" + }, + { + "index": 280, + "name": "Etta Nicholson", + "first": "Sadie", + "last": "Johnson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kamal_chaneman/73.jpg", + "expanded": false, + "guid": "445d79d7-84ef-49ef-aaac-2e47925151d7", + "integer": 36, + "date": "Wed Jan 05 2011 12:47:59 GMT-0800 (PST)", + "shortText": "aliquip quis incididunt esse commodo", + "mediumText": "Aliquip ut reprehenderit laboris veniam ad laboris excepteur. Et ut qui fugiat consequat qui aliquip aute incididunt magna non.", + "longText": "Sint anim magna Lorem incididunt tempor esse voluptate commodo qui velit velit aliqua adipisicing. Officia enim excepteur proident non nostrud est quis non quis anim ut irure nulla. Culpa officia velit et magna non sunt culpa laboris nulla enim. Et dolor laborum amet quis occaecat irure. Labore proident ea nulla aute anim do.\r\n", + "address": "4 Chestnut Avenue", + "city": "Boling", + "state": "Northern Mariana Islands", + "zip": 79666, + "country": "Czech Republic", + "email": "sadiejohnson@scentric.com", + "phone": "(929) 469-3200", + "color": "rgb(61,210,234)" + }, + { + "index": 281, + "name": "Roxanne Munoz", + "first": "Marguerite", + "last": "Rodriguez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_yardenoon/73.jpg", + "expanded": false, + "guid": "b7b8e91a-c476-45fb-b728-78461ff01383", + "integer": 59, + "date": "Tue Nov 11 1997 21:52:13 GMT-0800 (PST)", + "shortText": "amet adipisicing dolore Lorem consequat", + "mediumText": "Laborum fugiat anim pariatur minim fugiat sit pariatur exercitation proident. Incididunt ea duis nisi et. Do eu consectetur cillum veniam laboris consequat sunt labore exercitation laborum ipsum do duis sint. Pariatur id tempor cupidatat cillum ad eiusmod. Aliqua dolore enim magna officia tempor consequat Lorem excepteur culpa excepteur.", + "longText": "Occaecat ullamco nisi occaecat consequat consectetur aute in amet. Duis exercitation et ea aliqua elit ipsum ea ipsum laboris aliqua Lorem labore minim pariatur. Amet aliqua nostrud officia ex commodo mollit ex mollit consectetur esse elit sint. Est pariatur irure occaecat aute labore cillum nisi id.\r\nFugiat cupidatat veniam in adipisicing sint sunt cillum consequat in. Quis excepteur ad mollit occaecat et anim voluptate cupidatat. Sunt sit nisi amet excepteur voluptate. Cupidatat do ea fugiat sint minim elit nostrud. Culpa dolore in fugiat pariatur excepteur minim ad incididunt Lorem anim consequat consectetur. Duis est nulla sit eu nulla culpa proident et nostrud nostrud quis laborum dolore. Aute tempor et culpa amet.\r\n", + "address": "3 Box Street", + "city": "Caledonia", + "state": "South Dakota", + "zip": 29414, + "country": "Cape Verde", + "email": "margueriterodriguez@scentric.com", + "phone": "(975) 555-3617", + "color": "rgb(217,168,93)" + }, + { + "index": 282, + "name": "Chandler Mclean", + "first": "Olsen", + "last": "Rollins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/daniloc/73.jpg", + "expanded": false, + "guid": "18eb19e2-f53c-42f3-b3c0-f92ba5058e72", + "integer": 86, + "date": "Mon Nov 05 2012 21:48:32 GMT-0800 (PST)", + "shortText": "sunt", + "mediumText": "Sit magna labore veniam eu dolor.", + "longText": "Laboris pariatur qui esse proident aute in in quis aliquip tempor est Lorem elit nulla. Irure est id cillum in dolore qui mollit ullamco occaecat aute cupidatat culpa. Voluptate est nostrud eu laborum veniam eiusmod culpa eiusmod minim voluptate. Cupidatat cillum eiusmod aute nostrud exercitation est do anim in. Aliquip elit ullamco voluptate incididunt. In minim laboris nostrud nisi est officia proident consequat consequat velit enim ut eiusmod.\r\nSunt ex sunt ipsum dolor proident mollit cillum. In proident eiusmod nostrud cillum occaecat excepteur enim incididunt pariatur incididunt velit deserunt. Ullamco voluptate quis Lorem id qui sit occaecat qui deserunt qui aute eiusmod.\r\nCupidatat eiusmod eiusmod non officia nisi aliquip nulla eiusmod deserunt voluptate qui voluptate magna ad. Duis sit pariatur sint ea enim do esse cillum sit proident sunt. Aliqua deserunt deserunt adipisicing laboris sint voluptate occaecat culpa ipsum ut aute. Nulla amet est et aliquip commodo nostrud in ut laborum qui ullamco id aliqua. Consectetur magna aute aliquip sunt anim occaecat id ex consectetur ipsum. Eiusmod occaecat culpa laborum fugiat. Minim in sunt occaecat eu ex velit sit eiusmod ad reprehenderit.\r\nMinim nulla commodo qui velit proident. Nisi reprehenderit ullamco in in non eu. Enim exercitation voluptate consequat duis non officia quis irure consequat eu anim. Minim Lorem irure eu pariatur aute in Lorem deserunt esse elit officia excepteur. Est eiusmod tempor incididunt consectetur ullamco elit aliquip eu sunt elit eu sint aliquip. Irure adipisicing veniam aliqua incididunt officia esse veniam veniam officia.\r\nOfficia velit nostrud eiusmod ex elit nostrud non veniam commodo exercitation amet. Enim non mollit cupidatat magna aute anim tempor. Consequat ea nostrud esse laboris minim commodo culpa laborum aliqua adipisicing cupidatat sit. Ullamco enim fugiat tempor minim officia ipsum duis et sunt sint.\r\n", + "address": "4 Neptune Court", + "city": "Fillmore", + "state": "Alaska", + "zip": 62131, + "country": "Madagascar", + "email": "olsenrollins@scentric.com", + "phone": "(936) 437-3569", + "color": "rgb(163,129,119)" + }, + { + "index": 283, + "name": "Clements Wynn", + "first": "Dollie", + "last": "Rowland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jamesmbickerton/73.jpg", + "expanded": false, + "guid": "ecf696fd-aa3b-4bed-bdb1-b3b9a18f13f5", + "integer": 24, + "date": "Fri Jan 11 1974 07:17:27 GMT-0700 (PDT)", + "shortText": "consequat voluptate", + "mediumText": "Ut ullamco labore elit exercitation pariatur consequat quis proident. Tempor aute ex consectetur ut eu qui incididunt aliqua anim duis sit. Elit consequat nisi fugiat elit sit nisi eu laborum excepteur nulla proident ex. Eiusmod qui culpa quis velit elit consequat nulla.", + "longText": "Occaecat aliqua sunt velit deserunt mollit fugiat excepteur adipisicing pariatur non amet enim ad. Consectetur aliqua do sint cupidatat nostrud ipsum anim laborum nulla aliquip sit. Labore mollit amet Lorem quis. Ex cillum minim sit eu duis. Nulla sint esse nostrud nisi mollit irure commodo aute esse esse aliquip sunt ut. Ipsum et nulla cupidatat tempor consequat do occaecat ut.\r\nConsequat tempor et qui exercitation non in commodo. Aute minim nostrud laboris dolore reprehenderit. Adipisicing proident esse laborum cillum tempor veniam incididunt minim est adipisicing. Dolor nisi nisi dolore amet ea ipsum mollit amet.\r\n", + "address": "3 Minna Street", + "city": "Gratton", + "state": "Louisiana", + "zip": 90178, + "country": "Austria", + "email": "dollierowland@scentric.com", + "phone": "(992) 594-3916", + "color": "rgb(197,160,174)" + }, + { + "index": 284, + "name": "Cotton Newman", + "first": "Mccullough", + "last": "Oneil", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ddang33/73.jpg", + "expanded": false, + "guid": "da4451a9-1961-4257-87c6-19aa0c2780d9", + "integer": 24, + "date": "Fri Oct 26 1990 18:43:21 GMT-0700 (PDT)", + "shortText": "id nulla", + "mediumText": "In reprehenderit velit non aute ad mollit aliqua ullamco nostrud adipisicing dolore incididunt. Mollit et consequat eiusmod in laborum nulla in irure qui. Ex consequat est in laboris. Sunt ipsum eu eiusmod quis dolor nostrud sunt consectetur in ea ex commodo. Do enim occaecat labore et occaecat mollit consequat.", + "longText": "Nulla sunt aliqua ea laborum fugiat dolor reprehenderit nisi nulla pariatur minim. Duis aliquip in incididunt sunt sit nulla sunt cillum ut anim elit. Commodo excepteur dolore nisi labore exercitation commodo Lorem veniam anim nisi velit dolor aute.\r\nNulla labore laborum Lorem eu elit consequat eiusmod dolore irure ex. Occaecat enim ea nisi duis aliqua commodo sint sint enim consequat exercitation amet. Cupidatat Lorem culpa quis qui dolore. Proident non eu sint eiusmod id ullamco nisi nisi.\r\nAdipisicing nisi labore aliqua irure occaecat consectetur aute ut mollit ad excepteur. Magna et non laboris velit ipsum. Id et cillum aute nulla consectetur esse est quis culpa consequat. Veniam enim dolore dolore consequat pariatur aute elit consequat. Ipsum ullamco consectetur cillum dolor qui incididunt quis occaecat est proident eiusmod Lorem. Proident excepteur et mollit ipsum culpa duis ut fugiat tempor in ea.\r\n", + "address": "3 Troutman Street", + "city": "Roland", + "state": "Missouri", + "zip": 86860, + "country": "Venezuela", + "email": "mcculloughoneil@scentric.com", + "phone": "(823) 420-3250", + "color": "rgb(251,198,94)" + }, + { + "index": 285, + "name": "Gentry Ellis", + "first": "Bessie", + "last": "Mccarty", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/captnphilip/73.jpg", + "expanded": false, + "guid": "0c5c5f6a-c138-49a9-91a2-37523afe47ad", + "integer": 89, + "date": "Fri Jun 03 1983 21:40:24 GMT-0700 (PDT)", + "shortText": "in sint", + "mediumText": "Ullamco ex Lorem dolor cillum sint duis quis consequat consequat. Do ad proident ad deserunt do incididunt tempor qui anim tempor ullamco incididunt eiusmod Lorem. Et ex adipisicing esse sit velit excepteur reprehenderit proident enim. Magna exercitation ullamco commodo culpa fugiat laborum ipsum est ullamco occaecat nisi.", + "longText": "Ut veniam ad exercitation elit in anim nulla fugiat exercitation consequat officia enim. Sint id sunt sit Lorem veniam sint eu occaecat consequat consectetur nulla. Laboris incididunt aute esse duis magna proident cupidatat incididunt incididunt anim irure excepteur nostrud anim. Velit nisi officia pariatur pariatur enim veniam culpa ipsum nulla cupidatat id.\r\n", + "address": "4 Juliana Place", + "city": "Driftwood", + "state": "Kentucky", + "zip": 15926, + "country": "Hong Kong", + "email": "bessiemccarty@scentric.com", + "phone": "(873) 427-3409", + "color": "rgb(81,159,158)" + }, + { + "index": 286, + "name": "Walsh Joyce", + "first": "Antonia", + "last": "Wilder", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rangafangs/73.jpg", + "expanded": false, + "guid": "61dd3458-c773-4f4b-b2bb-3d301963acb2", + "integer": 63, + "date": "Thu Apr 03 2008 20:31:45 GMT-0700 (PDT)", + "shortText": "quis magna nisi", + "mediumText": "Pariatur ullamco mollit aliquip adipisicing dolore reprehenderit nulla in. Et do dolor pariatur est laboris ea amet proident elit proident est. Lorem et est nisi deserunt dolor consectetur cupidatat ea ex sunt. Qui amet veniam reprehenderit mollit adipisicing nulla in do voluptate. Fugiat irure esse proident esse anim Lorem et pariatur dolor.", + "longText": "Aute commodo incididunt eu consequat. Exercitation esse dolor id id in Lorem tempor laboris ex esse. Reprehenderit eiusmod consequat commodo consequat est. Ut magna mollit officia sint minim velit sunt magna commodo occaecat Lorem eu veniam nostrud.\r\nQui eu duis aliquip dolor dolor aliquip. Officia irure proident irure nulla non sint fugiat mollit sunt irure fugiat laborum. Labore non duis voluptate velit magna laborum aliquip officia ea reprehenderit ullamco ut eiusmod eiusmod. Velit sint esse eiusmod exercitation id voluptate veniam occaecat sit id eiusmod.\r\n", + "address": "3 Vandalia Avenue", + "city": "Haena", + "state": "American Samoa", + "zip": 29939, + "country": "Sri Lanka", + "email": "antoniawilder@scentric.com", + "phone": "(871) 452-2870", + "color": "rgb(215,69,234)" + }, + { + "index": 287, + "name": "Espinoza Sargent", + "first": "Lee", + "last": "Mccray", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zachbruggeman/73.jpg", + "expanded": false, + "guid": "8d6ab343-c3b7-4878-abfd-02a4bd8c4aad", + "integer": 34, + "date": "Sat Nov 24 2012 16:55:52 GMT-0800 (PST)", + "shortText": "laboris", + "mediumText": "Tempor et laboris nisi in deserunt ea veniam nostrud proident mollit ex nostrud adipisicing minim. Aliqua commodo eiusmod laborum labore. Velit et occaecat laborum aliqua labore culpa elit aute.", + "longText": "Ex labore aliquip voluptate enim Lorem qui cupidatat ipsum velit irure ullamco reprehenderit ad ad. Est enim ullamco velit pariatur eiusmod exercitation minim ex eiusmod laboris irure elit occaecat ipsum. Occaecat culpa dolore id veniam in. Consequat deserunt proident sit ad consequat proident. Dolore do voluptate ipsum eiusmod elit culpa irure in laborum aute. Ad ad dolor deserunt veniam aliqua adipisicing aliqua magna non pariatur dolore qui.\r\nNon in duis aliquip in nostrud magna ipsum ullamco. Reprehenderit do officia ad magna culpa id eiusmod et quis adipisicing nisi sint. Ullamco tempor cupidatat quis aliquip anim velit.\r\nDo id dolore veniam voluptate voluptate in ullamco dolor aliqua. Culpa duis enim eiusmod anim ipsum dolore consectetur velit esse aliqua aliquip amet. Nulla sit nulla et veniam eu. Sint nostrud do irure reprehenderit nulla consectetur in eu est id minim. Incididunt consectetur sint non nisi do anim veniam laboris in ad. Ut commodo elit est et mollit velit sunt dolore enim fugiat nulla voluptate sit irure. Laborum fugiat pariatur ut dolore ut qui minim.\r\nCupidatat nulla elit non ex elit. Deserunt exercitation excepteur nisi enim nulla commodo cupidatat exercitation est incididunt ex aute laboris. Id mollit nostrud veniam eiusmod minim esse nisi amet reprehenderit cillum aute sit fugiat. Nulla ad laboris laborum tempor dolor enim ullamco adipisicing do ipsum. Non reprehenderit sunt consectetur est labore consequat cupidatat cillum voluptate voluptate aliquip. Voluptate consectetur duis ipsum do mollit. Aute deserunt anim tempor veniam exercitation ut.\r\n", + "address": "4 Lombardy Street", + "city": "Thynedale", + "state": "Minnesota", + "zip": 37944, + "country": "Turkmenistan", + "email": "leemccray@scentric.com", + "phone": "(948) 512-3677", + "color": "rgb(124,117,105)" + }, + { + "index": 288, + "name": "Lillie Hewitt", + "first": "Cecelia", + "last": "Roman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/orkuncaylar/73.jpg", + "expanded": false, + "guid": "fd80b277-7170-4ff2-ad97-36272ea38b7d", + "integer": 54, + "date": "Mon Jul 11 1977 01:50:59 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Incididunt reprehenderit Lorem mollit consectetur adipisicing tempor occaecat nulla irure. Non nulla id proident quis est laboris adipisicing id eu id incididunt enim. Elit cillum sit ut elit nisi ea.", + "longText": "Ex adipisicing irure occaecat exercitation excepteur amet est eiusmod elit ullamco. Non tempor sit Lorem laborum laboris veniam elit sunt consequat. Pariatur officia laborum exercitation nostrud esse culpa consequat minim eiusmod voluptate consequat quis ad. Deserunt duis et Lorem labore do irure nostrud sit. Ullamco ad id sint sint cupidatat labore.\r\nEiusmod elit dolor qui nostrud eiusmod. Tempor veniam officia do exercitation. Id Lorem elit aute pariatur nostrud fugiat velit exercitation laboris ullamco irure. Laborum mollit occaecat reprehenderit dolore elit aliqua. Labore irure dolore proident non nisi culpa amet est anim non. Excepteur id veniam cupidatat aliquip ipsum cupidatat voluptate mollit in ut quis. Duis aute sunt fugiat ad consequat aliqua ea dolore esse consectetur non officia minim minim.\r\n", + "address": "3 Chauncey Street", + "city": "Rosedale", + "state": "Hawaii", + "zip": 94656, + "country": "Burundi", + "email": "ceceliaroman@scentric.com", + "phone": "(989) 468-2742", + "color": "rgb(136,244,245)" + }, + { + "index": 289, + "name": "Travis Ballard", + "first": "Georgia", + "last": "Horne", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/adamnac/73.jpg", + "expanded": false, + "guid": "c91bf011-bcd9-47fd-98b4-255ed2431de0", + "integer": 16, + "date": "Fri Aug 21 1998 11:13:07 GMT-0700 (PDT)", + "shortText": "sint enim fugiat culpa irure", + "mediumText": "Enim mollit ex velit anim ad. Mollit nulla sit est in minim voluptate ea deserunt commodo excepteur.", + "longText": "Consectetur aute officia nisi sint ut enim consequat. Id culpa in velit tempor nulla officia culpa. Ipsum occaecat tempor laborum veniam cillum occaecat consequat veniam. Nostrud aute velit veniam pariatur sint nostrud Lorem ipsum. Occaecat esse ea excepteur consequat exercitation eiusmod exercitation consequat do esse irure deserunt voluptate ut.\r\nConsectetur irure nostrud nulla ipsum fugiat nisi ex eu. Dolor ea deserunt aute cupidatat duis exercitation dolor consectetur do aliquip. Excepteur in ea cupidatat quis fugiat. Voluptate labore id tempor veniam pariatur excepteur ipsum.\r\nMagna qui ad aliqua minim sunt. Non enim eu proident esse dolor dolore elit Lorem dolore labore tempor eu. Incididunt elit esse cupidatat proident do sunt culpa sit elit cupidatat proident. Culpa dolore esse irure magna quis magna officia nostrud culpa dolor do non id. Esse laborum ea consequat commodo fugiat duis. Pariatur enim proident minim cupidatat dolor occaecat irure do. Incididunt dolor magna enim non ipsum minim cillum quis cillum velit culpa eu.\r\nEst esse eu commodo ea sint. Labore adipisicing cupidatat fugiat ea nostrud adipisicing ipsum. Esse eiusmod do tempor cillum sint dolor cillum occaecat incididunt ipsum exercitation sunt. Minim est ex commodo amet id sunt elit ea amet dolor ad. Ad elit exercitation consectetur nostrud elit exercitation irure fugiat dolore occaecat aliqua laborum. Sint sint et cupidatat laboris sunt exercitation ut dolor laborum consectetur minim.\r\n", + "address": "3 Jackson Place", + "city": "Titanic", + "state": "Alabama", + "zip": 30613, + "country": "Western Sahara", + "email": "georgiahorne@scentric.com", + "phone": "(862) 588-3110", + "color": "rgb(87,132,165)" + }, + { + "index": 290, + "name": "Natalie Mclaughlin", + "first": "Christa", + "last": "Whitney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremydowe/73.jpg", + "expanded": false, + "guid": "99003ea4-7908-4727-9909-1fc5a6e1b77d", + "integer": 38, + "date": "Wed Jun 18 2014 21:58:36 GMT-0700 (PDT)", + "shortText": "fugiat", + "mediumText": "Labore cillum ut voluptate laboris ipsum Lorem sint sit ut adipisicing ex occaecat aliquip nostrud. Deserunt officia minim sunt labore excepteur.", + "longText": "Voluptate cupidatat do eiusmod et ex magna nisi mollit veniam consequat fugiat. Velit culpa veniam sint nostrud aute aliquip id commodo consectetur. Reprehenderit aute consequat eu ullamco irure duis excepteur. Voluptate et aute culpa et pariatur sit ullamco deserunt cillum est magna reprehenderit tempor occaecat. Duis elit dolor id Lorem cupidatat sit aliquip. Pariatur aliqua occaecat sit sint in ullamco mollit duis aute proident. Et commodo pariatur nostrud est.\r\n", + "address": "3 Greenpoint Avenue", + "city": "Abiquiu", + "state": "North Carolina", + "zip": 97106, + "country": "Mozambique", + "email": "christawhitney@scentric.com", + "phone": "(882) 546-3928", + "color": "rgb(211,106,204)" + }, + { + "index": 291, + "name": "Sexton Phillips", + "first": "Ebony", + "last": "Riley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/adamawesomeface/73.jpg", + "expanded": false, + "guid": "79a69d1d-7c62-4f81-8cb4-2933233de8f0", + "integer": 31, + "date": "Mon Oct 28 1985 13:27:05 GMT-0800 (PST)", + "shortText": "duis", + "mediumText": "Duis do ullamco mollit reprehenderit proident labore laborum sint ipsum reprehenderit occaecat anim. Qui nostrud nostrud cillum in cupidatat duis sunt mollit et proident irure aliquip amet. Eiusmod amet elit occaecat ullamco in cillum proident exercitation nulla quis nisi. Velit qui ex nisi officia. Ullamco adipisicing irure sint excepteur aliquip consequat do cillum enim.", + "longText": "Ullamco labore amet est ullamco dolore quis tempor fugiat nulla eu aute duis. Pariatur officia sit Lorem occaecat aliquip nulla dolore incididunt id voluptate consequat sint ad. Tempor ipsum pariatur nisi laboris laboris id reprehenderit mollit est Lorem tempor fugiat dolore.\r\nAliqua et laborum amet proident ullamco velit minim est commodo culpa do ea excepteur anim. Sit qui nulla dolore laborum exercitation id qui id mollit consequat laboris adipisicing veniam anim. Pariatur reprehenderit id aliqua et pariatur nulla officia ex nostrud. Dolore ea do dolor nulla. Reprehenderit velit id eu nulla sunt ullamco eiusmod nulla consequat incididunt anim mollit enim.\r\n", + "address": "2 Moore Street", + "city": "Reno", + "state": "Connecticut", + "zip": 76313, + "country": "Grenada", + "email": "ebonyriley@scentric.com", + "phone": "(930) 448-2157", + "color": "rgb(79,135,188)" + }, + { + "index": 292, + "name": "Lynn Joyner", + "first": "Willis", + "last": "Wall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/low_res/73.jpg", + "expanded": false, + "guid": "0b8fad6f-6113-46f5-b586-19015be0120b", + "integer": 74, + "date": "Mon Oct 24 1988 13:00:24 GMT-0700 (PDT)", + "shortText": "excepteur exercitation", + "mediumText": "In occaecat voluptate officia in fugiat velit proident consectetur nulla tempor.", + "longText": "Amet veniam ex eiusmod ex nulla consequat nulla non duis officia. Reprehenderit esse laborum laboris velit fugiat sint incididunt consectetur nisi Lorem voluptate Lorem tempor quis. Voluptate veniam ea dolor laborum ea nostrud voluptate qui. Deserunt aliqua dolor culpa tempor ex consequat in. Esse est incididunt exercitation ad ex ad est. Aute culpa Lorem cillum est sunt adipisicing tempor eu cupidatat. Reprehenderit velit exercitation sunt adipisicing consequat velit eiusmod.\r\nDuis ex minim Lorem aute labore exercitation ipsum do magna minim. Lorem ipsum dolor laboris non minim. Ex laborum tempor commodo irure cillum dolore est ut sunt dolor excepteur officia pariatur. Labore commodo non anim et pariatur quis officia fugiat duis non id consequat.\r\nTempor ullamco cillum mollit aute id ipsum minim sunt anim aliqua fugiat. Ut incididunt dolore magna duis veniam et elit deserunt ad proident ea ea occaecat duis. Nulla proident consectetur sunt sint ex voluptate incididunt consequat laborum commodo enim do et culpa. Aute consequat minim elit Lorem adipisicing excepteur culpa.\r\n", + "address": "2 Lenox Road", + "city": "Otranto", + "state": "South Carolina", + "zip": 25833, + "country": "Cote D'Ivoire (Ivory Coast)", + "email": "williswall@scentric.com", + "phone": "(927) 481-2476", + "color": "rgb(59,194,92)" + }, + { + "index": 293, + "name": "Ursula Pearson", + "first": "Miriam", + "last": "Beck", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tomas_janousek/73.jpg", + "expanded": false, + "guid": "376bb50b-cbec-450c-a0c5-400189bf6ebd", + "integer": 27, + "date": "Sat Dec 27 1986 23:08:28 GMT-0800 (PST)", + "shortText": "tempor nostrud", + "mediumText": "Pariatur ex amet nulla ut nisi non sint sint. Labore minim aute id id ex. Consectetur eu aute ad aute irure proident. Tempor tempor velit labore nulla culpa sunt aliquip.", + "longText": "Exercitation culpa do nisi elit sit. Et fugiat mollit incididunt dolor esse consequat. Ut culpa duis sit laboris in enim fugiat exercitation. Nostrud ex qui laboris Lorem magna ea non nostrud ad esse. Et irure esse deserunt reprehenderit incididunt consectetur consequat do sint sunt. Nostrud cillum adipisicing quis duis.\r\nMollit eu officia velit velit ea consectetur fugiat amet nisi. Eiusmod sit culpa tempor fugiat reprehenderit irure proident. Labore laboris occaecat qui laboris ipsum irure sit consectetur consectetur laboris culpa. Minim ad aliquip enim Lorem qui culpa. Minim proident ipsum et ea sunt. Nulla et consectetur esse aute.\r\n", + "address": "2 Beayer Place", + "city": "Snelling", + "state": "Michigan", + "zip": 94691, + "country": "Philippines", + "email": "miriambeck@scentric.com", + "phone": "(829) 585-3891", + "color": "rgb(168,101,180)" + }, + { + "index": 294, + "name": "Hill Aguirre", + "first": "Kelley", + "last": "Myers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jghyllebert/73.jpg", + "expanded": false, + "guid": "34b624b3-92b6-4e5a-b477-c30521137ed1", + "integer": 85, + "date": "Tue Jun 01 2004 12:36:52 GMT-0700 (PDT)", + "shortText": "magna sit", + "mediumText": "Minim in cupidatat ullamco aliquip aliqua in nulla ullamco commodo esse quis sit. Ut aliquip elit cillum ad. Ex exercitation occaecat nulla nostrud elit aliquip nostrud commodo. Velit non cupidatat labore pariatur reprehenderit nulla anim deserunt mollit tempor ad nulla laboris qui. Exercitation aute fugiat quis anim aute.", + "longText": "Laboris id magna culpa aliquip anim nulla adipisicing mollit. Aute ad consequat ullamco in deserunt fugiat excepteur consectetur qui aliqua irure. Veniam ut in proident adipisicing dolore Lorem anim. Lorem veniam enim adipisicing nulla sint esse enim cupidatat. Sit ea ullamco laboris occaecat officia laborum ea do laboris duis velit minim.\r\nLaborum laborum sunt minim ex voluptate do elit ullamco reprehenderit mollit. Aliqua est esse magna aliqua laborum incididunt commodo aute velit esse sint irure tempor. Ut ut cupidatat quis exercitation exercitation. Proident aute id voluptate velit sint anim proident ea officia exercitation. Aliqua do labore veniam duis occaecat commodo. Anim duis elit esse non elit ut.\r\nVeniam minim excepteur consectetur enim ea enim ad nostrud exercitation enim deserunt. Fugiat cupidatat culpa dolore occaecat incididunt non aliquip sint ipsum. Duis velit ullamco consequat et nulla eu reprehenderit ut nostrud enim velit. Voluptate veniam et nulla incididunt aliqua nulla et consequat anim duis qui. Ullamco ipsum velit amet eu proident proident nisi qui aliquip sint. Minim do consectetur laborum laborum reprehenderit quis aliquip ut duis consectetur laboris reprehenderit mollit excepteur. Eiusmod aliquip deserunt aute ex.\r\n", + "address": "4 Garfield Place", + "city": "Enoree", + "state": "Maine", + "zip": 11286, + "country": "Bermuda", + "email": "kelleymyers@scentric.com", + "phone": "(843) 584-2383", + "color": "rgb(122,201,168)" + }, + { + "index": 295, + "name": "Roseann Bryant", + "first": "Jerry", + "last": "Hester", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gkaam/73.jpg", + "expanded": false, + "guid": "b860c080-a929-47e5-a0d0-71451a0c3af2", + "integer": 27, + "date": "Mon Feb 21 1977 02:23:49 GMT-0800 (PST)", + "shortText": "id commodo", + "mediumText": "Nulla reprehenderit laboris culpa aute laborum excepteur voluptate ullamco id. Consequat ut veniam occaecat officia dolore do. Laborum exercitation reprehenderit nostrud aute ut do. Esse laborum sit Lorem sint do mollit.", + "longText": "Dolore in cupidatat officia sunt. Sunt elit labore nisi est laboris dolore veniam. Esse pariatur in ex magna veniam aute.\r\nReprehenderit dolor nostrud amet reprehenderit sit nulla veniam ea id irure sit cupidatat laborum. Consectetur labore eiusmod magna ea esse ut exercitation voluptate eiusmod do. Ut cupidatat officia fugiat irure anim eu eu cillum minim ex ullamco.\r\nLabore reprehenderit culpa laboris irure cillum aliqua. Labore velit esse officia duis Lorem veniam fugiat laboris exercitation reprehenderit anim est incididunt qui. Cillum velit excepteur duis ullamco officia amet. Velit reprehenderit Lorem est pariatur culpa in amet quis nostrud nisi proident ex ex. Laboris aliquip nulla anim mollit mollit ea amet quis amet nisi et culpa nostrud. Magna esse in sit cillum eu sunt anim sit officia culpa ea aliqua ipsum. Excepteur ex ullamco quis in reprehenderit ex id sint commodo dolor tempor.\r\n", + "address": "2 Classon Avenue", + "city": "Harmon", + "state": "Kansas", + "zip": 61846, + "country": "Benin", + "email": "jerryhester@scentric.com", + "phone": "(890) 533-3064", + "color": "rgb(137,53,240)" + }, + { + "index": 296, + "name": "Darlene Brady", + "first": "Cindy", + "last": "Aguilar", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmetalpbalkan/73.jpg", + "expanded": false, + "guid": "1701f080-0b5d-4b9b-b030-9e4c5f307453", + "integer": 65, + "date": "Thu Aug 06 1981 04:50:44 GMT-0700 (PDT)", + "shortText": "minim", + "mediumText": "Reprehenderit aliquip consequat ut aliqua exercitation dolor ipsum cillum elit pariatur. Pariatur nisi laborum cupidatat eiusmod cillum exercitation pariatur magna eu sunt. Dolore culpa ut non occaecat.", + "longText": "Do occaecat do quis qui laboris veniam. Non minim eiusmod est do exercitation eu commodo irure sint deserunt nisi anim. Aute ex ea culpa fugiat sit labore ut incididunt tempor et aliqua culpa sint. Duis cillum laborum officia eiusmod qui veniam laborum incididunt. Cillum ullamco sint nostrud reprehenderit velit consectetur nostrud exercitation aute elit nisi velit occaecat ex.\r\n", + "address": "4 Fountain Avenue", + "city": "Bennett", + "state": "Iowa", + "zip": 74097, + "country": "Lithuania", + "email": "cindyaguilar@scentric.com", + "phone": "(812) 401-3316", + "color": "rgb(232,141,62)" + }, + { + "index": 297, + "name": "Patty Barr", + "first": "Ferguson", + "last": "Estrada", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/Silveredge9/73.jpg", + "expanded": false, + "guid": "fd87de9f-318b-4a1a-81e7-568f64e7c526", + "integer": 98, + "date": "Thu May 21 2009 02:11:35 GMT-0700 (PDT)", + "shortText": "excepteur excepteur esse culpa", + "mediumText": "Duis quis id elit culpa aute occaecat occaecat mollit culpa commodo ad labore laborum. Aliqua ea dolor Lorem ad laboris deserunt.", + "longText": "Ex in occaecat enim voluptate ex nisi officia. Id nostrud adipisicing sint commodo do proident minim sint tempor Lorem. Fugiat aliquip quis anim tempor laborum nisi voluptate minim non incididunt sint in. Aliqua dolore deserunt qui id eu cillum cillum ex nulla laboris nostrud eiusmod dolore. Qui dolor ullamco dolore proident aliqua.\r\nMagna consequat ex sunt occaecat enim deserunt dolor. Proident deserunt enim nulla eiusmod esse ea. Laborum aliquip nulla ipsum elit non pariatur nisi anim veniam amet aliqua. Ullamco cillum deserunt ex consectetur. Esse ex fugiat dolor ea ullamco dolor sit non. Esse eu occaecat dolore quis ipsum. Labore sint qui veniam fugiat est laboris sit.\r\nEst sint do veniam cillum occaecat aliqua ut sit Lorem consequat irure nostrud excepteur. Veniam dolore Lorem et nostrud quis esse est. Reprehenderit cillum laborum occaecat anim Lorem culpa sit aliquip consectetur ut enim eiusmod irure. Qui eu non eiusmod enim cillum sint in laborum sunt ipsum eiusmod enim est. Et labore occaecat dolor aliquip anim esse pariatur. Labore sit incididunt deserunt dolore ad deserunt. Lorem deserunt ex cillum qui amet adipisicing dolor eiusmod culpa id.\r\nEnim fugiat excepteur in ut ex pariatur pariatur sunt deserunt Lorem proident. Ipsum eu enim fugiat est ut ipsum do sint proident ipsum esse deserunt. Culpa minim duis ut aliquip sint sunt velit dolore amet. Consectetur enim enim velit velit non commodo velit nulla cupidatat laborum. Aliqua duis sint cupidatat excepteur adipisicing. Laboris proident irure aliqua esse irure aliqua ex consectetur.\r\n", + "address": "4 Monitor Street", + "city": "Clarksburg", + "state": "Vermont", + "zip": 44637, + "country": "Virgin Islands (British)", + "email": "fergusonestrada@scentric.com", + "phone": "(896) 548-2171", + "color": "rgb(100,112,105)" + }, + { + "index": 298, + "name": "Cunningham Flores", + "first": "Barbra", + "last": "Weiss", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_rennerlisa/73.jpg", + "expanded": false, + "guid": "c5081ce2-b967-4d87-9edd-e1b2d4d029cb", + "integer": 58, + "date": "Wed Nov 21 2001 11:50:05 GMT-0800 (PST)", + "shortText": "duis deserunt voluptate", + "mediumText": "Ea enim eu sit eu officia esse sunt. Consequat consequat exercitation officia incididunt consequat exercitation veniam do aute duis eiusmod irure velit. Anim labore ut exercitation excepteur irure incididunt laborum. Adipisicing et pariatur sit officia dolor laboris. Duis ipsum amet ipsum sit labore ipsum elit aliqua eiusmod.", + "longText": "Labore esse consectetur dolor veniam tempor incididunt ipsum aliqua velit laborum dolore Lorem in. Duis proident occaecat Lorem eu officia labore ullamco duis Lorem. Eu deserunt amet laboris aliqua anim sunt aliqua. Occaecat pariatur proident fugiat officia in dolore mollit consectetur dolore officia fugiat esse. Proident culpa veniam sit commodo. Quis sunt in velit id magna tempor est. Velit veniam aliquip cupidatat sunt quis veniam et minim.\r\nLorem ut fugiat in sit eiusmod officia in ad ad culpa culpa. Sit occaecat qui laboris labore amet magna irure ut ut anim esse incididunt ut velit. Dolor minim id reprehenderit reprehenderit labore. Dolore sint ipsum esse ut ex. Dolor esse est Lorem Lorem commodo veniam minim. Eu laborum amet labore nostrud cillum sint aliqua pariatur laborum ullamco consequat do. Quis proident in sunt laborum officia qui aliquip.\r\nIn cillum do cupidatat qui sint. Irure aliqua dolor proident esse tempor cupidatat laborum cillum. Culpa laboris nostrud esse eiusmod.\r\nReprehenderit non duis amet dolore excepteur ad et. Officia magna quis ipsum fugiat eu in nostrud labore culpa. Ullamco ullamco duis irure sit dolore amet aute non dolor adipisicing.\r\n", + "address": "2 River Street", + "city": "Wedgewood", + "state": "Nebraska", + "zip": 20486, + "country": "Jordan", + "email": "barbraweiss@scentric.com", + "phone": "(828) 488-2896", + "color": "rgb(86,115,171)" + }, + { + "index": 299, + "name": "Bobbi Salas", + "first": "Ines", + "last": "Howell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kulturpessimist/73.jpg", + "expanded": false, + "guid": "3bfa3d64-c2c0-4ea1-9111-2f9ca46c2a87", + "integer": 81, + "date": "Mon Jan 06 2014 11:35:59 GMT-0800 (PST)", + "shortText": "elit nostrud", + "mediumText": "In anim nulla tempor Lorem sunt in enim fugiat eiusmod occaecat aliquip eiusmod aute.", + "longText": "Consectetur excepteur pariatur officia esse cupidatat duis do excepteur nostrud id deserunt. Veniam ad consequat nostrud id fugiat cupidatat sint sunt cillum aute commodo dolore adipisicing. Eu dolor exercitation ullamco enim consequat ad pariatur incididunt. Nisi dolor eiusmod reprehenderit non. Culpa ex labore cupidatat mollit incididunt veniam qui ipsum commodo sunt. In qui aliqua tempor excepteur ut ea cillum.\r\n", + "address": "2 Cypress Court", + "city": "Kiskimere", + "state": "Florida", + "zip": 33788, + "country": "Nicaragua", + "email": "ineshowell@scentric.com", + "phone": "(959) 501-3404", + "color": "rgb(139,215,118)" + }, + { + "index": 300, + "name": "Alice Cooke", + "first": "Dillon", + "last": "Goodwin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/picard102/73.jpg", + "expanded": false, + "guid": "b536f301-48d7-4e68-90a9-c9d3caf00547", + "integer": 95, + "date": "Mon Jan 13 1992 21:08:29 GMT-0800 (PST)", + "shortText": "amet dolor ut consequat", + "mediumText": "Laborum excepteur esse qui sint. Enim ullamco amet anim commodo sunt incididunt dolore. Pariatur mollit esse consectetur fugiat ex esse voluptate enim.", + "longText": "Occaecat duis sit labore magna. Aute veniam ex reprehenderit irure dolor. Aliquip dolor quis sint eu do sunt commodo nulla cillum. Non minim fugiat nulla amet ullamco ipsum ex. Nulla incididunt proident labore veniam aliquip duis fugiat fugiat laboris nisi anim. Aliqua aliqua aliqua elit excepteur magna esse non ipsum mollit qui sint irure magna labore.\r\nId commodo sunt officia sit aute dolor consectetur et eiusmod deserunt mollit est magna laboris. Est laborum nulla in ex adipisicing veniam. Nisi anim ut dolore cupidatat fugiat eu. Eiusmod et culpa ex quis fugiat nostrud culpa. Excepteur ipsum enim excepteur minim esse aliquip elit amet aliquip incididunt Lorem. Quis laboris officia pariatur nisi ad sunt pariatur mollit cillum eu nostrud nulla. Ad ea excepteur est sint aliqua minim sint voluptate magna tempor nostrud pariatur duis.\r\nEu laboris ea esse adipisicing est veniam sint elit eiusmod. Consectetur voluptate eiusmod do anim reprehenderit pariatur aliqua ullamco voluptate nulla commodo aliqua id. Voluptate deserunt irure Lorem velit amet consectetur amet deserunt. Excepteur id esse eiusmod cupidatat laborum fugiat. Ea labore et amet non.\r\nAmet ea aute magna tempor. Duis voluptate culpa voluptate culpa ut irure. Adipisicing laborum deserunt nulla amet magna velit est nisi do pariatur nulla culpa laboris. Amet proident voluptate cillum ullamco cupidatat. Elit est incididunt sint fugiat tempor.\r\nEiusmod exercitation voluptate laborum laboris laborum aliquip magna esse mollit cupidatat magna excepteur do. Magna tempor excepteur ex dolor. Pariatur sunt duis minim duis aute cupidatat qui in anim qui. Do nulla anim reprehenderit deserunt nostrud enim dolore ad eu eu eiusmod irure duis culpa.\r\n", + "address": "4 Vanderbilt Street", + "city": "Disautel", + "state": "New Jersey", + "zip": 93269, + "country": "South Africa", + "email": "dillongoodwin@scentric.com", + "phone": "(884) 433-3460", + "color": "rgb(218,70,51)" + }, + { + "index": 301, + "name": "Bianca Miles", + "first": "Eddie", + "last": "Lambert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/e_zrra/73.jpg", + "expanded": false, + "guid": "d469f64f-4779-4372-ae48-a5c5546cc282", + "integer": 69, + "date": "Sat Feb 23 1974 14:20:00 GMT-0700 (PDT)", + "shortText": "proident mollit ad ipsum eu", + "mediumText": "Id sint adipisicing nostrud nulla velit amet ullamco Lorem adipisicing sit in ipsum. Ad ex ut nostrud exercitation pariatur proident ullamco esse ex quis id aliqua elit. Culpa et laborum enim laboris.", + "longText": "Consectetur reprehenderit qui velit proident ipsum voluptate Lorem. Nisi sit consectetur irure do occaecat tempor cupidatat dolor deserunt excepteur velit. Culpa incididunt veniam consequat veniam ex nisi nulla deserunt. Reprehenderit aliqua nisi enim in fugiat magna consectetur officia aute elit commodo mollit. Quis ipsum eiusmod fugiat ut consequat amet do eu.\r\nExcepteur magna deserunt qui ut esse duis commodo nostrud magna adipisicing culpa ullamco proident enim. Laboris aliquip non dolor in enim quis eu. Ex non cupidatat nostrud sit ut ea et ex irure tempor sint excepteur sit fugiat. Id cupidatat elit amet sit ullamco sint tempor sit tempor. Incididunt Lorem magna veniam occaecat duis aute minim duis sint.\r\nCillum pariatur non esse amet incididunt. Consectetur veniam aliquip consequat id consectetur enim excepteur dolore ullamco enim sunt elit ea eiusmod. Eiusmod aute veniam nostrud irure sunt pariatur irure magna exercitation irure adipisicing consequat enim. In et ex occaecat occaecat velit. In id qui aliquip nisi nostrud anim laborum nulla magna exercitation esse aliquip culpa amet. Exercitation tempor adipisicing culpa sit eu est fugiat consequat. Laboris minim nulla nisi labore enim sint consequat pariatur.\r\nPariatur occaecat culpa voluptate exercitation velit esse excepteur. Exercitation eiusmod et enim labore. Sunt sunt qui non ipsum nostrud nostrud veniam dolor velit velit qui. Anim qui reprehenderit ut quis mollit cillum. Eu dolor reprehenderit excepteur do ipsum eu. Proident veniam cillum qui in ex cupidatat duis anim deserunt consectetur Lorem eu. Incididunt consectetur eiusmod mollit dolor cupidatat adipisicing adipisicing est.\r\nVeniam ad ipsum fugiat occaecat laborum est culpa mollit ipsum Lorem. Ut ullamco quis amet adipisicing pariatur fugiat qui labore labore consectetur tempor adipisicing proident. Proident tempor reprehenderit ut ea dolor Lorem nisi. Labore adipisicing commodo ad eu sit nulla cillum. Adipisicing veniam Lorem ex nulla labore ad excepteur aliquip cillum Lorem. Ea incididunt proident ullamco incididunt tempor esse est. Incididunt quis nostrud deserunt irure sit do.\r\n", + "address": "2 Oriental Boulevard", + "city": "Cobbtown", + "state": "Wisconsin", + "zip": 11605, + "country": "Mexico", + "email": "eddielambert@scentric.com", + "phone": "(946) 553-2155", + "color": "rgb(90,142,67)" + }, + { + "index": 302, + "name": "Gracie Fuentes", + "first": "Cecilia", + "last": "Page", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/voldy333/73.jpg", + "expanded": false, + "guid": "55c8f54a-2927-4fc0-b0c6-4f8f5ef1107c", + "integer": 93, + "date": "Wed Aug 26 2009 01:27:46 GMT-0700 (PDT)", + "shortText": "culpa est", + "mediumText": "Aliquip consequat exercitation est sit magna sunt cillum occaecat. Nulla qui aute non eu exercitation.", + "longText": "Amet elit in ullamco aliqua proident dolore quis excepteur tempor ut. Lorem aliqua ipsum labore fugiat voluptate duis anim sunt dolor enim do proident non. Magna aliqua exercitation cupidatat fugiat non deserunt qui laborum cupidatat nisi.\r\nCommodo ullamco incididunt est dolore ad sint culpa sunt dolor enim. Esse consequat consectetur eiusmod dolore Lorem eu aliquip minim id exercitation incididunt. Fugiat aliquip non in commodo ex consectetur eiusmod reprehenderit exercitation aute. Aliqua ut occaecat adipisicing sint duis mollit cillum id sunt pariatur tempor proident aliqua. Culpa exercitation non dolor id laborum labore duis dolore ex duis mollit veniam sit. Ut id est ipsum anim labore do ex tempor anim laboris consequat eu commodo. Cillum do Lorem aliqua Lorem in sunt non ullamco velit aliquip.\r\nUllamco minim quis eu consequat. Et labore irure adipisicing cillum fugiat in in. Pariatur amet in dolore ipsum amet consectetur veniam commodo esse dolore. Nostrud sit aliquip ipsum incididunt enim commodo qui irure. Occaecat nostrud consequat aliquip ex labore excepteur nostrud velit labore et amet nulla dolor. Ea exercitation nulla sint magna aute aute enim labore enim exercitation. Est dolor ipsum mollit aliquip sunt voluptate amet veniam ullamco.\r\nEiusmod ea aute pariatur pariatur et tempor. Veniam eiusmod incididunt ullamco nulla. Esse excepteur culpa veniam sunt. Aliquip duis amet laboris qui est nostrud consequat. Fugiat incididunt laboris aute Lorem ea laboris consequat nostrud mollit duis. Reprehenderit consequat dolore labore nostrud non eiusmod tempor consequat nostrud ipsum adipisicing.\r\nTempor cillum reprehenderit consectetur elit incididunt exercitation. Sint anim eu enim ullamco adipisicing nostrud et sunt sit nulla quis et non quis. Ut eiusmod elit dolor ea commodo reprehenderit non. Sint duis commodo excepteur ad ad laboris exercitation dolore proident quis. Eu laborum exercitation consequat mollit esse. Aute tempor ipsum veniam exercitation labore culpa duis qui.\r\n", + "address": "2 Lloyd Court", + "city": "Roy", + "state": "Washington", + "zip": 84762, + "country": "Sudan", + "email": "ceciliapage@scentric.com", + "phone": "(834) 596-3524", + "color": "rgb(96,136,83)" + }, + { + "index": 303, + "name": "Marion Mcleod", + "first": "Valerie", + "last": "Snow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jasonmarkjones/73.jpg", + "expanded": false, + "guid": "c9e129b1-7fdd-4a79-82ea-ec24bd138ccb", + "integer": 3, + "date": "Sun Dec 28 2008 07:30:23 GMT-0800 (PST)", + "shortText": "incididunt culpa anim officia", + "mediumText": "Eiusmod laborum aute culpa incididunt reprehenderit quis sunt minim culpa proident non proident ex. Ea mollit pariatur in voluptate Lorem ullamco ea fugiat deserunt laboris magna quis commodo Lorem. Irure sunt commodo proident id adipisicing irure deserunt ad ullamco eiusmod deserunt tempor sint labore. Eiusmod fugiat commodo aliquip excepteur nisi irure deserunt esse.", + "longText": "Est consectetur adipisicing est officia. Fugiat esse dolor qui aliquip aute est eu irure excepteur incididunt. Consectetur qui nulla culpa ea cupidatat labore adipisicing. Consectetur aliquip reprehenderit anim magna nulla Lorem proident consectetur mollit consectetur fugiat et deserunt magna. Incididunt culpa Lorem velit ut fugiat irure dolore enim nulla ut. Commodo elit enim incididunt deserunt incididunt officia.\r\nNostrud sit ipsum non elit proident fugiat aliqua culpa aute nostrud. Occaecat amet duis enim aliquip dolor aute anim nulla duis duis commodo sunt nisi. Amet ex eiusmod commodo veniam aliquip Lorem enim irure elit pariatur esse.\r\nEiusmod et ea aute elit ea ullamco consectetur adipisicing adipisicing sit anim. Cillum ipsum deserunt irure do incididunt tempor aliqua sit tempor sunt sit nisi officia est. Incididunt aliquip amet ex est ea ullamco consequat tempor voluptate ex anim quis officia. Pariatur commodo velit amet deserunt. Aliquip irure ullamco laboris laborum ea duis ea aute elit culpa sit deserunt ad.\r\nDolor veniam Lorem reprehenderit nostrud culpa excepteur pariatur eiusmod tempor. Amet nisi excepteur id laborum minim veniam. Nisi laborum aliqua pariatur laboris qui eiusmod nisi deserunt reprehenderit cillum nulla non reprehenderit.\r\n", + "address": "2 Wyckoff Street", + "city": "Brantleyville", + "state": "Oregon", + "zip": 70507, + "country": "Papua New Guinea", + "email": "valeriesnow@scentric.com", + "phone": "(998) 544-3267", + "color": "rgb(187,108,144)" + }, + { + "index": 304, + "name": "Jimmie Rutledge", + "first": "Robbie", + "last": "Morton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/r_oy/73.jpg", + "expanded": false, + "guid": "d8dded94-1c64-4d63-b175-e22679a649ea", + "integer": 98, + "date": "Wed Aug 22 1990 18:30:41 GMT-0700 (PDT)", + "shortText": "labore fugiat exercitation cupidatat ex", + "mediumText": "Cupidatat aliquip reprehenderit officia eu est fugiat deserunt. Fugiat labore do elit quis et nisi culpa. Exercitation labore laborum ad irure deserunt consequat. Commodo do dolor nulla anim aliqua consectetur cupidatat excepteur non minim commodo.", + "longText": "Qui incididunt reprehenderit veniam eu fugiat aute enim ipsum. Quis aliquip ea commodo proident exercitation tempor duis. Non commodo in duis id cillum excepteur eu elit. Deserunt Lorem proident in laboris quis ea et. Cupidatat irure veniam sit incididunt. Dolor ut dolor labore ullamco enim. Qui deserunt ullamco ex aute elit nulla officia sit exercitation.\r\nDo commodo officia esse sint. Aliqua est reprehenderit anim fugiat sunt esse tempor dolor officia dolore veniam ex mollit. Ad ea culpa laboris ea anim commodo. Incididunt sunt reprehenderit non laboris aute magna laborum aute labore aliqua. Esse nulla nostrud id occaecat pariatur laborum ut voluptate. Ex cillum officia cupidatat duis ex Lorem laboris fugiat aliquip in est et incididunt. Veniam laboris commodo nostrud consequat sunt dolore.\r\n", + "address": "3 Hornell Loop", + "city": "Aguila", + "state": "Illinois", + "zip": 50667, + "country": "Romania", + "email": "robbiemorton@scentric.com", + "phone": "(980) 409-3469", + "color": "rgb(235,114,85)" + }, + { + "index": 305, + "name": "Sweet Humphrey", + "first": "Duke", + "last": "Vargas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/boericke/73.jpg", + "expanded": false, + "guid": "e9257b10-4071-40be-a831-77dc11b731e5", + "integer": 25, + "date": "Sun Oct 19 2008 14:12:07 GMT-0700 (PDT)", + "shortText": "duis deserunt ex ad", + "mediumText": "Anim duis quis amet laboris id adipisicing magna. Lorem ullamco magna consequat adipisicing dolor magna.", + "longText": "Velit mollit pariatur fugiat cupidatat veniam est. Laborum non reprehenderit qui in labore nisi. Reprehenderit officia est culpa fugiat dolore non sint consequat duis velit enim do laboris. Cillum reprehenderit consectetur minim nisi consectetur sint culpa pariatur reprehenderit incididunt.\r\nDolore cillum sit enim pariatur sunt duis deserunt nostrud occaecat sit. Aliqua do ut cillum aliquip adipisicing qui. Pariatur culpa velit dolor ut aliqua elit sunt non anim magna deserunt et anim. Irure non aute velit cupidatat labore esse non duis sit qui amet officia voluptate. Deserunt et proident amet anim duis consectetur commodo mollit. Commodo voluptate deserunt eiusmod sit.\r\n", + "address": "4 Carroll Street", + "city": "Sehili", + "state": "West Virginia", + "zip": 80913, + "country": "Bangladesh", + "email": "dukevargas@scentric.com", + "phone": "(978) 506-3898", + "color": "rgb(226,72,213)" + }, + { + "index": 306, + "name": "Rivas Mcmillan", + "first": "Kelley", + "last": "Gamble", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/phanalpha/73.jpg", + "expanded": false, + "guid": "bd339242-0db1-4838-9a8f-198fefcd1392", + "integer": 97, + "date": "Thu Mar 09 1972 11:02:38 GMT-0800 (PST)", + "shortText": "reprehenderit exercitation consectetur officia", + "mediumText": "Id culpa aliqua ullamco ad. Dolor eu cillum minim officia quis occaecat. Labore nulla ea dolore aliquip exercitation enim. Non ipsum dolore Lorem esse incididunt tempor culpa nulla.", + "longText": "Id do duis dolore cupidatat culpa aliquip Lorem cupidatat mollit proident minim sint duis. Reprehenderit dolor incididunt cillum elit esse irure aliquip fugiat ex officia ad cupidatat velit. Ex ea aliquip ea labore id non occaecat mollit nostrud consequat irure cillum minim. Officia quis nostrud dolore quis nostrud esse laborum id magna nulla qui id commodo. Nisi mollit elit elit velit minim cillum sit eiusmod fugiat eiusmod et cillum eiusmod pariatur.\r\nNulla pariatur enim mollit sunt ad excepteur exercitation minim culpa adipisicing. Anim qui adipisicing pariatur aliquip. Proident cupidatat veniam in et est magna labore reprehenderit in. Qui Lorem reprehenderit in in.\r\n", + "address": "4 Fleet Street", + "city": "Nile", + "state": "Mississippi", + "zip": 85536, + "country": "Monaco", + "email": "kelleygamble@scentric.com", + "phone": "(880) 406-2442", + "color": "rgb(60,94,167)" + }, + { + "index": 307, + "name": "Arline Cantrell", + "first": "Maldonado", + "last": "Kaufman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/miguellagran/73.jpg", + "expanded": false, + "guid": "8b28f57b-1d99-4094-a3a5-8ca8bdc0ebac", + "integer": 83, + "date": "Mon Jan 21 1974 10:44:50 GMT-0700 (PDT)", + "shortText": "cillum mollit irure id cillum", + "mediumText": "Duis aliqua fugiat deserunt ad veniam veniam esse fugiat commodo tempor. Non consectetur commodo eu dolore eu veniam. Mollit ullamco ut minim mollit. Qui enim aliqua nisi officia. Ipsum dolore ut adipisicing ea aliqua et ea incididunt consectetur laborum dolore qui fugiat ut.", + "longText": "Excepteur adipisicing cupidatat et aliquip commodo voluptate aute pariatur culpa occaecat reprehenderit nostrud. Reprehenderit occaecat eiusmod ut elit magna occaecat. Et aute duis consectetur dolor ut consequat ad.\r\nProident ad cillum sit ullamco. Labore eu laborum enim adipisicing nisi sunt ipsum in non excepteur quis officia in. Anim anim eu consectetur est sint et quis. Amet amet cupidatat reprehenderit aliquip. Elit voluptate ad anim dolore anim tempor nostrud tempor.\r\n", + "address": "4 Hinckley Place", + "city": "Swartzville", + "state": "Rhode Island", + "zip": 72582, + "country": "Martinique", + "email": "maldonadokaufman@scentric.com", + "phone": "(902) 553-3658", + "color": "rgb(87,176,75)" + }, + { + "index": 308, + "name": "Ortega Terry", + "first": "Muriel", + "last": "Pickett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dustinlamont/73.jpg", + "expanded": false, + "guid": "46a75489-56ac-4c3a-88c3-1bc1b2260321", + "integer": 79, + "date": "Thu Dec 20 2012 17:16:17 GMT-0800 (PST)", + "shortText": "quis laborum", + "mediumText": "Eu eu occaecat esse ad aliquip occaecat tempor dolor veniam sint ut mollit.", + "longText": "Elit labore ex culpa ad consectetur mollit. Dolore velit nostrud consectetur officia pariatur dolore do laboris deserunt cillum id consequat occaecat aliqua. Mollit est sit aute cillum tempor laborum officia. Eiusmod in aliquip est consequat excepteur sunt voluptate do deserunt ea. Tempor non laborum aliqua ad sit culpa consequat laborum.\r\nAmet tempor ipsum et laborum adipisicing non nulla ad. Nostrud in ex incididunt minim et ullamco velit. Voluptate aliquip est culpa exercitation fugiat proident ex elit enim aute excepteur in dolore duis. Cillum consectetur fugiat eiusmod consequat cupidatat commodo aliqua consectetur excepteur mollit voluptate sint. Deserunt ad dolor elit reprehenderit deserunt esse nisi in deserunt est eiusmod exercitation fugiat.\r\n", + "address": "4 Alice Court", + "city": "Whitewater", + "state": "Georgia", + "zip": 58312, + "country": "Kuwait", + "email": "murielpickett@scentric.com", + "phone": "(848) 468-2790", + "color": "rgb(99,60,211)" + }, + { + "index": 309, + "name": "Rosie Beasley", + "first": "Cora", + "last": "Vaughan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrzero158/73.jpg", + "expanded": false, + "guid": "94799d19-471d-4d23-9c9f-44ee2cb25c6f", + "integer": 96, + "date": "Tue Nov 09 1982 16:08:56 GMT-0800 (PST)", + "shortText": "do ea aute", + "mediumText": "Ex aliquip duis quis dolore adipisicing mollit excepteur aliquip consectetur id. Adipisicing eu ipsum cupidatat ullamco voluptate. Duis occaecat occaecat mollit incididunt cillum ipsum id tempor. Officia ex eiusmod pariatur dolore fugiat aute ad. Sit ad non ipsum nulla.", + "longText": "Officia officia ad non commodo anim. Anim ad non ut excepteur voluptate amet consequat Lorem sunt ad. Deserunt enim ad nisi in amet anim anim culpa et officia aute reprehenderit sint eiusmod. Anim laborum occaecat culpa aute ipsum do. Officia irure sit nostrud nulla laborum reprehenderit laboris est ex culpa. Cillum exercitation aute Lorem enim amet commodo amet anim sunt mollit pariatur in consequat.\r\nCupidatat occaecat ex ex pariatur dolore fugiat incididunt velit qui reprehenderit. Ullamco enim nisi deserunt laborum aute. Aliquip duis do enim adipisicing cupidatat. Consequat aute sint non laborum quis laboris reprehenderit aliqua non culpa. Enim est amet nostrud ullamco minim duis eu labore ut magna excepteur.\r\nAmet sint pariatur ad nostrud irure qui do eiusmod irure id ea. Veniam cillum minim excepteur ut quis tempor et officia consequat ut in. Laboris exercitation ad proident esse in tempor exercitation aliqua veniam aute minim.\r\nConsectetur fugiat duis adipisicing dolore et exercitation reprehenderit. Eu nostrud qui veniam non. Voluptate quis nisi reprehenderit non adipisicing amet ipsum irure velit labore nostrud reprehenderit.\r\n", + "address": "3 Canton Court", + "city": "Glendale", + "state": "New Mexico", + "zip": 99043, + "country": "Ukraine", + "email": "coravaughan@scentric.com", + "phone": "(961) 557-2273", + "color": "rgb(111,160,125)" + }, + { + "index": 310, + "name": "Olivia Becker", + "first": "Wyatt", + "last": "Mcneil", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/donaldjohns/73.jpg", + "expanded": false, + "guid": "4c1be78a-e176-445f-93d3-f818ae0d96b0", + "integer": 31, + "date": "Thu Sep 18 1980 04:25:22 GMT-0700 (PDT)", + "shortText": "excepteur labore sint in", + "mediumText": "Sint consectetur anim tempor ea pariatur cillum sit do in exercitation. Aliqua nisi esse laborum voluptate consectetur et amet magna consequat irure anim. Adipisicing veniam veniam id veniam laboris Lorem cupidatat quis pariatur voluptate.", + "longText": "Non et officia eu do eu deserunt tempor dolore velit commodo cillum sint. Consectetur aliqua sunt pariatur sint. Quis esse aliqua elit labore sunt velit officia consequat anim consequat quis mollit id reprehenderit.\r\n", + "address": "2 Menahan Street", + "city": "Lorraine", + "state": "Arizona", + "zip": 11066, + "country": "Guatemala", + "email": "wyattmcneil@scentric.com", + "phone": "(888) 600-2767", + "color": "rgb(65,51,174)" + }, + { + "index": 311, + "name": "Aguirre Mendez", + "first": "Dona", + "last": "Kane", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ah_lice/73.jpg", + "expanded": false, + "guid": "5c63b545-e732-43bc-af3f-32e0c68ad484", + "integer": 76, + "date": "Wed Oct 10 2007 23:01:28 GMT-0700 (PDT)", + "shortText": "voluptate eu cillum anim", + "mediumText": "Culpa voluptate laborum pariatur consectetur sit esse ullamco cupidatat elit adipisicing qui culpa ex. Ut ad tempor ipsum ut quis ipsum. Non officia enim do tempor ad do excepteur velit sit duis mollit aliquip. Dolore aliqua eiusmod commodo nostrud amet cillum dolore.", + "longText": "Ullamco laborum esse mollit aliqua aute deserunt Lorem. Officia eiusmod fugiat exercitation esse consequat commodo veniam. Cupidatat amet non cillum mollit do ut excepteur reprehenderit consectetur eiusmod ut exercitation sit. Sint id irure ullamco quis anim labore. Culpa duis aliquip qui elit ex laborum.\r\nAdipisicing et est culpa deserunt irure. Ullamco ut sit do fugiat. Enim nulla laborum ea anim Lorem eiusmod incididunt eiusmod velit enim incididunt id sit. Consectetur magna ut minim ipsum est commodo cillum cupidatat excepteur. Nostrud minim veniam veniam laborum anim. Nulla consectetur ea nostrud et culpa dolor est.\r\n", + "address": "2 Losee Terrace", + "city": "Fedora", + "state": "Texas", + "zip": 18483, + "country": "Argentina", + "email": "donakane@scentric.com", + "phone": "(876) 594-2112", + "color": "rgb(134,128,159)" + }, + { + "index": 312, + "name": "Holden Shaffer", + "first": "Dana", + "last": "Raymond", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/enda/73.jpg", + "expanded": false, + "guid": "2f0136bc-47e0-4206-b4f4-d87b45b44a4a", + "integer": 94, + "date": "Thu Jul 04 2002 17:43:16 GMT-0700 (PDT)", + "shortText": "quis ex cillum enim", + "mediumText": "Sit incididunt reprehenderit velit elit laborum sint est nulla. Ipsum dolore sit laborum eu occaecat dolor reprehenderit adipisicing nisi. Et aliquip officia fugiat consequat aliquip exercitation.", + "longText": "Deserunt veniam veniam fugiat eu proident aute aute cupidatat pariatur qui non nostrud qui nulla. Consequat quis enim consequat ea minim ex est duis commodo qui exercitation. Ex et mollit ea adipisicing aliqua occaecat nostrud elit minim sint esse. Magna deserunt nulla voluptate aute. Duis ullamco tempor voluptate adipisicing eu veniam ad quis quis enim. Ea adipisicing veniam eu nostrud amet laborum.\r\n", + "address": "2 Lawton Street", + "city": "Durham", + "state": "District Of Columbia", + "zip": 20487, + "country": "Mauritius", + "email": "danaraymond@scentric.com", + "phone": "(836) 540-2790", + "color": "rgb(187,110,242)" + }, + { + "index": 313, + "name": "Cherie Lynn", + "first": "Johnston", + "last": "Head", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guillogo/73.jpg", + "expanded": false, + "guid": "72ab6b5a-bd21-4563-b6b0-ab24cff5caed", + "integer": 80, + "date": "Fri May 10 1974 03:24:27 GMT-0700 (PDT)", + "shortText": "ad enim", + "mediumText": "Ut adipisicing excepteur ex Lorem cupidatat esse ipsum deserunt nisi irure in ut. Quis reprehenderit sunt non amet consectetur Lorem ut sit. Culpa ex laboris pariatur nisi quis qui. Amet in aliquip occaecat quis eiusmod nostrud occaecat consequat consequat.", + "longText": "Adipisicing esse occaecat sint quis nostrud. Sint incididunt elit mollit excepteur dolore. Lorem tempor excepteur occaecat cupidatat voluptate sit officia exercitation laborum. Cupidatat id reprehenderit deserunt minim.\r\n", + "address": "4 Surf Avenue", + "city": "Cleary", + "state": "Virgin Islands", + "zip": 76947, + "country": "St. Helena", + "email": "johnstonhead@scentric.com", + "phone": "(925) 538-2973", + "color": "rgb(59,239,155)" + }, + { + "index": 314, + "name": "Alvarez Byrd", + "first": "Cristina", + "last": "Bullock", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iboldurev/73.jpg", + "expanded": false, + "guid": "11934487-0dbb-4d2a-bf49-4f9e5938f248", + "integer": 88, + "date": "Fri Mar 12 1993 09:02:34 GMT-0800 (PST)", + "shortText": "veniam ad ullamco", + "mediumText": "Quis labore cillum magna incididunt. Nisi enim magna et tempor voluptate amet aute proident.", + "longText": "Laborum proident non sint cupidatat pariatur occaecat adipisicing voluptate aliquip. Mollit elit ut voluptate eu labore Lorem. Ullamco aliquip commodo do duis labore do aliquip in aliquip reprehenderit occaecat exercitation. Duis cillum voluptate ipsum minim sit commodo occaecat ex ipsum ex. Anim et Lorem ex elit fugiat.\r\n", + "address": "3 Ross Street", + "city": "Dola", + "state": "Puerto Rico", + "zip": 69951, + "country": "Suriname", + "email": "cristinabullock@scentric.com", + "phone": "(847) 528-3630", + "color": "rgb(146,84,109)" + }, + { + "index": 315, + "name": "Gonzalez Freeman", + "first": "Sampson", + "last": "Smith", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/smalonso/73.jpg", + "expanded": false, + "guid": "62c47315-656a-41e7-b9b4-7ee380ad77e8", + "integer": 58, + "date": "Sat Feb 15 2003 14:30:07 GMT-0800 (PST)", + "shortText": "sint", + "mediumText": "Excepteur tempor magna eiusmod pariatur anim consequat mollit excepteur nulla duis ut eu esse pariatur. Deserunt cillum amet incididunt nisi ut laboris quis enim labore. Eiusmod cupidatat qui officia ex dolor sint occaecat elit fugiat ex.", + "longText": "Do consequat voluptate duis aliqua Lorem cillum labore. Reprehenderit commodo esse anim aliqua exercitation qui. Elit nostrud officia esse aliquip in eiusmod ipsum duis ullamco. Elit deserunt magna voluptate mollit. Quis dolore esse reprehenderit sunt dolore nulla sunt duis fugiat.\r\n", + "address": "4 Hutchinson Court", + "city": "Utting", + "state": "Maryland", + "zip": 69064, + "country": "Greece", + "email": "sampsonsmith@scentric.com", + "phone": "(829) 445-2244", + "color": "rgb(246,63,201)" + }, + { + "index": 316, + "name": "Wheeler Zamora", + "first": "Bush", + "last": "Dickerson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taherrapee/73.jpg", + "expanded": false, + "guid": "a91485a2-e0b1-4e16-afa8-afb990283828", + "integer": 25, + "date": "Mon Jun 05 2006 06:35:22 GMT-0700 (PDT)", + "shortText": "sit pariatur", + "mediumText": "Officia minim occaecat nostrud dolor eiusmod. Reprehenderit aliquip esse sint qui deserunt do nostrud proident id est quis minim. Consectetur ad ut tempor anim elit dolore reprehenderit consectetur do culpa minim.", + "longText": "Exercitation officia est aute sunt nisi. Et officia irure eu deserunt enim est nulla. Commodo commodo consequat dolor eiusmod dolor. Aliqua qui consequat cillum velit et minim consectetur duis et culpa velit nostrud laborum. Labore id cillum nulla excepteur voluptate eu velit pariatur anim nulla. Ut qui tempor officia dolore anim enim veniam tempor ex exercitation eiusmod commodo ex ut. Non aute veniam sunt esse culpa non aliqua quis elit culpa elit.\r\nCommodo ut cillum quis laboris aliquip in. Mollit nisi amet cillum nisi laboris est officia. Non laborum fugiat ea non nisi. Et velit incididunt enim magna. Aute anim aute occaecat consequat ipsum Lorem et laboris esse aliquip proident pariatur. Consectetur non consectetur labore laboris ea est.\r\nAdipisicing laborum officia esse reprehenderit nostrud Lorem cillum magna. Labore ad ullamco pariatur irure. Sit ea aliquip ad Lorem ut consequat quis. Eiusmod consequat anim dolor in aliquip est laborum adipisicing incididunt excepteur excepteur laborum duis qui. Sunt consequat voluptate sunt cupidatat nostrud nisi. Ullamco reprehenderit anim est laboris et nulla.\r\nAmet ut dolor nostrud voluptate laboris nisi reprehenderit culpa ea velit mollit nulla. Esse qui sint anim ut incididunt. Nisi mollit ut nisi laborum ut deserunt magna dolor eiusmod. Elit enim sit reprehenderit cupidatat et. Aliqua dolore id fugiat occaecat occaecat ipsum.\r\nEsse fugiat amet quis adipisicing tempor deserunt tempor exercitation excepteur dolore incididunt ex. Laborum adipisicing dolore enim veniam non ut consectetur Lorem ut cupidatat duis id. Incididunt laboris cupidatat adipisicing deserunt fugiat veniam tempor. Fugiat officia eu ullamco magna sunt fugiat consectetur. Occaecat irure proident do officia. Laborum nulla quis non incididunt velit.\r\n", + "address": "4 Campus Road", + "city": "Bethpage", + "state": "Massachusetts", + "zip": 23000, + "country": "New Caledonia", + "email": "bushdickerson@scentric.com", + "phone": "(914) 557-2160", + "color": "rgb(106,245,89)" + }, + { + "index": 317, + "name": "Nadine Heath", + "first": "Dee", + "last": "Burnett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ismailmayat/73.jpg", + "expanded": false, + "guid": "315f838f-f59d-4c6c-bae4-f431576cf508", + "integer": 59, + "date": "Wed Aug 06 1980 08:47:43 GMT-0700 (PDT)", + "shortText": "nostrud labore culpa sint occaecat", + "mediumText": "Dolore irure officia consequat commodo exercitation non et consectetur minim fugiat.", + "longText": "Velit ipsum enim laboris cillum qui quis deserunt laborum. Nostrud voluptate commodo nisi ipsum adipisicing aliqua laborum culpa excepteur minim ex sint. Non minim voluptate pariatur consectetur. Dolor minim aute sint anim exercitation id laborum laborum.\r\nExercitation est ullamco culpa ut cillum commodo minim ipsum qui cupidatat et cillum mollit. Incididunt anim esse veniam veniam. Nulla ullamco ea eu proident laboris voluptate laboris ad in excepteur excepteur qui. Incididunt aute nisi irure quis commodo aute. Elit nisi labore qui sunt est velit anim cupidatat nostrud.\r\nCulpa anim consequat occaecat sunt. Velit commodo deserunt duis proident exercitation ullamco esse fugiat. Ullamco velit elit pariatur ut qui ex. Tempor voluptate labore consectetur id elit. Deserunt occaecat occaecat aliqua ad laborum irure mollit officia fugiat aliqua aliqua irure do. Sit id duis occaecat cupidatat ullamco nulla. Sit laborum eu tempor magna laborum mollit aliquip proident aute anim magna.\r\n", + "address": "4 Bay Parkway", + "city": "Gila", + "state": "Oklahoma", + "zip": 89518, + "country": "Syria", + "email": "deeburnett@scentric.com", + "phone": "(995) 481-3920", + "color": "rgb(158,55,147)" + }, + { + "index": 318, + "name": "Cash Baker", + "first": "Tanya", + "last": "Patton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlyson/73.jpg", + "expanded": false, + "guid": "4f3b7c6f-78ec-4074-b24d-b1e0788829a9", + "integer": 17, + "date": "Mon Jun 19 1972 16:40:48 GMT-0700 (PDT)", + "shortText": "proident duis eiusmod pariatur", + "mediumText": "Ullamco qui dolore fugiat id ad non.", + "longText": "Sint irure officia do magna eu deserunt non laborum ut qui incididunt est irure voluptate. Amet eiusmod eiusmod ut occaecat reprehenderit sunt irure do aute reprehenderit pariatur laborum consectetur. Proident quis ex reprehenderit aliquip non ullamco ullamco sunt commodo. Nostrud proident adipisicing laborum voluptate sit cillum ad magna id adipisicing cillum fugiat. Anim sit do quis cupidatat reprehenderit tempor pariatur deserunt. Tempor culpa reprehenderit adipisicing ea.\r\n", + "address": "2 Garnet Street", + "city": "Crawfordsville", + "state": "Ohio", + "zip": 65388, + "country": "Rwanda", + "email": "tanyapatton@scentric.com", + "phone": "(912) 427-3358", + "color": "rgb(122,127,173)" + }, + { + "index": 319, + "name": "Sears Conley", + "first": "Boyle", + "last": "Schmidt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thewillbeard/73.jpg", + "expanded": false, + "guid": "17ce3452-2b9d-4fe3-b1db-7009a74b7e32", + "integer": 69, + "date": "Sat May 18 1996 00:26:16 GMT-0700 (PDT)", + "shortText": "amet consequat", + "mediumText": "Nulla non deserunt elit nostrud dolore elit Lorem sit qui aliqua aute aliquip elit. Mollit aliqua enim velit ea consectetur dolor duis minim ea. Ipsum aute ut labore duis labore nostrud labore. Aliqua proident cillum id cupidatat elit anim nostrud culpa aliquip enim irure nisi qui. Magna sint exercitation ullamco commodo labore sunt ipsum anim nostrud voluptate non et reprehenderit.", + "longText": "Labore irure est cillum sit exercitation nisi ex exercitation ea pariatur ipsum consectetur. Nisi ad qui eiusmod nulla deserunt eiusmod dolor officia magna labore deserunt aliqua. Consequat labore proident cupidatat qui fugiat magna voluptate esse ex nisi officia enim. Ipsum nisi fugiat in proident magna deserunt magna incididunt sint cupidatat Lorem. Sunt veniam consectetur ut ea. Nulla exercitation do deserunt consequat elit aliqua excepteur aliquip laborum mollit ex non. Commodo fugiat occaecat sint tempor dolore ut ex proident amet mollit fugiat.\r\nVeniam ex consequat consectetur incididunt. Qui enim eu incididunt anim. Reprehenderit eiusmod labore consequat pariatur adipisicing esse incididunt quis velit. Pariatur elit amet deserunt eu exercitation cupidatat aute eiusmod anim sit anim est. Adipisicing ea cupidatat sunt labore id amet magna anim pariatur cupidatat. Sint ex sunt nulla elit ut aute laboris deserunt cillum. Consectetur sunt aliqua minim eu commodo nulla tempor anim non cillum quis culpa occaecat.\r\nFugiat veniam qui ut sunt Lorem. Sint elit do deserunt laborum. Voluptate pariatur sit eiusmod labore elit aliqua sunt eu labore id sunt. Officia id non minim cillum. Laboris reprehenderit elit commodo esse exercitation minim aute aliqua esse. Dolor Lorem fugiat non reprehenderit occaecat dolore magna.\r\nMollit velit dolore mollit non consequat ullamco do incididunt nisi. Dolore ex eiusmod ex anim consequat deserunt qui. Culpa laborum laboris adipisicing pariatur duis elit sint consectetur duis. Ut ea consectetur dolore ullamco amet est irure Lorem. Aliqua do reprehenderit id incididunt amet fugiat id amet. Exercitation duis sit pariatur fugiat elit dolore do aliqua culpa anim adipisicing velit aliquip consectetur.\r\nElit ex excepteur do aute enim incididunt. Est eu aute occaecat quis dolor eiusmod quis ut quis fugiat enim id. Duis incididunt esse pariatur voluptate. Velit dolore ut aliqua culpa officia quis esse.\r\n", + "address": "3 Llama Court", + "city": "Murillo", + "state": "Nevada", + "zip": 82006, + "country": "Puerto Rico", + "email": "boyleschmidt@scentric.com", + "phone": "(938) 529-3967", + "color": "rgb(238,104,187)" + }, + { + "index": 320, + "name": "Regina Duke", + "first": "Pacheco", + "last": "Finch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tgormtx/73.jpg", + "expanded": false, + "guid": "1cd2ce04-b8d2-4d31-8130-6c88fda8666e", + "integer": 28, + "date": "Sun Sep 22 1974 11:52:41 GMT-0700 (PDT)", + "shortText": "deserunt proident voluptate anim", + "mediumText": "Tempor eiusmod culpa incididunt esse mollit elit anim Lorem magna et occaecat. Quis exercitation aute laboris adipisicing excepteur non consectetur. Eu sunt esse velit sint ad voluptate cillum est. Et adipisicing sunt incididunt incididunt tempor nostrud aute eu occaecat ea.", + "longText": "Qui exercitation commodo sunt nostrud dolor elit labore in laboris. Minim cillum Lorem enim sunt nostrud culpa sint reprehenderit. Cillum reprehenderit occaecat non eu ea veniam aliquip occaecat quis et in eiusmod enim Lorem. Aliquip duis cupidatat aliqua aliquip commodo qui aliqua excepteur ipsum. Lorem labore tempor nisi ut deserunt. Excepteur est sint nulla dolor officia ex ex est in duis magna consectetur. Occaecat anim irure pariatur sit fugiat.\r\nFugiat nulla mollit quis ex deserunt non id anim proident. Officia sint fugiat eiusmod qui fugiat consequat ut magna Lorem. Officia cillum ipsum reprehenderit laboris proident et minim consectetur laboris cupidatat do ea aliqua deserunt. Ullamco tempor elit velit sunt qui in et amet irure aliqua eiusmod reprehenderit. Quis mollit consectetur veniam est ad esse quis nostrud esse magna id minim qui eu. Occaecat elit ullamco in aliqua aute sint. Incididunt qui esse ad voluptate nisi.\r\n", + "address": "2 Fillmore Avenue", + "city": "Riverton", + "state": "Montana", + "zip": 10495, + "country": "Korea (North)", + "email": "pachecofinch@scentric.com", + "phone": "(935) 574-3165", + "color": "rgb(231,59,64)" + }, + { + "index": 321, + "name": "Watts Forbes", + "first": "Crystal", + "last": "Holman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/73.jpg", + "expanded": false, + "guid": "78f69b15-a996-41aa-be22-2350d747a215", + "integer": 37, + "date": "Sat Oct 27 2001 01:47:57 GMT-0700 (PDT)", + "shortText": "duis", + "mediumText": "Sit sint ut incididunt esse irure do tempor esse est velit aliqua consectetur consectetur fugiat.", + "longText": "Dolore sunt mollit nisi adipisicing esse laboris. Cillum quis mollit voluptate consequat qui cillum sunt incididunt voluptate velit ea. Enim id ut duis minim pariatur. Nulla esse aliqua exercitation aute enim elit proident et ipsum et tempor eiusmod do esse.\r\nAnim id nisi ex occaecat eu ipsum nulla non pariatur sunt ut esse duis do. Exercitation est anim sit eiusmod qui pariatur dolore. Fugiat eu mollit consectetur occaecat duis exercitation deserunt aliqua cupidatat nostrud. Deserunt cillum duis officia nostrud non tempor cillum mollit enim sit. Ad commodo nostrud adipisicing mollit culpa non dolore. Amet pariatur sunt officia irure enim minim ea. Nulla qui id laborum velit cillum incididunt cupidatat duis exercitation tempor tempor sit.\r\n", + "address": "2 Beekman Place", + "city": "Advance", + "state": "California", + "zip": 50813, + "country": "Bosnia and Herzegovina", + "email": "crystalholman@scentric.com", + "phone": "(886) 454-2038", + "color": "rgb(212,198,57)" + }, + { + "index": 322, + "name": "Janelle Leblanc", + "first": "Velma", + "last": "Stone", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mwarkentin/73.jpg", + "expanded": false, + "guid": "84151da3-43cb-4cb5-ac3f-dce5eac66594", + "integer": 10, + "date": "Wed Mar 15 1995 04:06:56 GMT-0800 (PST)", + "shortText": "sit duis", + "mediumText": "Sint incididunt in ex officia cupidatat consectetur fugiat eiusmod labore.", + "longText": "Ullamco non sunt duis duis commodo ipsum ipsum nulla eiusmod irure adipisicing eu tempor. Elit labore magna incididunt est. Officia id incididunt minim pariatur officia consequat sunt. Non ut voluptate proident ipsum. Irure nulla cillum aute exercitation. Aliqua sit eu occaecat minim.\r\nAd excepteur qui est culpa. Mollit in adipisicing duis deserunt minim Lorem tempor nisi tempor enim. Nulla ex aliqua nostrud id. Adipisicing officia nulla amet aliqua non ipsum eiusmod elit ad pariatur labore eiusmod consectetur. Duis sint et aliqua commodo dolor veniam in eiusmod occaecat consectetur.\r\nConsectetur ea voluptate ullamco tempor nisi in. Lorem anim mollit fugiat tempor. Consectetur adipisicing deserunt consequat exercitation reprehenderit exercitation cillum ad anim do. Commodo occaecat ad do et laborum veniam aliqua cupidatat. Et velit ullamco cupidatat nostrud exercitation aute sint ea adipisicing culpa aliquip. Aliquip consectetur dolor ut adipisicing laborum id est magna pariatur amet.\r\n", + "address": "2 Albemarle Terrace", + "city": "Knowlton", + "state": "Marshall Islands", + "zip": 80538, + "country": "France", + "email": "velmastone@scentric.com", + "phone": "(910) 600-2666", + "color": "rgb(84,227,83)" + }, + { + "index": 323, + "name": "Holman Atkinson", + "first": "Myra", + "last": "Ellison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/herkulano/73.jpg", + "expanded": false, + "guid": "51f45fc6-fc94-4be1-8769-ac78341d3d69", + "integer": 13, + "date": "Mon Jan 24 2011 03:20:14 GMT-0800 (PST)", + "shortText": "labore sit eiusmod sit", + "mediumText": "Qui ipsum tempor occaecat ullamco Lorem officia voluptate. Consequat cillum ea sunt cupidatat est quis quis pariatur.", + "longText": "Eiusmod fugiat ullamco sunt ea sint eiusmod aute excepteur eiusmod ullamco non nostrud aliqua. Pariatur pariatur aute aliqua nisi nisi amet. Non officia ipsum eu do veniam excepteur ea sit sint consequat. Do sint minim culpa enim ullamco excepteur officia mollit Lorem id commodo culpa est. Laborum ex anim Lorem et. Cupidatat mollit esse do adipisicing.\r\nEu velit ipsum officia ex. Deserunt esse et tempor magna duis ex ut sunt dolore do. Elit labore excepteur aliqua culpa cillum deserunt nulla veniam veniam commodo do mollit.\r\n", + "address": "3 Nova Court", + "city": "Hoehne", + "state": "Indiana", + "zip": 44523, + "country": "Guinea", + "email": "myraellison@scentric.com", + "phone": "(892) 546-2971", + "color": "rgb(252,153,180)" + }, + { + "index": 324, + "name": "Carson Glover", + "first": "Annabelle", + "last": "Reid", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jonny_moon/73.jpg", + "expanded": false, + "guid": "560ce64c-d4a7-43a1-a119-c815a7d0eddc", + "integer": 43, + "date": "Sun Oct 21 1979 10:07:45 GMT-0700 (PDT)", + "shortText": "qui reprehenderit", + "mediumText": "Ullamco incididunt minim ullamco id exercitation.", + "longText": "In veniam fugiat laboris incididunt excepteur ad proident. Consequat nisi mollit nostrud excepteur sunt laboris mollit voluptate exercitation exercitation tempor velit dolore. Sunt amet aute pariatur tempor adipisicing Lorem consequat pariatur exercitation sit cupidatat Lorem duis culpa. Aute velit exercitation occaecat cillum incididunt fugiat ipsum ut labore tempor mollit velit ad adipisicing. Tempor nisi elit est culpa tempor eiusmod velit enim occaecat tempor excepteur ut veniam. Culpa eiusmod nisi officia quis nulla ipsum laboris magna elit esse exercitation nostrud occaecat amet. Esse anim culpa est esse elit ad velit ad eu do exercitation occaecat adipisicing.\r\nIn duis enim Lorem id ullamco cillum veniam. Nulla sint laboris sint non ad mollit incididunt tempor ea voluptate sint eiusmod. Mollit nisi labore est labore anim laboris irure qui Lorem nulla veniam velit et non. Do occaecat excepteur aliqua in ea pariatur elit incididunt.\r\nDolore eiusmod commodo do commodo sit incididunt deserunt ullamco fugiat eiusmod consectetur ipsum. Fugiat eiusmod consectetur elit aliquip tempor labore cillum. Duis ullamco qui sit consectetur nulla qui amet Lorem occaecat esse tempor eiusmod aute.\r\n", + "address": "4 Lexington Avenue", + "city": "Canoochee", + "state": "Tennessee", + "zip": 16359, + "country": "Senegal", + "email": "annabellereid@scentric.com", + "phone": "(833) 494-3476", + "color": "rgb(56,217,233)" + }, + { + "index": 325, + "name": "Gibbs Good", + "first": "Hendrix", + "last": "Lyons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alyssalowww/73.jpg", + "expanded": false, + "guid": "2a5302bc-b0dd-4ccc-8688-7df77439ace5", + "integer": 21, + "date": "Thu Jan 01 1976 12:47:48 GMT-0800 (PST)", + "shortText": "aliqua tempor", + "mediumText": "Commodo pariatur enim velit ut reprehenderit in culpa. Culpa nulla ipsum velit est occaecat elit et laborum reprehenderit eu minim do.", + "longText": "Qui quis do nulla sit velit non elit duis exercitation do laboris cillum sit. Eiusmod reprehenderit sit aliqua qui dolor sunt qui commodo. Tempor aute Lorem labore aliqua ea minim duis irure sint non veniam. Ad ex aute reprehenderit nulla aliqua nostrud ullamco Lorem esse aliquip do qui velit. Nostrud elit esse ad duis occaecat culpa. Aliqua officia quis mollit ipsum velit cupidatat sit quis quis ea veniam sit aute ullamco. Laboris et ad cillum veniam nulla fugiat.\r\nFugiat in incididunt minim consequat sit pariatur occaecat reprehenderit aliquip incididunt ullamco eu. Nostrud qui nostrud laboris magna. Aute ullamco veniam consequat nulla aute nulla culpa. Fugiat id mollit ullamco eu enim velit reprehenderit sunt ut est elit fugiat sint veniam. Reprehenderit amet ea anim veniam consectetur proident commodo. Aliquip Lorem amet occaecat cupidatat dolor officia quis pariatur. Sit ea exercitation minim deserunt elit sit excepteur id reprehenderit.\r\nIpsum in tempor culpa esse fugiat mollit esse. Incididunt consequat dolor duis aute cillum ut veniam commodo do fugiat eu culpa fugiat. Enim pariatur reprehenderit elit ex proident aute aliqua. Elit do veniam fugiat in qui quis ullamco esse exercitation tempor non commodo nulla anim. Non Lorem sunt cupidatat aliquip dolor labore laboris Lorem fugiat. Do velit et ipsum pariatur duis sit id consectetur officia occaecat culpa reprehenderit. Nulla est in commodo nostrud ea deserunt duis culpa.\r\n", + "address": "4 Cranberry Street", + "city": "Belgreen", + "state": "Palau", + "zip": 13045, + "country": "Yugoslavia", + "email": "hendrixlyons@scentric.com", + "phone": "(884) 521-3084", + "color": "rgb(234,55,208)" + }, + { + "index": 326, + "name": "Reba Horton", + "first": "Ochoa", + "last": "Reed", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rafelorden/73.jpg", + "expanded": false, + "guid": "b51d4b79-1289-46e1-9874-cac40d2a3f4c", + "integer": 89, + "date": "Mon Sep 06 2010 03:05:58 GMT-0700 (PDT)", + "shortText": "sint reprehenderit", + "mediumText": "Consectetur velit id fugiat amet aliquip laboris deserunt. Pariatur officia non Lorem consectetur officia ipsum occaecat sint commodo laboris amet minim ullamco officia.", + "longText": "Deserunt consequat eiusmod commodo qui adipisicing et. Occaecat elit occaecat ullamco eu ea minim cupidatat veniam veniam aliquip tempor laboris. Exercitation duis cupidatat ullamco magna incididunt cupidatat reprehenderit consequat laborum.\r\nOfficia occaecat quis quis fugiat aliquip et. In laborum et pariatur qui consectetur ullamco cillum excepteur voluptate fugiat. Eiusmod nulla elit qui in irure. Nulla enim consectetur proident nostrud.\r\nVeniam sit tempor laboris aute dolor officia laborum. Deserunt ad consequat non nulla dolor eiusmod elit veniam tempor. Esse sint amet nisi et ea labore amet. Officia aliquip pariatur dolore anim dolore culpa esse elit amet aliqua voluptate. Esse elit ex ipsum proident occaecat deserunt non amet reprehenderit. Voluptate anim sunt fugiat consectetur ut quis esse sit.\r\nCillum incididunt sint sit nostrud magna minim anim labore elit adipisicing est ipsum. Laborum ut officia ullamco labore non dolore veniam labore dolor et sint ex duis. Excepteur irure exercitation Lorem occaecat exercitation in consequat. Nulla est excepteur elit qui magna quis nulla laboris amet. Laborum nisi ex enim consequat mollit ullamco magna aliquip occaecat occaecat et elit sunt. Consectetur reprehenderit magna officia do aliquip proident minim. Aute qui officia deserunt labore id in esse aliqua do anim pariatur dolore consequat.\r\nAmet pariatur veniam cupidatat deserunt voluptate aliquip fugiat occaecat eu sit pariatur. Consectetur eu quis proident reprehenderit nisi. Voluptate aliquip quis culpa proident anim culpa esse. Mollit eiusmod magna cupidatat nostrud non ad duis. Laboris reprehenderit amet cupidatat duis sint qui deserunt excepteur amet. Consectetur reprehenderit Lorem esse nisi aliquip incididunt ipsum aute occaecat esse occaecat. Laboris sit Lorem incididunt laborum in.\r\n", + "address": "2 Montauk Avenue", + "city": "Wildwood", + "state": "Virginia", + "zip": 44321, + "country": "Uzbekistan", + "email": "ochoareed@scentric.com", + "phone": "(873) 450-2072", + "color": "rgb(87,106,105)" + }, + { + "index": 327, + "name": "Newton Townsend", + "first": "Cara", + "last": "Armstrong", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wim1k/73.jpg", + "expanded": false, + "guid": "396fee22-8931-4acb-9aa0-ef4e3d463f65", + "integer": 32, + "date": "Sun Feb 20 2011 09:27:11 GMT-0800 (PST)", + "shortText": "magna", + "mediumText": "Magna aute elit cupidatat ipsum velit reprehenderit. Occaecat qui fugiat nostrud quis excepteur commodo. Voluptate id consequat laborum mollit exercitation proident voluptate cillum voluptate in. Amet culpa consequat ullamco dolore incididunt consequat aliqua est nulla quis proident culpa.", + "longText": "Enim esse anim veniam est sunt labore ut qui magna cillum fugiat. Labore cupidatat ullamco deserunt veniam elit irure elit quis qui tempor anim et magna. Ex commodo ex adipisicing non laborum. Aliquip ex consequat dolor ut non consequat excepteur. Laboris laborum adipisicing cupidatat est. Id est aliqua laborum mollit incididunt excepteur. Enim commodo in culpa Lorem.\r\nLaborum sunt et exercitation mollit ut nulla aliqua nulla fugiat dolor. Deserunt commodo Lorem eu id adipisicing amet qui reprehenderit eu consectetur aliquip mollit eiusmod. Ad sit anim qui irure et ipsum laboris qui consectetur.\r\n", + "address": "4 School Lane", + "city": "Garfield", + "state": "Wyoming", + "zip": 38497, + "country": "Estonia", + "email": "caraarmstrong@scentric.com", + "phone": "(824) 554-2497", + "color": "rgb(82,224,190)" + }, + { + "index": 328, + "name": "Jenkins Short", + "first": "Castaneda", + "last": "Padilla", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rpeezy/73.jpg", + "expanded": false, + "guid": "bf4be80d-f135-468d-adab-23bf03ffb166", + "integer": 12, + "date": "Thu Sep 22 1994 12:13:32 GMT-0700 (PDT)", + "shortText": "et duis Lorem occaecat deserunt", + "mediumText": "Voluptate sint non minim elit. Est tempor tempor tempor nisi id cupidatat sunt.", + "longText": "In esse voluptate velit dolore ullamco in. Deserunt anim fugiat laboris sunt pariatur. Magna veniam ad eu labore aliquip non quis do adipisicing. Quis esse ad nostrud commodo. Non non aliquip sit laboris quis commodo laboris.\r\nPariatur laborum ad in ut et deserunt labore aute sint eiusmod. Voluptate eiusmod est enim quis id culpa aute eiusmod magna deserunt quis sint deserunt tempor. Deserunt quis deserunt enim elit. Esse duis irure eu officia ut tempor in velit in pariatur. Ea aute enim occaecat amet enim nisi excepteur consequat qui ut laboris incididunt tempor.\r\nIpsum enim dolore irure esse incididunt. Voluptate elit qui mollit aliquip ex proident ad adipisicing ipsum. Tempor dolore minim esse esse sint irure pariatur esse.\r\nMagna sunt labore Lorem do laboris duis exercitation aliqua fugiat eiusmod incididunt. Dolor mollit sunt commodo occaecat dolor eu sunt id occaecat sint. Et sunt esse eiusmod veniam nisi magna culpa voluptate nisi esse.\r\n", + "address": "2 Elton Street", + "city": "Gouglersville", + "state": "Colorado", + "zip": 96057, + "country": "Gambia", + "email": "castanedapadilla@scentric.com", + "phone": "(911) 571-2320", + "color": "rgb(80,137,178)" + }, + { + "index": 329, + "name": "Deborah Klein", + "first": "Sandoval", + "last": "Miranda", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sectronov/73.jpg", + "expanded": false, + "guid": "9daaa0e4-d04c-4232-a637-24e733f0b9ac", + "integer": 76, + "date": "Sun Aug 14 1994 19:32:54 GMT-0700 (PDT)", + "shortText": "exercitation mollit reprehenderit dolore deserunt", + "mediumText": "Quis sint eu occaecat ex ex amet pariatur deserunt ea magna excepteur. Laborum in fugiat eiusmod amet sunt nostrud officia qui magna id et. Non fugiat eu consectetur veniam tempor. Nostrud proident reprehenderit sint aute nisi aliqua anim enim deserunt id. Labore excepteur sit dolor nisi occaecat velit pariatur id aliquip.", + "longText": "Labore officia tempor adipisicing amet. Aliqua amet deserunt dolore nisi commodo velit aliqua. Eu nisi fugiat minim duis ipsum esse adipisicing eu nulla ex ad.\r\n", + "address": "2 Olive Street", + "city": "Fairview", + "state": "Utah", + "zip": 99892, + "country": "Nepal", + "email": "sandovalmiranda@scentric.com", + "phone": "(808) 578-2445", + "color": "rgb(234,209,129)" + }, + { + "index": 330, + "name": "Tricia Moss", + "first": "Dickson", + "last": "Houston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/starburst1977/73.jpg", + "expanded": false, + "guid": "f41db055-f748-45e3-9ce3-4d867e00f776", + "integer": 9, + "date": "Mon Jun 15 1992 12:38:40 GMT-0700 (PDT)", + "shortText": "esse consectetur", + "mediumText": "Non nisi ut aliqua ipsum consequat excepteur culpa labore labore. Incididunt adipisicing qui mollit elit eiusmod aliqua aute. Laboris ut consequat consectetur elit aliquip irure enim aute cupidatat. Laboris incididunt id laborum reprehenderit duis nisi consectetur laboris nostrud.", + "longText": "Occaecat mollit reprehenderit tempor veniam consectetur non officia. Laboris consequat velit mollit in quis. Qui dolore excepteur in esse magna cupidatat incididunt eiusmod magna do. Laboris consectetur adipisicing occaecat cillum mollit duis. Officia excepteur exercitation quis consequat deserunt magna officia voluptate officia sint magna quis officia voluptate. Ullamco qui nostrud id incididunt veniam eu Lorem ad voluptate.\r\nConsequat cupidatat laborum sint consectetur. Anim do anim reprehenderit excepteur occaecat duis eu ea ipsum anim non nostrud nulla minim. Voluptate eu id officia consequat minim. Proident nulla qui amet qui veniam mollit non.\r\n", + "address": "3 Russell Street", + "city": "Fruitdale", + "state": "Idaho", + "zip": 49478, + "country": "Falkland Islands (Malvinas)", + "email": "dicksonhouston@scentric.com", + "phone": "(904) 444-3745", + "color": "rgb(237,192,112)" + }, + { + "index": 331, + "name": "Mclaughlin Spence", + "first": "Vicky", + "last": "Montoya", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mocabyte/73.jpg", + "expanded": false, + "guid": "b76384d1-fb6b-4500-ad6a-f266c0a380ce", + "integer": 95, + "date": "Tue Apr 18 1995 21:15:18 GMT-0700 (PDT)", + "shortText": "aute aliqua", + "mediumText": "Aliquip ea ad aute pariatur exercitation ex elit.", + "longText": "Labore veniam officia officia dolore. Ea quis et incididunt irure. Ut exercitation proident nostrud eiusmod quis ad. Laboris et Lorem qui quis ullamco dolore minim do incididunt. Lorem dolor fugiat consectetur eu qui nulla est voluptate veniam eu reprehenderit laboris dolore ex.\r\nUllamco Lorem voluptate deserunt ut et nulla cupidatat non et exercitation elit est. Mollit esse aute excepteur eiusmod commodo pariatur. Aute exercitation exercitation duis cupidatat ad pariatur minim anim adipisicing minim esse eu sit laborum. Laboris excepteur eu commodo dolor amet eiusmod. Officia quis reprehenderit dolor laborum non amet pariatur sit. Minim anim minim minim nulla minim ut non adipisicing consequat esse.\r\n", + "address": "2 Carlton Avenue", + "city": "Bend", + "state": "Arkansas", + "zip": 21354, + "country": "Peru", + "email": "vickymontoya@scentric.com", + "phone": "(808) 516-2094", + "color": "rgb(156,150,201)" + }, + { + "index": 332, + "name": "Montgomery Farrell", + "first": "Hayden", + "last": "Maldonado", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamasifmirza/73.jpg", + "expanded": false, + "guid": "098a567c-1dc4-4f48-aa95-7c039f017b7e", + "integer": 99, + "date": "Sat Jul 30 2005 17:18:13 GMT-0700 (PDT)", + "shortText": "do culpa elit magna tempor", + "mediumText": "Non esse aliqua dolor irure cillum labore excepteur. Amet labore dolor tempor duis quis ullamco proident enim anim incididunt nulla pariatur sit eiusmod.", + "longText": "Cupidatat anim anim cupidatat fugiat Lorem id pariatur excepteur et nisi. Commodo pariatur proident id fugiat consectetur irure velit consectetur ipsum non velit aute adipisicing irure. Do aliqua aute id esse Lorem. Lorem minim incididunt et labore pariatur Lorem ex enim ipsum cupidatat exercitation. Amet aliquip nisi cupidatat laboris eu officia aute velit. Dolor non sit consequat elit eu ut qui occaecat. Proident ut reprehenderit commodo ipsum deserunt ex quis elit.\r\nEsse Lorem deserunt adipisicing esse tempor ad officia sit do officia laborum voluptate. Do voluptate voluptate eiusmod magna in quis minim consectetur. Officia fugiat cillum aliquip et magna esse elit voluptate ea ad officia dolor sint. Ad velit aliqua reprehenderit consectetur quis incididunt nisi.\r\nAute pariatur pariatur aliquip incididunt ut enim id dolor aute sit aute. Elit occaecat labore nostrud enim veniam. Eu laborum mollit quis sit ut incididunt et. Nulla Lorem excepteur culpa ullamco adipisicing est irure reprehenderit cillum tempor cillum culpa ad.\r\n", + "address": "2 Folsom Place", + "city": "Edmund", + "state": "Delaware", + "zip": 95338, + "country": "Tonga", + "email": "haydenmaldonado@scentric.com", + "phone": "(891) 403-3020", + "color": "rgb(131,136,141)" + }, + { + "index": 333, + "name": "Mavis Sanchez", + "first": "Ginger", + "last": "Dale", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benoitboucart/73.jpg", + "expanded": false, + "guid": "ba039378-7a45-4b1c-8ec3-cb2714651e82", + "integer": 67, + "date": "Sun Dec 13 1992 23:12:22 GMT-0800 (PST)", + "shortText": "adipisicing sint", + "mediumText": "Pariatur minim ipsum aliquip nulla qui voluptate irure irure est anim culpa laboris cupidatat. Enim adipisicing exercitation eiusmod sunt ex ad irure id labore. Aute labore voluptate amet eu. Dolor ea non enim nostrud elit aliqua qui amet aliqua et.", + "longText": "Occaecat mollit pariatur ea nisi veniam. Dolore incididunt dolore commodo incididunt ad ex dolore officia et ea aliqua magna. Ad sunt est proident nostrud consectetur. Ullamco laboris incididunt sit aute aliquip dolor proident tempor duis adipisicing esse pariatur.\r\nDo quis ea proident quis ea aliquip cupidatat culpa elit deserunt consectetur sunt. Anim excepteur aliquip culpa amet minim nostrud laborum proident eiusmod labore culpa est dolor. Amet et fugiat irure nisi commodo tempor irure aliqua nostrud nostrud. Dolore tempor sit laborum anim.\r\nOfficia commodo dolore duis officia do. Eu fugiat quis voluptate sunt excepteur nulla irure quis cupidatat sit quis. Ex irure non cupidatat ex. Sunt qui sit excepteur occaecat mollit velit eiusmod esse dolore aliqua laborum ullamco.\r\n", + "address": "4 Brown Street", + "city": "Comptche", + "state": "Federated States Of Micronesia", + "zip": 91514, + "country": "Tunisia", + "email": "gingerdale@scentric.com", + "phone": "(883) 563-2014", + "color": "rgb(163,218,120)" + }, + { + "index": 334, + "name": "Terrie Peters", + "first": "Adeline", + "last": "Franklin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/markwienands/73.jpg", + "expanded": false, + "guid": "7eb5d929-28c8-4d9e-8728-a158423e70eb", + "integer": 69, + "date": "Thu Mar 20 1986 06:50:48 GMT-0800 (PST)", + "shortText": "commodo", + "mediumText": "Nisi nulla enim ad deserunt proident qui. Aliqua duis id ea deserunt. Ut amet adipisicing sint consequat qui ut nisi et sit cillum amet. Velit laboris nulla nisi laborum cillum laborum qui minim velit aute sunt elit culpa aliqua. Adipisicing aliqua nulla proident sit sit laborum ea eu.", + "longText": "Fugiat dolor cupidatat sunt ex quis labore proident esse. Cupidatat exercitation elit do commodo ex Lorem tempor pariatur consequat laboris in elit. Ea cupidatat culpa elit officia nulla pariatur consequat magna incididunt tempor sunt voluptate. Voluptate nisi eiusmod fugiat nostrud dolore occaecat labore esse esse incididunt Lorem aliquip et.\r\nCupidatat consectetur dolor culpa cillum cupidatat occaecat. Dolor mollit nostrud cupidatat aliqua enim cupidatat consequat dolor labore ex nisi excepteur. Elit aliqua quis aliquip magna. Nostrud excepteur officia tempor laboris sunt voluptate proident pariatur. Consequat laboris Lorem id dolore in est sunt cillum irure exercitation id adipisicing minim aliquip. Non est dolore duis deserunt commodo elit amet esse sint reprehenderit. Aliqua quis fugiat elit duis minim exercitation consectetur.\r\n", + "address": "3 Desmond Court", + "city": "Fredericktown", + "state": "Guam", + "zip": 17881, + "country": "Guadeloupe", + "email": "adelinefranklin@scentric.com", + "phone": "(814) 430-3138", + "color": "rgb(186,245,118)" + }, + { + "index": 335, + "name": "Reed Banks", + "first": "Frost", + "last": "Velez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/menghe/73.jpg", + "expanded": false, + "guid": "0ea4f50e-f8d5-4d36-b794-5124c98c0103", + "integer": 38, + "date": "Fri Feb 13 1981 04:31:25 GMT-0800 (PST)", + "shortText": "do adipisicing", + "mediumText": "Sit dolor occaecat sint ipsum. Velit nostrud ea ex officia id minim do minim dolore occaecat duis laborum.", + "longText": "Aute ullamco eu ad quis voluptate dolore qui. Laborum deserunt consectetur dolore ut deserunt amet Lorem ut est duis eiusmod Lorem in. Dolor voluptate aliqua aute cillum exercitation sit deserunt ut cillum cupidatat cillum aliquip mollit voluptate. Aute anim ad nulla minim deserunt dolor ut dolore adipisicing anim laborum deserunt do eiusmod. Id excepteur nisi enim ullamco sunt esse minim velit dolore aliqua. Elit adipisicing laborum est est Lorem quis est.\r\n", + "address": "2 Osborn Street", + "city": "Orviston", + "state": "Pennsylvania", + "zip": 73473, + "country": "Australia", + "email": "frostvelez@scentric.com", + "phone": "(805) 408-3874", + "color": "rgb(61,142,146)" + }, + { + "index": 336, + "name": "Horton Howe", + "first": "Loretta", + "last": "Hudson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/heyanata/73.jpg", + "expanded": false, + "guid": "22d30b57-493f-4a7d-9b75-bb3a630d6a21", + "integer": 97, + "date": "Sat Oct 11 1975 04:15:11 GMT-0700 (PDT)", + "shortText": "do enim", + "mediumText": "Ea magna cillum aliqua reprehenderit consequat velit laboris aliqua. Officia laboris nostrud ullamco magna mollit occaecat est velit ea minim veniam tempor esse id. Consequat dolore quis id pariatur velit mollit quis. Quis veniam consectetur ad esse sit amet Lorem anim irure occaecat laborum duis. Aute sunt fugiat anim cillum dolor elit consequat sint magna commodo fugiat laboris.", + "longText": "Ut elit do mollit tempor aliqua duis anim incididunt anim consectetur veniam deserunt enim aliquip. Ad velit ad cupidatat ad deserunt reprehenderit aliqua ut elit sit. Commodo reprehenderit eu do consequat irure enim nisi exercitation qui minim. Minim fugiat culpa excepteur duis ea laborum. Elit occaecat adipisicing fugiat consequat minim cillum commodo laborum labore sunt consequat ut reprehenderit. Veniam non exercitation nostrud magna magna ullamco dolor eiusmod officia enim nisi quis. Enim nisi eu velit excepteur et exercitation irure.\r\nAmet consequat ea proident anim minim sint consequat consectetur sunt nostrud proident ut. Aliquip proident aliqua consectetur occaecat esse magna sunt labore id quis officia pariatur officia excepteur. Occaecat Lorem ut esse irure. Ullamco eiusmod ipsum qui culpa eu esse exercitation ullamco irure elit.\r\nEu consectetur commodo sunt laborum consectetur nulla laboris in reprehenderit id. Culpa dolore deserunt nulla labore cillum enim enim do velit deserunt quis cupidatat tempor labore. Enim proident sunt aliquip dolor laborum labore sint eu cillum. Ut irure quis proident laboris cupidatat et anim anim qui. Nisi reprehenderit eu esse laboris qui excepteur sunt cupidatat eiusmod magna nostrud ipsum consectetur. Non ut amet velit non laboris fugiat duis.\r\nReprehenderit et incididunt sit consectetur qui non aliquip mollit pariatur nisi. Enim eu dolor id eu. Laborum laboris ex esse veniam Lorem exercitation exercitation nostrud officia. Exercitation ipsum dolor exercitation ullamco adipisicing anim non tempor laboris deserunt consequat amet tempor tempor. Cupidatat sunt non magna aute excepteur magna dolor in irure esse dolor pariatur. Eiusmod commodo minim ipsum elit. Ut reprehenderit veniam ex magna mollit duis magna.\r\n", + "address": "3 Hampton Avenue", + "city": "Brecon", + "state": "New Hampshire", + "zip": 11881, + "country": "Dominican Republic", + "email": "lorettahudson@scentric.com", + "phone": "(969) 542-2613", + "color": "rgb(245,143,237)" + }, + { + "index": 337, + "name": "Byrd Hopkins", + "first": "Charmaine", + "last": "Gibbs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/73.jpg", + "expanded": false, + "guid": "bf3bdf33-82fb-4240-b2be-d215fbaff029", + "integer": 55, + "date": "Wed Sep 12 2001 15:08:00 GMT-0700 (PDT)", + "shortText": "esse", + "mediumText": "Minim culpa et ea labore labore ad do officia eiusmod. Incididunt duis elit sit cupidatat mollit qui ea. Dolor id adipisicing est tempor commodo.", + "longText": "Consequat consequat eiusmod sint esse ex. Nisi eu est magna esse cillum exercitation velit ea. Pariatur irure cupidatat est non anim do magna adipisicing eu aliqua Lorem.\r\nSunt tempor qui id aliqua minim culpa non adipisicing in id elit. Laborum laboris aliquip ea mollit excepteur aute. Culpa id sit quis cupidatat nostrud irure duis aliqua do laboris veniam. Ullamco aute cillum in excepteur enim. Ipsum amet voluptate aliqua mollit commodo sint.\r\nAmet aute pariatur cillum adipisicing ad culpa velit do commodo nulla consequat elit exercitation ad. Do nisi in laboris id proident deserunt. Dolor commodo do qui esse aliqua dolore duis officia adipisicing Lorem.\r\nTempor eu sit id occaecat nostrud esse non voluptate officia exercitation mollit. Aliqua elit commodo incididunt nulla labore nostrud est duis. Pariatur ut laboris laboris laborum mollit anim consequat. Veniam eu non nostrud elit amet incididunt mollit sint duis adipisicing voluptate duis fugiat qui. Velit labore nostrud anim ex laboris ullamco elit. Ad in adipisicing anim culpa. Aliqua ullamco quis cupidatat exercitation qui.\r\n", + "address": "2 Norfolk Street", + "city": "Beechmont", + "state": "North Dakota", + "zip": 44060, + "country": "Zaire", + "email": "charmainegibbs@scentric.com", + "phone": "(882) 485-2815", + "color": "rgb(52,73,103)" + }, + { + "index": 338, + "name": "Walter Hoffman", + "first": "John", + "last": "Arnold", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluesix/73.jpg", + "expanded": false, + "guid": "775148e8-ce9f-4917-b50d-93d7d88dcc90", + "integer": 64, + "date": "Sat Oct 10 1992 03:41:40 GMT-0700 (PDT)", + "shortText": "culpa esse eiusmod amet nisi", + "mediumText": "Excepteur sunt fugiat dolor dolor cupidatat laboris esse sint incididunt elit fugiat reprehenderit aliqua dolor.", + "longText": "Proident aliquip eu incididunt nulla laboris deserunt dolore ipsum. Officia elit in laboris nulla nostrud. Voluptate dolore Lorem qui consectetur id amet qui esse est. Ipsum pariatur non id quis proident est exercitation culpa consectetur occaecat ut eiusmod minim. Nostrud dolore id nulla ullamco mollit aute minim ad quis.\r\n", + "address": "2 Madeline Court", + "city": "Coinjock", + "state": "Northern Mariana Islands", + "zip": 94228, + "country": "China", + "email": "johnarnold@scentric.com", + "phone": "(832) 506-2961", + "color": "rgb(124,211,144)" + }, + { + "index": 339, + "name": "Conner Santiago", + "first": "Geneva", + "last": "Cline", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/w8candice/73.jpg", + "expanded": false, + "guid": "42040b16-aa43-4862-94d5-186ca3462e87", + "integer": 42, + "date": "Sat Jan 30 1988 20:47:01 GMT-0800 (PST)", + "shortText": "pariatur enim fugiat", + "mediumText": "Pariatur voluptate mollit deserunt voluptate proident sit sint Lorem magna sunt deserunt ipsum. Exercitation nostrud proident consequat amet.", + "longText": "Occaecat nulla nulla labore laborum id est enim adipisicing proident commodo incididunt sit ex. Aute excepteur deserunt tempor quis sit deserunt eu velit elit veniam dolore dolore adipisicing consectetur. Consequat tempor nostrud excepteur laboris quis. Duis aute magna do mollit ullamco ex ipsum occaecat aute sunt.\r\nCupidatat nisi ullamco dolor incididunt magna nulla dolor amet consectetur laborum ex non cupidatat. Labore incididunt in anim anim quis sint sit consequat quis labore aute. Magna nisi sint nostrud ea esse voluptate.\r\nLorem ex cupidatat Lorem aute sunt consectetur proident. Labore dolor ipsum laboris laboris nulla enim ea excepteur aliqua incididunt incididunt et ipsum mollit. Dolor labore cillum dolor Lorem nulla voluptate reprehenderit fugiat dolor ad sint id commodo. Aliqua in fugiat laboris fugiat ea officia dolor magna labore laborum non commodo. In labore consequat incididunt ut minim. Lorem enim tempor mollit minim esse deserunt anim ex labore. Officia nulla reprehenderit dolore eu duis eu.\r\n", + "address": "2 Ford Street", + "city": "Buxton", + "state": "South Dakota", + "zip": 92541, + "country": "British Indian Ocean Territory", + "email": "genevacline@scentric.com", + "phone": "(945) 577-3780", + "color": "rgb(88,84,180)" + }, + { + "index": 340, + "name": "Rosales Cain", + "first": "Lucille", + "last": "Sims", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mbilderbach/73.jpg", + "expanded": false, + "guid": "05c0e183-2ebf-459b-8755-1581a4a5e362", + "integer": 66, + "date": "Thu Oct 16 1997 15:05:12 GMT-0700 (PDT)", + "shortText": "esse labore", + "mediumText": "Ipsum cillum sunt laboris reprehenderit quis nulla.", + "longText": "Enim adipisicing non occaecat dolore sunt qui magna do velit mollit. Adipisicing enim esse quis Lorem sit ut elit est. Nostrud ea sit duis ex esse tempor enim exercitation non exercitation sint. Occaecat ipsum ex id elit eu id occaecat ea pariatur nisi tempor velit. Amet duis do minim minim excepteur adipisicing elit reprehenderit do tempor do sint ex.\r\nElit eu laboris mollit ullamco. Reprehenderit sit elit ipsum ad aliqua nostrud sunt quis ut irure aliqua. Quis non in cillum aliquip laboris esse in aliquip laboris eu qui adipisicing consectetur. Magna tempor irure officia duis sunt.\r\nSit ad dolore mollit fugiat do culpa in anim aliqua. Ad adipisicing esse occaecat ullamco proident. Cillum consequat nostrud sit consequat ullamco do et aute dolore nulla ullamco. Occaecat aliquip ut et incididunt ex fugiat ea esse aute quis amet consequat dolore ex. Officia aute incididunt esse exercitation culpa.\r\n", + "address": "4 Bergen Place", + "city": "Neibert", + "state": "Alaska", + "zip": 90229, + "country": "Libya", + "email": "lucillesims@scentric.com", + "phone": "(881) 438-3457", + "color": "rgb(57,64,85)" + }, + { + "index": 341, + "name": "Jillian Puckett", + "first": "Bean", + "last": "Dyer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/coreyweb/73.jpg", + "expanded": false, + "guid": "a5317fd0-0be0-41ea-bbe9-a86a56e64aee", + "integer": 79, + "date": "Fri Oct 22 2004 15:49:39 GMT-0700 (PDT)", + "shortText": "ipsum aliqua", + "mediumText": "Occaecat ut eu consectetur sit Lorem nulla incididunt magna mollit reprehenderit fugiat.", + "longText": "Ad non eiusmod ullamco consectetur. In incididunt officia ex irure id. Quis minim ut quis duis id adipisicing commodo consectetur ut voluptate eiusmod duis.\r\nCulpa aliquip amet esse tempor do adipisicing. Excepteur do amet duis ad labore exercitation do nulla minim do pariatur ea. Magna amet dolor Lorem do nostrud aliqua eiusmod ad ut aliquip irure ullamco deserunt ipsum. Eu enim amet ut ut tempor sit cupidatat magna dolore. Laborum magna irure sit incididunt quis duis ex.\r\n", + "address": "2 Throop Avenue", + "city": "Saddlebrooke", + "state": "Louisiana", + "zip": 90267, + "country": "Cook Islands", + "email": "beandyer@scentric.com", + "phone": "(996) 420-2363", + "color": "rgb(127,126,117)" + }, + { + "index": 342, + "name": "Imelda Barrera", + "first": "Ramos", + "last": "Burke", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyshimko/73.jpg", + "expanded": false, + "guid": "7af4342e-1e1e-4807-8c51-aa37e8b7e551", + "integer": 25, + "date": "Thu Apr 19 2012 18:26:05 GMT-0700 (PDT)", + "shortText": "excepteur in culpa duis ullamco", + "mediumText": "In minim officia mollit veniam esse deserunt enim ullamco adipisicing ullamco deserunt quis.", + "longText": "Non cupidatat ipsum sint pariatur laborum ex in non aliquip est laborum. Aliquip fugiat proident sint in ea adipisicing dolor veniam consequat labore quis Lorem occaecat amet. Exercitation do commodo sunt nisi elit aliqua aliqua consectetur. Reprehenderit eu qui ea aliquip labore eiusmod cillum sunt.\r\n", + "address": "4 Cozine Avenue", + "city": "Sedley", + "state": "Missouri", + "zip": 43280, + "country": "Iran", + "email": "ramosburke@scentric.com", + "phone": "(800) 574-2091", + "color": "rgb(187,50,171)" + }, + { + "index": 343, + "name": "Witt Tyson", + "first": "Rebekah", + "last": "Kelly", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pavelbuben/73.jpg", + "expanded": false, + "guid": "81d76694-4ec9-4a0d-b1d2-87c3513414e3", + "integer": 92, + "date": "Thu Jul 31 1975 13:57:11 GMT-0700 (PDT)", + "shortText": "do quis", + "mediumText": "Reprehenderit veniam in sit magna nulla non ad ut enim culpa consequat in nisi id. Aute culpa ex laborum est cillum excepteur amet labore culpa nostrud magna. Enim deserunt aliquip eu et voluptate consequat culpa do minim occaecat voluptate sit.", + "longText": "Dolor excepteur minim magna tempor cillum duis voluptate reprehenderit veniam nulla anim tempor elit sint. Enim eu consectetur aliqua labore est non anim reprehenderit aliquip deserunt aute. Consequat et veniam id id ullamco amet adipisicing eiusmod. Ullamco fugiat quis ad sit consequat aliqua ipsum labore. Laboris magna est incididunt mollit magna voluptate velit duis aute ut. Laborum in proident nulla officia voluptate do in nostrud consectetur cupidatat est.\r\nLorem elit nulla tempor officia incididunt consequat aliqua. Voluptate anim labore esse veniam. Voluptate commodo occaecat minim duis qui enim veniam anim exercitation nulla laborum officia irure.\r\nNulla est eiusmod duis deserunt ea. Non deserunt ea nulla est quis occaecat cupidatat sit officia aliqua et nulla irure sint. Ea duis aliqua veniam reprehenderit culpa eiusmod sint. Quis et eu eu dolore. Nulla est officia adipisicing laborum est dolore duis culpa. Cupidatat eu aliqua adipisicing magna irure et deserunt eu magna Lorem tempor culpa.\r\nIrure cillum velit dolor duis dolore non sunt elit deserunt pariatur ut elit cupidatat. Qui irure sint duis ad nostrud dolore laborum. Labore esse amet et deserunt elit enim est duis in irure proident adipisicing irure. In laboris mollit eiusmod aliquip irure fugiat nulla commodo quis do eiusmod aute.\r\nIn voluptate aute ex qui ex adipisicing ea sint aliqua in mollit consequat. Duis sit adipisicing proident elit eu duis non dolor aliquip eiusmod duis nostrud reprehenderit. Amet et sint aliquip proident ea cillum veniam qui elit excepteur occaecat voluptate culpa. Mollit ea labore nulla mollit Lorem velit velit sit commodo nostrud. Ex deserunt laborum ea laborum culpa culpa sit eu dolor aute sunt amet. Est dolor tempor proident sint labore proident ipsum consectetur nostrud. Qui commodo qui aliqua commodo esse aute non enim.\r\n", + "address": "2 Kosciusko Street", + "city": "Zarephath", + "state": "Kentucky", + "zip": 42417, + "country": "Aruba", + "email": "rebekahkelly@scentric.com", + "phone": "(941) 590-3874", + "color": "rgb(228,211,182)" + }, + { + "index": 344, + "name": "Daphne Murphy", + "first": "Solis", + "last": "Norris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hafeeskhan/73.jpg", + "expanded": false, + "guid": "aba2b0e9-cd59-410a-b0d2-70b43acabbc0", + "integer": 71, + "date": "Sun Apr 30 1972 14:07:42 GMT-0700 (PDT)", + "shortText": "aute consequat voluptate adipisicing ex", + "mediumText": "Dolore commodo sit ea sunt in consectetur fugiat laboris incididunt aliquip.", + "longText": "Sunt dolor duis fugiat voluptate veniam. In cillum irure nisi quis reprehenderit est ipsum. Dolore duis est ea duis labore laborum ea ex nisi minim. Velit eiusmod nulla laborum eu dolor aliqua sunt officia proident nulla sunt in pariatur. Pariatur sit do ullamco nostrud commodo ex et ex in. Labore excepteur tempor et qui nisi Lorem culpa eu. Incididunt esse Lorem ex ipsum aliquip sunt velit et voluptate consectetur duis.\r\nAdipisicing esse ipsum tempor eu. Voluptate aliqua laborum incididunt excepteur veniam. Laboris sunt id quis sint voluptate duis ex.\r\nQui dolore culpa reprehenderit est est do. Duis mollit consequat quis velit do dolore elit voluptate consequat deserunt aliquip culpa consequat. Laboris adipisicing qui nulla voluptate irure cillum velit eiusmod officia Lorem cillum pariatur tempor duis. Et magna consectetur laborum consectetur est culpa ipsum ullamco sunt aute dolor velit. Duis ipsum reprehenderit quis adipisicing voluptate do laborum.\r\nExcepteur minim est adipisicing ipsum id Lorem eu nisi ea mollit anim ut. Incididunt eu sint eu in ex ut voluptate consectetur ex consectetur aliquip exercitation labore. Proident amet labore sit laborum sit et officia est proident aliqua enim id id. Ea consectetur minim deserunt non. Eu in est labore aliqua non amet aliquip minim enim cupidatat veniam magna. Commodo occaecat dolore Lorem Lorem Lorem sint consequat proident ut duis enim magna. Aute occaecat nisi duis culpa velit sunt.\r\n", + "address": "3 Bushwick Avenue", + "city": "Farmington", + "state": "American Samoa", + "zip": 46996, + "country": "Faroe Islands", + "email": "solisnorris@scentric.com", + "phone": "(926) 567-2180", + "color": "rgb(195,76,204)" + }, + { + "index": 345, + "name": "Summer Sawyer", + "first": "Cheri", + "last": "Watts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/timmillwood/73.jpg", + "expanded": false, + "guid": "edf13e03-caa7-418a-8781-3ec09c26861d", + "integer": 75, + "date": "Tue May 08 2012 18:10:55 GMT-0700 (PDT)", + "shortText": "incididunt excepteur", + "mediumText": "Ullamco adipisicing id culpa irure anim non fugiat. Quis laborum nisi cillum incididunt minim ad cupidatat eiusmod mollit. Et nostrud eiusmod dolor et Lorem aliquip deserunt. In minim ut pariatur commodo. Ullamco minim commodo velit labore commodo eiusmod magna ea officia ex.", + "longText": "Mollit irure non aute magna. Amet dolor dolore ipsum pariatur anim ipsum ipsum cupidatat voluptate. Veniam excepteur eiusmod labore voluptate. Ipsum cillum anim esse aliqua ex consequat. Tempor adipisicing aute laborum deserunt magna labore duis deserunt.\r\nEt fugiat amet esse aliquip veniam magna est ad. Veniam velit velit ipsum pariatur duis incididunt sunt consequat esse. Cillum eiusmod duis aliqua ullamco. Magna pariatur adipisicing magna reprehenderit tempor eiusmod cillum consequat ipsum mollit occaecat enim. Officia tempor aute eu elit aliquip anim voluptate minim cupidatat fugiat esse labore excepteur. Nulla ex aliqua ipsum irure minim. Consectetur dolor non quis consequat eiusmod reprehenderit fugiat eiusmod quis qui qui elit nisi.\r\nDo mollit dolor id occaecat pariatur sint nulla ea aliquip ullamco aliquip exercitation eiusmod ex. Duis magna nulla amet fugiat Lorem tempor duis nisi ex exercitation ex. Non irure ullamco reprehenderit nulla consectetur in.\r\nNisi proident cillum labore anim consectetur in. Amet ullamco magna laboris minim velit eu incididunt non elit sit eu est consequat. Duis consectetur in nulla anim elit in sint nostrud excepteur quis velit. Mollit proident enim voluptate irure officia cupidatat anim Lorem anim occaecat consectetur Lorem.\r\n", + "address": "2 Oxford Street", + "city": "Bordelonville", + "state": "Minnesota", + "zip": 67948, + "country": "Zambia", + "email": "cheriwatts@scentric.com", + "phone": "(854) 438-3356", + "color": "rgb(90,88,182)" + }, + { + "index": 346, + "name": "Anita Jacobson", + "first": "Lucile", + "last": "Roberts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butchewing/73.jpg", + "expanded": false, + "guid": "c88108ef-0dce-42ae-b03e-770b8b26ecf0", + "integer": 37, + "date": "Mon Apr 18 1977 02:05:21 GMT-0800 (PST)", + "shortText": "nostrud", + "mediumText": "Deserunt fugiat veniam minim ipsum consequat ipsum tempor voluptate ut. Elit tempor eu non ea pariatur dolore incididunt laboris quis eiusmod est qui.", + "longText": "Fugiat tempor dolore proident adipisicing fugiat minim. Sunt in veniam dolor anim non Lorem id proident in anim sint. Cupidatat et esse culpa sunt incididunt ex proident elit qui ad eu elit laboris cillum. Laboris culpa pariatur ea sit culpa et ea minim fugiat. Eu nulla est excepteur deserunt officia.\r\nSunt cupidatat do sunt anim ad ullamco veniam est tempor elit id ex sunt. Velit consectetur occaecat laborum do consequat dolore duis sint exercitation anim. Ad sunt aliqua culpa dolore fugiat excepteur elit magna labore. Nostrud cupidatat aliquip et officia aliquip incididunt. Fugiat excepteur pariatur officia magna. Ex id velit enim amet culpa.\r\n", + "address": "2 Adams Street", + "city": "Southview", + "state": "Hawaii", + "zip": 67415, + "country": "Albania", + "email": "lucileroberts@scentric.com", + "phone": "(826) 522-3183", + "color": "rgb(114,159,181)" + }, + { + "index": 347, + "name": "Beverly Ayala", + "first": "Teresa", + "last": "Serrano", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dotmariusz/73.jpg", + "expanded": false, + "guid": "e5824ea2-1204-42b5-8075-232d1e648cfc", + "integer": 47, + "date": "Mon Jul 24 2000 15:52:57 GMT-0700 (PDT)", + "shortText": "non cillum mollit enim ullamco", + "mediumText": "Amet do eu non culpa ea eiusmod culpa reprehenderit aute adipisicing duis nostrud in dolor. Do sint ex anim consectetur reprehenderit.", + "longText": "Et quis laboris ad ea do quis id enim. Ex culpa cupidatat velit nostrud cupidatat voluptate velit ipsum. Eu amet culpa aute officia non commodo irure fugiat. Qui sit consectetur labore exercitation officia cillum veniam enim.\r\n", + "address": "2 Quincy Street", + "city": "Vale", + "state": "Alabama", + "zip": 98150, + "country": "Panama", + "email": "teresaserrano@scentric.com", + "phone": "(898) 426-2065", + "color": "rgb(110,156,140)" + }, + { + "index": 348, + "name": "Golden Zimmerman", + "first": "Greta", + "last": "Gillespie", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronbeashel/73.jpg", + "expanded": false, + "guid": "e4300d91-7791-4fcb-b61e-c551eeed9488", + "integer": 57, + "date": "Thu Sep 20 2007 17:36:22 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Lorem duis adipisicing et ea dolore dolore non anim nisi exercitation enim. Ea incididunt velit quis mollit nisi dolor proident. Ipsum enim id eiusmod ex reprehenderit magna et reprehenderit deserunt aliqua. Qui mollit sit occaecat sunt ex veniam excepteur ex velit ea commodo ad.", + "longText": "Do dolore culpa cillum officia aliqua cillum. Fugiat nisi ipsum proident reprehenderit velit. Nulla proident aliqua proident velit incididunt consectetur quis ut adipisicing do aliqua. Amet laboris elit amet commodo adipisicing. Nisi esse minim ut elit. Est officia do minim mollit occaecat ipsum officia aliqua commodo in ipsum laborum labore.\r\nReprehenderit dolore irure dolore occaecat cillum minim quis non laborum ullamco tempor. Irure ut magna ad esse nostrud nostrud ut. Eiusmod sunt nulla commodo officia incididunt nisi aliqua. Eiusmod occaecat non do non qui eiusmod. Amet sit dolore fugiat aliquip.\r\n", + "address": "2 Foster Avenue", + "city": "Neahkahnie", + "state": "North Carolina", + "zip": 57285, + "country": "Turks and Caicos Islands", + "email": "gretagillespie@scentric.com", + "phone": "(907) 597-3902", + "color": "rgb(54,207,230)" + }, + { + "index": 349, + "name": "Sandra Taylor", + "first": "Schroeder", + "last": "Noel", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jina/73.jpg", + "expanded": false, + "guid": "10f56b06-75ab-4405-929b-533362c0fd8f", + "integer": 65, + "date": "Thu Jul 19 1979 21:31:02 GMT-0700 (PDT)", + "shortText": "laboris pariatur anim est", + "mediumText": "Velit nostrud voluptate labore eu irure laboris proident reprehenderit.", + "longText": "Ex irure sit ut quis exercitation enim voluptate laborum. Cillum deserunt amet est et. Nostrud consequat ullamco minim sit deserunt amet officia sit dolore. Incididunt laboris amet cupidatat exercitation enim enim veniam nostrud ipsum excepteur reprehenderit esse. Adipisicing esse do et est esse nulla duis nisi veniam sint.\r\nAmet incididunt est velit incididunt id consectetur ut eiusmod commodo nostrud do aliqua esse excepteur. Ullamco laborum proident ullamco aliqua nisi aliquip ex id. Irure voluptate non exercitation qui do enim incididunt incididunt esse dolor. Eiusmod aute id consectetur ullamco laboris cupidatat consequat.\r\nSunt commodo amet deserunt sit esse ad eiusmod tempor. Excepteur deserunt ea aliquip tempor nostrud nostrud labore eu et et. Dolore ex mollit officia voluptate non consequat. Tempor enim eiusmod est labore ut esse magna minim eu officia sit enim veniam. Quis do veniam magna elit enim amet est veniam irure.\r\nMollit sit incididunt sunt tempor adipisicing Lorem incididunt. Dolor veniam velit esse laboris fugiat eiusmod velit tempor ea pariatur nisi fugiat. Velit proident ex ipsum id cillum amet ad.\r\nCupidatat incididunt minim ex ipsum exercitation commodo aliquip excepteur. Voluptate labore reprehenderit quis in ex magna. Ad cillum adipisicing proident nostrud eu proident cupidatat consectetur adipisicing amet. Quis labore sunt sit ullamco deserunt amet ad occaecat cupidatat et pariatur fugiat commodo aute. Enim et veniam proident Lorem sint. Labore nisi in esse eiusmod laborum occaecat excepteur cillum incididunt esse in dolore. Aliqua eiusmod velit id occaecat sunt qui ex ea.\r\n", + "address": "2 Williams Court", + "city": "Davenport", + "state": "Connecticut", + "zip": 57031, + "country": "Christmas Island", + "email": "schroedernoel@scentric.com", + "phone": "(982) 532-3421", + "color": "rgb(240,238,143)" + }, + { + "index": 350, + "name": "Shelby Lott", + "first": "Maryanne", + "last": "Dixon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gu5taf/73.jpg", + "expanded": false, + "guid": "86ccb30c-436b-4e11-b33f-231007768e3c", + "integer": 16, + "date": "Wed Jan 07 1970 01:58:18 GMT-0800 (PST)", + "shortText": "anim officia nulla aliqua", + "mediumText": "Officia et eu enim esse veniam. Incididunt fugiat occaecat amet officia ad commodo aute amet reprehenderit reprehenderit nostrud non aute velit. Duis excepteur consectetur enim consequat labore exercitation irure nisi sint ullamco qui quis labore.", + "longText": "Tempor culpa mollit id anim labore sit Lorem cillum. Occaecat cupidatat sit ad voluptate tempor non do. Ullamco id laborum et ex esse. Do ex ad excepteur magna consequat. Qui proident qui occaecat ut aute nostrud.\r\n", + "address": "2 Quay Street", + "city": "Santel", + "state": "South Carolina", + "zip": 32917, + "country": "Botswana", + "email": "maryannedixon@scentric.com", + "phone": "(808) 502-2314", + "color": "rgb(150,72,230)" + }, + { + "index": 351, + "name": "Buck Reyes", + "first": "Meredith", + "last": "Kennedy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/antonkudin/73.jpg", + "expanded": false, + "guid": "1836f1d4-6bef-4b29-8a27-b11d78119e5a", + "integer": 56, + "date": "Wed Jul 03 2013 04:17:00 GMT-0700 (PDT)", + "shortText": "cillum enim aute ea enim", + "mediumText": "Voluptate do Lorem veniam ullamco id excepteur. Mollit et occaecat ut amet nostrud dolore consectetur id minim. Eu esse nisi incididunt nulla occaecat sunt. Minim labore dolor do pariatur voluptate do nostrud irure tempor ipsum consectetur ea fugiat ut.", + "longText": "Et ex ipsum eu commodo aliquip sit officia id. Deserunt reprehenderit sunt dolore nisi veniam adipisicing esse exercitation velit anim ex. Eiusmod do aliquip magna cillum dolore cillum excepteur. Excepteur dolore quis nisi veniam quis eiusmod occaecat. Amet nulla ut excepteur duis officia dolor esse incididunt ipsum. Laboris est aliqua qui nostrud labore duis eu non do.\r\nDo id commodo et deserunt aliquip. Aliqua in ullamco ex consequat nisi laborum esse culpa ipsum mollit do occaecat occaecat incididunt. Tempor est irure irure ex incididunt laboris. Dolore veniam fugiat ea eiusmod cupidatat nostrud est reprehenderit sit id sunt consectetur eu irure. In laborum voluptate proident et dolor aute. Deserunt dolore dolor ad sit duis veniam.\r\n", + "address": "4 Herzl Street", + "city": "Sisquoc", + "state": "Michigan", + "zip": 13348, + "country": "Algeria", + "email": "meredithkennedy@scentric.com", + "phone": "(805) 554-3669", + "color": "rgb(179,239,148)" + }, + { + "index": 352, + "name": "Wooten Sloan", + "first": "Allen", + "last": "Wade", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/derekebradley/73.jpg", + "expanded": false, + "guid": "dc87dc7f-bf6e-4633-9a8e-2e7ce98a216b", + "integer": 94, + "date": "Fri Mar 13 1998 22:52:34 GMT-0800 (PST)", + "shortText": "consectetur ipsum eu velit", + "mediumText": "Lorem commodo sit nostrud culpa esse deserunt laboris magna. Elit esse id Lorem ut.", + "longText": "Sunt veniam est ex duis sit amet eiusmod ullamco cupidatat cillum Lorem. Deserunt ex do mollit consequat elit. Nostrud voluptate proident do commodo Lorem fugiat nostrud minim anim excepteur ad magna.\r\nQui et velit consequat Lorem occaecat irure anim esse. Labore veniam exercitation do excepteur velit pariatur excepteur consectetur aute voluptate enim exercitation non deserunt. Mollit irure magna id elit laborum. Elit pariatur aute pariatur nulla deserunt. Deserunt sit consectetur anim tempor duis laborum do quis enim.\r\nDolore dolore nostrud voluptate ipsum qui. Ea laboris culpa proident duis officia sit. Non do pariatur aute elit dolor aliqua cillum. Lorem ullamco eiusmod laboris mollit sint tempor consectetur laborum laboris deserunt exercitation. Eu fugiat nulla irure excepteur aliqua enim et consequat culpa. Amet dolor excepteur proident labore mollit mollit pariatur culpa incididunt occaecat dolor aliqua aliquip dolor.\r\nIn qui enim cupidatat quis magna do qui aliquip magna. Proident culpa nostrud nulla eiusmod occaecat sit id pariatur labore voluptate aute veniam. Eu amet labore labore aliqua amet adipisicing commodo. Non commodo est ea reprehenderit fugiat est ullamco voluptate excepteur ipsum sint est.\r\nCupidatat dolor aliqua amet ipsum incididunt non consectetur duis proident aliqua sit. Occaecat aliqua labore commodo qui consequat reprehenderit ut voluptate. Sint velit minim mollit elit occaecat laboris aliqua dolor enim do.\r\n", + "address": "2 Sandford Street", + "city": "Levant", + "state": "Maine", + "zip": 74609, + "country": "Switzerland", + "email": "allenwade@scentric.com", + "phone": "(971) 515-2074", + "color": "rgb(55,67,137)" + }, + { + "index": 353, + "name": "Luella Hogan", + "first": "Flores", + "last": "Wolfe", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karachentsov/73.jpg", + "expanded": false, + "guid": "3e88723e-2180-4ee0-8c96-fd9c48538abd", + "integer": 65, + "date": "Thu Sep 03 1998 10:25:29 GMT-0700 (PDT)", + "shortText": "commodo reprehenderit anim", + "mediumText": "Magna in quis irure duis. Nisi duis non pariatur magna ipsum excepteur ea. Ea exercitation culpa commodo consectetur. Do cillum Lorem nisi ipsum nulla cupidatat officia sunt pariatur ea. Dolor deserunt enim reprehenderit in in.", + "longText": "Officia cillum proident consequat quis non dolor nisi id sit amet laborum sint. Elit enim ex laborum amet nulla qui. Ut amet eiusmod mollit id.\r\nEt fugiat laborum adipisicing laboris adipisicing. Sint ea est non ut laborum velit irure officia cupidatat excepteur. Eu cillum occaecat minim id proident incididunt.\r\nLaboris enim aliqua id et duis laborum dolore mollit proident. Culpa commodo dolor labore tempor minim nulla minim esse cupidatat do. Adipisicing ut non ullamco magna do commodo est dolore elit ea est eu. Est dolore duis Lorem culpa adipisicing. Tempor qui sunt qui et. Anim veniam esse consequat ut elit Lorem voluptate excepteur non culpa. Quis veniam Lorem aliqua culpa.\r\nNisi duis ex sunt magna enim proident et sint proident minim. In excepteur id pariatur ullamco. Nulla ea cupidatat sunt ut pariatur minim duis.\r\n", + "address": "2 Grafton Street", + "city": "Falconaire", + "state": "Kansas", + "zip": 39969, + "country": "S. Georgia and S. Sandwich Isls.", + "email": "floreswolfe@scentric.com", + "phone": "(961) 502-3921", + "color": "rgb(81,99,101)" + }, + { + "index": 354, + "name": "Mckee Tillman", + "first": "Patsy", + "last": "Odonnell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmeffess/73.jpg", + "expanded": false, + "guid": "3cc7cc1e-1856-4b5a-a9f7-0e938e0206e5", + "integer": 14, + "date": "Fri Jan 11 1985 09:25:30 GMT-0800 (PST)", + "shortText": "minim in proident", + "mediumText": "Duis eiusmod pariatur consectetur et laboris magna. Est aute cupidatat enim proident qui ea quis officia anim reprehenderit officia deserunt nostrud deserunt.", + "longText": "Qui occaecat irure veniam aliqua nisi Lorem exercitation in consequat nostrud fugiat. Magna cupidatat incididunt tempor in. Esse cillum ullamco minim et nisi tempor nostrud tempor. Fugiat duis veniam enim enim consequat. Incididunt anim fugiat in Lorem sunt sit fugiat. Do ut anim officia aliquip irure consectetur ipsum eu ex magna esse et exercitation. Reprehenderit irure velit sunt minim aute proident nisi ad enim tempor nostrud dolor.\r\n", + "address": "2 Dekalb Avenue", + "city": "Sattley", + "state": "Iowa", + "zip": 56105, + "country": "Brazil", + "email": "patsyodonnell@scentric.com", + "phone": "(991) 576-3320", + "color": "rgb(151,157,82)" + }, + { + "index": 355, + "name": "Tammy Mckenzie", + "first": "Araceli", + "last": "Villarreal", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bmovement/73.jpg", + "expanded": false, + "guid": "645a7c4c-a0cf-4361-9c6d-5d32d77d5500", + "integer": 69, + "date": "Sun Dec 24 2006 07:06:15 GMT-0800 (PST)", + "shortText": "anim laborum nisi", + "mediumText": "Incididunt consectetur culpa nisi Lorem eiusmod cillum non nisi tempor mollit irure nisi ut cupidatat. Proident non magna consectetur ut consequat occaecat est consectetur culpa aliqua cupidatat consequat ea. Commodo et veniam qui magna velit non deserunt exercitation proident Lorem eu non. Mollit eu laboris labore ipsum id nisi aute culpa dolore in magna ad cillum. Ea adipisicing Lorem ad irure exercitation amet aliqua esse.", + "longText": "Ea laboris in irure labore cillum. Lorem aliqua ut amet aliqua sint sunt officia adipisicing ipsum minim velit. Elit in reprehenderit occaecat et et elit sint. In consequat quis nulla cillum cillum sint ullamco do officia. Excepteur id fugiat ullamco elit adipisicing veniam deserunt tempor. Nisi dolor tempor amet irure in amet consequat ea. Sit tempor amet excepteur in tempor irure ut ipsum amet velit culpa dolor occaecat fugiat.\r\nLorem consequat deserunt irure veniam culpa fugiat incididunt eu sunt excepteur commodo sit adipisicing cillum. Magna ea mollit anim ullamco nisi do laboris duis aliquip excepteur labore reprehenderit dolor. Amet ea proident cupidatat cupidatat magna magna amet proident aute tempor. Officia non culpa tempor reprehenderit nostrud ut anim quis nisi laboris ipsum nostrud deserunt. Magna proident elit eiusmod et incididunt deserunt est ad anim occaecat enim tempor ex. Id veniam ad commodo ad proident reprehenderit. Veniam in culpa do dolore excepteur pariatur mollit.\r\nCupidatat ex occaecat nulla irure excepteur. Duis sit do nisi officia. Ea eu commodo magna aliquip ea sint aute dolor mollit laborum aute reprehenderit Lorem sit. Proident laboris incididunt sit in sint. Veniam nisi sunt laboris eu aliquip sunt reprehenderit irure ad reprehenderit. In ea ullamco ullamco amet cillum irure pariatur veniam.\r\nDolor deserunt sunt sunt aliqua consequat est deserunt culpa proident labore proident sit laborum. Cupidatat aute nostrud ad non consequat laboris. Cupidatat dolor magna et occaecat laboris. Ipsum magna id amet non consectetur adipisicing veniam. Aliqua anim pariatur nostrud anim in sint sit deserunt anim. Laborum dolor sunt anim sunt eiusmod consectetur do aliqua aute magna ad ea. Enim amet exercitation culpa deserunt proident.\r\nCommodo nisi officia commodo Lorem irure occaecat qui. Est eu Lorem et labore excepteur elit enim. Minim occaecat eu cupidatat labore ad deserunt irure officia quis enim. Consequat eiusmod labore minim ex ipsum velit ea veniam. Elit minim do non eiusmod cillum incididunt proident. In excepteur exercitation nisi aliquip adipisicing consequat qui.\r\n", + "address": "2 Richards Street", + "city": "Bancroft", + "state": "Vermont", + "zip": 63605, + "country": "Anguilla", + "email": "aracelivillarreal@scentric.com", + "phone": "(922) 535-2085", + "color": "rgb(123,74,237)" + }, + { + "index": 356, + "name": "Joyce Carney", + "first": "Vance", + "last": "Boyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taiyab/73.jpg", + "expanded": false, + "guid": "0714e7c1-db9c-4bc9-ae14-47d72e9f36b2", + "integer": 29, + "date": "Sat Jan 18 1986 13:37:09 GMT-0800 (PST)", + "shortText": "Lorem non cillum laborum culpa", + "mediumText": "Laboris Lorem anim cillum et deserunt nostrud laborum ex laborum laboris laborum sint nostrud. In anim aliqua pariatur cupidatat adipisicing esse ex nulla pariatur sunt velit laborum cupidatat. Culpa irure elit occaecat ea in aliqua. Aliqua ex sint anim elit aute enim consectetur ea culpa pariatur. Reprehenderit culpa nisi nostrud cillum sint ullamco mollit sit velit ea officia pariatur.", + "longText": "Minim magna ipsum excepteur irure non qui pariatur excepteur. Minim velit ea ullamco irure quis est duis velit est enim do labore. Irure laboris mollit commodo fugiat. Elit dolor ipsum non veniam culpa id esse.\r\nAnim excepteur deserunt cillum fugiat quis dolor aliqua cillum occaecat. Occaecat deserunt incididunt voluptate cupidatat eu nulla do consequat laborum id veniam laborum. Laboris adipisicing cupidatat laboris sint elit fugiat ipsum mollit laboris sint proident dolore officia. Pariatur ut laboris aliquip culpa irure magna officia velit velit occaecat. Duis ipsum duis occaecat aute magna sunt ex veniam dolore laborum aliqua.\r\nUllamco deserunt minim et qui consequat esse. Cillum do elit magna culpa exercitation occaecat tempor reprehenderit nostrud ex do. Ex laborum irure aliquip ipsum. Excepteur cupidatat laboris consequat sint esse est aute voluptate est minim.\r\n", + "address": "3 Suydam Place", + "city": "Wiscon", + "state": "Nebraska", + "zip": 24690, + "country": "Mayotte", + "email": "vanceboyd@scentric.com", + "phone": "(950) 499-2028", + "color": "rgb(151,255,141)" + }, + { + "index": 357, + "name": "Briggs Cash", + "first": "Mason", + "last": "Norton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rigelstpierre/73.jpg", + "expanded": false, + "guid": "06751f30-d76a-46ef-a97a-3d8233acee4e", + "integer": 36, + "date": "Wed Oct 22 1997 23:32:22 GMT-0700 (PDT)", + "shortText": "qui aliquip laborum", + "mediumText": "Velit eiusmod est incididunt sint ipsum qui ullamco amet. Elit est velit adipisicing occaecat velit nisi irure tempor enim exercitation tempor sunt nulla elit. Incididunt ad quis officia nostrud aliqua incididunt commodo. Duis ex quis sint mollit laboris sint in ipsum enim.", + "longText": "Nisi excepteur culpa ipsum cillum aute cupidatat nisi. Culpa aliqua in excepteur et elit eu est irure laboris amet pariatur. Eiusmod culpa do nostrud sunt velit ea aliquip laboris nulla occaecat quis amet elit cupidatat. Excepteur sit mollit fugiat laborum nostrud sint pariatur. Officia ullamco consequat ex est quis. Dolor est laboris sint eu in laborum culpa.\r\n", + "address": "3 Williams Avenue", + "city": "Marbury", + "state": "Florida", + "zip": 96679, + "country": "Northern Mariana Islands", + "email": "masonnorton@scentric.com", + "phone": "(988) 478-3734", + "color": "rgb(122,225,185)" + }, + { + "index": 358, + "name": "Frank Vance", + "first": "Eva", + "last": "Christian", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vlajki/73.jpg", + "expanded": false, + "guid": "90639571-dc94-4c8f-98c8-db8781d4d7e2", + "integer": 11, + "date": "Thu Jan 05 1984 02:00:59 GMT-0800 (PST)", + "shortText": "laboris non cillum laborum amet", + "mediumText": "Nulla consequat aute non non esse elit nostrud labore dolor consectetur. Fugiat culpa dolore commodo aute et enim exercitation reprehenderit. Mollit velit anim labore est dolor. Id fugiat proident qui in Lorem eiusmod. Officia labore reprehenderit nulla irure aute enim tempor sint mollit et.", + "longText": "Duis ad proident anim sint eu. Qui aute dolore minim nisi proident cillum consequat laboris. Aliquip sunt sunt irure eiusmod esse laboris amet ad nisi occaecat exercitation ullamco aliqua ex. Ipsum minim labore ut officia ut ut minim officia qui. Qui aliqua commodo nulla labore nulla aliqua sunt laboris ullamco anim. Enim exercitation labore excepteur et eiusmod Lorem fugiat sunt nulla enim aliquip magna. Excepteur esse et nisi in excepteur reprehenderit excepteur duis magna cupidatat labore exercitation adipisicing enim.\r\n", + "address": "2 Cypress Avenue", + "city": "Westwood", + "state": "New Jersey", + "zip": 64807, + "country": "Pitcairn", + "email": "evachristian@scentric.com", + "phone": "(933) 555-3019", + "color": "rgb(65,246,66)" + }, + { + "index": 359, + "name": "Bennett Fitzgerald", + "first": "Alyce", + "last": "Roth", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/leeiio/73.jpg", + "expanded": false, + "guid": "abc6eb23-4f14-4711-aaa1-0356ef6ac47e", + "integer": 79, + "date": "Mon Dec 15 1986 02:54:47 GMT-0800 (PST)", + "shortText": "veniam adipisicing velit magna deserunt", + "mediumText": "Laboris fugiat cupidatat ad aute laboris aliquip qui magna cupidatat cupidatat reprehenderit occaecat do.", + "longText": "Incididunt pariatur qui et ad adipisicing laborum. Aliqua eiusmod qui occaecat incididunt laboris sit. Amet ut commodo amet reprehenderit sit ex labore labore reprehenderit velit irure officia esse. Fugiat dolor ullamco sit ex ipsum aliqua irure aute dolore dolor.\r\n", + "address": "3 Howard Avenue", + "city": "Imperial", + "state": "Wisconsin", + "zip": 43410, + "country": "Saint Vincent and The Grenadines", + "email": "alyceroth@scentric.com", + "phone": "(930) 449-2969", + "color": "rgb(122,168,204)" + }, + { + "index": 360, + "name": "Garrett Lawson", + "first": "Marlene", + "last": "Hatfield", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brad_frost/73.jpg", + "expanded": false, + "guid": "ea670adf-3aa0-4b5f-9ffc-4e448f9ad69b", + "integer": 63, + "date": "Sun Nov 16 1986 08:23:14 GMT-0800 (PST)", + "shortText": "aliqua sit aliquip id elit", + "mediumText": "Anim qui adipisicing enim est consequat duis qui aliquip. Elit excepteur tempor in eu ex exercitation. Dolor ex velit amet laboris. Sit non nisi anim ut et quis qui non irure elit pariatur nulla.", + "longText": "Ut pariatur magna duis cupidatat enim proident eiusmod tempor do aute Lorem non occaecat. Amet anim id quis cupidatat nulla exercitation nulla dolore eu irure Lorem anim incididunt. Laboris id dolore ullamco exercitation nostrud mollit pariatur Lorem. Consequat labore ea Lorem elit duis cupidatat nostrud do nulla. Elit amet proident fugiat commodo nostrud ipsum incididunt. Incididunt sunt qui laborum officia sit proident aute. Laboris laboris do est voluptate eu id officia labore amet aliquip eiusmod.\r\nLorem tempor elit nisi sunt. Laboris eu ea id id. Esse ad duis laboris elit tempor sint officia enim qui nulla elit aliquip cillum qui. Ex id culpa consequat laboris et voluptate esse irure.\r\nMollit sunt elit duis sunt reprehenderit aliquip id consequat elit ea amet Lorem non culpa. Et ad qui est mollit laboris mollit aute amet ut. Veniam occaecat mollit aliquip cillum consequat sit sint eu Lorem voluptate pariatur ad ad irure. Id aliquip velit eiusmod veniam anim duis proident do esse culpa non aliqua. Irure duis aute fugiat aliquip esse sint mollit aute non magna aliquip. Aliqua Lorem officia veniam cillum ad. Laboris reprehenderit adipisicing occaecat labore cupidatat cupidatat consectetur elit fugiat.\r\nUt amet tempor qui irure ex sunt nisi nostrud. Ipsum dolor cillum nisi mollit cupidatat adipisicing tempor ipsum veniam mollit anim aute nulla. Dolor aliqua occaecat aliqua eiusmod Lorem voluptate laborum. Aliquip sit quis culpa quis velit ut minim anim quis aliquip voluptate laborum. Sint qui exercitation elit occaecat consequat fugiat in nulla voluptate. Consequat fugiat culpa nulla qui Lorem cillum commodo elit aliqua proident enim dolore dolor excepteur. Voluptate pariatur ad culpa eiusmod ad nisi.\r\nSint eiusmod non reprehenderit proident Lorem anim nostrud id id. Adipisicing cupidatat magna commodo culpa quis amet sunt amet dolore veniam duis veniam duis occaecat. Cillum exercitation elit fugiat non. Consequat enim deserunt et nisi id. Ut occaecat est amet ea Lorem occaecat minim irure dolor nulla esse fugiat in aliqua. Commodo commodo occaecat duis consectetur sint ad ea exercitation adipisicing amet adipisicing aute duis.\r\n", + "address": "4 Elm Avenue", + "city": "Bluffview", + "state": "Washington", + "zip": 66639, + "country": "Iceland", + "email": "marlenehatfield@scentric.com", + "phone": "(944) 414-3916", + "color": "rgb(156,157,84)" + }, + { + "index": 361, + "name": "Rosalinda Barber", + "first": "Rosalind", + "last": "Little", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alsobrooks/73.jpg", + "expanded": false, + "guid": "301b4435-b804-43a6-b90e-8b509a8d7482", + "integer": 30, + "date": "Mon Dec 21 2009 13:14:30 GMT-0800 (PST)", + "shortText": "ea veniam dolor enim", + "mediumText": "Excepteur et labore esse commodo in. In irure quis qui veniam cillum. Reprehenderit aliqua velit cillum fugiat velit eiusmod ad ex consectetur occaecat.", + "longText": "Aliquip minim ex adipisicing tempor labore qui deserunt laborum consequat. Cillum excepteur id cupidatat minim ex. Consequat officia voluptate aliqua cupidatat qui.\r\n", + "address": "4 Centre Street", + "city": "Efland", + "state": "Oregon", + "zip": 37697, + "country": "Andorra", + "email": "rosalindlittle@scentric.com", + "phone": "(912) 415-2087", + "color": "rgb(158,187,61)" + }, + { + "index": 362, + "name": "Krystal Lane", + "first": "Kitty", + "last": "Hodge", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thekishpatel/73.jpg", + "expanded": false, + "guid": "8918af69-f5ee-41e7-b442-d3e13fa03f20", + "integer": 88, + "date": "Tue Apr 11 1978 05:39:13 GMT-0800 (PST)", + "shortText": "adipisicing quis dolore ullamco exercitation", + "mediumText": "Nulla ipsum mollit sunt ad fugiat officia labore velit Lorem elit id. Tempor magna aliquip nulla laborum labore ea voluptate.", + "longText": "Nostrud culpa pariatur mollit nisi labore aliquip enim nulla reprehenderit. Laborum magna ut voluptate in occaecat irure non magna non aliqua sunt commodo anim. Consectetur officia irure proident enim. Sit amet nulla duis minim cillum consequat labore anim cillum. Cillum minim voluptate commodo ex aute duis nulla do. Incididunt cupidatat occaecat commodo labore pariatur eu sit commodo fugiat proident exercitation sint est.\r\nSunt voluptate sunt quis pariatur excepteur et. Id exercitation veniam cupidatat incididunt quis commodo duis cupidatat enim laboris elit. Consectetur irure reprehenderit consequat labore qui commodo quis excepteur irure nisi labore mollit Lorem voluptate. Aute dolore consectetur voluptate cillum anim qui incididunt.\r\n", + "address": "3 President Street", + "city": "Laurelton", + "state": "Illinois", + "zip": 32233, + "country": "Myanmar", + "email": "kittyhodge@scentric.com", + "phone": "(994) 498-3202", + "color": "rgb(139,225,83)" + }, + { + "index": 363, + "name": "Lorrie Carey", + "first": "Moran", + "last": "Bradshaw", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iqonicd/73.jpg", + "expanded": false, + "guid": "8040adde-26e1-416b-9053-e33e98a911a9", + "integer": 0, + "date": "Sat May 27 1972 21:40:25 GMT-0700 (PDT)", + "shortText": "culpa fugiat", + "mediumText": "Commodo cillum Lorem duis laborum minim cillum labore irure nostrud excepteur ut fugiat fugiat anim. Occaecat do eiusmod proident irure. Voluptate id nisi veniam tempor. Consequat non reprehenderit nulla esse irure magna pariatur occaecat minim nisi sunt velit. Labore reprehenderit ad consectetur et exercitation esse commodo.", + "longText": "Ad occaecat amet cillum nisi culpa pariatur sint Lorem ex. Ea ullamco Lorem officia exercitation pariatur cupidatat non mollit voluptate proident. Fugiat tempor irure pariatur eu minim nisi fugiat cupidatat. Ad anim ad qui occaecat. Do id veniam est cupidatat non proident occaecat deserunt fugiat incididunt.\r\nAliqua ea adipisicing elit est officia. Dolor voluptate ex labore proident aute laboris fugiat fugiat. Et fugiat enim qui et laborum sint. Aute excepteur ut ad duis. Voluptate duis adipisicing cupidatat ullamco magna.\r\nEu sint anim ea mollit ea labore pariatur velit adipisicing laborum velit. Irure eu ipsum consequat Lorem aute aliqua exercitation magna est anim commodo deserunt ea. Minim laboris adipisicing laboris in cillum culpa magna ea esse enim veniam. Non enim velit qui veniam commodo do incididunt. Aliqua quis reprehenderit consequat tempor ut excepteur fugiat ad tempor sit est ad est.\r\nUllamco quis et ea ex est deserunt ut. Adipisicing quis commodo laboris pariatur exercitation sit mollit labore. Dolore ut ad do magna incididunt ut adipisicing dolor eu eiusmod irure consectetur ipsum. Exercitation magna incididunt exercitation eiusmod. Esse veniam mollit Lorem qui eu officia aute.\r\n", + "address": "3 Hart Street", + "city": "Vandiver", + "state": "West Virginia", + "zip": 46407, + "country": "Saint Lucia", + "email": "moranbradshaw@scentric.com", + "phone": "(807) 537-3271", + "color": "rgb(54,143,210)" + }, + { + "index": 364, + "name": "Kirk Richard", + "first": "Delia", + "last": "Cervantes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamlechev/73.jpg", + "expanded": false, + "guid": "42e322d1-8045-429a-8eeb-8c62ba84d618", + "integer": 75, + "date": "Sat Nov 22 2003 15:26:15 GMT-0800 (PST)", + "shortText": "eu in consequat qui", + "mediumText": "Ullamco elit eu id excepteur incididunt Lorem ipsum pariatur laboris incididunt Lorem ullamco. Veniam consequat id sunt commodo fugiat magna velit laborum do Lorem enim in sunt. In non non magna deserunt duis nisi exercitation cupidatat eiusmod fugiat ea ex do in. Reprehenderit non consequat sit nostrud.", + "longText": "Dolor excepteur exercitation et ullamco. Non nulla duis qui cillum aliqua nostrud elit sunt dolor. Ex excepteur voluptate do minim non ea sint Lorem incididunt laborum sint. Officia elit labore reprehenderit proident. Laborum eiusmod occaecat eu nulla nisi voluptate. Dolor id in ullamco laborum ut ea est laborum adipisicing tempor et. Incididunt laborum consequat quis anim proident irure amet do.\r\n", + "address": "3 Amboy Street", + "city": "Tuttle", + "state": "Mississippi", + "zip": 27056, + "country": "Equatorial Guinea", + "email": "deliacervantes@scentric.com", + "phone": "(829) 471-3065", + "color": "rgb(94,71,106)" + }, + { + "index": 365, + "name": "Tate Mcdowell", + "first": "Adrian", + "last": "Mccullough", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elliotpopel/73.jpg", + "expanded": false, + "guid": "9e89b9c6-cf38-4f45-99ed-c7f3f5623d7c", + "integer": 86, + "date": "Sat Jul 23 1977 13:14:21 GMT-0700 (PDT)", + "shortText": "exercitation", + "mediumText": "In non excepteur est ex sunt laborum commodo esse ex. Elit officia laborum incididunt tempor consectetur ea incididunt duis aliqua culpa quis occaecat minim.", + "longText": "Aliquip nisi elit commodo quis exercitation aliquip et do magna quis aute excepteur tempor dolor. Laborum deserunt ullamco aute velit fugiat non labore aliquip. Non exercitation aliqua sunt eiusmod laborum occaecat cupidatat amet commodo enim occaecat amet. Duis laboris labore enim dolor nisi deserunt id cupidatat id. Deserunt esse Lorem minim proident laboris fugiat irure laborum consectetur cillum laborum proident ex. Nulla est excepteur nostrud eiusmod consectetur dolor magna nostrud elit dolore.\r\nElit magna do occaecat in ea elit reprehenderit cupidatat excepteur labore consequat est minim enim. Laborum culpa id commodo esse elit nulla. Irure nulla aliquip adipisicing deserunt nisi ut duis sint. Duis culpa id ex duis incididunt irure nostrud excepteur.\r\nDolor cillum nisi eiusmod ea Lorem sint. Aute duis proident aute in aliquip. Nostrud ut cupidatat ex sit pariatur tempor duis consequat quis quis mollit. Ullamco nostrud id consequat ut. Nostrud officia officia nostrud anim occaecat culpa laborum nostrud fugiat cupidatat irure ex aliqua tempor. Eiusmod pariatur adipisicing reprehenderit exercitation minim Lorem commodo deserunt velit dolor esse elit dolore. Mollit dolore ipsum eu do excepteur nulla magna ea aliquip ut velit aliquip exercitation.\r\nDuis dolor magna voluptate irure enim eu mollit commodo enim commodo nostrud. Laborum magna culpa aliqua aliquip consequat consequat incididunt sunt proident ex eu adipisicing. Sunt esse non exercitation excepteur quis quis fugiat. Qui anim sint nisi proident non quis cillum magna. Ipsum amet veniam anim esse sint et occaecat occaecat in.\r\nAdipisicing ad mollit consequat ut quis eiusmod exercitation quis elit veniam do. Lorem excepteur occaecat labore ex deserunt cupidatat irure officia dolor sunt adipisicing elit officia. Laboris labore aliqua aliqua dolore Lorem laboris ipsum in. Irure ut mollit adipisicing incididunt magna.\r\n", + "address": "2 Bedell Lane", + "city": "Chilton", + "state": "Rhode Island", + "zip": 97237, + "country": "Tanzania", + "email": "adrianmccullough@scentric.com", + "phone": "(810) 599-3339", + "color": "rgb(178,126,71)" + }, + { + "index": 366, + "name": "Terry Romero", + "first": "Barrett", + "last": "Burgess", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/diesellaws/73.jpg", + "expanded": false, + "guid": "f92c32bc-6e74-46d1-85b4-49fefcf41773", + "integer": 59, + "date": "Thu Mar 25 2004 20:56:10 GMT-0800 (PST)", + "shortText": "amet ex aliqua dolor", + "mediumText": "Ullamco mollit in excepteur et sit do ad nulla in ex. Deserunt dolore elit velit est cillum irure non dolor consectetur pariatur adipisicing aute qui officia. Quis minim cillum ex reprehenderit Lorem eu non consequat dolor nisi consequat qui. Ex do eu ad velit ad do ut dolor aliquip id. Aliqua ullamco elit cupidatat laborum laborum ut velit quis aliquip.", + "longText": "In duis aute elit nostrud sint ut veniam. Aute sunt tempor laborum et consectetur. Incididunt qui excepteur dolor proident in et aliqua anim nisi magna incididunt duis fugiat. Irure amet laboris excepteur consequat dolore est magna. Eu velit dolore velit eiusmod id mollit esse dolore ullamco enim aute reprehenderit commodo occaecat. Ea quis cillum cillum ea consequat dolor non ea aute ipsum.\r\nDolore qui consectetur Lorem deserunt cupidatat pariatur est magna consectetur veniam. Pariatur ullamco nostrud commodo cillum fugiat cillum id ipsum ad. Occaecat laboris irure est nostrud proident ipsum aliqua cillum fugiat nulla enim.\r\n", + "address": "2 Whitney Avenue", + "city": "Weeksville", + "state": "Georgia", + "zip": 31104, + "country": "Slovak Republic", + "email": "barrettburgess@scentric.com", + "phone": "(946) 534-2498", + "color": "rgb(219,133,212)" + }, + { + "index": 367, + "name": "Karen Collins", + "first": "Barton", + "last": "Diaz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/juanpablob/73.jpg", + "expanded": false, + "guid": "98c26038-07d2-4135-bbd2-9a3f427c12e0", + "integer": 8, + "date": "Sat Sep 17 2005 00:39:48 GMT-0700 (PDT)", + "shortText": "aute aute nulla Lorem", + "mediumText": "Aliqua aliquip adipisicing veniam aliqua magna adipisicing dolor officia nisi nulla non voluptate ut.", + "longText": "Qui aliqua culpa sunt ea eu ipsum velit reprehenderit. Do eu veniam ad velit proident ea ea ut cupidatat elit sunt. Nisi cillum est tempor anim veniam. Sit nostrud exercitation veniam minim magna. Esse veniam amet est cillum dolore magna sunt ea minim aliqua incididunt reprehenderit est. Nulla pariatur consectetur officia aliqua veniam irure labore minim dolor amet cupidatat anim sint.\r\nCulpa id amet esse officia. Officia esse ex cillum velit. Cupidatat in in adipisicing exercitation deserunt. Amet id adipisicing ipsum deserunt.\r\n", + "address": "4 Garland Court", + "city": "Martinez", + "state": "New Mexico", + "zip": 87856, + "country": "Iraq", + "email": "bartondiaz@scentric.com", + "phone": "(915) 446-2455", + "color": "rgb(198,214,168)" + }, + { + "index": 368, + "name": "Carly Kirkland", + "first": "Malone", + "last": "West", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/whale/73.jpg", + "expanded": false, + "guid": "a0fe6dd2-da36-4fe8-9172-64d79b76016a", + "integer": 40, + "date": "Thu Sep 03 2009 05:16:20 GMT-0700 (PDT)", + "shortText": "dolor culpa", + "mediumText": "Incididunt nulla est do proident qui culpa ea non eu et velit.", + "longText": "Quis non exercitation in cupidatat ad. Irure pariatur anim magna est elit excepteur nulla elit est quis nisi tempor quis. Sint irure consectetur consequat nostrud. Excepteur officia eiusmod reprehenderit sit irure aliqua id minim esse consectetur dolore.\r\nIncididunt incididunt sint magna excepteur quis reprehenderit qui pariatur dolore magna est. Pariatur exercitation minim et culpa consequat eiusmod cillum nostrud Lorem cupidatat. Amet labore amet laborum qui qui id laborum. Officia magna ipsum proident mollit deserunt sit veniam nostrud reprehenderit do laborum voluptate. Excepteur laboris excepteur pariatur proident pariatur minim dolor. Fugiat veniam nostrud ut non duis fugiat ex culpa. Velit enim culpa voluptate culpa reprehenderit officia irure velit ad qui veniam non exercitation.\r\nLaborum fugiat ea ex sint. Veniam labore duis non sunt ad reprehenderit voluptate irure voluptate commodo elit non. Eiusmod labore elit magna irure dolor aliquip.\r\nDolore qui occaecat magna ex amet irure officia adipisicing consequat Lorem proident reprehenderit sint. Laboris esse eiusmod quis ex sunt dolor ipsum sunt Lorem labore laborum id eu. Quis dolore qui quis exercitation minim nostrud do aliquip qui deserunt commodo aute fugiat aliqua. Pariatur proident eiusmod pariatur sit esse eiusmod aliquip fugiat exercitation culpa duis eiusmod. Mollit pariatur commodo ex qui et incididunt.\r\n", + "address": "2 Livonia Avenue", + "city": "Bartley", + "state": "Arizona", + "zip": 65737, + "country": "Congo", + "email": "malonewest@scentric.com", + "phone": "(884) 560-3387", + "color": "rgb(203,128,144)" + }, + { + "index": 369, + "name": "Cline Porter", + "first": "Villarreal", + "last": "Berg", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kalmerrautam/73.jpg", + "expanded": false, + "guid": "bc0ae406-a0b0-46b8-a78c-e814bf6e352a", + "integer": 34, + "date": "Sat Dec 17 2011 17:11:11 GMT-0800 (PST)", + "shortText": "aliquip", + "mediumText": "Sit eu exercitation deserunt fugiat sunt. Duis amet Lorem sint fugiat aliquip sint nisi nulla officia. Mollit magna esse magna mollit ex aliquip sit voluptate occaecat. Sint ea reprehenderit pariatur ut proident consequat tempor do irure.", + "longText": "Sunt sunt culpa enim anim reprehenderit minim occaecat officia est exercitation exercitation. Magna irure consequat aliquip nisi sint. Ad excepteur et exercitation consectetur. Nulla magna pariatur commodo velit consectetur elit sunt voluptate laborum eiusmod sint cupidatat proident ex.\r\nConsectetur minim aute in eu tempor enim laboris deserunt. Proident laboris fugiat cupidatat ullamco ex. Laboris et eu qui tempor nisi non anim magna sunt est commodo qui et. In sint eu quis ea. Adipisicing ad nisi non mollit officia elit. Reprehenderit veniam aute consequat qui aliqua incididunt.\r\n", + "address": "4 Willmohr Street", + "city": "Russellville", + "state": "Texas", + "zip": 61324, + "country": "Cocos (Keeling Islands)", + "email": "villarrealberg@scentric.com", + "phone": "(934) 457-2444", + "color": "rgb(128,225,98)" + }, + { + "index": 370, + "name": "Davidson Parker", + "first": "George", + "last": "Pittman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicoleglynn/73.jpg", + "expanded": false, + "guid": "4d0d0e84-953f-4ab2-819d-ae72aa4552f7", + "integer": 2, + "date": "Sat Jun 23 1979 15:10:33 GMT-0700 (PDT)", + "shortText": "adipisicing Lorem", + "mediumText": "Est ullamco qui est cupidatat magna velit cupidatat do sunt officia ad.", + "longText": "Velit enim nostrud et ut elit nostrud laboris mollit. Pariatur sit sint proident officia ea sunt consectetur occaecat esse velit. Nulla Lorem ad anim ut aute nostrud amet sit labore sint ullamco nisi ad.\r\nEsse proident in magna elit ex esse et consequat incididunt eiusmod officia. Occaecat labore ut aliqua sunt labore minim Lorem ut velit magna occaecat sit sunt. Commodo ut magna cillum minim.\r\nDolor cupidatat et ullamco velit elit labore. Sint dolore incididunt anim nisi aliquip. Ullamco id laboris cillum id enim cillum exercitation non.\r\nLaboris qui Lorem ipsum dolor proident exercitation consectetur commodo incididunt. Ad pariatur cillum et aute. Nulla cillum sint quis laboris fugiat do ullamco incididunt aliqua aliquip eu aute.\r\nLorem irure nisi magna ex do voluptate tempor consequat. Aliquip dolore ullamco laboris reprehenderit Lorem elit. Dolor esse minim veniam eu ex reprehenderit. Sit do irure anim ipsum id duis culpa laboris dolore velit cillum nulla amet dolor. Exercitation enim proident ut aliqua culpa ipsum. Aute ad irure ipsum exercitation fugiat ut. Labore non do incididunt nulla veniam ex exercitation nostrud enim fugiat.\r\n", + "address": "3 Stryker Court", + "city": "Bourg", + "state": "District Of Columbia", + "zip": 63976, + "country": "Saint Kitts and Nevis", + "email": "georgepittman@scentric.com", + "phone": "(812) 518-3391", + "color": "rgb(128,255,152)" + }, + { + "index": 371, + "name": "Ingram Ware", + "first": "Caitlin", + "last": "Hart", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rickdt/73.jpg", + "expanded": false, + "guid": "b6de624e-cbfa-436a-9fcb-b5d584616793", + "integer": 24, + "date": "Thu Feb 14 1974 18:30:07 GMT-0700 (PDT)", + "shortText": "tempor reprehenderit nulla quis", + "mediumText": "Qui id adipisicing do deserunt laboris anim. Eiusmod magna dolor labore fugiat aute amet commodo ad sit. Esse occaecat labore qui culpa aute pariatur commodo velit laborum enim voluptate. Consequat sunt labore cupidatat ex labore id exercitation ad deserunt quis laboris et dolor.", + "longText": "Et consequat duis excepteur occaecat reprehenderit labore dolor nostrud. Aliqua irure ullamco reprehenderit incididunt dolore aliquip eiusmod. Et et in commodo quis.\r\nFugiat fugiat amet qui deserunt incididunt consequat ex anim culpa Lorem. Magna cillum incididunt ut consectetur esse quis veniam nulla aliqua esse velit consequat ipsum. Veniam ut amet officia tempor aliquip ad ad ad commodo ut et. Ad esse mollit adipisicing adipisicing cillum.\r\nUllamco dolore ullamco adipisicing in duis enim eiusmod sit. Proident nisi nostrud ea ipsum. Aliquip officia est ut Lorem ad incididunt qui tempor aliquip aute non esse. Id culpa ipsum proident duis eu sint elit eiusmod esse quis veniam nulla mollit. Elit mollit pariatur occaecat sunt duis et ipsum quis pariatur consequat ad culpa deserunt ex.\r\n", + "address": "2 Elliott Place", + "city": "Moscow", + "state": "Virgin Islands", + "zip": 16190, + "country": "Spain", + "email": "caitlinhart@scentric.com", + "phone": "(802) 458-3217", + "color": "rgb(245,222,100)" + }, + { + "index": 372, + "name": "Rodriguez Herring", + "first": "Blevins", + "last": "Richards", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/funwatercat/73.jpg", + "expanded": false, + "guid": "16027d94-5563-418b-b92e-879c2bfe66a2", + "integer": 27, + "date": "Thu Aug 04 1977 16:52:59 GMT-0700 (PDT)", + "shortText": "ea incididunt commodo", + "mediumText": "Fugiat culpa duis velit ullamco cupidatat esse pariatur deserunt laborum. Irure nostrud nulla culpa cupidatat est quis sunt veniam culpa. Aliqua anim mollit nulla aliquip quis dolore irure aliquip non est.", + "longText": "Anim laborum aliquip et culpa mollit eiusmod laboris. Consectetur tempor deserunt ullamco cillum elit sunt esse ut ullamco do aliquip. Irure pariatur occaecat id deserunt fugiat irure Lorem tempor excepteur ut dolor cupidatat reprehenderit adipisicing.\r\nIpsum sit ipsum aute ex sint magna commodo in anim enim consequat occaecat nisi. Qui do pariatur do ea. Consequat cupidatat sit aute fugiat qui laboris culpa elit irure excepteur. Duis ea elit et aliqua qui ipsum commodo proident adipisicing duis tempor. Duis ad nulla dolore minim anim dolore aute amet tempor.\r\nExercitation pariatur mollit cupidatat adipisicing deserunt pariatur incididunt. Sit deserunt consequat nisi do irure et duis quis. Cupidatat ea et ut velit ullamco ad dolore fugiat voluptate cillum.\r\nDolore ipsum anim nisi voluptate id ad non do dolor cupidatat duis dolor in. Excepteur esse aliquip ex dolor aute adipisicing duis dolore. Mollit amet deserunt occaecat qui cupidatat do et ea reprehenderit qui.\r\n", + "address": "2 Mill Street", + "city": "Sunriver", + "state": "Puerto Rico", + "zip": 60210, + "country": "Guinea-Bissau", + "email": "blevinsrichards@scentric.com", + "phone": "(880) 569-2358", + "color": "rgb(141,69,176)" + }, + { + "index": 373, + "name": "Larsen Petersen", + "first": "Kayla", + "last": "Wolf", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ssiskind/73.jpg", + "expanded": false, + "guid": "a7e99e07-e0c7-499a-a66b-a5b931143a55", + "integer": 25, + "date": "Fri Nov 24 1995 21:45:58 GMT-0800 (PST)", + "shortText": "elit exercitation", + "mediumText": "Minim in laboris culpa cupidatat ea nostrud sunt id dolore officia ea ipsum sit.", + "longText": "Id amet fugiat voluptate labore ea. Velit fugiat qui magna cillum ullamco duis eu qui pariatur. Do laboris irure nulla id. Minim enim commodo non ut sint. Consequat ut in consequat laborum pariatur commodo consectetur irure.\r\nDolor in aute mollit anim. Laboris incididunt occaecat ipsum Lorem velit nisi anim sunt consectetur. Occaecat aliquip ex irure adipisicing. Culpa elit dolore deserunt nisi. Laboris quis nulla in incididunt culpa proident culpa Lorem ea. Incididunt eiusmod culpa Lorem in cillum amet eu aute qui anim et qui sunt et.\r\nAmet veniam adipisicing minim minim proident sit commodo reprehenderit. Duis consequat do ex mollit minim consectetur. Nulla cillum enim esse sit commodo ad cupidatat ipsum veniam aliquip sunt. Ut dolore ullamco velit est minim laboris incididunt consequat.\r\nVoluptate excepteur Lorem ut id minim incididunt quis proident cupidatat consequat sunt magna dolor. Nostrud aliqua laborum exercitation dolor Lorem. Magna adipisicing cupidatat anim reprehenderit mollit aliquip esse nisi magna est. Laboris mollit consectetur ut tempor minim excepteur fugiat do consectetur tempor. Enim fugiat tempor labore occaecat elit est minim. Enim ex quis pariatur est eiusmod.\r\nDo velit nisi enim adipisicing qui consectetur reprehenderit aute occaecat exercitation consectetur. Cupidatat proident aute sit aliqua cupidatat velit adipisicing occaecat eu sint et proident ad quis. Qui laboris dolore id proident mollit labore aliqua sint aliquip. Minim reprehenderit consequat est voluptate proident irure aliqua reprehenderit do nisi. Nulla culpa culpa eu ea laborum minim ad culpa Lorem enim. Aliqua officia ut id et laboris quis eiusmod ex consequat aliquip voluptate.\r\n", + "address": "4 Sunnyside Avenue", + "city": "Jacksonwald", + "state": "Maryland", + "zip": 86841, + "country": "Cameroon", + "email": "kaylawolf@scentric.com", + "phone": "(905) 565-3468", + "color": "rgb(60,235,69)" + }, + { + "index": 374, + "name": "Holt Oconnor", + "first": "Newman", + "last": "Skinner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_purplebunny/73.jpg", + "expanded": false, + "guid": "b20aa0b1-320a-4487-8af0-78e7cbf30443", + "integer": 29, + "date": "Sun Apr 26 1981 19:50:41 GMT-0700 (PDT)", + "shortText": "non duis elit", + "mediumText": "Esse fugiat ut incididunt fugiat minim enim sit. Aliquip amet incididunt enim quis culpa et ut incididunt eu officia mollit adipisicing ex. Tempor velit magna deserunt voluptate occaecat id laborum occaecat labore id dolore.", + "longText": "Ut deserunt ut minim consequat. Non aute commodo minim proident ex ex id. Consectetur sunt reprehenderit consectetur Lorem eu sit ut reprehenderit aliqua eu occaecat.\r\nEiusmod occaecat dolor mollit adipisicing aute enim do. Aliqua ut sit tempor velit sunt. Minim eiusmod qui aute ea quis dolor et dolor excepteur qui sit eu incididunt qui. Ex id incididunt nisi sint dolore laboris reprehenderit officia velit.\r\nCupidatat dolor nostrud reprehenderit irure aliquip minim minim voluptate in Lorem labore eiusmod proident minim. Commodo reprehenderit eu velit magna fugiat ad cillum in deserunt elit tempor est commodo. Pariatur aliqua dolore proident cillum ex laboris culpa proident irure velit reprehenderit. Irure sit ad ipsum mollit ex. Reprehenderit nulla sit adipisicing excepteur dolore magna ullamco quis laborum minim enim ut.\r\nEnim sit Lorem nulla adipisicing ipsum cillum pariatur cillum aute culpa proident non Lorem dolor. Ea cupidatat anim labore duis nisi et ex id proident tempor. Qui sunt est aliqua in non do ea fugiat. Aute aliqua consectetur sunt culpa nisi sunt. Ipsum nulla quis ad ut elit proident ad culpa deserunt enim elit ea. Ea sint ea ipsum velit esse labore labore est ex aliquip nulla fugiat id dolor. Officia sunt ipsum est officia laborum in ea eiusmod irure laborum ea id magna non.\r\nAliquip nostrud nisi dolor aliquip commodo. Enim ex labore velit anim nisi consectetur excepteur labore reprehenderit. Lorem exercitation ut cillum et magna commodo labore esse nostrud duis Lorem. Cillum incididunt deserunt eu in cupidatat. Veniam cillum culpa voluptate irure cillum sit veniam elit velit labore. Dolore voluptate commodo labore nisi anim esse veniam deserunt sint anim amet velit.\r\n", + "address": "2 Neptune Avenue", + "city": "Croom", + "state": "Massachusetts", + "zip": 45897, + "country": "Niger", + "email": "newmanskinner@scentric.com", + "phone": "(895) 579-2625", + "color": "rgb(213,132,55)" + }, + { + "index": 375, + "name": "Ray Mcdonald", + "first": "Gladys", + "last": "Hamilton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linkthief/73.jpg", + "expanded": false, + "guid": "129213d5-185b-462e-9d98-ec5d7ebbf584", + "integer": 29, + "date": "Fri Oct 24 2008 13:24:33 GMT-0700 (PDT)", + "shortText": "sit in", + "mediumText": "Sit ut sit ut ullamco pariatur.", + "longText": "Nulla veniam officia ipsum cupidatat est sit deserunt officia eiusmod. Ut aliquip mollit sint qui do laborum esse id. Cillum mollit Lorem laboris deserunt quis reprehenderit do deserunt excepteur ullamco cillum. Qui sit consequat velit ipsum elit non officia laborum eiusmod ad aliquip velit. Minim consectetur reprehenderit nisi irure ullamco occaecat ipsum.\r\nEu fugiat do in ad dolore reprehenderit aute ullamco sit non. Incididunt qui esse fugiat nisi excepteur eiusmod mollit non deserunt qui sunt do. Velit deserunt ex culpa sunt ipsum elit veniam aute. Dolor occaecat officia eiusmod sint sint non aute consectetur quis ea.\r\n", + "address": "4 Lacon Court", + "city": "Iberia", + "state": "Oklahoma", + "zip": 71131, + "country": "Malta", + "email": "gladyshamilton@scentric.com", + "phone": "(966) 483-3351", + "color": "rgb(155,104,148)" + }, + { + "index": 376, + "name": "Clay Langley", + "first": "Burris", + "last": "Randall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/73.jpg", + "expanded": false, + "guid": "51f80793-c017-41ad-9079-d752d4d47d9e", + "integer": 53, + "date": "Mon Jun 07 1982 18:22:42 GMT-0700 (PDT)", + "shortText": "elit", + "mediumText": "Irure in cillum eiusmod do laboris. Magna sit consectetur elit quis dolore quis ea esse. Minim velit adipisicing consequat mollit veniam. Minim eiusmod laboris nisi mollit ea labore commodo ipsum et ullamco duis.", + "longText": "Sit est fugiat sit nostrud laboris veniam aliqua enim aliqua eu ex cillum. Incididunt occaecat minim consectetur duis eiusmod. Pariatur laborum nostrud dolore minim excepteur sunt pariatur aute. Do anim quis ad enim est sint minim dolore laboris in fugiat cupidatat mollit pariatur. Ipsum est dolor aliqua aute. Sunt proident duis pariatur qui veniam sunt. Ea anim consequat nostrud reprehenderit ea ad non.\r\n", + "address": "4 McClancy Place", + "city": "Nash", + "state": "Ohio", + "zip": 18742, + "country": "Antigua and Barbuda", + "email": "burrisrandall@scentric.com", + "phone": "(844) 495-2795", + "color": "rgb(161,56,157)" + }, + { + "index": 377, + "name": "Whitaker Duffy", + "first": "Consuelo", + "last": "Vaughn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/labibjaffar/73.jpg", + "expanded": false, + "guid": "d79e9e47-4d77-47c0-9b13-a19147d76339", + "integer": 69, + "date": "Tue Apr 18 1989 16:24:01 GMT-0700 (PDT)", + "shortText": "adipisicing", + "mediumText": "Cillum mollit amet fugiat aliquip proident. Cillum veniam ut do anim eiusmod officia laborum enim voluptate commodo.", + "longText": "Aliquip labore non amet cillum ipsum ex non commodo enim eiusmod ea. Est non do nulla laborum minim nostrud esse exercitation fugiat eiusmod. Aliquip labore dolor ad duis velit nisi exercitation fugiat proident cupidatat Lorem elit ullamco dolore. Cupidatat enim sunt id veniam exercitation voluptate consectetur pariatur. Irure labore tempor sint adipisicing nisi anim. Proident officia minim amet sunt enim in officia dolor voluptate ea magna ullamco.\r\n", + "address": "4 Senator Street", + "city": "Emerald", + "state": "Nevada", + "zip": 95049, + "country": "Kazakhstan", + "email": "consuelovaughn@scentric.com", + "phone": "(820) 453-3820", + "color": "rgb(211,124,127)" + }, + { + "index": 378, + "name": "Millicent Brewer", + "first": "Carpenter", + "last": "French", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tnrzdmr/73.jpg", + "expanded": false, + "guid": "fc81e8c8-56bf-4cc7-9a99-bc5e5336cc44", + "integer": 10, + "date": "Mon Dec 20 2004 03:29:39 GMT-0800 (PST)", + "shortText": "cillum elit dolore id", + "mediumText": "Consectetur laboris velit culpa nisi est nostrud ea laboris et. Voluptate incididunt qui cillum velit occaecat nisi deserunt. Ut nisi do veniam sunt deserunt adipisicing nostrud nostrud eu nulla consectetur amet elit.", + "longText": "Enim aliquip ipsum voluptate ut adipisicing anim dolor. Est est nisi est ex fugiat labore aute proident nisi amet deserunt anim nisi dolore. Eiusmod elit Lorem et officia cillum in proident cillum sint do. Laboris dolore ad cupidatat anim et eu.\r\nIn aute eiusmod esse commodo officia culpa Lorem quis laboris. Ipsum pariatur pariatur dolore amet ipsum amet ex laboris laboris. Magna elit sunt Lorem magna ea laborum non voluptate eu velit irure id excepteur. Adipisicing non pariatur culpa sit tempor ea anim officia aute. Magna eu cupidatat sint nostrud veniam sunt irure non. Lorem mollit eiusmod ea magna qui consectetur quis aliqua nulla nulla. Ipsum deserunt cupidatat irure fugiat et commodo ut.\r\nVelit anim eiusmod Lorem incididunt id deserunt mollit voluptate. Commodo id excepteur id occaecat sit. Qui amet proident ipsum est aute culpa et mollit et nulla occaecat minim minim. Magna ut enim exercitation laborum deserunt occaecat enim sunt veniam aliquip exercitation elit et. Nulla enim tempor fugiat eiusmod qui laborum ad est minim incididunt reprehenderit voluptate ad reprehenderit. Officia exercitation reprehenderit aliquip in id Lorem laboris laboris ipsum laborum minim ullamco eiusmod.\r\nConsectetur consequat irure consectetur reprehenderit aliqua quis ea fugiat ullamco reprehenderit. Fugiat fugiat elit voluptate in aliqua qui excepteur duis ipsum veniam occaecat eu sint amet. Aliquip deserunt ea ipsum ea pariatur in magna dolore voluptate.\r\nEnim eiusmod laboris officia exercitation irure laboris sit adipisicing non tempor nostrud officia. Quis ut esse deserunt qui laborum do velit eu amet dolore. Consequat adipisicing nulla officia ipsum veniam eiusmod. Occaecat deserunt veniam tempor sint labore nisi irure. Ullamco ad eu pariatur commodo aute ea cupidatat et consequat do commodo tempor. Adipisicing eiusmod culpa nostrud commodo adipisicing irure dolore aliquip labore. Ullamco commodo mollit consequat incididunt ut in officia occaecat voluptate.\r\n", + "address": "3 Drew Street", + "city": "Enetai", + "state": "Montana", + "zip": 76072, + "country": "Bahrain", + "email": "carpenterfrench@scentric.com", + "phone": "(981) 464-3639", + "color": "rgb(116,120,98)" + }, + { + "index": 379, + "name": "Blanchard Solis", + "first": "Kristie", + "last": "Cabrera", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyjantz/73.jpg", + "expanded": false, + "guid": "c2c84ffa-4a75-48e1-998f-924681ab4240", + "integer": 1, + "date": "Sat Jul 09 1988 08:58:08 GMT-0700 (PDT)", + "shortText": "excepteur velit quis dolore amet", + "mediumText": "Culpa magna fugiat est consequat deserunt elit eiusmod ullamco. Non esse consectetur id amet excepteur magna culpa mollit ea veniam elit.", + "longText": "Nulla et laboris qui aute commodo sunt enim occaecat ad eu. Enim eu consequat in id irure minim. Id pariatur commodo duis ea aute deserunt. Cillum consequat ea nostrud cillum proident.\r\n", + "address": "3 Aitken Place", + "city": "Germanton", + "state": "California", + "zip": 10214, + "country": "India", + "email": "kristiecabrera@scentric.com", + "phone": "(870) 486-2499", + "color": "rgb(60,117,146)" + }, + { + "index": 380, + "name": "Armstrong Leon", + "first": "Wolfe", + "last": "Hansen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ibrahemaq/73.jpg", + "expanded": false, + "guid": "ae0fcdb0-49fc-4ff8-85f2-7414f67b99f6", + "integer": 60, + "date": "Fri Feb 27 1970 07:01:10 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Laboris adipisicing consectetur qui do nostrud occaecat in consectetur sit. Esse nisi commodo voluptate magna eu nisi fugiat amet nostrud.", + "longText": "Sunt ut labore sint sint labore dolor ullamco cupidatat velit tempor ea cillum. Veniam sit ex dolor sint irure ut. Nulla culpa ullamco ut ullamco tempor consectetur pariatur adipisicing reprehenderit laborum nostrud sint.\r\nEnim nisi aliquip pariatur non laboris ea. Aute aute pariatur commodo tempor sint pariatur quis ad ea pariatur Lorem cupidatat aute consectetur. Laboris ad laboris in cillum proident nostrud mollit consectetur irure nisi magna. Dolor nisi amet anim esse voluptate ipsum minim officia ut ex laboris cillum sunt elit. Tempor quis ex ullamco pariatur officia. Ad excepteur enim ea laborum id officia aliquip cillum est. Do ut labore aliquip dolor sit commodo.\r\nMinim excepteur esse esse enim proident eiusmod reprehenderit proident qui amet. Lorem culpa proident reprehenderit officia tempor magna sunt deserunt qui velit voluptate sunt. Ad ex nulla dolore duis veniam exercitation enim dolore excepteur consequat laborum officia ea fugiat. Et proident eiusmod incididunt quis do fugiat consectetur consectetur esse culpa magna magna.\r\nIn excepteur eu esse duis et excepteur. Qui incididunt eu dolore tempor pariatur occaecat. Dolor ex voluptate ut incididunt est mollit mollit aliqua Lorem sunt est irure ullamco in. Id culpa amet voluptate do aliquip laborum sit duis anim occaecat ea adipisicing do.\r\n", + "address": "4 Kent Street", + "city": "Carlton", + "state": "Marshall Islands", + "zip": 34631, + "country": "Qatar", + "email": "wolfehansen@scentric.com", + "phone": "(834) 587-3684", + "color": "rgb(135,161,252)" + }, + { + "index": 381, + "name": "Kerry Emerson", + "first": "Hurst", + "last": "Gilliam", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/croakx/73.jpg", + "expanded": false, + "guid": "454852cf-301c-42cc-88a5-fef2dce8ac2d", + "integer": 54, + "date": "Mon Jan 15 1990 07:32:08 GMT-0800 (PST)", + "shortText": "amet ullamco", + "mediumText": "Sunt tempor irure nulla do esse aliqua. Velit fugiat incididunt aliqua voluptate nisi qui ut.", + "longText": "Do labore aute veniam voluptate reprehenderit Lorem cupidatat excepteur est cupidatat adipisicing irure. Veniam consectetur fugiat esse et. Excepteur magna dolore duis ea occaecat. Voluptate occaecat id occaecat velit nostrud.\r\nFugiat sint eiusmod reprehenderit magna consequat esse. Dolor sint officia aliquip occaecat occaecat qui ipsum magna cupidatat excepteur ad et est laborum. Ut consectetur ex proident elit.\r\nAdipisicing incididunt excepteur ea labore proident proident et id in reprehenderit ut occaecat et. Et aliquip incididunt enim ea enim ea minim ut eiusmod. Velit mollit sunt voluptate laboris aliquip incididunt. Duis laborum do adipisicing non tempor nisi minim do aliquip laboris irure tempor ad dolore. Aliqua amet adipisicing eu Lorem esse fugiat fugiat velit.\r\nSunt irure ex reprehenderit nostrud minim magna. Commodo nostrud mollit pariatur reprehenderit consequat occaecat aliqua. Reprehenderit id non magna nisi amet sunt incididunt deserunt dolor quis cupidatat adipisicing voluptate sunt. Tempor proident magna amet culpa est est. Mollit sint eiusmod reprehenderit est. Lorem do culpa ut enim quis enim cillum elit ullamco deserunt fugiat commodo dolor.\r\n", + "address": "3 Vandam Street", + "city": "Carlos", + "state": "Indiana", + "zip": 18552, + "country": "Vatican City State (Holy See)", + "email": "hurstgilliam@scentric.com", + "phone": "(883) 509-3820", + "color": "rgb(92,147,218)" + }, + { + "index": 382, + "name": "Rosanna Mercer", + "first": "Jeannie", + "last": "Harrington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_dukex/73.jpg", + "expanded": false, + "guid": "81b02f40-06df-4e1f-bb59-400a488d75c1", + "integer": 9, + "date": "Thu Apr 29 1982 09:20:09 GMT-0700 (PDT)", + "shortText": "velit exercitation laborum excepteur nulla", + "mediumText": "Lorem minim consequat sunt eu commodo. Irure occaecat do irure ex dolore. Dolore consequat occaecat aliqua aliqua do incididunt consectetur in et eiusmod. Laboris incididunt esse magna aliquip excepteur sint quis ipsum consectetur aute labore. Et non consequat reprehenderit ipsum incididunt nisi do.", + "longText": "Dolor esse nostrud in culpa. Elit cillum cupidatat cillum aute nulla labore sint aliquip enim exercitation. Nulla do tempor labore sit adipisicing. Ex sint deserunt in pariatur veniam. Ea do do aliqua cillum id mollit duis elit aute eiusmod pariatur cupidatat duis anim.\r\nCulpa officia ea amet non non nulla occaecat quis ut Lorem eiusmod velit ad ut. Ex deserunt ut pariatur excepteur fugiat dolor ex aute elit officia amet consectetur consectetur excepteur. Dolor culpa pariatur proident anim reprehenderit velit laboris velit aliquip.\r\nSit velit amet laboris incididunt qui excepteur irure excepteur. Nulla adipisicing pariatur enim nisi. Dolore ea veniam adipisicing mollit eiusmod. Eu sit ea in consequat proident ex magna veniam pariatur quis aute aliquip sint. Ullamco irure nisi anim tempor.\r\n", + "address": "3 Brooklyn Road", + "city": "Northchase", + "state": "Tennessee", + "zip": 58954, + "country": "Malaysia", + "email": "jeannieharrington@scentric.com", + "phone": "(869) 440-3471", + "color": "rgb(54,179,184)" + }, + { + "index": 383, + "name": "Hudson Gill", + "first": "Erma", + "last": "Medina", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gregsqueeb/73.jpg", + "expanded": false, + "guid": "5cc52dab-f9b6-4d23-9718-12faaca42aaa", + "integer": 29, + "date": "Fri Nov 07 1975 23:03:48 GMT-0800 (PST)", + "shortText": "elit consequat", + "mediumText": "Exercitation aliqua fugiat Lorem fugiat amet est elit. Incididunt voluptate sunt sint ut veniam. Non velit deserunt duis est excepteur consectetur excepteur commodo non ex consequat. Non et ullamco ipsum eiusmod.", + "longText": "Sint ea duis commodo sunt elit ut nulla. Tempor consectetur id aliqua voluptate. Anim sint occaecat nisi eu commodo nisi magna deserunt commodo fugiat quis aliqua.\r\nEiusmod aliquip incididunt dolore elit et fugiat in ex. Qui cupidatat duis tempor amet aute. Nulla et cillum culpa irure consequat sit exercitation ex quis ex. Qui sit ipsum non laboris esse cupidatat eu excepteur. Incididunt tempor sit in fugiat tempor excepteur culpa veniam in incididunt reprehenderit. Ad quis enim cillum quis anim.\r\n", + "address": "2 Decatur Street", + "city": "Hardyville", + "state": "Palau", + "zip": 41443, + "country": "Belize", + "email": "ermamedina@scentric.com", + "phone": "(806) 595-3481", + "color": "rgb(144,140,116)" + }, + { + "index": 384, + "name": "Dominique Valenzuela", + "first": "Stacey", + "last": "Foreman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/csmnng/73.jpg", + "expanded": false, + "guid": "11147a9a-0058-436d-96c3-f7ae0639677c", + "integer": 82, + "date": "Sat Jul 25 1992 11:14:15 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Enim aliqua aute nostrud ad veniam eiusmod Lorem occaecat sit magna aliqua. Ad ut ipsum dolore pariatur officia sunt tempor velit minim ea consequat commodo deserunt cupidatat. Aliqua ad nostrud aliqua officia mollit ut dolor aliqua est mollit elit ad in veniam. Dolor et nostrud elit ea proident dolore excepteur sit adipisicing cillum enim. Reprehenderit mollit do adipisicing excepteur ullamco exercitation culpa ipsum in eu aliqua.", + "longText": "Reprehenderit ullamco esse aute et laborum pariatur consectetur tempor. Consequat eiusmod fugiat commodo incididunt laborum. Et eiusmod cupidatat incididunt dolor cupidatat sint in nisi anim duis sit labore ex occaecat. Excepteur ipsum officia ut qui ad tempor eu ad cillum commodo.\r\nMagna quis nisi nostrud sint et eiusmod laborum laborum ut. In labore labore veniam anim labore laboris reprehenderit aliquip voluptate aute ullamco duis. Aute tempor magna elit elit aute adipisicing est consequat enim occaecat culpa.\r\nIn aliqua adipisicing aliquip do consequat ipsum Lorem. Nisi nulla velit mollit deserunt laboris elit magna ullamco sint magna anim ut ullamco. Aliquip commodo qui ipsum tempor amet nostrud sit aliquip qui eiusmod minim deserunt esse. Incididunt adipisicing irure excepteur reprehenderit id officia sit amet reprehenderit reprehenderit nostrud ut. Officia deserunt officia qui magna incididunt non cillum esse cupidatat dolor quis eiusmod. Cillum amet minim dolor ipsum anim officia velit aliqua adipisicing anim mollit. Irure enim laborum ex esse id magna dolore non nulla nisi excepteur ad nulla aute.\r\n", + "address": "3 McDonald Avenue", + "city": "Robbins", + "state": "Virginia", + "zip": 22185, + "country": "Singapore", + "email": "staceyforeman@scentric.com", + "phone": "(829) 412-3655", + "color": "rgb(214,140,189)" + }, + { + "index": 385, + "name": "Dolores Morgan", + "first": "Gaines", + "last": "Mullen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ogmenemre/73.jpg", + "expanded": false, + "guid": "ee76f873-95bb-4f4d-84fd-c7313d26386b", + "integer": 51, + "date": "Mon Feb 22 1999 15:26:58 GMT-0800 (PST)", + "shortText": "officia proident", + "mediumText": "Aliquip proident ad incididunt veniam.", + "longText": "Esse excepteur ex sunt id sit laborum. Ut ea qui esse esse qui aliqua ut ex in. Dolore magna laborum veniam magna non ad eiusmod et eiusmod deserunt tempor occaecat. Eiusmod voluptate ut do non. Deserunt est laborum eu aute deserunt eiusmod amet consectetur elit ullamco laboris elit.\r\nConsectetur aliquip reprehenderit est sunt do est sint ad deserunt dolor est. Pariatur id Lorem nostrud elit proident in nulla anim. Duis sunt veniam fugiat sunt aliquip ea eiusmod consectetur nulla consectetur quis.\r\n", + "address": "4 Village Road", + "city": "Springville", + "state": "Wyoming", + "zip": 48245, + "country": "Trinidad and Tobago", + "email": "gainesmullen@scentric.com", + "phone": "(832) 562-2069", + "color": "rgb(177,196,203)" + }, + { + "index": 386, + "name": "Washington Bates", + "first": "Mccray", + "last": "Davenport", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionutmaxim/73.jpg", + "expanded": false, + "guid": "97224884-727c-4a89-b596-60fbca7914a7", + "integer": 34, + "date": "Thu Nov 13 1980 22:28:43 GMT-0800 (PST)", + "shortText": "enim nostrud", + "mediumText": "Sunt fugiat esse ad sint sint duis ex tempor enim excepteur ullamco. Dolor ipsum occaecat laborum enim. Nisi ex cillum ex culpa laborum proident esse minim incididunt anim est occaecat deserunt cillum. Excepteur aliqua dolore duis do non adipisicing anim excepteur. Sit aliquip ut nisi aliquip labore do officia proident amet esse deserunt laborum sunt veniam.", + "longText": "Aute magna amet irure mollit ex. Deserunt exercitation irure aute eiusmod aute occaecat mollit reprehenderit sit ea esse esse. Laborum cillum Lorem Lorem officia velit minim cillum reprehenderit tempor velit exercitation deserunt ad velit. Irure nulla aliqua ex cupidatat adipisicing cillum amet ex quis deserunt.\r\nVoluptate amet nisi incididunt eiusmod consequat et laboris consequat est voluptate sunt enim. Adipisicing nostrud pariatur aute commodo minim veniam. Anim mollit velit esse cupidatat aliquip exercitation est id est. Cillum incididunt nulla duis non incididunt dolore ipsum est culpa pariatur duis quis.\r\nAd commodo laborum ex voluptate commodo non fugiat ut. Id labore quis aute eiusmod deserunt cupidatat. Consequat irure eu velit aliqua reprehenderit consequat qui labore magna. Sunt ad ad sit irure laboris enim sint do eiusmod Lorem velit cupidatat labore enim. Exercitation veniam sint nulla excepteur id reprehenderit laboris qui et adipisicing. Anim occaecat duis cupidatat dolore labore id duis ad ipsum do.\r\nCulpa fugiat minim cupidatat nisi occaecat reprehenderit sit. Ipsum laboris incididunt tempor irure adipisicing veniam. Nisi laborum cupidatat anim quis fugiat velit ea ad commodo cupidatat. Aliquip esse eu deserunt sint.\r\n", + "address": "4 Lincoln Avenue", + "city": "Deercroft", + "state": "Colorado", + "zip": 53863, + "country": "Namibia", + "email": "mccraydavenport@scentric.com", + "phone": "(970) 600-2028", + "color": "rgb(55,74,60)" + }, + { + "index": 387, + "name": "Estela Dotson", + "first": "Brewer", + "last": "Barnett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teylorfeliz/73.jpg", + "expanded": false, + "guid": "ec7da2db-8a36-430c-bb60-68be4ca38e6f", + "integer": 50, + "date": "Tue Sep 10 1985 22:13:34 GMT-0700 (PDT)", + "shortText": "pariatur do deserunt enim velit", + "mediumText": "Nulla consequat incididunt sint do. Mollit dolor veniam sunt nisi ex consectetur eu excepteur officia culpa.", + "longText": "Veniam proident laboris fugiat id. Ex ut consectetur tempor pariatur duis quis veniam eiusmod amet cupidatat amet enim. Est consectetur exercitation deserunt tempor laboris dolor velit dolore consectetur. Amet anim excepteur sunt sunt ut exercitation minim. Cillum velit aliqua enim magna sunt cillum exercitation esse.\r\nFugiat magna eu nulla anim est voluptate pariatur dolore tempor esse. Nostrud adipisicing laborum ea sint sint aliquip deserunt culpa ipsum sunt. Dolor deserunt ex quis duis dolor sint labore. Et tempor eu cillum est aliqua non. Proident dolore irure est labore duis. Cupidatat ullamco magna excepteur et ex adipisicing ullamco consectetur.\r\n", + "address": "4 Batchelder Street", + "city": "Unionville", + "state": "Utah", + "zip": 19511, + "country": "Paraguay", + "email": "brewerbarnett@scentric.com", + "phone": "(824) 468-3108", + "color": "rgb(251,142,227)" + }, + { + "index": 388, + "name": "Griffith Calhoun", + "first": "Elma", + "last": "Delaney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/73.jpg", + "expanded": false, + "guid": "bcdb801c-da6b-4e33-8b60-cb63d7391110", + "integer": 26, + "date": "Thu Oct 07 2004 12:09:01 GMT-0700 (PDT)", + "shortText": "incididunt commodo est", + "mediumText": "Ullamco aliqua excepteur nisi veniam dolor veniam excepteur aute est. Sit in reprehenderit laborum non laboris incididunt esse quis veniam ex. In sit laboris enim ex mollit. Esse nisi ipsum sit adipisicing velit excepteur reprehenderit pariatur excepteur aute Lorem consequat. Aliquip culpa dolor commodo consectetur ad aute amet eu tempor velit eiusmod.", + "longText": "Do velit in aliqua id eu occaecat duis ex officia amet. Aliquip consectetur fugiat quis labore. Commodo commodo veniam incididunt aute sit in dolore excepteur eiusmod mollit sint nisi laborum incididunt.\r\n", + "address": "3 Willow Street", + "city": "Craig", + "state": "Idaho", + "zip": 23018, + "country": "Macau", + "email": "elmadelaney@scentric.com", + "phone": "(820) 569-3637", + "color": "rgb(73,159,77)" + }, + { + "index": 389, + "name": "Delgado Brennan", + "first": "Mercedes", + "last": "Livingston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/S0ufi4n3/73.jpg", + "expanded": false, + "guid": "f39cc1c7-24fe-4b1d-a1ae-3a5b625510ee", + "integer": 14, + "date": "Wed May 28 2008 07:59:57 GMT-0700 (PDT)", + "shortText": "sint", + "mediumText": "Sit et labore aute exercitation cupidatat deserunt proident proident et ad occaecat. Sint occaecat adipisicing qui eiusmod id enim consectetur dolor qui dolore sunt ullamco. Laboris ex ad ad nostrud nisi laborum est sint occaecat elit. Ut ad anim aliquip voluptate aute eiusmod do minim ad do voluptate ullamco in occaecat. Irure deserunt culpa dolor consectetur eu ad magna officia nostrud ea.", + "longText": "Ex id adipisicing non ipsum sint tempor in anim. Fugiat consequat culpa dolor eu non sint quis velit nulla voluptate. Et commodo laborum laboris anim ut fugiat occaecat sunt pariatur. Commodo adipisicing cillum consectetur proident velit deserunt. Dolore veniam aute ipsum minim velit occaecat. Ut aute laborum quis in mollit. Quis labore sit sint elit deserunt nostrud deserunt elit ex cillum.\r\nElit incididunt cillum ad ullamco nisi eu esse nisi ipsum voluptate magna exercitation nisi sit. Adipisicing mollit dolore magna duis. Aliqua non Lorem voluptate nulla ad id excepteur ullamco magna id magna pariatur ea anim. Officia voluptate laborum reprehenderit consequat.\r\nMagna deserunt consequat dolor elit ullamco. Amet labore tempor esse ipsum excepteur officia ut irure reprehenderit dolor fugiat proident culpa. Enim eu eiusmod do ex sit ut aute sit dolore consequat et laboris labore sint. Elit elit laborum exercitation velit consectetur. Aute esse occaecat in nisi sunt veniam sint sit sunt dolor pariatur consectetur.\r\nConsectetur cupidatat amet id mollit dolore occaecat pariatur in ea proident consectetur. Minim eiusmod nulla proident ut pariatur incididunt ullamco mollit nulla occaecat excepteur fugiat eu. Sint veniam anim nostrud deserunt excepteur id labore aliquip consectetur.\r\n", + "address": "4 Summit Street", + "city": "Chloride", + "state": "Arkansas", + "zip": 87932, + "country": "Mauritania", + "email": "mercedeslivingston@scentric.com", + "phone": "(982) 574-2165", + "color": "rgb(166,233,208)" + }, + { + "index": 390, + "name": "Melanie Gilmore", + "first": "Michael", + "last": "Rodriquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nepdud/73.jpg", + "expanded": false, + "guid": "7505cfd7-3696-48c3-8cb0-20a4ddd83340", + "integer": 30, + "date": "Sun Dec 27 1992 18:33:54 GMT-0800 (PST)", + "shortText": "cupidatat est in excepteur dolor", + "mediumText": "Consectetur est Lorem do dolore reprehenderit irure. Culpa et aliquip nulla pariatur aute sit aliqua incididunt enim. Elit nostrud excepteur nulla dolor aute ad sunt laboris sint reprehenderit est do. Irure irure reprehenderit adipisicing amet fugiat sunt ullamco nisi laborum non ad.", + "longText": "Voluptate officia eu dolore ullamco laborum enim id et adipisicing aute reprehenderit cillum. Incididunt et deserunt mollit elit incididunt qui dolore quis. Consectetur magna minim irure culpa sint tempor aliquip proident cillum elit velit. Elit pariatur aliquip cillum id enim.\r\n", + "address": "2 Havens Place", + "city": "Nettie", + "state": "Delaware", + "zip": 89009, + "country": "Ghana", + "email": "michaelrodriquez@scentric.com", + "phone": "(870) 537-3435", + "color": "rgb(69,106,81)" + }, + { + "index": 391, + "name": "Hamilton Sanford", + "first": "Quinn", + "last": "Deleon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/amir_hooseini/73.jpg", + "expanded": false, + "guid": "f4a9b5c2-7e54-4d86-ac2b-dd1367a2ddb7", + "integer": 84, + "date": "Mon Feb 27 2006 05:53:41 GMT-0800 (PST)", + "shortText": "consequat cupidatat dolore veniam", + "mediumText": "Do id aliquip esse Lorem anim mollit est velit laborum deserunt.", + "longText": "Quis commodo esse aute qui ea anim ex Lorem duis culpa ipsum. Nostrud sint et anim Lorem officia sit dolor ipsum voluptate fugiat proident incididunt. Deserunt magna eu aute aliquip culpa exercitation. Voluptate et sit non dolor reprehenderit non proident enim qui. Ea do labore nisi commodo deserunt qui esse incididunt mollit velit esse fugiat officia.\r\nVoluptate dolor Lorem cillum commodo esse adipisicing veniam est pariatur esse aliqua. Aliquip commodo tempor fugiat ea quis deserunt sint nostrud minim. Consequat occaecat reprehenderit deserunt nisi irure consectetur et veniam esse exercitation dolore quis enim. Lorem deserunt anim ut occaecat culpa. Magna reprehenderit quis sunt deserunt ipsum.\r\nLaboris ut labore aliqua ut in anim sint. Ex fugiat duis elit ullamco veniam excepteur laboris. Aliqua dolore consequat excepteur incididunt nisi laboris irure et adipisicing aliquip Lorem fugiat dolor. Irure magna do cupidatat qui sint cupidatat qui commodo aute nostrud incididunt.\r\nPariatur minim proident excepteur ad pariatur mollit ipsum. Id eu elit deserunt elit cupidatat duis cillum proident do voluptate commodo aliqua. Tempor deserunt eiusmod commodo officia est enim non fugiat excepteur. Laborum exercitation Lorem voluptate sit est esse laboris ea sunt nostrud ipsum. Elit nostrud exercitation ad consequat ipsum velit velit fugiat excepteur consequat exercitation qui. Fugiat ex aliqua officia velit occaecat sint dolore. Excepteur cupidatat sit dolor dolore et eu.\r\nQui laboris aute et exercitation elit sint pariatur ea nulla Lorem do laboris ipsum. Fugiat nostrud proident laboris laborum adipisicing. Eu consectetur in ad tempor nisi qui do ea Lorem id labore pariatur anim officia. Cillum commodo est ex commodo nostrud elit consequat est dolore enim minim cillum. Dolore tempor dolor irure cupidatat eiusmod magna sit pariatur occaecat. Consequat non sit pariatur consequat nulla dolore adipisicing.\r\n", + "address": "4 Gerald Court", + "city": "Wanship", + "state": "Federated States Of Micronesia", + "zip": 83910, + "country": "Moldova", + "email": "quinndeleon@scentric.com", + "phone": "(843) 402-3938", + "color": "rgb(178,174,101)" + }, + { + "index": 392, + "name": "Williams Wiggins", + "first": "Brooke", + "last": "Pitts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kokikillara/73.jpg", + "expanded": false, + "guid": "4ed6c0c9-de4f-460e-807c-24402159047d", + "integer": 8, + "date": "Mon May 03 1976 22:14:52 GMT-0700 (PDT)", + "shortText": "velit elit", + "mediumText": "Voluptate ea officia laborum exercitation ullamco veniam aliquip mollit duis dolor eu et. Veniam exercitation fugiat aute ipsum cupidatat. Mollit ad id irure enim adipisicing. Ullamco aliqua voluptate laborum non commodo pariatur aliquip.", + "longText": "Dolor fugiat aliqua aliqua Lorem tempor proident elit cillum exercitation. Voluptate ipsum Lorem pariatur fugiat mollit exercitation occaecat consequat laborum enim Lorem. Elit exercitation tempor eu sint nostrud aliquip aliquip enim in. Anim incididunt ad laboris deserunt duis sit ut anim esse ea dolore ipsum nostrud. Id pariatur velit velit pariatur elit sunt aliqua excepteur. Enim commodo amet sunt id mollit adipisicing quis sunt incididunt aliqua eiusmod nostrud.\r\nOfficia id sunt nulla adipisicing laborum. Laborum laborum eiusmod velit commodo non labore eu. Non nostrud sint do Lorem. Excepteur ipsum est esse minim ullamco reprehenderit quis Lorem sit veniam magna cupidatat laboris. Incididunt est in officia qui sit sit dolore. Aute voluptate irure commodo ad mollit elit amet consequat elit cupidatat consectetur tempor.\r\nOccaecat Lorem aliquip amet sint enim. Ullamco sunt quis commodo cupidatat voluptate ea. Est sint commodo exercitation sunt duis duis mollit reprehenderit. Incididunt consectetur eu et esse et pariatur velit laborum tempor. Nulla ea ea est pariatur et non.\r\nIn irure pariatur non commodo est cillum ut esse. Amet aliquip proident culpa Lorem velit et nostrud amet. Esse Lorem anim nulla dolore cillum labore do irure est aliqua labore sint magna non. Quis consequat nulla ex deserunt ex. Eiusmod commodo magna voluptate qui ex. Ex anim exercitation deserunt duis proident ea voluptate non enim.\r\nAd fugiat dolor officia cupidatat aute dolor dolor consectetur sit. Aliqua magna occaecat nulla minim ea aute fugiat sint irure aliquip nostrud dolor. Amet et non duis fugiat enim excepteur ipsum nisi. Ex amet dolore ex reprehenderit elit consectetur sunt sint laboris et. Ad do consequat aliqua adipisicing tempor pariatur non excepteur nisi ipsum elit cupidatat. Aliqua exercitation pariatur ullamco sint exercitation irure cupidatat aliquip mollit elit veniam ex reprehenderit.\r\n", + "address": "3 Portal Street", + "city": "Berwind", + "state": "Guam", + "zip": 84129, + "country": "Costa Rica", + "email": "brookepitts@scentric.com", + "phone": "(951) 474-2640", + "color": "rgb(210,98,96)" + }, + { + "index": 393, + "name": "Lucia Maynard", + "first": "Moore", + "last": "Bass", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/christianoliff/73.jpg", + "expanded": false, + "guid": "044b1bae-19f0-48c3-a675-b3840c1f0350", + "integer": 13, + "date": "Sun Jun 29 2008 08:11:07 GMT-0700 (PDT)", + "shortText": "eiusmod", + "mediumText": "Est ullamco aute deserunt minim duis sunt dolore cillum tempor exercitation sit. Laboris voluptate labore sit eu adipisicing in occaecat excepteur elit ipsum in eu. Eiusmod est minim veniam do excepteur laborum amet aute. Laboris tempor deserunt cillum ipsum.", + "longText": "Laboris ad excepteur eiusmod non dolor sunt in proident velit. Incididunt laborum eiusmod enim pariatur exercitation ut. Laboris culpa fugiat consequat qui. Do aliquip incididunt et labore minim ex mollit. Occaecat id duis velit velit occaecat laborum ex officia. Veniam irure fugiat cillum dolore nostrud. Amet ea consectetur incididunt ut minim.\r\nAdipisicing quis consectetur consectetur adipisicing eiusmod excepteur ullamco nostrud sit tempor labore ad. Ea incididunt commodo occaecat qui ea veniam nulla sunt ex. Non aliquip incididunt aute cillum magna nisi. Aliqua culpa deserunt nulla ad fugiat. Enim non consectetur pariatur voluptate enim qui consectetur aliquip irure nisi. Minim eu commodo aliquip laboris elit sint quis.\r\nMagna commodo laborum fugiat commodo voluptate quis. Adipisicing laborum in anim exercitation proident. Magna est cillum voluptate consectetur reprehenderit. Velit veniam laboris fugiat anim est esse aliquip. Cupidatat aliquip excepteur voluptate laboris.\r\nOfficia anim laborum anim velit adipisicing et. Velit magna quis culpa ipsum. Id et culpa eu dolore ullamco aute ut cupidatat pariatur commodo anim nostrud qui sit. Qui nulla veniam quis elit sint et exercitation exercitation aute cupidatat nostrud. Aliquip fugiat aute nostrud magna amet dolore adipisicing elit ipsum sint labore nisi.\r\nPariatur aute voluptate veniam eu eu id tempor exercitation ipsum eu cillum velit. Elit fugiat commodo officia in. Laboris do sunt excepteur ut deserunt aliquip. Adipisicing commodo ipsum quis proident voluptate reprehenderit sint ea magna ipsum anim est occaecat. Aliqua do eu elit aute dolor culpa nisi cupidatat incididunt. Id eu veniam adipisicing veniam qui sint velit voluptate. Laborum amet ea minim minim nulla sint sit labore dolor pariatur.\r\n", + "address": "4 Newton Street", + "city": "Harviell", + "state": "Pennsylvania", + "zip": 25300, + "country": "El Salvador", + "email": "moorebass@scentric.com", + "phone": "(913) 577-3866", + "color": "rgb(103,233,105)" + }, + { + "index": 394, + "name": "Walker Workman", + "first": "Howard", + "last": "Fleming", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andrey_maxim/73.jpg", + "expanded": false, + "guid": "ec870357-2a02-4dff-b9c5-a4574e39ddcf", + "integer": 73, + "date": "Sun Jun 02 1974 13:38:40 GMT-0700 (PDT)", + "shortText": "officia dolore consequat", + "mediumText": "Aliqua ex nisi adipisicing tempor elit pariatur voluptate cillum dolore duis excepteur commodo do eiusmod. Exercitation nulla sint officia voluptate ut ipsum esse fugiat quis sint reprehenderit irure. Voluptate voluptate deserunt sit aliqua Lorem et labore. Magna qui eu nisi do cupidatat eu ea. Nulla sint eiusmod in ipsum est dolor qui.", + "longText": "Magna elit sunt qui ut dolor et. Enim adipisicing aliquip dolore ex consectetur dolor ut. Ex culpa fugiat id sunt sunt incididunt Lorem adipisicing nostrud magna dolore mollit enim est.\r\nPariatur ea magna anim sit incididunt veniam occaecat pariatur ullamco nulla. Sit commodo cupidatat elit commodo eu do officia nostrud. Eu consequat ipsum amet eiusmod elit commodo ut enim ex.\r\nIrure ipsum ipsum ullamco magna deserunt pariatur in consectetur. Mollit nisi mollit reprehenderit et laboris in esse irure minim. Ipsum culpa nostrud nisi fugiat sint culpa consequat incididunt nostrud culpa occaecat aliquip sit. Commodo cupidatat nulla qui cupidatat sint anim. Ad quis cillum magna adipisicing ad qui ex fugiat velit velit amet aliqua. Ea laboris laborum dolor amet sunt. Fugiat sit dolor ipsum ut.\r\nElit labore fugiat commodo reprehenderit nostrud culpa qui cupidatat deserunt eiusmod tempor est excepteur laboris. Aliqua aliqua elit occaecat magna ullamco nisi commodo enim. Reprehenderit et mollit mollit aliqua ex tempor sint minim magna eu. Voluptate ullamco voluptate excepteur ullamco ea consectetur non do. Officia deserunt duis ullamco Lorem officia esse. Consequat et quis cupidatat officia.\r\nDo esse reprehenderit incididunt quis voluptate sunt eu amet ad incididunt. Do occaecat amet in culpa anim id. Fugiat est fugiat Lorem enim adipisicing do qui officia. Proident elit labore consectetur Lorem eiusmod cupidatat mollit sit fugiat magna ex commodo minim. Ea nisi amet non enim culpa veniam aliqua ad labore.\r\n", + "address": "3 Exeter Street", + "city": "Wakulla", + "state": "New Hampshire", + "zip": 85378, + "country": "Oman", + "email": "howardfleming@scentric.com", + "phone": "(844) 545-2412", + "color": "rgb(126,110,68)" + }, + { + "index": 395, + "name": "Harper Chase", + "first": "Glenda", + "last": "Burns", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/muringa/73.jpg", + "expanded": false, + "guid": "d6866e9e-6cc1-4021-9e8e-c0657bd2f64c", + "integer": 36, + "date": "Sun Dec 12 1971 00:30:23 GMT-0800 (PST)", + "shortText": "ad aliquip consequat", + "mediumText": "Consectetur exercitation commodo ut labore incididunt velit laborum labore velit aute. Aliquip velit id enim sit. Nostrud magna est veniam excepteur commodo irure. Sunt ex sint irure nisi anim. Nisi dolore veniam tempor cupidatat irure incididunt culpa veniam sunt aute.", + "longText": "Duis enim ex officia reprehenderit consectetur esse. Adipisicing ea velit labore officia sint nisi do anim ex incididunt irure. Laborum amet fugiat laboris proident. Ex duis dolor dolor nisi Lorem do qui sunt incididunt exercitation nulla do deserunt pariatur.\r\nOfficia et dolor incididunt elit non quis. Deserunt ad esse enim tempor aliquip officia excepteur magna esse deserunt. Excepteur dolore veniam commodo non quis. Do Lorem ex est exercitation sit consectetur exercitation duis duis laborum. Aliquip elit ea nulla elit quis deserunt eu adipisicing id pariatur non occaecat. Irure dolore nulla nisi irure qui tempor quis ut minim.\r\nAnim officia et laboris culpa velit consectetur do voluptate ad voluptate Lorem. Nostrud fugiat ut ad amet est elit duis consequat cupidatat. Ad minim cillum dolore incididunt sunt enim deserunt. Dolor aliqua qui nulla aliquip enim magna incididunt. Minim enim occaecat dolor in aliqua. Laborum eu quis culpa in voluptate commodo culpa sint dolor Lorem duis elit. Incididunt sint et enim sit laboris pariatur laboris eu sit eu anim.\r\nEa elit minim tempor ut id ut ea et tempor aute magna eiusmod adipisicing exercitation. Culpa elit esse tempor proident sint duis consequat. Sint ullamco ex veniam aliquip aute labore anim adipisicing est magna velit nisi. Ipsum dolore labore proident id irure qui velit anim. Incididunt Lorem nisi ut amet in enim laboris labore proident fugiat officia irure. Occaecat dolor Lorem qui nulla. Aliqua officia ipsum et cillum aliquip adipisicing ex.\r\nEu incididunt deserunt cupidatat ex laborum in voluptate excepteur ea consectetur est incididunt. Occaecat qui aliqua consequat nostrud in ex labore dolor eiusmod. Enim duis eu laboris consectetur culpa aliquip commodo. Elit ullamco reprehenderit consequat proident et ex veniam ea consectetur aute minim. Voluptate ut in laborum exercitation laboris irure culpa esse deserunt adipisicing sunt.\r\n", + "address": "4 Hinsdale Street", + "city": "Belva", + "state": "North Dakota", + "zip": 11729, + "country": "Belgium", + "email": "glendaburns@scentric.com", + "phone": "(856) 471-3316", + "color": "rgb(157,180,79)" + }, + { + "index": 396, + "name": "Lynch Dillard", + "first": "Marta", + "last": "Trujillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmedelgabri/73.jpg", + "expanded": false, + "guid": "66702f6f-a19b-4e41-8b5c-0df08d432b1b", + "integer": 55, + "date": "Mon Nov 21 1983 17:47:19 GMT-0800 (PST)", + "shortText": "culpa qui ullamco", + "mediumText": "Lorem dolor esse veniam minim culpa aliquip dolore occaecat Lorem quis.", + "longText": "Ea est sunt et duis dolor irure voluptate. Nostrud esse do irure exercitation officia magna proident irure deserunt magna. Dolore minim exercitation qui exercitation proident. Excepteur ea occaecat irure qui ea et duis minim voluptate id culpa enim ad dolor. Enim anim aliquip sint aliqua veniam Lorem id.\r\n", + "address": "3 Eckford Street", + "city": "Savage", + "state": "Northern Mariana Islands", + "zip": 46157, + "country": "Kyrgyzstan", + "email": "martatrujillo@scentric.com", + "phone": "(867) 559-3000", + "color": "rgb(184,176,151)" + }, + { + "index": 397, + "name": "Blake Wilkins", + "first": "Lara", + "last": "Gentry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bobbytwoshoes/73.jpg", + "expanded": false, + "guid": "e4e03f54-413f-4638-be7c-12175f24c458", + "integer": 5, + "date": "Sun Oct 10 1971 04:19:14 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Ullamco ut ex tempor est irure proident.", + "longText": "Labore id reprehenderit elit velit adipisicing amet voluptate exercitation adipisicing. Eiusmod anim officia sint Lorem ullamco cupidatat. Consectetur culpa nostrud elit nisi aute velit amet Lorem esse laborum sint exercitation.\r\nNon labore proident adipisicing duis veniam. Mollit ad irure Lorem minim ullamco elit aliqua occaecat excepteur. Veniam elit eiusmod quis minim enim ad Lorem est ut nulla voluptate amet Lorem ad. In dolore irure magna elit officia. Non velit anim Lorem eiusmod fugiat nostrud in reprehenderit officia commodo culpa ea sunt. Enim ut exercitation deserunt laborum laboris fugiat pariatur incididunt officia deserunt consectetur Lorem. Dolor nisi culpa dolor anim id laborum aute qui elit est quis occaecat esse id.\r\nEu ullamco aliquip enim qui cillum non anim reprehenderit. Nulla et tempor enim nulla consectetur. Reprehenderit nulla velit sunt consectetur exercitation consequat cupidatat. Anim dolor qui enim ex do labore dolore commodo voluptate ut laborum. Ut aute sint adipisicing reprehenderit est aliquip laborum esse dolore commodo aute excepteur fugiat est. Ex cupidatat commodo sit mollit veniam sint ex magna adipisicing occaecat laborum occaecat.\r\n", + "address": "4 Schenck Place", + "city": "Greenwich", + "state": "South Dakota", + "zip": 61210, + "country": "Swaziland", + "email": "laragentry@scentric.com", + "phone": "(909) 447-3849", + "color": "rgb(209,112,163)" + }, + { + "index": 398, + "name": "Lawson Peck", + "first": "Mullen", + "last": "Keller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/milovanovicdu/73.jpg", + "expanded": false, + "guid": "27329629-6fcc-48e1-a7b9-e3158f75ea79", + "integer": 2, + "date": "Wed Jul 31 1974 10:57:47 GMT-0700 (PDT)", + "shortText": "ut", + "mediumText": "Irure ut velit ea nisi enim est fugiat magna non duis pariatur. Sint voluptate irure incididunt incididunt exercitation id magna culpa.", + "longText": "Ex labore ut aliquip magna. Laborum consectetur anim voluptate commodo Lorem nisi veniam incididunt dolor aliqua irure fugiat nostrud. Amet aliquip elit in sint. Proident voluptate nisi nulla culpa tempor. Fugiat dolor minim elit dolor elit ex incididunt Lorem non eu. Ad ex laboris ut magna eu sunt veniam excepteur velit officia ipsum reprehenderit commodo.\r\nEu irure ullamco aute qui ex mollit. Officia anim proident non officia. Aute in voluptate mollit eiusmod voluptate. Culpa esse deserunt nostrud culpa consectetur mollit. Minim fugiat amet cillum anim eu velit qui non et duis ut.\r\nDo labore enim tempor in ipsum dolore veniam consequat aliqua deserunt excepteur duis. Sunt ad elit in aliquip officia veniam tempor ad velit consectetur Lorem. Voluptate sint commodo ullamco nisi sunt minim enim labore labore. In sit laboris officia exercitation labore minim ex velit ullamco. Adipisicing ex consectetur mollit occaecat id. Officia minim dolore qui do magna exercitation. Nisi in ipsum aliqua adipisicing ad sit ad anim dolore ipsum officia elit.\r\n", + "address": "2 Rugby Road", + "city": "Kirk", + "state": "Alaska", + "zip": 73560, + "country": "Slovenia", + "email": "mullenkeller@scentric.com", + "phone": "(964) 598-3707", + "color": "rgb(210,88,176)" + }, + { + "index": 399, + "name": "Rosario Camacho", + "first": "Trina", + "last": "Perez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imughal7/73.jpg", + "expanded": false, + "guid": "2f75ea28-cf05-4abd-8600-a3f69265392c", + "integer": 41, + "date": "Mon Jul 19 1993 06:30:42 GMT-0700 (PDT)", + "shortText": "est fugiat tempor", + "mediumText": "Irure cupidatat et officia velit ut ipsum exercitation. Aliquip pariatur enim enim duis labore duis. Excepteur Lorem eu in id exercitation eu enim dolore occaecat deserunt consequat. Aute commodo amet incididunt cillum ipsum adipisicing in. Aute sunt consequat fugiat cillum qui velit deserunt nisi nisi cupidatat.", + "longText": "Minim elit nisi enim pariatur tempor consequat et voluptate. Proident officia ipsum aliqua esse deserunt ex id nisi. Labore reprehenderit sint fugiat duis Lorem consectetur enim labore nostrud sit commodo id anim sint.\r\nEa labore et consectetur in aliqua consectetur exercitation labore dolor laborum id labore irure irure. Commodo elit ex culpa amet ex velit eiusmod consequat. Nostrud consequat id excepteur consequat et ad labore. Tempor sint consequat exercitation consectetur ex ad laboris et. Laboris fugiat consequat minim commodo veniam cillum nostrud dolore voluptate minim aute.\r\nAdipisicing commodo aliquip occaecat incididunt consequat aliqua dolor in nulla aliquip veniam aliqua aute. Incididunt ex ut minim aute mollit fugiat proident voluptate Lorem minim. Ipsum eiusmod ullamco consectetur sint in. Qui magna occaecat cillum eu et consectetur. Cillum duis occaecat cillum ipsum aliquip fugiat laborum et eiusmod consectetur id deserunt. Minim minim qui ea cillum sit quis duis non anim.\r\nVelit mollit aute ex exercitation sit consequat incididunt voluptate. Non eu laboris nulla cillum anim eu minim elit eu occaecat culpa reprehenderit consectetur. Tempor cupidatat est aute cupidatat laboris culpa qui aute veniam cillum ut incididunt esse dolor. Laboris irure ex ad ut labore dolore irure mollit irure aliquip eu tempor proident Lorem. Lorem sit eiusmod do Lorem consequat quis id minim cupidatat ex sunt magna. Laboris tempor adipisicing adipisicing et sint cupidatat ad dolor exercitation et qui occaecat laborum et.\r\nDuis incididunt anim proident dolore tempor voluptate nulla sunt aliquip voluptate dolor enim. Laborum anim sunt anim adipisicing exercitation commodo eu esse. Proident labore nostrud et excepteur sit eiusmod exercitation culpa eu in id adipisicing voluptate. Pariatur officia aute mollit amet et nisi aute sit. Aute eiusmod consectetur excepteur magna quis enim sint velit velit excepteur fugiat. Non Lorem nostrud eu voluptate anim reprehenderit et aliquip nostrud ipsum Lorem. Magna fugiat laborum culpa anim sunt laboris consectetur culpa quis pariatur minim minim minim.\r\n", + "address": "4 Ridge Boulevard", + "city": "Crown", + "state": "Louisiana", + "zip": 12286, + "country": "Mali", + "email": "trinaperez@scentric.com", + "phone": "(848) 593-3474", + "color": "rgb(121,115,73)" + }, + { + "index": 400, + "name": "Savannah Nieves", + "first": "Sutton", + "last": "Oneill", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/creative_px/73.jpg", + "expanded": false, + "guid": "2a23bf3c-f5ec-4e78-90bc-ace28f8f2bab", + "integer": 2, + "date": "Thu Apr 23 1992 13:29:05 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Et aute minim non exercitation ut in aliqua officia consequat.", + "longText": "Elit officia excepteur aliqua deserunt est. Exercitation magna culpa ut aute. Laborum Lorem aliquip labore enim velit in. Dolore in do do dolor do do qui.\r\nLabore sunt laborum id sit esse pariatur amet ea. Nostrud irure excepteur Lorem ea duis adipisicing est ea voluptate. Ea consectetur dolor duis anim. Non laborum incididunt aliquip mollit pariatur. Amet laborum esse enim velit aute sit fugiat sit laborum commodo. In nulla veniam adipisicing et velit dolore culpa mollit ad dolore dolor commodo proident dolore.\r\nPariatur nisi eu sint ullamco proident elit dolore officia quis mollit nisi. Do officia cillum minim occaecat duis. Exercitation adipisicing reprehenderit esse aliqua non elit eiusmod deserunt qui.\r\nMinim culpa aliqua sit id ex. Qui do ea in sint cillum Lorem non. Consequat Lorem sunt est nulla Lorem exercitation culpa esse ex. Veniam dolor in Lorem cillum amet esse eiusmod minim voluptate aute ipsum ex ad. Elit magna laboris id occaecat aute sit tempor fugiat velit incididunt consectetur minim. Sint est dolore occaecat aliquip in sint amet eiusmod esse exercitation quis duis dolore adipisicing.\r\n", + "address": "2 Ridgewood Place", + "city": "Ventress", + "state": "Missouri", + "zip": 37064, + "country": "Cyprus", + "email": "suttononeill@scentric.com", + "phone": "(957) 407-3116", + "color": "rgb(163,237,93)" + }, + { + "index": 401, + "name": "Faye Graves", + "first": "Mildred", + "last": "Branch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gabrielizalo/73.jpg", + "expanded": false, + "guid": "12b69605-f47d-4b63-b96d-48e2e24c1031", + "integer": 82, + "date": "Wed Feb 04 1981 06:07:39 GMT-0800 (PST)", + "shortText": "tempor occaecat ullamco", + "mediumText": "Velit aute non nisi elit laborum. Id nisi reprehenderit culpa incididunt eu labore est excepteur aute laborum officia enim. Qui proident deserunt voluptate commodo elit id irure voluptate. Consequat quis dolor id ea tempor ipsum culpa.", + "longText": "Velit sit eu nulla sunt nulla veniam velit mollit nostrud reprehenderit cillum velit. Nostrud non deserunt culpa Lorem quis. Sit elit ex tempor amet officia cupidatat. Dolore laboris et est consectetur elit dolor. Exercitation consectetur qui pariatur laborum pariatur aliquip irure veniam dolore laboris.\r\nLabore incididunt cupidatat elit nostrud ipsum aliquip ipsum commodo incididunt reprehenderit exercitation ipsum. Voluptate et ipsum qui nisi irure esse cillum ut. Tempor culpa et excepteur incididunt adipisicing laboris aliqua mollit minim incididunt. Dolor dolor fugiat anim culpa culpa id reprehenderit voluptate laboris occaecat. Esse Lorem sit cillum non consequat mollit minim non tempor aliquip culpa. Pariatur velit amet ad reprehenderit esse cillum veniam in ad. Nisi dolore irure dolore deserunt.\r\nNon amet elit pariatur nisi id dolor in adipisicing nisi elit sit. Adipisicing cillum sint tempor deserunt aute exercitation do pariatur. Nulla et eiusmod do dolore elit ullamco magna mollit. Irure deserunt consectetur Lorem ex elit consequat consequat laboris.\r\nDuis aute sint nisi tempor in ipsum laboris. Cillum magna exercitation mollit eu amet proident reprehenderit cupidatat irure. Ea minim dolor magna id aliquip. Ex commodo proident adipisicing sint velit non eiusmod sit in exercitation non laboris. Consequat nulla laborum sint qui dolor sint amet non. Qui sint dolore occaecat cillum proident ullamco ipsum incididunt duis sit duis fugiat consequat.\r\nQuis occaecat nulla officia quis nulla sunt reprehenderit nostrud. Cillum anim duis irure do nulla id. Sunt eiusmod quis dolor aliqua occaecat non. Sit velit elit sit laborum et cupidatat est veniam aliqua enim. In dolore veniam amet duis incididunt. Elit est quis minim nisi consectetur consequat sunt enim culpa eiusmod ea elit cupidatat. Officia reprehenderit in do consequat.\r\n", + "address": "4 Farragut Place", + "city": "Grayhawk", + "state": "Kentucky", + "zip": 53142, + "country": "Georgia", + "email": "mildredbranch@scentric.com", + "phone": "(888) 489-2923", + "color": "rgb(206,181,98)" + }, + { + "index": 402, + "name": "England Cameron", + "first": "Heath", + "last": "Roach", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/xtr1mal2/73.jpg", + "expanded": false, + "guid": "7eecdcf4-46f8-401c-aff2-9c22abf751ae", + "integer": 92, + "date": "Mon Jul 02 1990 04:55:35 GMT-0700 (PDT)", + "shortText": "velit", + "mediumText": "Cillum minim qui ex officia magna velit sunt nisi. Non reprehenderit sint pariatur minim elit commodo reprehenderit proident elit occaecat non duis voluptate. Aliquip ullamco ut duis officia do magna minim cupidatat in. Ex irure officia occaecat laboris tempor velit reprehenderit quis anim ipsum sit.", + "longText": "Cupidatat excepteur officia veniam id tempor sit amet. Deserunt mollit aliquip labore cupidatat sint laboris velit voluptate aute consectetur exercitation sit sint. Labore et pariatur laboris quis labore. Irure consectetur labore sit et. Aute consectetur veniam veniam id nulla pariatur deserunt. Deserunt nulla proident id nulla.\r\nUt nostrud tempor et laborum laboris aliquip ullamco exercitation exercitation elit culpa non culpa in. Cupidatat consectetur exercitation ea excepteur culpa sint eiusmod culpa reprehenderit Lorem fugiat laboris. Veniam sint mollit dolor consequat sunt officia. Irure ipsum culpa et non. Aliqua nisi amet Lorem nisi enim commodo aliquip occaecat duis aute eu cupidatat ut. Pariatur Lorem tempor consequat in irure pariatur mollit sunt reprehenderit dolore officia.\r\n", + "address": "2 Maujer Street", + "city": "Morningside", + "state": "American Samoa", + "zip": 87621, + "country": "Djibouti", + "email": "heathroach@scentric.com", + "phone": "(947) 435-3218", + "color": "rgb(247,200,211)" + }, + { + "index": 403, + "name": "Michele Reynolds", + "first": "Mayo", + "last": "Gray", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eugenerifan/73.jpg", + "expanded": false, + "guid": "826af78f-bd69-4f81-a45e-1a38d5afb1a8", + "integer": 54, + "date": "Mon Nov 02 2009 06:31:46 GMT-0800 (PST)", + "shortText": "exercitation adipisicing et", + "mediumText": "Aliqua ex amet anim proident nostrud et id Lorem aliqua. Quis reprehenderit veniam cupidatat fugiat.", + "longText": "Ipsum ullamco commodo aliqua non consectetur culpa in. Et nulla nulla adipisicing sit sunt irure ea commodo ex cupidatat enim excepteur. Aliqua eu dolore commodo culpa est nostrud velit exercitation irure. Ad est fugiat duis ipsum non Lorem deserunt esse.\r\nAliquip reprehenderit id voluptate ullamco anim sunt aliquip veniam proident esse magna officia eiusmod. Nostrud nostrud cillum sunt fugiat incididunt irure pariatur veniam incididunt irure Lorem irure velit velit. Eiusmod occaecat proident culpa Lorem labore culpa ad. Eu dolor ad cupidatat sunt fugiat sint. Ea sunt quis amet nulla labore dolor occaecat consequat ea nulla. Sint magna qui et veniam cillum.\r\nOccaecat sunt aliqua adipisicing non consequat in ipsum esse sunt elit reprehenderit. Enim adipisicing cupidatat voluptate deserunt aliqua reprehenderit aliquip excepteur dolore non Lorem est do. Dolor ipsum non ex id tempor tempor mollit. Consequat cupidatat ad elit nulla ex nostrud nisi dolor nulla cillum labore dolor dolor.\r\nFugiat exercitation nulla irure aliqua id. Laboris reprehenderit cillum quis cillum Lorem exercitation Lorem ipsum deserunt. Velit sint aute adipisicing aliquip voluptate et culpa ullamco aliqua.\r\nNon cillum magna elit sunt aliqua ea. Veniam eu esse in est proident non reprehenderit nulla enim. Nisi non sunt et laborum minim non qui nisi nisi elit excepteur nisi. Ex excepteur consequat mollit sunt proident velit et deserunt sint excepteur et. Ullamco qui ipsum labore culpa aliquip. Qui pariatur veniam non velit qui nisi non veniam incididunt Lorem laboris occaecat. Ut duis qui labore anim amet dolor.\r\n", + "address": "4 Eagle Street", + "city": "Allentown", + "state": "Minnesota", + "zip": 44111, + "country": "Tokelau", + "email": "mayogray@scentric.com", + "phone": "(992) 459-3031", + "color": "rgb(215,198,143)" + }, + { + "index": 404, + "name": "Dorthy Simon", + "first": "Gena", + "last": "Calderon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imcoding/73.jpg", + "expanded": false, + "guid": "6afa8867-330b-419e-b186-df524f163ef0", + "integer": 1, + "date": "Mon Jun 09 2014 19:43:18 GMT-0700 (PDT)", + "shortText": "esse", + "mediumText": "Incididunt ea id eu id mollit eu. Culpa fugiat dolor minim mollit.", + "longText": "Dolor exercitation dolor minim cillum anim ut ex elit sunt laborum voluptate est ea non. Sunt tempor deserunt aute ut aliqua. Nostrud eu ullamco in est eu ea mollit qui. Ad mollit fugiat quis ex elit. Proident duis cupidatat ex amet sint dolore laboris elit. Excepteur cupidatat minim id consequat dolor.\r\nTempor ipsum eu commodo ipsum ut. Elit elit eiusmod fugiat ullamco labore. Mollit est ea nulla ea cupidatat excepteur.\r\nDeserunt duis ipsum adipisicing in laboris sit. Esse incididunt in aliqua non anim esse consectetur. Exercitation dolor deserunt eiusmod incididunt et ea culpa. Mollit anim non mollit adipisicing est. Pariatur aliqua dolore ullamco aliqua.\r\nEt id laboris sit adipisicing adipisicing eu occaecat et quis sint. Proident voluptate ad et velit. Quis aliqua elit deserunt consectetur sunt. Incididunt sit qui ex excepteur et culpa et. Non occaecat ea amet commodo Lorem. Minim mollit eu eiusmod id ipsum esse ut mollit do do.\r\n", + "address": "3 Vermont Court", + "city": "Williston", + "state": "Hawaii", + "zip": 55240, + "country": "San Marino", + "email": "genacalderon@scentric.com", + "phone": "(888) 431-2447", + "color": "rgb(169,113,77)" + }, + { + "index": 405, + "name": "Estella Bird", + "first": "Candice", + "last": "Grant", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/madhan4uu/73.jpg", + "expanded": false, + "guid": "acee6de8-e101-4121-92a2-004058e99752", + "integer": 82, + "date": "Sat Sep 14 2002 06:24:28 GMT-0700 (PDT)", + "shortText": "id pariatur in tempor", + "mediumText": "Reprehenderit nulla consectetur minim minim ut consequat id tempor anim labore. Occaecat reprehenderit in consequat velit occaecat Lorem.", + "longText": "Nulla tempor et esse nostrud minim aliqua mollit ullamco elit consectetur cupidatat. Non non aliqua labore aute Lorem magna excepteur tempor. Velit exercitation veniam elit proident do nostrud et adipisicing et consectetur est dolore. Quis minim cupidatat occaecat Lorem aute labore ea et do nisi nisi consectetur. Do aute commodo labore elit laboris. In ipsum quis voluptate nulla est officia eu.\r\n", + "address": "4 Wythe Avenue", + "city": "Rivera", + "state": "Alabama", + "zip": 33941, + "country": "Vanuatu", + "email": "candicegrant@scentric.com", + "phone": "(991) 536-3705", + "color": "rgb(157,106,60)" + }, + { + "index": 406, + "name": "Clarissa Bray", + "first": "Rojas", + "last": "Robles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tirsope/73.jpg", + "expanded": false, + "guid": "bfc3f083-ca88-443f-8639-1467b45a7b5e", + "integer": 54, + "date": "Fri Jul 03 1970 19:21:58 GMT-0700 (PDT)", + "shortText": "consectetur duis ullamco est", + "mediumText": "Excepteur qui sint nulla pariatur reprehenderit ex fugiat anim ut. Id voluptate quis incididunt sint sint aliqua aliquip excepteur sit officia ad dolore. Aute eu elit tempor laborum eu voluptate ipsum duis sunt. Reprehenderit fugiat ex Lorem aute quis nostrud commodo Lorem.", + "longText": "Labore ad nostrud ad eu dolor pariatur sit exercitation tempor voluptate do eu deserunt. Consectetur culpa culpa veniam nisi eu elit minim est est. Mollit cillum sit pariatur quis. Cupidatat ex reprehenderit ad eu ad amet id esse aliqua. Adipisicing sint adipisicing ex consectetur magna quis sint culpa irure pariatur laboris exercitation ea ex. Elit fugiat proident dolor amet minim cillum et sint. Non nostrud nulla ipsum eu.\r\n", + "address": "4 Clifton Place", + "city": "Walton", + "state": "North Carolina", + "zip": 22683, + "country": "Somalia", + "email": "rojasrobles@scentric.com", + "phone": "(829) 530-3596", + "color": "rgb(58,225,142)" + }, + { + "index": 407, + "name": "Jody Schultz", + "first": "Baird", + "last": "Robinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lorenzosinisi/73.jpg", + "expanded": false, + "guid": "7a26e07a-6210-47eb-8a15-d60b73f0b0ba", + "integer": 34, + "date": "Sat Oct 25 1980 07:30:41 GMT-0700 (PDT)", + "shortText": "dolor qui", + "mediumText": "Aliqua sunt magna esse aute veniam occaecat tempor aliquip aliquip adipisicing aliquip qui deserunt incididunt.", + "longText": "Laboris dolore anim pariatur laboris in veniam irure. Lorem laborum nulla amet dolore cupidatat. Dolor est reprehenderit eiusmod labore excepteur duis mollit veniam ipsum sunt magna. Minim ut aliquip sunt ut irure voluptate voluptate duis ea. Exercitation occaecat mollit cupidatat sint dolore aliquip cupidatat aute minim exercitation ipsum occaecat. Consequat sit tempor esse ut culpa tempor duis irure duis quis. Enim incididunt sint consequat adipisicing veniam fugiat eiusmod.\r\nMinim mollit voluptate amet laborum fugiat eiusmod duis esse aute ea tempor. Ea minim ipsum sint pariatur amet voluptate ipsum. Excepteur magna pariatur esse culpa ipsum do. Ad deserunt excepteur aliquip cillum non eiusmod excepteur non labore ut nostrud fugiat. Minim sunt duis dolor ex ipsum reprehenderit. Magna incididunt reprehenderit tempor reprehenderit voluptate. Irure magna non minim quis sunt laboris ut velit velit eu consequat ad.\r\nEst et sunt consequat adipisicing elit non pariatur nostrud reprehenderit sit. Pariatur irure veniam veniam aliquip velit fugiat adipisicing. Consectetur ex mollit tempor cillum commodo ad magna dolore Lorem. Consectetur non esse ex esse irure consectetur ullamco proident eu ex ullamco. Ipsum ut tempor Lorem exercitation et voluptate nulla aute commodo. Adipisicing nostrud laboris quis elit minim.\r\nProident ea irure ex qui qui deserunt ex consequat est ex et elit consequat ut. Sunt deserunt tempor dolor esse reprehenderit excepteur est. Mollit eu occaecat anim voluptate.\r\n", + "address": "4 Montieth Street", + "city": "Lowell", + "state": "Connecticut", + "zip": 26397, + "country": "Maldives", + "email": "bairdrobinson@scentric.com", + "phone": "(881) 497-3274", + "color": "rgb(109,107,114)" + }, + { + "index": 408, + "name": "Sullivan Singleton", + "first": "Lupe", + "last": "Shields", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/celikovic/73.jpg", + "expanded": false, + "guid": "77364f56-0bf3-44a2-b715-57adc5471291", + "integer": 76, + "date": "Sun Jan 30 2000 05:01:36 GMT-0800 (PST)", + "shortText": "eiusmod enim officia", + "mediumText": "Deserunt sunt nulla ex reprehenderit nulla laborum fugiat consectetur aliqua est. Dolor qui laborum non anim in. Nisi amet commodo ullamco id excepteur ipsum veniam. Id quis nulla amet sint pariatur. Velit irure exercitation ut excepteur pariatur anim amet deserunt.", + "longText": "Ullamco labore cupidatat qui ad consequat consequat incididunt ullamco non. Id tempor est laboris non. Pariatur incididunt veniam irure Lorem aute. Eu reprehenderit do adipisicing adipisicing officia est consectetur laboris ut et et consequat duis ut.\r\nFugiat excepteur dolore culpa excepteur excepteur laboris Lorem non esse do ad. Duis consectetur aliqua voluptate veniam velit culpa incididunt incididunt ad anim. Quis id elit officia in ut.\r\nCupidatat dolor excepteur in mollit proident nostrud duis consequat in. Duis ullamco eu qui culpa. Nostrud culpa eu cupidatat occaecat. Eu reprehenderit ex nisi voluptate aliqua aute.\r\n", + "address": "4 Knickerbocker Avenue", + "city": "Alafaya", + "state": "South Carolina", + "zip": 66270, + "country": "Israel", + "email": "lupeshields@scentric.com", + "phone": "(945) 571-2010", + "color": "rgb(61,207,100)" + }, + { + "index": 409, + "name": "Bullock Harrell", + "first": "Morse", + "last": "Haynes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_kshitish/73.jpg", + "expanded": false, + "guid": "4176d27b-2ff0-44dd-9f1e-17963821d222", + "integer": 45, + "date": "Sat Feb 20 1999 17:08:27 GMT-0800 (PST)", + "shortText": "id nostrud fugiat irure culpa", + "mediumText": "Reprehenderit quis elit id amet laborum labore.", + "longText": "Nulla pariatur in cupidatat qui fugiat. Id incididunt ad aute consequat velit anim ad velit fugiat labore. Sunt magna do dolore ullamco Lorem Lorem enim et aliquip mollit esse id sunt. Nisi reprehenderit magna sit non officia Lorem eu fugiat. Elit non occaecat laborum in sunt consequat amet in non.\r\nSit ipsum mollit proident pariatur ea esse. Culpa magna aliqua ipsum excepteur ea esse laborum aliquip occaecat reprehenderit nostrud ex ea. Non esse exercitation nulla nostrud esse in sunt. Esse tempor aliqua sit veniam proident aute sint nulla do velit eiusmod. Qui duis occaecat tempor do aliquip irure cillum elit. Culpa Lorem et est nisi ut qui consequat exercitation magna nisi ad officia magna voluptate.\r\nTempor enim sit deserunt do nisi amet enim ipsum ea dolore eu. Proident excepteur aliqua sit sit qui duis ad nostrud adipisicing qui. Exercitation eiusmod velit aliquip officia voluptate anim laborum anim duis in enim qui consectetur. Ad est occaecat occaecat do ex esse ipsum ipsum Lorem veniam. Minim et et sunt non sit irure ad amet minim in et anim reprehenderit voluptate. Irure anim id nisi eiusmod eu eiusmod proident aute sunt. Consequat et aute ipsum ullamco do aute ad do Lorem ipsum in minim.\r\n", + "address": "4 Louise Terrace", + "city": "Blodgett", + "state": "Michigan", + "zip": 68968, + "country": "Reunion", + "email": "morsehaynes@scentric.com", + "phone": "(933) 478-3987", + "color": "rgb(127,118,223)" + }, + { + "index": 410, + "name": "Tammi Gordon", + "first": "Cooke", + "last": "Chandler", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/2fockus/73.jpg", + "expanded": false, + "guid": "c65f8ce1-2436-4ef2-9dc8-74fcc3a09b55", + "integer": 7, + "date": "Wed Jan 12 2005 21:50:12 GMT-0800 (PST)", + "shortText": "laboris est ipsum", + "mediumText": "Id dolore quis voluptate dolor ullamco enim velit cillum mollit dolor occaecat officia.", + "longText": "Laborum est amet mollit esse exercitation exercitation culpa commodo laborum irure enim commodo aliquip amet. Eu ea commodo occaecat cupidatat velit adipisicing reprehenderit amet. Reprehenderit in Lorem voluptate amet consectetur id incididunt reprehenderit in quis commodo est deserunt non. Pariatur pariatur in elit labore ut esse esse irure. Tempor mollit labore laborum voluptate ut. Ut occaecat mollit mollit cillum aliquip ipsum quis voluptate veniam. Cillum ad exercitation incididunt culpa ex in reprehenderit eiusmod deserunt voluptate.\r\nDo eiusmod esse aliquip eiusmod veniam deserunt do non dolor pariatur. Occaecat dolore minim irure proident laborum in nostrud sit. Ipsum deserunt duis reprehenderit duis occaecat fugiat voluptate aute aliquip consectetur consequat eiusmod. Qui laborum sunt incididunt id quis eu consectetur adipisicing mollit commodo eiusmod ipsum amet.\r\nCulpa anim officia ea occaecat occaecat occaecat occaecat mollit ipsum commodo dolore laboris. Ut anim velit amet laboris velit et aliqua aliquip incididunt consectetur culpa aliquip sint cupidatat. Enim eu adipisicing ut non. Amet duis nostrud est ad dolore non cupidatat veniam in. Voluptate nostrud sint aliqua voluptate culpa qui Lorem tempor.\r\nCommodo Lorem officia aute ut do mollit sint labore ex fugiat ullamco eu ut consectetur. Nulla nisi laborum anim et qui ullamco est dolore enim pariatur ex velit. Sit ullamco aliqua reprehenderit ea anim aliquip velit ut amet culpa eiusmod cillum. Aute eu sit aute proident Lorem dolor ea pariatur. Nisi pariatur consequat tempor occaecat consectetur deserunt irure magna adipisicing anim.\r\n", + "address": "3 Bergen Avenue", + "city": "Tolu", + "state": "Maine", + "zip": 88956, + "country": "Taiwan", + "email": "cookechandler@scentric.com", + "phone": "(975) 467-3292", + "color": "rgb(138,124,136)" + }, + { + "index": 411, + "name": "Jeanine Shaw", + "first": "Kasey", + "last": "Guerrero", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dnevozhai/73.jpg", + "expanded": false, + "guid": "be3a2408-087f-4d1d-ba80-0cffdd225a29", + "integer": 82, + "date": "Sun May 13 2001 01:14:30 GMT-0700 (PDT)", + "shortText": "sint", + "mediumText": "Non quis officia mollit labore velit est in Lorem culpa laboris voluptate et. Exercitation dolor non sit magna Lorem consequat.", + "longText": "Labore ea elit irure eiusmod deserunt aliqua. Aliqua velit esse voluptate sunt duis dolor ad in nostrud consectetur proident. Amet aliquip excepteur veniam commodo dolore do voluptate non. Lorem sunt duis anim officia sunt culpa laborum dolor occaecat.\r\nOfficia cillum est enim labore minim esse voluptate culpa consectetur Lorem aliquip. Quis incididunt esse dolor Lorem nulla nostrud aliquip duis aliqua laboris ut. Qui nisi proident voluptate nostrud anim. Sunt culpa est elit exercitation magna sint.\r\nEst mollit quis fugiat deserunt quis ullamco dolore enim exercitation occaecat nulla aute anim ullamco. Nisi consequat consequat consequat pariatur nostrud ad nostrud voluptate irure anim adipisicing ex in sint. Sunt culpa incididunt laborum laborum in adipisicing excepteur dolor tempor ad. Reprehenderit et mollit sint duis irure sit enim ex dolore est duis sunt incididunt. Eiusmod deserunt et est laborum est ipsum reprehenderit pariatur sunt duis. Sunt minim magna consectetur do occaecat. Duis ut tempor ullamco sunt dolor sit deserunt nisi amet.\r\n", + "address": "3 Conduit Boulevard", + "city": "Itmann", + "state": "Kansas", + "zip": 88741, + "country": "Cuba", + "email": "kaseyguerrero@scentric.com", + "phone": "(807) 548-3703", + "color": "rgb(77,230,193)" + }, + { + "index": 412, + "name": "Mcmahon Reeves", + "first": "Amanda", + "last": "Holloway", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sebasribas/73.jpg", + "expanded": false, + "guid": "d7d7d64e-e5c2-426c-b930-5d2e09aba244", + "integer": 32, + "date": "Thu May 08 1986 15:44:35 GMT-0700 (PDT)", + "shortText": "ut", + "mediumText": "Dolor aute Lorem irure occaecat. Dolore culpa eu ex id eu ad ad quis.", + "longText": "Nisi officia commodo consequat consequat aliquip. Eu non esse sit sit ipsum duis exercitation tempor. Voluptate officia eiusmod consequat sunt esse exercitation sint tempor nulla cillum ad Lorem qui ea. Id dolore elit ullamco ex ea commodo reprehenderit consequat. Anim dolore id ullamco laborum commodo dolore proident ex.\r\nEnim minim elit adipisicing occaecat occaecat veniam. Dolor culpa occaecat adipisicing proident ex id. Incididunt ullamco aute ex anim est ullamco magna nisi. Occaecat duis mollit id duis ipsum reprehenderit proident ut elit consectetur non deserunt eiusmod commodo.\r\nIrure do nulla consequat fugiat. Aliqua proident est voluptate consectetur culpa reprehenderit labore aute voluptate aliqua anim laborum. Voluptate consectetur commodo et enim enim sint eiusmod ut consectetur quis ipsum. Proident dolor ipsum duis cillum sunt.\r\nEsse culpa non esse consectetur mollit reprehenderit commodo velit esse nulla sit ad. Ex ad amet exercitation irure velit reprehenderit. Qui officia incididunt commodo minim fugiat exercitation ut magna amet voluptate ullamco.\r\nEnim occaecat consequat officia ad incididunt magna nulla ea laborum in consectetur laborum Lorem laboris. Deserunt esse cillum nulla anim. Ea laborum amet ex aliquip aliquip.\r\n", + "address": "3 Kingston Avenue", + "city": "Herlong", + "state": "Iowa", + "zip": 83835, + "country": "Turkey", + "email": "amandaholloway@scentric.com", + "phone": "(818) 520-3833", + "color": "rgb(198,210,85)" + }, + { + "index": 413, + "name": "Fox Patterson", + "first": "Samantha", + "last": "Frazier", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cepreygolubev/73.jpg", + "expanded": false, + "guid": "24f589f7-f6f9-4cab-9292-d754c16d9e45", + "integer": 63, + "date": "Fri Mar 16 2007 14:40:33 GMT-0700 (PDT)", + "shortText": "adipisicing velit Lorem", + "mediumText": "Anim amet dolore eiusmod sit ea officia duis aliqua ipsum ea consequat Lorem. Lorem sunt non amet ullamco elit. Aliquip reprehenderit pariatur mollit officia irure irure dolor incididunt voluptate qui sit duis esse amet. Tempor aliqua magna excepteur ad aliqua. In fugiat et aliqua irure excepteur dolore ipsum voluptate.", + "longText": "Consequat sit pariatur exercitation esse tempor adipisicing labore amet nulla elit elit fugiat. Laborum id in ad laborum officia nulla id cillum occaecat. Esse consectetur fugiat veniam ex minim eiusmod nostrud.\r\nExercitation officia velit officia occaecat voluptate ipsum ipsum et fugiat id enim laboris veniam. Commodo eu velit reprehenderit cupidatat. Do incididunt anim irure laborum ut voluptate est aute elit anim. Duis dolor dolore ex sit adipisicing ipsum voluptate voluptate anim. Non adipisicing aute nostrud anim magna id qui quis.\r\nEst sint irure eu pariatur elit id non cupidatat. Exercitation nisi ea commodo in nulla pariatur anim sunt adipisicing culpa esse sint. Quis et culpa ad anim cillum mollit excepteur. Cillum fugiat amet reprehenderit nisi ullamco. In ipsum commodo nisi ut reprehenderit. Deserunt eiusmod labore enim consequat.\r\nSit eu est irure excepteur ea esse magna minim adipisicing consequat ad ut esse. Laboris ut duis culpa nulla cillum sunt sint velit. Excepteur aute aliquip aute id adipisicing aute nulla ex incididunt consequat occaecat cillum. In consectetur aute veniam adipisicing et non dolor aliqua qui eiusmod ea aliquip elit. Ut fugiat aliqua nisi deserunt excepteur eu aute minim culpa aute mollit.\r\nQui et laborum deserunt proident dolore mollit fugiat labore. Dolore et ullamco laboris sit adipisicing do voluptate ullamco nulla amet eu voluptate. Mollit nisi officia nisi incididunt minim culpa commodo irure elit quis in.\r\n", + "address": "2 Roosevelt Court", + "city": "Mammoth", + "state": "Vermont", + "zip": 32042, + "country": "Solomon Islands", + "email": "samanthafrazier@scentric.com", + "phone": "(831) 425-2424", + "color": "rgb(239,229,222)" + }, + { + "index": 414, + "name": "Gloria Mcclain", + "first": "Marisol", + "last": "Marshall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamphilipjoyce/73.jpg", + "expanded": false, + "guid": "0eb44c61-37e0-4715-9356-2231abd957a0", + "integer": 93, + "date": "Thu Nov 03 2005 21:43:21 GMT-0800 (PST)", + "shortText": "quis nisi ad ut commodo", + "mediumText": "Consequat tempor ad id sint consectetur officia aliqua excepteur duis. Voluptate cupidatat id est eu velit id voluptate aute sunt cillum elit minim nulla tempor.", + "longText": "Magna tempor elit reprehenderit aliquip laboris eu commodo et consectetur laborum officia magna. Veniam fugiat minim ut occaecat incididunt nisi. Sunt adipisicing quis aliqua sit in aliquip eiusmod laborum.\r\n", + "address": "2 Scott Avenue", + "city": "Emison", + "state": "Nebraska", + "zip": 11179, + "country": "Malawi", + "email": "marisolmarshall@scentric.com", + "phone": "(850) 423-2670", + "color": "rgb(179,133,229)" + }, + { + "index": 415, + "name": "Mcintyre Cochran", + "first": "Courtney", + "last": "Faulkner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/russell_baylis/73.jpg", + "expanded": false, + "guid": "07e7e322-9ff5-428a-a8d7-1d9e39a2bc7c", + "integer": 19, + "date": "Tue Aug 26 1975 19:13:06 GMT-0700 (PDT)", + "shortText": "ullamco fugiat", + "mediumText": "Ipsum veniam commodo consectetur occaecat. Aliqua velit dolor aliqua pariatur eu proident enim do eu mollit proident consectetur ipsum.", + "longText": "Sunt in veniam dolor anim cupidatat Lorem proident pariatur culpa. Pariatur ipsum consectetur nostrud officia dolor magna esse anim aliqua. Exercitation ex nisi enim irure veniam eiusmod et ipsum sint do. Consectetur eu minim minim aute aliquip consequat laborum exercitation commodo ex adipisicing culpa.\r\nNulla anim velit amet laboris. Commodo deserunt et duis consectetur consequat aute est pariatur consequat do tempor. Voluptate reprehenderit irure esse minim. Qui tempor id eiusmod id aliquip sit quis quis anim exercitation nulla. Laborum cillum veniam cupidatat incididunt adipisicing magna non laboris labore aliquip. Minim sit sint id ea in adipisicing et ex cillum reprehenderit. Pariatur tempor ea fugiat in irure.\r\nEa culpa proident aliquip officia sint irure Lorem consectetur. Ad reprehenderit adipisicing mollit nostrud ad amet ipsum aliqua dolore dolor eiusmod in. Lorem sit in aliquip esse aute sunt id nostrud ex culpa reprehenderit mollit. Qui laboris anim culpa id fugiat veniam. Reprehenderit exercitation sint pariatur mollit sint sunt. Velit excepteur consectetur proident non labore non aute incididunt duis. Excepteur amet occaecat occaecat commodo ut do velit tempor aliqua laborum.\r\nMinim veniam dolor id id culpa cillum enim sunt qui esse pariatur pariatur aliquip. Esse et ad dolor aliquip. Adipisicing fugiat do elit exercitation eiusmod fugiat ea ullamco mollit non. Minim occaecat ipsum dolore elit anim velit occaecat cupidatat. Irure irure reprehenderit fugiat ad mollit ullamco esse sit. Fugiat veniam reprehenderit amet ullamco nostrud irure ea reprehenderit.\r\n", + "address": "4 Nassau Street", + "city": "Bowden", + "state": "Florida", + "zip": 14172, + "country": "Samoa", + "email": "courtneyfaulkner@scentric.com", + "phone": "(861) 587-3003", + "color": "rgb(87,119,212)" + }, + { + "index": 416, + "name": "Sheppard Pacheco", + "first": "Shepard", + "last": "Hopper", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kijanmaharjan/73.jpg", + "expanded": false, + "guid": "25a22dc2-f676-4e38-b172-8b3d6598cafd", + "integer": 98, + "date": "Thu Jun 19 2003 12:30:27 GMT-0700 (PDT)", + "shortText": "incididunt ad ad nulla elit", + "mediumText": "Consectetur magna dolore consequat consectetur officia labore culpa aute deserunt officia laboris exercitation. Duis labore consectetur ex id id ullamco voluptate commodo ut ea cillum.", + "longText": "Ea do adipisicing enim mollit cillum officia sunt amet exercitation esse. Incididunt deserunt dolore deserunt sunt ut tempor. Quis magna consectetur commodo nisi eiusmod cupidatat ea velit. Consectetur Lorem cillum laborum velit enim esse et officia ipsum consectetur sit.\r\nDo cillum irure aliqua nostrud elit proident sunt deserunt pariatur sunt ad. Esse adipisicing fugiat sunt irure duis eu non officia eiusmod fugiat. Quis ut officia commodo elit ad veniam ut eu amet do. Mollit eiusmod Lorem adipisicing officia cillum culpa deserunt ullamco reprehenderit eu labore voluptate. Irure reprehenderit consequat tempor laboris exercitation aliquip velit nulla. Tempor quis adipisicing et esse. Lorem ea nulla consequat culpa aliquip tempor amet.\r\n", + "address": "4 Buffalo Avenue", + "city": "Tampico", + "state": "New Jersey", + "zip": 90074, + "country": "United Kingdom", + "email": "shepardhopper@scentric.com", + "phone": "(985) 565-3301", + "color": "rgb(103,234,218)" + }, + { + "index": 417, + "name": "Hobbs Chapman", + "first": "Byers", + "last": "Craig", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/73.jpg", + "expanded": false, + "guid": "355ebabb-a1d0-4ed7-adfb-e8a0515d4ee5", + "integer": 3, + "date": "Fri Mar 26 2010 15:05:55 GMT-0700 (PDT)", + "shortText": "cupidatat", + "mediumText": "Aute sit fugiat nostrud enim proident ad quis reprehenderit irure. Enim esse ex sunt dolore id occaecat proident fugiat cillum non ex dolore.", + "longText": "Nisi excepteur cillum incididunt ipsum ullamco esse do sit duis deserunt pariatur. Eiusmod commodo veniam excepteur deserunt veniam aliquip aute nisi dolore ut do cupidatat. Aliqua tempor occaecat amet sit do laboris ea dolor mollit duis laborum dolore aute deserunt. Nulla non duis sunt do eiusmod sunt labore dolore excepteur cillum reprehenderit veniam elit reprehenderit. Occaecat Lorem incididunt amet ad ullamco minim ullamco enim nostrud aute occaecat duis Lorem. Ea labore in nostrud pariatur ea fugiat deserunt. Laborum eu enim officia amet sint et qui in id.\r\nFugiat minim adipisicing anim duis eiusmod id deserunt ea minim esse est nostrud laboris cupidatat. Ex ut reprehenderit commodo veniam. Aliquip duis incididunt proident ut sit aliquip occaecat commodo reprehenderit qui. Enim enim dolor non quis magna esse aliqua labore labore officia ut ut anim. Ex dolor velit aliqua pariatur.\r\nDolor enim ad non dolor do qui nulla exercitation eiusmod cillum elit minim non. Esse sint voluptate ullamco et sit esse. Ut ullamco non eiusmod anim quis anim ullamco irure amet. Amet ut pariatur ad mollit eu occaecat aliqua adipisicing. Dolore et sint veniam qui ad veniam fugiat aliqua dolor. Deserunt eiusmod et reprehenderit consequat enim quis deserunt dolor.\r\nCillum amet aliquip laborum eiusmod. Consequat commodo aliquip velit quis fugiat velit. Lorem nulla nostrud deserunt aliquip Lorem sunt et. Ea sunt duis officia Lorem elit do commodo. Tempor nostrud incididunt sunt nisi fugiat ex eu. Commodo nisi do duis non culpa consectetur ut exercitation ad in. Laborum laborum tempor sit laborum labore reprehenderit voluptate.\r\n", + "address": "2 Aberdeen Street", + "city": "Maplewood", + "state": "Wisconsin", + "zip": 44000, + "country": "French Guiana", + "email": "byerscraig@scentric.com", + "phone": "(830) 519-3986", + "color": "rgb(189,244,220)" + }, + { + "index": 418, + "name": "Lisa Yates", + "first": "Lea", + "last": "Underwood", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/noufalibrahim/73.jpg", + "expanded": false, + "guid": "dc5b7819-35b2-4a5e-b228-74fa3c7bdf7a", + "integer": 38, + "date": "Mon Nov 07 2011 03:37:10 GMT-0800 (PST)", + "shortText": "laborum ipsum enim et quis", + "mediumText": "Nulla proident ut aliquip consectetur occaecat aliqua laboris incididunt. Reprehenderit labore laborum sint non mollit reprehenderit amet ullamco proident dolore cupidatat ad adipisicing. Cupidatat consectetur mollit enim sit ipsum sunt consequat.", + "longText": "Lorem adipisicing velit in ipsum aliqua ad anim nulla tempor id eu laboris. Sunt velit minim elit laboris tempor irure culpa laboris laborum qui pariatur est. Ea laboris id nostrud exercitation non. Aute irure do eiusmod in. Anim pariatur proident enim ex commodo cupidatat nisi dolore non est cupidatat reprehenderit. Id deserunt amet aliquip in quis do ipsum duis ipsum deserunt commodo culpa incididunt irure. Deserunt aliquip incididunt eiusmod laboris et culpa qui Lorem ad magna voluptate ad est.\r\nMollit velit ut eu magna non proident ullamco. Aliquip incididunt consectetur nostrud sunt sint eu labore magna ex. Reprehenderit labore cupidatat voluptate eiusmod pariatur consequat proident aliquip. Ea irure ad aliqua eu exercitation ullamco laborum duis. Ea et quis esse magna sunt quis tempor irure elit veniam sunt nulla irure nisi.\r\nIrure consequat veniam esse ea nostrud excepteur ipsum. Dolore minim tempor in ad ex aliquip amet. Sint id excepteur commodo ipsum ullamco consequat ut nisi nulla.\r\nQuis sunt reprehenderit ad quis. Fugiat commodo adipisicing ex irure consectetur ullamco ullamco culpa ullamco aliqua laborum aliquip duis incididunt. Lorem Lorem est fugiat ex veniam minim amet magna minim quis incididunt ullamco nostrud. Qui nostrud reprehenderit sint non sint irure adipisicing mollit mollit proident consequat nostrud esse pariatur. Ex aute velit magna enim veniam enim id eiusmod. Adipisicing Lorem eiusmod ea minim anim do deserunt pariatur aliquip qui ullamco velit qui.\r\nMollit occaecat voluptate sint ea dolor non ullamco nostrud enim minim duis sit amet. Enim ex reprehenderit nisi ipsum deserunt. Aliqua sit Lorem esse qui et deserunt esse.\r\n", + "address": "4 Apollo Street", + "city": "Gilgo", + "state": "Washington", + "zip": 82570, + "country": "Latvia", + "email": "leaunderwood@scentric.com", + "phone": "(828) 506-3671", + "color": "rgb(157,198,63)" + }, + { + "index": 419, + "name": "Casey Long", + "first": "Ella", + "last": "Ingram", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/avclarkey/73.jpg", + "expanded": false, + "guid": "9594164f-bed6-4350-84a7-8006ac0ac9a1", + "integer": 72, + "date": "Sun Nov 13 1988 09:05:46 GMT-0800 (PST)", + "shortText": "irure labore", + "mediumText": "Esse aliquip est ullamco velit. Amet tempor est consectetur consequat voluptate. Tempor ipsum fugiat enim et. Id officia cupidatat magna ullamco enim occaecat exercitation in sunt enim do nisi culpa cupidatat.", + "longText": "Eiusmod in et sit voluptate culpa sit velit et irure minim tempor ipsum. Aliqua elit consectetur ea aliqua excepteur eiusmod cillum dolor in ullamco. Commodo quis qui laborum labore minim. Ipsum est do proident labore incididunt nisi. Adipisicing magna velit sit consequat mollit proident commodo quis. Laboris quis elit adipisicing labore consectetur incididunt in reprehenderit enim. Magna cillum enim id veniam velit aliquip amet deserunt ea.\r\nReprehenderit ea ullamco do id tempor in duis nulla pariatur. Eiusmod adipisicing in consectetur exercitation. Fugiat enim veniam occaecat esse exercitation eu ullamco cillum quis consequat.\r\nAliqua non enim sunt amet cillum id proident do nulla eiusmod eu. Fugiat in nisi incididunt irure enim. Occaecat culpa tempor culpa anim laborum dolore consectetur Lorem eu.\r\nOfficia et aliqua aliqua ex occaecat est magna officia enim. Commodo officia dolor officia esse aute eiusmod. Velit quis reprehenderit reprehenderit laborum occaecat voluptate. Eiusmod dolor culpa irure do mollit excepteur ullamco aute est culpa. Ad ullamco incididunt minim eu mollit irure esse adipisicing laborum mollit cupidatat dolore.\r\n", + "address": "2 Dorchester Road", + "city": "Kersey", + "state": "Oregon", + "zip": 52838, + "country": "Netherlands Antilles", + "email": "ellaingram@scentric.com", + "phone": "(939) 546-2501", + "color": "rgb(50,99,109)" + }, + { + "index": 420, + "name": "Kent Fitzpatrick", + "first": "Lara", + "last": "Vinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/arindam_/73.jpg", + "expanded": false, + "guid": "8c5b6ef8-755b-48a6-9d5c-2fbfc73015b9", + "integer": 94, + "date": "Wed Nov 13 1991 18:16:19 GMT-0800 (PST)", + "shortText": "labore", + "mediumText": "Esse ipsum culpa magna consequat fugiat magna aute.", + "longText": "Elit dolore incididunt non anim cupidatat magna exercitation quis ut eiusmod adipisicing mollit excepteur ut. Voluptate sunt velit cupidatat consectetur occaecat est sint eiusmod. Ullamco sint do magna quis culpa sit id pariatur reprehenderit reprehenderit cupidatat aliqua reprehenderit. Et cillum est nisi laborum nisi officia sint ut deserunt eiusmod in. Incididunt dolore duis eiusmod eiusmod officia.\r\nEiusmod occaecat sint mollit aliqua dolore velit ea laboris cupidatat adipisicing ullamco duis commodo. Laborum commodo officia tempor ea id eu aliquip quis veniam Lorem nostrud in duis fugiat. Quis aliquip esse cupidatat cillum quis sint. Aute sunt qui dolore laboris.\r\nTempor sunt tempor minim fugiat cupidatat occaecat aute adipisicing eu minim mollit fugiat exercitation. Tempor occaecat sint ad enim sit occaecat Lorem nisi. Sunt sunt occaecat nisi nisi eiusmod fugiat labore adipisicing sit sint ut.\r\nConsequat minim ad laboris et est. Voluptate cupidatat amet dolore consectetur deserunt nulla laboris proident consectetur nulla. Ex voluptate magna velit ex cillum do. Adipisicing adipisicing esse magna amet consectetur pariatur aute cupidatat eiusmod velit. Fugiat sint occaecat tempor qui cillum ad nulla. Aliquip aliqua in aute dolor laborum cupidatat adipisicing mollit excepteur tempor do sunt adipisicing in. Ipsum ex dolore cupidatat non minim ullamco velit cillum irure aute irure occaecat.\r\n", + "address": "2 Reeve Place", + "city": "Grahamtown", + "state": "Illinois", + "zip": 69832, + "country": "Colombia", + "email": "laravinson@scentric.com", + "phone": "(965) 578-3210", + "color": "rgb(152,231,185)" + }, + { + "index": 421, + "name": "Claudia Ochoa", + "first": "Maynard", + "last": "Giles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmakardaras/73.jpg", + "expanded": false, + "guid": "97fdeebe-aaf9-4f67-a240-254056b3fbc4", + "integer": 43, + "date": "Thu Oct 04 2007 14:11:47 GMT-0700 (PDT)", + "shortText": "commodo nostrud", + "mediumText": "Consectetur aliquip reprehenderit magna id ex sint nostrud aute aliquip adipisicing. Laboris mollit aute ad ea pariatur proident laborum in sint consectetur velit anim.", + "longText": "Ea sint id dolore in enim non nulla tempor dolor excepteur non quis minim occaecat. Velit eu nostrud in eiusmod irure ea nulla in dolore Lorem consectetur ex in tempor. Ad duis ullamco dolor elit Lorem est dolore irure et non enim. Tempor laborum dolor velit consequat incididunt.\r\n", + "address": "2 Dikeman Street", + "city": "Wawona", + "state": "West Virginia", + "zip": 90747, + "country": "Wallis and Futuna Islands", + "email": "maynardgiles@scentric.com", + "phone": "(868) 426-2611", + "color": "rgb(82,210,230)" + }, + { + "index": 422, + "name": "Deleon Madden", + "first": "Jeri", + "last": "Roy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/georgespillman/73.jpg", + "expanded": false, + "guid": "0eeed2b0-573c-4b2a-8cf7-24f3929d42f6", + "integer": 3, + "date": "Mon Jul 24 2006 08:25:36 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Veniam mollit ut veniam anim ex proident nostrud. Qui dolore aute velit non voluptate sit ad reprehenderit sunt mollit. Reprehenderit fugiat occaecat duis mollit.", + "longText": "Reprehenderit exercitation nisi consequat veniam duis quis id aliqua ut ex aliqua sunt ipsum. Ad ad amet qui mollit officia Lorem exercitation dolore nulla. Quis commodo mollit sunt labore aliquip ipsum. Excepteur nisi non esse duis aliqua commodo officia consequat amet aliqua voluptate exercitation in nulla.\r\nConsectetur aute sit quis qui laboris. Laboris anim nulla in voluptate. Commodo magna nisi nisi commodo consectetur enim est do exercitation nisi. Mollit aliquip sint ea qui laborum.\r\nConsectetur eiusmod magna nisi mollit sint sunt id nostrud dolor eu. Exercitation mollit fugiat anim nisi nisi irure ipsum tempor eu. Est nisi consequat occaecat voluptate ad velit mollit amet. Elit est quis laboris culpa proident occaecat adipisicing officia cillum ea reprehenderit. Do quis ex aliqua culpa.\r\nIn minim proident enim nisi quis consequat. Deserunt veniam occaecat laborum laborum ex ipsum cupidatat commodo commodo adipisicing dolor in. Ex et est irure irure consequat ut sint in voluptate laborum eu nulla officia aute. Non enim magna nostrud deserunt minim pariatur irure elit ex qui minim. Exercitation nostrud dolore cupidatat dolore excepteur excepteur ad qui ex. Enim non occaecat ea enim officia exercitation proident irure nulla occaecat reprehenderit elit nostrud id. Culpa pariatur fugiat mollit labore non officia magna exercitation anim esse et.\r\n", + "address": "2 Lafayette Walk", + "city": "Kennedyville", + "state": "Mississippi", + "zip": 49852, + "country": "Bouvet Island", + "email": "jeriroy@scentric.com", + "phone": "(840) 457-2791", + "color": "rgb(127,95,131)" + }, + { + "index": 423, + "name": "Alexander Carroll", + "first": "Spears", + "last": "Obrien", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fireupman/73.jpg", + "expanded": false, + "guid": "36236dec-3738-49d8-befd-946c2774fd1e", + "integer": 88, + "date": "Tue Jul 01 1986 19:56:06 GMT-0700 (PDT)", + "shortText": "aute non ex Lorem", + "mediumText": "Proident Lorem aliqua laboris adipisicing ullamco velit consequat exercitation nisi. Laborum enim duis nulla reprehenderit est eu ad laboris ad.", + "longText": "Adipisicing tempor commodo nulla sint tempor veniam deserunt do eiusmod. Do tempor voluptate cillum ipsum veniam voluptate occaecat enim cillum anim mollit ad adipisicing. Consequat consequat aute dolor anim ut. Incididunt Lorem mollit anim esse veniam.\r\nCillum consequat proident consectetur ex proident ad cupidatat laboris do officia. Amet deserunt eu eiusmod aliquip esse ipsum laboris. Do dolor nostrud dolore sint quis nulla pariatur quis adipisicing. Culpa exercitation incididunt ullamco culpa sit.\r\nDolore irure sunt eiusmod tempor. Esse deserunt ex elit Lorem et nulla esse officia ipsum culpa. Lorem sunt duis tempor nostrud enim ea excepteur ad. Ea ut commodo minim et adipisicing veniam exercitation ad et dolor et tempor et. Minim duis Lorem excepteur ipsum ipsum ea esse velit voluptate dolore tempor sunt nulla incididunt. Excepteur est est consectetur in. Aliquip nisi ipsum deserunt nulla.\r\n", + "address": "3 Doone Court", + "city": "Fulford", + "state": "Rhode Island", + "zip": 83826, + "country": "Niue", + "email": "spearsobrien@scentric.com", + "phone": "(832) 502-3659", + "color": "rgb(138,211,151)" + }, + { + "index": 424, + "name": "Debora Gibson", + "first": "Crane", + "last": "Lawrence", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kylefrost/73.jpg", + "expanded": false, + "guid": "0a2de76d-c5db-4e74-89e0-3ff39bf504ad", + "integer": 29, + "date": "Fri Apr 01 1977 03:54:28 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Esse veniam veniam in do incididunt non culpa laborum.", + "longText": "Ullamco exercitation deserunt enim est ea. Ullamco irure ipsum dolore labore do nisi in minim occaecat irure reprehenderit sit. Elit culpa officia ut labore nulla duis ullamco magna culpa veniam. Cupidatat irure esse voluptate amet sit aliquip est pariatur ut deserunt enim labore. Nulla occaecat cupidatat et ex amet qui esse. Eu ullamco adipisicing aliquip consectetur voluptate officia magna incididunt officia reprehenderit.\r\nNon id magna esse tempor commodo reprehenderit quis culpa dolore mollit cupidatat non. Ullamco sit aute consectetur aliquip et amet eu dolore dolor amet occaecat. Cillum labore cupidatat esse veniam irure dolor minim minim dolore excepteur do minim exercitation est. Tempor dolor Lorem ipsum cupidatat aliqua ea est velit excepteur excepteur anim magna esse consectetur. Labore fugiat laboris excepteur mollit qui esse aliquip aliqua tempor. Eiusmod magna eiusmod incididunt exercitation nostrud dolore consectetur sunt ullamco. Cillum aliquip et cillum officia est nostrud enim sit irure proident elit ipsum.\r\n", + "address": "3 Dean Street", + "city": "Freeburn", + "state": "Georgia", + "zip": 97509, + "country": "Sweden", + "email": "cranelawrence@scentric.com", + "phone": "(871) 449-2232", + "color": "rgb(249,221,142)" + }, + { + "index": 425, + "name": "Effie Witt", + "first": "Tamika", + "last": "Mcfarland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/quser/73.jpg", + "expanded": false, + "guid": "24996c53-4fce-4e30-9a15-01ad7f8a690e", + "integer": 72, + "date": "Sun Nov 03 1991 09:36:14 GMT-0800 (PST)", + "shortText": "dolore ullamco do dolor", + "mediumText": "Ad ex aliquip minim exercitation ex incididunt adipisicing sit sit aliqua. Laboris voluptate sint Lorem officia pariatur nostrud non amet ea consectetur esse. Amet aliqua id est irure minim duis nostrud laboris laborum reprehenderit. Ea anim proident nisi adipisicing dolor. Magna mollit do irure do veniam minim proident.", + "longText": "Laboris aute duis aliquip pariatur adipisicing irure adipisicing sunt irure commodo nulla occaecat amet veniam. Nostrud ex voluptate elit nulla voluptate culpa dolore excepteur. Qui ea ex adipisicing proident sint adipisicing ea. Nulla consequat enim et consequat ad ullamco magna anim tempor excepteur. Amet officia irure adipisicing in eiusmod minim eu sunt in veniam culpa. Quis eu aliqua proident in aute proident ea. Adipisicing occaecat laborum consectetur elit aute velit ullamco ad cillum ipsum non aliquip.\r\nCommodo qui incididunt deserunt enim excepteur ut fugiat. Consectetur aliquip incididunt est minim nostrud irure officia enim occaecat quis minim pariatur. Cillum aliquip commodo excepteur incididunt officia tempor ea occaecat in tempor magna.\r\n", + "address": "4 Homecrest Avenue", + "city": "Tioga", + "state": "New Mexico", + "zip": 47382, + "country": "Bolivia", + "email": "tamikamcfarland@scentric.com", + "phone": "(822) 428-3372", + "color": "rgb(123,143,247)" + }, + { + "index": 426, + "name": "Marissa Winters", + "first": "Bradford", + "last": "Tate", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maikelk/73.jpg", + "expanded": false, + "guid": "03ba235d-b8bd-446d-a82f-209ef1f02bc3", + "integer": 21, + "date": "Sat Feb 21 1987 11:19:00 GMT-0800 (PST)", + "shortText": "deserunt mollit", + "mediumText": "Velit non amet irure dolore nisi proident nisi.", + "longText": "Et ad occaecat ipsum amet aliquip sit nisi. Adipisicing ut esse dolore aliquip ut. Aliqua sunt anim ullamco voluptate eiusmod est et nulla amet duis voluptate enim elit. Ea consequat ea aliquip nulla enim in enim mollit ea consequat.\r\n", + "address": "3 Bush Street", + "city": "Trinway", + "state": "Arizona", + "zip": 66056, + "country": "Barbados", + "email": "bradfordtate@scentric.com", + "phone": "(895) 532-2566", + "color": "rgb(254,114,222)" + }, + { + "index": 427, + "name": "Keri Holt", + "first": "Pate", + "last": "Ford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ifarafonow/73.jpg", + "expanded": false, + "guid": "fe01b1c1-e14b-4167-92b2-6eef711b41a3", + "integer": 74, + "date": "Sun Jul 01 1979 19:51:30 GMT-0700 (PDT)", + "shortText": "eiusmod pariatur sunt sit", + "mediumText": "Tempor officia velit commodo aute laborum nostrud incididunt id id et. Esse cillum do deserunt sit tempor nisi ipsum sint proident sint. Aute officia esse voluptate pariatur ut. In consequat eiusmod exercitation nostrud reprehenderit et.", + "longText": "Voluptate pariatur eu eu voluptate enim cillum consequat proident pariatur esse est veniam. Qui nisi nulla laborum adipisicing irure occaecat. Mollit amet ullamco velit et reprehenderit amet. Ex ex quis do et anim fugiat exercitation nulla fugiat. Fugiat deserunt irure voluptate consequat reprehenderit Lorem sint ullamco. Ipsum non labore occaecat incididunt amet esse elit enim nostrud eu Lorem nisi.\r\nId culpa non enim aliquip dolore. Laborum nostrud minim deserunt excepteur exercitation voluptate eiusmod. Adipisicing pariatur occaecat voluptate reprehenderit aute. Aliquip incididunt non adipisicing veniam adipisicing occaecat do irure occaecat aliqua veniam laboris. Nulla veniam minim reprehenderit laboris in ut id nulla eiusmod dolor ut voluptate. Tempor enim nostrud ut velit eu cupidatat amet.\r\nAute ipsum ex nulla ut labore ex exercitation nulla anim. Pariatur sit voluptate reprehenderit enim amet. In duis sint excepteur anim proident elit proident non adipisicing exercitation aliquip. Reprehenderit occaecat duis ipsum eu et ad elit do sunt fugiat aliqua. Ea enim mollit dolore qui reprehenderit pariatur nostrud. Aliqua voluptate adipisicing ipsum occaecat cupidatat est do esse sunt enim aliquip sit adipisicing nulla.\r\nId ullamco amet ad deserunt. Pariatur duis ea excepteur proident ad cupidatat consectetur mollit et sint officia voluptate. Sunt et aliqua anim quis proident culpa cillum. Deserunt consequat dolore do anim eiusmod magna. Quis dolor adipisicing anim aliquip exercitation quis adipisicing. Culpa ipsum ea enim anim aliqua occaecat aliquip non reprehenderit dolor. Non proident labore enim est.\r\nProident reprehenderit sunt est aliqua. Dolor ex voluptate occaecat Lorem velit minim do voluptate aute in aliqua. Aute ut voluptate Lorem eu occaecat non deserunt nulla Lorem do minim magna. Duis sit nisi commodo aliquip enim pariatur. Cillum velit officia proident irure dolor.\r\n", + "address": "3 Aviation Road", + "city": "Baker", + "state": "Texas", + "zip": 94487, + "country": "Haiti", + "email": "pateford@scentric.com", + "phone": "(933) 513-2608", + "color": "rgb(74,250,221)" + }, + { + "index": 428, + "name": "Billie Dennis", + "first": "Noreen", + "last": "Chambers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ananya159/73.jpg", + "expanded": false, + "guid": "1277af24-5433-4c02-a123-9dbc3554824d", + "integer": 91, + "date": "Tue Jun 01 1999 05:28:24 GMT-0700 (PDT)", + "shortText": "anim consectetur minim esse", + "mediumText": "Sunt eu velit irure ipsum velit.", + "longText": "Culpa ipsum irure eiusmod et ad esse cillum. In ipsum qui dolor dolor. Ex deserunt incididunt duis exercitation quis est esse. Anim adipisicing ipsum aute qui mollit. Occaecat veniam excepteur velit nostrud cillum in nostrud ex magna ex.\r\nNostrud ipsum do deserunt ipsum consequat cupidatat elit fugiat duis duis consequat magna ea. Do labore ea do et cupidatat mollit et eiusmod. Exercitation exercitation aliqua ea irure duis. Lorem ipsum eu veniam ad nulla nisi ipsum in eu laborum pariatur ipsum cupidatat officia. Adipisicing pariatur velit commodo ipsum sint fugiat elit esse dolore ipsum ut exercitation officia excepteur.\r\n", + "address": "2 Jerome Street", + "city": "Fostoria", + "state": "District Of Columbia", + "zip": 51169, + "country": "Heard and McDonald Islands", + "email": "noreenchambers@scentric.com", + "phone": "(921) 600-2756", + "color": "rgb(240,228,68)" + }, + { + "index": 429, + "name": "Norris Henderson", + "first": "Rhea", + "last": "Velasquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/horaciobella/73.jpg", + "expanded": false, + "guid": "f6c07756-a3f1-410c-a912-acb877dca497", + "integer": 10, + "date": "Thu Jul 17 2008 11:56:06 GMT-0700 (PDT)", + "shortText": "adipisicing irure cillum", + "mediumText": "Sint duis irure cupidatat aliqua nostrud magna aliquip do do quis mollit occaecat.", + "longText": "Dolor et duis nisi est elit dolore amet enim et ad officia duis. Pariatur adipisicing aliquip reprehenderit exercitation qui occaecat consequat excepteur anim est do mollit amet. In eu eiusmod ea elit. Laborum duis culpa reprehenderit reprehenderit.\r\nOccaecat culpa aliquip elit sunt proident mollit ad reprehenderit occaecat consequat. Id pariatur commodo consectetur cillum laboris et dolor ea voluptate. Laborum magna nisi sunt eu ut mollit amet esse consectetur sunt. Est qui ea cillum excepteur ullamco velit excepteur in ea incididunt ipsum. Tempor reprehenderit velit non adipisicing dolore non nisi proident consequat sit. Nulla est incididunt sint proident do sunt ipsum adipisicing Lorem ad.\r\nNulla excepteur enim ipsum est. Dolor magna consequat ex magna nostrud duis eiusmod enim nulla reprehenderit esse fugiat irure amet. Et officia voluptate aliqua dolore fugiat voluptate nisi mollit occaecat ipsum qui. Fugiat sint magna et cillum aliqua cupidatat deserunt cupidatat aute laboris.\r\nEiusmod consequat ea aute cillum do enim quis commodo excepteur magna labore elit. Voluptate nisi velit dolore consequat elit irure fugiat. Sunt veniam ea enim ullamco esse excepteur quis voluptate excepteur Lorem nostrud amet. Ad commodo labore excepteur velit sunt ut. Ullamco consectetur esse voluptate eu minim deserunt nulla ipsum reprehenderit deserunt laborum.\r\nDuis adipisicing reprehenderit enim qui. Sit duis fugiat dolore consequat mollit incididunt irure ullamco proident quis minim qui ex irure. Est magna laboris magna minim aute excepteur commodo ullamco duis duis nulla sunt deserunt. Irure sunt ea do ipsum aliquip nisi nulla ex ex nostrud. Elit amet voluptate commodo id minim ut est ut minim adipisicing in. Eu nostrud anim irure do eu consectetur anim esse eiusmod officia laboris.\r\n", + "address": "2 Fillmore Place", + "city": "Castleton", + "state": "Virgin Islands", + "zip": 22826, + "country": "United States", + "email": "rheavelasquez@scentric.com", + "phone": "(801) 444-3966", + "color": "rgb(186,114,65)" + }, + { + "index": 430, + "name": "Carrillo Park", + "first": "Ola", + "last": "Allison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thatdesigner/73.jpg", + "expanded": false, + "guid": "3a544cbd-1319-4b62-b664-89f96dc2d58f", + "integer": 79, + "date": "Wed Feb 03 1999 14:08:18 GMT-0800 (PST)", + "shortText": "tempor", + "mediumText": "Id et eiusmod ad sunt laborum. Veniam magna veniam ea incididunt occaecat quis veniam et laboris aliquip ea Lorem ut. Eu officia incididunt eu veniam.", + "longText": "Voluptate reprehenderit nostrud non adipisicing ad ex enim. Id incididunt veniam pariatur ut id qui fugiat reprehenderit laboris consequat officia. Aliquip exercitation excepteur elit aliqua esse tempor nulla laborum.\r\nIn mollit reprehenderit irure duis cupidatat ad velit irure ad. Est et laborum non reprehenderit. Est elit non aliquip pariatur do dolore Lorem enim exercitation tempor. Amet culpa ut nostrud dolor fugiat.\r\nNon duis aliquip laboris consequat nisi sunt ad velit ipsum eu deserunt sit labore. Qui velit ipsum cupidatat ad irure nisi adipisicing eu. Reprehenderit deserunt cillum ut exercitation labore enim deserunt elit. Incididunt sint reprehenderit aliquip eiusmod consectetur quis ad pariatur ea dolor ea minim ex. Non labore labore amet excepteur aliquip amet anim do in eiusmod sunt laboris nisi. Est qui qui laboris veniam elit elit sunt in. Tempor commodo ex ea laborum.\r\nDolore dolore dolore labore velit fugiat commodo consectetur. Ullamco qui quis labore velit exercitation irure voluptate nulla duis occaecat. Ad quis ullamco magna occaecat esse dolore et id reprehenderit enim nisi commodo irure.\r\nFugiat proident deserunt nulla et pariatur ullamco do. Enim cillum nulla sint in laboris cillum excepteur anim irure ad sint laboris tempor nostrud. Enim pariatur amet sint non nisi commodo. Cupidatat qui incididunt sit labore ex enim Lorem aute excepteur veniam consequat nisi labore. Proident dolor excepteur aute et proident. Veniam excepteur veniam laboris deserunt sint.\r\n", + "address": "3 Noel Avenue", + "city": "Seymour", + "state": "Puerto Rico", + "zip": 59608, + "country": "Jamaica", + "email": "olaallison@scentric.com", + "phone": "(813) 560-2883", + "color": "rgb(206,102,76)" + }, + { + "index": 431, + "name": "Aileen Manning", + "first": "Sophia", + "last": "House", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/snaphappydad/73.jpg", + "expanded": false, + "guid": "832335a5-d05a-4d43-8c98-091dad23386f", + "integer": 82, + "date": "Fri Feb 17 2012 22:56:46 GMT-0800 (PST)", + "shortText": "amet est Lorem velit tempor", + "mediumText": "Cupidatat incididunt do aliqua velit occaecat officia occaecat amet occaecat Lorem veniam eu ipsum cillum. Amet esse aliqua in qui excepteur commodo veniam ut velit.", + "longText": "Officia esse consectetur proident consequat. Ex eiusmod cupidatat labore velit anim fugiat amet ipsum labore. Ut velit id ullamco occaecat et. Labore amet consequat excepteur adipisicing ut nisi dolore consectetur tempor veniam mollit reprehenderit quis. Esse ad irure elit et.\r\n", + "address": "3 Cove Lane", + "city": "Mappsville", + "state": "Maryland", + "zip": 46354, + "country": "Sao Tome and Principe", + "email": "sophiahouse@scentric.com", + "phone": "(829) 411-2721", + "color": "rgb(188,234,157)" + }, + { + "index": 432, + "name": "Angeline Welch", + "first": "Riggs", + "last": "Albert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cristianovalim/73.jpg", + "expanded": false, + "guid": "ff60a0af-9800-4828-beec-cc4ad3e7a4f5", + "integer": 75, + "date": "Wed Oct 28 1992 15:16:43 GMT-0800 (PST)", + "shortText": "laborum aliquip minim", + "mediumText": "Minim est qui proident deserunt nostrud commodo nisi non in veniam duis. Nisi minim aliqua cupidatat est dolore consequat nisi. Proident ut incididunt aute ea qui id reprehenderit veniam commodo.", + "longText": "Eu velit exercitation id amet. Incididunt eu nulla occaecat sunt pariatur culpa magna incididunt mollit id consectetur exercitation. Dolor pariatur voluptate aliquip quis aliquip anim amet qui commodo elit fugiat. Non dolore Lorem laboris voluptate voluptate ex anim eiusmod quis id magna proident.\r\nElit aliqua velit consequat velit laboris officia ut cillum mollit nulla culpa. Ut ea qui minim deserunt aliquip cillum ea proident duis. Laborum fugiat consequat ex magna irure proident reprehenderit officia consectetur fugiat excepteur laborum et. Est veniam non elit nisi minim. Ex sunt elit minim incididunt eu officia excepteur mollit nisi ad. Do est nisi magna et tempor culpa. Elit irure ex ut cillum ipsum ipsum ex esse dolor.\r\n", + "address": "4 Irvington Place", + "city": "Kempton", + "state": "Massachusetts", + "zip": 55149, + "country": "Belarus", + "email": "riggsalbert@scentric.com", + "phone": "(964) 471-3289", + "color": "rgb(143,144,152)" + }, + { + "index": 433, + "name": "Wilder Parks", + "first": "Guzman", + "last": "Gay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pmeissner/73.jpg", + "expanded": false, + "guid": "34d47442-340f-4017-a323-333b9d8966a7", + "integer": 46, + "date": "Sat May 01 1982 19:47:12 GMT-0700 (PDT)", + "shortText": "fugiat nisi fugiat", + "mediumText": "Lorem ipsum ipsum elit ad reprehenderit do culpa proident qui labore ea cillum tempor aute. Velit nisi anim excepteur commodo tempor. Id reprehenderit reprehenderit adipisicing exercitation aliqua ipsum dolore est cillum pariatur in quis est. Ad adipisicing irure qui ullamco eiusmod excepteur laborum.", + "longText": "Lorem id elit est velit veniam ullamco voluptate et do. Non ea ad minim Lorem in. Laborum amet enim magna et qui eu ullamco labore do minim in magna esse veniam. Incididunt nostrud nulla ut excepteur et et. Laborum labore qui adipisicing consectetur adipisicing incididunt excepteur Lorem eu nulla tempor ipsum. Ipsum labore dolore in qui irure pariatur proident laboris tempor ipsum culpa est ea cillum. Lorem sunt eu proident enim.\r\n", + "address": "4 Cumberland Street", + "city": "Enlow", + "state": "Oklahoma", + "zip": 93935, + "country": "Russian Federation", + "email": "guzmangay@scentric.com", + "phone": "(995) 459-2856", + "color": "rgb(54,118,212)" + }, + { + "index": 434, + "name": "Nash Valencia", + "first": "Leanne", + "last": "Stafford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akbarbobojonov/73.jpg", + "expanded": false, + "guid": "0594778f-1bb9-4338-88af-480e9dcce7ec", + "integer": 12, + "date": "Wed Aug 07 1985 09:48:17 GMT-0700 (PDT)", + "shortText": "exercitation", + "mediumText": "Incididunt commodo exercitation do eu laborum do fugiat aute dolore nostrud proident tempor. Aute laborum elit dolor sint aliquip mollit laboris tempor ea irure incididunt magna. Id aliquip sit do magna.", + "longText": "Consectetur voluptate duis cupidatat incididunt laborum. Magna non laboris reprehenderit duis consequat cupidatat aliquip ex aliquip pariatur. Adipisicing incididunt pariatur magna adipisicing amet dolore pariatur laboris nulla esse duis labore. Dolore est aute do do culpa pariatur. Consequat ea minim qui laborum culpa velit id fugiat nostrud sint. Ipsum irure cillum quis officia eu laboris.\r\nLorem ex duis eu deserunt minim cupidatat et non non et sunt. Pariatur ut culpa et non non voluptate ut velit sunt eu non. Cillum exercitation veniam nostrud est id laboris. Tempor do et consectetur reprehenderit ut dolor deserunt fugiat consectetur velit. Nulla elit deserunt dolor do cupidatat amet velit consectetur. Consectetur in nostrud sunt deserunt est aute cupidatat mollit aliquip sint cupidatat sit esse. Ut eu ut veniam sunt do proident cillum velit voluptate.\r\nCupidatat et aute tempor dolore. Aute exercitation sunt eiusmod ut consequat ut pariatur et excepteur. Tempor ea deserunt duis incididunt aute minim cupidatat veniam non elit.\r\nEiusmod occaecat culpa ipsum enim deserunt qui irure. Reprehenderit dolor quis dolor dolore culpa aliquip ipsum. Enim aliquip ullamco minim laboris do non laborum sint id incididunt voluptate. Do ea enim cupidatat deserunt ipsum nulla mollit ullamco laborum sint.\r\nElit minim et cupidatat voluptate aliqua proident mollit amet qui cupidatat. Enim cillum commodo consequat adipisicing dolore occaecat sit consectetur incididunt pariatur tempor. Ea eu do ea elit et.\r\n", + "address": "2 Hopkins Street", + "city": "Sunwest", + "state": "Ohio", + "zip": 99728, + "country": "Croatia (Hrvatska)", + "email": "leannestafford@scentric.com", + "phone": "(976) 400-2448", + "color": "rgb(172,121,148)" + }, + { + "index": 435, + "name": "Mann Lindsey", + "first": "Angelita", + "last": "Holland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pjnes/73.jpg", + "expanded": false, + "guid": "b158f0bc-58b6-497c-b8e9-827e2fd5adcb", + "integer": 86, + "date": "Tue Mar 30 1999 04:50:25 GMT-0800 (PST)", + "shortText": "nulla", + "mediumText": "Cupidatat sint laboris irure irure quis irure laborum anim ex aliquip ad. Ullamco anim cillum ex aliqua cillum reprehenderit ipsum exercitation ea non laborum nulla. Consectetur dolor duis anim irure duis dolor qui sint aliquip est pariatur ullamco.", + "longText": "Laboris minim commodo qui ad mollit non sunt laborum dolore irure ad dolore aliquip sit. Eu ullamco nulla magna velit non. Cupidatat nulla reprehenderit qui elit nisi mollit adipisicing anim. Irure laborum aute culpa nisi et voluptate esse minim.\r\nEt proident ipsum ex reprehenderit deserunt nostrud amet commodo nulla eu tempor culpa sit. Aute fugiat dolor commodo quis laboris nulla ea laboris. Et excepteur laborum aute et.\r\nPariatur et excepteur irure tempor duis consectetur nisi pariatur in ea ut commodo ad. Esse sint tempor qui consectetur ad nisi ut reprehenderit sit excepteur. Dolore mollit voluptate ipsum ad in aliqua nisi. Officia nulla aliquip tempor do culpa velit. Ut Lorem non cillum ipsum. Qui exercitation non velit elit quis voluptate ipsum adipisicing occaecat minim. Est consectetur duis minim irure reprehenderit.\r\nVoluptate deserunt duis ut elit ut cillum officia nulla sint do. Elit deserunt est mollit mollit et ullamco dolore. Amet consequat pariatur cupidatat velit. Eiusmod elit qui mollit nisi ipsum enim. Ullamco eu commodo est consequat. Voluptate excepteur adipisicing ad sit velit duis enim fugiat et sit nisi veniam ipsum occaecat.\r\nAnim exercitation mollit ullamco sunt pariatur excepteur anim exercitation velit ex enim fugiat. Ullamco excepteur ex sint nulla laboris qui anim sunt nisi. Esse ea exercitation dolore adipisicing. Quis amet aute consequat occaecat officia ea nulla.\r\n", + "address": "3 Williamsburg Street", + "city": "Hiwasse", + "state": "Nevada", + "zip": 20139, + "country": "Indonesia", + "email": "angelitaholland@scentric.com", + "phone": "(939) 494-2894", + "color": "rgb(245,81,217)" + }, + { + "index": 436, + "name": "Herring Barry", + "first": "Fanny", + "last": "Mills", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/balintorosz/73.jpg", + "expanded": false, + "guid": "80d4034b-37c2-4d36-8a84-8902d6dbd1e8", + "integer": 7, + "date": "Thu Feb 26 1987 04:22:07 GMT-0800 (PST)", + "shortText": "culpa veniam laborum", + "mediumText": "Eu culpa qui cillum nulla occaecat irure proident laboris. Enim Lorem eiusmod minim magna ea eu reprehenderit eu ea nulla aute. Et in laborum aliqua consectetur consectetur aute sint velit fugiat dolore.", + "longText": "Minim ea magna laboris commodo in fugiat qui non reprehenderit. Sint tempor labore qui ullamco nisi tempor consequat tempor quis. Aute dolore minim nulla magna ut ex commodo mollit dolor ipsum dolor. Eu eu labore deserunt et occaecat excepteur consectetur cupidatat mollit nisi.\r\nTempor aute culpa sit occaecat consequat. Culpa ullamco proident aliquip labore. Reprehenderit pariatur aute fugiat irure adipisicing sint anim anim occaecat adipisicing labore ipsum deserunt consectetur. Voluptate eiusmod eu pariatur proident nostrud sint labore. Sit adipisicing ipsum proident non incididunt mollit minim labore elit nulla elit et occaecat.\r\nSit culpa veniam id minim minim dolore elit culpa ut enim est. Ex adipisicing deserunt ex officia commodo sit nostrud labore aute est sit. Elit eu sint consequat cillum deserunt eu anim nostrud reprehenderit cupidatat occaecat consequat. Sint anim est ullamco non sint dolore excepteur.\r\n", + "address": "2 Grand Avenue", + "city": "Gasquet", + "state": "Montana", + "zip": 88459, + "country": "Nauru", + "email": "fannymills@scentric.com", + "phone": "(961) 418-2958", + "color": "rgb(207,161,63)" + }, + { + "index": 437, + "name": "Davenport Knowles", + "first": "Carol", + "last": "Acevedo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/martinhn/73.jpg", + "expanded": false, + "guid": "20017740-0bff-43ce-a66b-b139bdd82fdf", + "integer": 10, + "date": "Sat Aug 12 1989 13:36:36 GMT-0700 (PDT)", + "shortText": "tempor fugiat ex do", + "mediumText": "Culpa quis minim eiusmod veniam ullamco cupidatat velit dolore cillum aute duis reprehenderit. Enim cupidatat dolore qui ex dolor magna mollit amet adipisicing dolor.", + "longText": "Voluptate ex duis culpa est ullamco magna ullamco id. Magna ullamco aliquip anim laborum velit deserunt consectetur sunt irure. Anim nulla ullamco veniam sint ex culpa eu minim dolor excepteur. Adipisicing ex tempor duis ea. Labore enim pariatur dolore irure et elit ad ipsum exercitation mollit aliqua deserunt. Minim labore ea dolor duis tempor veniam id incididunt occaecat non incididunt dolor sit.\r\nLaboris voluptate duis deserunt aute sunt et voluptate proident est nulla. Labore aute esse est nisi in excepteur laborum irure. Fugiat sint qui esse excepteur duis qui do labore. Non incididunt elit nulla ex officia cupidatat elit culpa id aliqua. Ex aute esse ex reprehenderit. Veniam excepteur aliquip irure laborum eiusmod. Elit qui sunt mollit dolor non fugiat est qui nostrud est do consequat aute officia.\r\nConsequat occaecat incididunt enim excepteur nostrud dolor amet duis ea irure sit. Veniam et reprehenderit labore officia ex ipsum officia consequat voluptate. Incididunt duis commodo deserunt aute deserunt dolore sunt Lorem. Veniam non ea laborum mollit aliquip qui eu fugiat duis. Fugiat id sunt aute mollit elit sit incididunt veniam tempor. Consectetur pariatur consectetur labore et non et commodo qui mollit minim enim esse. Et proident elit minim est occaecat.\r\nDo aliquip excepteur nulla elit. Laboris consequat do officia veniam laboris. Non quis velit velit ipsum sint amet ut aliqua quis laboris est pariatur ut officia. Eu esse consequat irure dolore quis in sit. Labore ipsum minim ad ut voluptate ea non. In voluptate magna esse est elit voluptate labore irure minim aliqua velit laborum et nulla. Ipsum nostrud est consequat tempor velit culpa sint fugiat dolor.\r\nLorem esse aliqua cillum excepteur labore proident ipsum dolor enim ut aliquip laboris ut. Ullamco aliqua pariatur enim dolore est irure. Quis nisi officia mollit nostrud consectetur pariatur ad id adipisicing aute laboris qui reprehenderit tempor. Nulla non nostrud excepteur duis excepteur quis. Ex do voluptate sit Lorem ea irure eu velit culpa.\r\n", + "address": "2 Lincoln Terrace", + "city": "Eggertsville", + "state": "California", + "zip": 49607, + "country": "Ireland", + "email": "carolacevedo@scentric.com", + "phone": "(873) 489-2712", + "color": "rgb(215,231,234)" + }, + { + "index": 438, + "name": "Sonia Moses", + "first": "Patel", + "last": "Thompson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/73.jpg", + "expanded": false, + "guid": "e3a9a23d-000c-47aa-8039-4fce46c5565c", + "integer": 26, + "date": "Sun Jan 13 1991 10:21:14 GMT-0800 (PST)", + "shortText": "enim tempor ea", + "mediumText": "Deserunt consectetur velit proident ipsum aute sunt ullamco incididunt consequat aliqua sit mollit. Sit deserunt minim eu laborum quis cupidatat nulla id sit esse ea ad amet.", + "longText": "Dolor anim incididunt ullamco esse qui occaecat in dolore Lorem. Nisi eiusmod laboris ullamco quis consequat pariatur et cupidatat ad exercitation. In eu cillum occaecat amet tempor cillum. Exercitation id ullamco mollit non. Eiusmod culpa reprehenderit consectetur officia officia ad elit adipisicing est ut ea. Fugiat dolor nostrud occaecat consequat elit nulla ex. Ullamco pariatur incididunt nisi voluptate consequat deserunt proident exercitation ad labore ad.\r\nExcepteur tempor dolor eu duis Lorem deserunt elit ipsum. Cillum velit dolor esse Lorem commodo. Sint cupidatat ex deserunt voluptate adipisicing eiusmod sit proident aliqua excepteur. Consequat cillum irure sint ex reprehenderit incididunt est.\r\nCommodo minim cupidatat voluptate aliqua laborum deserunt sint elit nisi officia sit nostrud. Lorem exercitation laborum mollit adipisicing quis. Ad officia nisi cillum consequat non sunt sunt. Nulla id labore ut qui deserunt aute officia voluptate dolor laboris laboris reprehenderit do. Irure esse Lorem labore enim culpa eu amet ut aliquip esse exercitation elit. Nulla do id anim exercitation commodo pariatur nostrud incididunt aliquip irure. Deserunt ea do velit veniam duis culpa aliqua elit consequat amet aliqua qui.\r\nAliquip et nostrud tempor occaecat amet nulla duis non amet. Ipsum mollit mollit tempor nostrud sint aliqua ea aliquip non pariatur esse nulla cillum magna. Adipisicing excepteur Lorem cillum nisi sint magna laboris do ipsum aliquip eiusmod veniam ullamco.\r\n", + "address": "2 Prescott Place", + "city": "Norwood", + "state": "Marshall Islands", + "zip": 70002, + "country": "Luxembourg", + "email": "patelthompson@scentric.com", + "phone": "(883) 472-3011", + "color": "rgb(207,132,88)" + }, + { + "index": 439, + "name": "Gabrielle Black", + "first": "Holmes", + "last": "Valentine", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vovkasolovev/73.jpg", + "expanded": false, + "guid": "4bc9e815-0354-4c95-b76c-945cd74c26d0", + "integer": 40, + "date": "Mon May 10 2010 09:38:40 GMT-0700 (PDT)", + "shortText": "Lorem", + "mediumText": "Eiusmod velit ea exercitation voluptate qui labore voluptate amet proident. Ullamco nulla cupidatat id in anim. Cupidatat nisi culpa nostrud laboris aute labore sunt elit in mollit aliquip. Incididunt incididunt consequat aliqua ullamco velit.", + "longText": "Consequat sint ad reprehenderit nisi quis aliqua laborum sint elit pariatur labore magna officia. Occaecat culpa do laboris amet mollit ex velit. Proident fugiat sint laborum nostrud aute ex in veniam fugiat. Adipisicing velit ex non aliqua ex amet ex adipisicing enim consequat mollit occaecat irure cillum. Ad eu eiusmod cupidatat consectetur commodo laborum duis in sit labore laborum cillum. Enim qui cupidatat amet non fugiat.\r\nPariatur mollit consequat eiusmod consectetur labore velit cupidatat mollit sit nostrud laborum. Aliquip occaecat sunt aute occaecat exercitation enim quis excepteur amet id. Ullamco sunt est consequat do voluptate. Incididunt do anim do voluptate do ut deserunt minim enim non. Occaecat proident aute officia fugiat do sint in reprehenderit. Duis incididunt labore nisi laboris reprehenderit tempor non adipisicing enim ad pariatur commodo consectetur minim.\r\nTempor elit est et esse. Sit sint culpa laborum id et cupidatat qui cupidatat. Veniam veniam pariatur dolore ipsum quis officia aliquip eiusmod amet aliqua occaecat tempor laboris irure. Aute in pariatur cillum irure. Fugiat in nisi Lorem sit sint amet amet. Proident eu voluptate irure ipsum cupidatat aliquip cupidatat tempor ea labore enim. Cupidatat duis velit irure eiusmod pariatur reprehenderit eu excepteur enim nostrud mollit commodo.\r\nVelit mollit Lorem enim ullamco nostrud exercitation. Enim occaecat Lorem aliquip nulla velit fugiat. Ullamco voluptate non fugiat non minim voluptate velit. Duis dolor laborum qui est enim ut. Nulla reprehenderit esse ea nisi sit et non nulla voluptate laboris ullamco. Labore in fugiat esse culpa dolor duis anim sunt duis do sint officia non. Laborum dolor pariatur consequat ullamco fugiat.\r\n", + "address": "3 Pleasant Place", + "city": "Fairforest", + "state": "Indiana", + "zip": 30882, + "country": "Afghanistan", + "email": "holmesvalentine@scentric.com", + "phone": "(990) 581-2101", + "color": "rgb(140,238,67)" + }, + { + "index": 440, + "name": "Lakisha Cross", + "first": "Pena", + "last": "Compton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/urbanjahvier/73.jpg", + "expanded": false, + "guid": "cd35d1ad-004f-43fa-a754-2ab807d0ab4d", + "integer": 1, + "date": "Mon Feb 27 2012 17:16:59 GMT-0800 (PST)", + "shortText": "adipisicing anim velit esse", + "mediumText": "Dolor excepteur non id laboris. Consectetur in duis sint labore duis ut. Consequat elit adipisicing amet cillum non tempor pariatur.", + "longText": "Ipsum non enim aliqua culpa velit enim deserunt proident laboris sunt. Sunt esse officia qui est ut ad cillum eu est cupidatat Lorem proident incididunt. Officia duis culpa duis in exercitation irure officia quis aliquip. Tempor nulla consequat exercitation eu nulla.\r\nEu enim labore excepteur proident. Commodo aliqua Lorem aute dolore ullamco ipsum mollit exercitation veniam. Labore enim veniam ea aliquip esse non id aliqua aliquip nostrud aliquip eu voluptate. Do reprehenderit velit proident ad occaecat sit dolor. Occaecat proident tempor aute nisi ipsum commodo dolore ipsum labore do laborum ea in. Non esse ut qui anim sint cupidatat amet est in consequat aliqua eiusmod. Reprehenderit consectetur amet commodo incididunt do amet laboris.\r\nVeniam magna consequat consequat eiusmod aliqua nulla commodo aliquip magna aute. Excepteur culpa ea consectetur sint velit sunt nulla Lorem ex. Irure in amet cupidatat duis occaecat pariatur.\r\nUt commodo laboris incididunt amet exercitation consectetur adipisicing eu. Aliqua in ex cillum Lorem reprehenderit cillum esse non ut cupidatat. Dolore et dolore duis exercitation sunt fugiat. Irure commodo eiusmod est fugiat ipsum anim ullamco ut. Duis amet duis non sint. Fugiat excepteur dolore et aliqua veniam aute elit mollit sit eu. Eiusmod dolore in magna voluptate reprehenderit pariatur non qui in qui Lorem ipsum.\r\nConsequat mollit tempor do sunt Lorem do est reprehenderit. Lorem aliqua culpa irure duis laborum non ut elit ad. Ad ipsum cillum nisi est aute nisi ad et. Aliquip voluptate voluptate elit amet in laboris fugiat. Non voluptate amet ut cillum exercitation veniam. Ea Lorem nostrud aliquip ex.\r\n", + "address": "4 Belvidere Street", + "city": "Whitestone", + "state": "Tennessee", + "zip": 30601, + "country": "St. Pierre and Miquelon", + "email": "penacompton@scentric.com", + "phone": "(979) 573-3861", + "color": "rgb(191,149,118)" + }, + { + "index": 441, + "name": "Concetta Whitaker", + "first": "Lora", + "last": "Mccarthy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/betraydan/73.jpg", + "expanded": false, + "guid": "4527d6de-ed39-4b47-8916-33b23feda2f9", + "integer": 64, + "date": "Tue Jul 24 2012 12:23:04 GMT-0700 (PDT)", + "shortText": "voluptate", + "mediumText": "Id pariatur aliqua ea id id duis qui sint mollit commodo.", + "longText": "Incididunt voluptate do id labore. Voluptate aliqua tempor quis anim magna quis pariatur et quis voluptate dolor occaecat. In veniam commodo sunt quis consectetur non minim. Laboris velit fugiat aliqua deserunt nostrud amet sint ad Lorem Lorem cupidatat cillum. Ullamco enim minim et eu non Lorem eu laborum magna duis velit esse reprehenderit laboris. Ad enim irure dolor laboris excepteur fugiat exercitation occaecat commodo aliqua ex.\r\nMinim ex est culpa ipsum cupidatat ullamco exercitation cupidatat exercitation veniam cillum. Proident enim elit cupidatat sunt aliqua non minim officia. Laboris veniam laboris id cillum labore occaecat quis cupidatat velit excepteur aute nostrud est anim. Non do ut dolore veniam dolor labore reprehenderit sunt velit officia.\r\n", + "address": "4 Remsen Avenue", + "city": "Northridge", + "state": "Palau", + "zip": 32997, + "country": "Montserrat", + "email": "loramccarthy@scentric.com", + "phone": "(878) 505-2614", + "color": "rgb(124,101,157)" + }, + { + "index": 442, + "name": "Tammie Juarez", + "first": "Liza", + "last": "Daniel", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justme_timothyg/73.jpg", + "expanded": false, + "guid": "0ed69dca-4d57-43c4-835b-b4f0d9654df4", + "integer": 11, + "date": "Sun Jul 08 2012 11:35:08 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Culpa nulla aliqua nulla adipisicing reprehenderit. Labore nisi non dolore deserunt ut elit anim ullamco ullamco eiusmod cupidatat. Nisi proident qui culpa deserunt velit aliquip cillum deserunt tempor exercitation dolore eu. Do non anim aliquip id dolore anim velit qui ut sunt consequat deserunt. Eiusmod ea proident culpa exercitation enim occaecat.", + "longText": "Minim ex labore Lorem eiusmod laboris voluptate irure est. Dolore occaecat excepteur commodo ullamco deserunt irure cillum. Nisi nostrud in sint sunt excepteur culpa sunt do eu aute deserunt. Irure pariatur proident sit proident exercitation ex aute aliquip eiusmod est Lorem adipisicing laborum officia. Aute consectetur dolor occaecat incididunt cillum eiusmod culpa anim cupidatat est exercitation est. Sunt culpa quis cillum et sint dolor pariatur enim non nostrud dolore sunt proident do.\r\nQui enim do qui aliqua velit ullamco irure culpa aliqua adipisicing velit in tempor aute. Amet consectetur officia do elit. Aute laborum esse ullamco dolore id ullamco velit Lorem. Fugiat dolore et velit velit ut.\r\nSunt non anim veniam proident id est magna ullamco exercitation consequat est. Laborum culpa eiusmod non eu ipsum occaecat excepteur minim occaecat velit magna. Voluptate aliquip tempor do excepteur est enim. Do tempor laboris ut laborum in tempor Lorem occaecat dolore. Est id veniam dolore dolor eiusmod enim ea adipisicing fugiat ad nostrud ullamco ex. Occaecat nisi et ea eiusmod duis Lorem labore enim non veniam labore.\r\nMagna occaecat dolor nisi sint est magna magna tempor sunt. Minim amet sunt exercitation incididunt ea dolore tempor tempor magna pariatur aliqua. Mollit amet et in veniam. Reprehenderit do ut cupidatat incididunt. Eu anim Lorem laboris qui cillum officia amet aute minim magna proident officia.\r\n", + "address": "2 Friel Place", + "city": "Waverly", + "state": "Virginia", + "zip": 15976, + "country": "Norway", + "email": "lizadaniel@scentric.com", + "phone": "(837) 444-2117", + "color": "rgb(169,145,105)" + }, + { + "index": 443, + "name": "Bettie Osborne", + "first": "Daugherty", + "last": "Randolph", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justinteractive/73.jpg", + "expanded": false, + "guid": "3d66fd94-2bfe-43f5-9b83-14c609449f27", + "integer": 7, + "date": "Sat Jan 20 2007 20:48:29 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Veniam quis ea ipsum adipisicing quis excepteur proident laboris fugiat id reprehenderit aute occaecat.", + "longText": "Sunt anim reprehenderit eu in sit culpa enim. Magna voluptate pariatur fugiat commodo fugiat ad voluptate ipsum ut elit ullamco dolor amet. Ut cupidatat consectetur velit velit est labore. Ex cillum ad duis excepteur irure officia eiusmod labore in culpa exercitation duis anim non. Deserunt ullamco consequat tempor tempor incididunt esse laboris.\r\nProident ex dolor anim laboris aliqua velit sit est. Aute aute velit eiusmod non irure nostrud pariatur anim tempor pariatur ipsum labore do. Lorem laborum ipsum minim eu nulla minim ullamco culpa in ex velit veniam aliqua cillum. Exercitation aliquip sit proident nostrud. Dolor ipsum aute nulla Lorem dolore amet dolor nisi enim irure.\r\nIpsum deserunt cupidatat ea nisi anim aliquip et excepteur pariatur nisi dolor. Quis exercitation ea pariatur eiusmod. Sint qui Lorem eu velit aute.\r\n", + "address": "3 Utica Avenue", + "city": "Glenbrook", + "state": "Wyoming", + "zip": 52525, + "country": "Guam", + "email": "daughertyrandolph@scentric.com", + "phone": "(978) 484-3479", + "color": "rgb(158,76,101)" + }, + { + "index": 444, + "name": "Valenzuela Swanson", + "first": "Buckner", + "last": "Dawson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/psdesignuk/73.jpg", + "expanded": false, + "guid": "4fe81672-768e-44ba-b3d5-c57fbb9c3507", + "integer": 27, + "date": "Mon Feb 03 1975 20:36:41 GMT-0800 (PST)", + "shortText": "fugiat fugiat", + "mediumText": "Eiusmod eu elit do in occaecat dolor consectetur non mollit. Officia eiusmod consectetur veniam laboris consequat velit commodo exercitation tempor officia commodo. Voluptate elit Lorem elit non elit. Dolor consequat exercitation cillum labore do cillum irure exercitation. Lorem et irure velit eiusmod sit ut.", + "longText": "Amet enim eiusmod anim culpa non ipsum dolor deserunt adipisicing fugiat. Ut irure ipsum et incididunt veniam proident ex veniam. Magna eu dolor do minim elit culpa labore. Commodo non amet qui nisi nisi anim ex. Sit ipsum nulla fugiat ea exercitation duis in sint ex ea. Minim est ut minim in laboris est esse culpa minim pariatur exercitation ex. Ex voluptate sint sunt velit in adipisicing.\r\n", + "address": "4 Bridge Street", + "city": "Byrnedale", + "state": "Colorado", + "zip": 22776, + "country": "Gibraltar", + "email": "bucknerdawson@scentric.com", + "phone": "(822) 533-3432", + "color": "rgb(72,149,99)" + }, + { + "index": 445, + "name": "Bernice Hood", + "first": "Dionne", + "last": "Russo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teclaro/73.jpg", + "expanded": false, + "guid": "604ff26f-12a6-4e76-bbcc-b8004c60fc12", + "integer": 25, + "date": "Sat Sep 15 2001 19:47:51 GMT-0700 (PDT)", + "shortText": "id commodo aute eu", + "mediumText": "Aliquip ut proident ad consequat proident velit magna. Non excepteur Lorem labore et fugiat quis laboris anim ut fugiat tempor consectetur laborum aute. Ullamco dolor nulla esse nisi aliquip fugiat fugiat dolor.", + "longText": "Elit ipsum voluptate laborum veniam cillum reprehenderit aliqua quis incididunt id excepteur. Reprehenderit qui fugiat nostrud quis. Ad nostrud amet do quis pariatur laborum in reprehenderit. Irure ipsum qui aute deserunt deserunt amet adipisicing eu dolor minim. Ad dolor aliquip quis sit nulla culpa nulla commodo aliqua non. Proident enim consequat elit tempor ut non est. Qui aliquip dolor ut consequat officia reprehenderit ea minim nisi cillum irure.\r\nCillum eu nisi consequat ipsum est aliqua cillum ad et laborum. Lorem incididunt occaecat ex ullamco et nostrud sint elit proident sunt adipisicing eu quis. Voluptate mollit sit sunt ad velit nisi commodo cupidatat. Nisi tempor nostrud minim magna id occaecat aliquip aute.\r\nEiusmod elit sit adipisicing reprehenderit nisi eiusmod incididunt eiusmod laboris mollit mollit do. Do aliqua adipisicing nostrud eu voluptate. Officia ut aliquip excepteur aute consequat sit pariatur amet id dolor.\r\nMagna cillum aliquip laborum anim aliquip in officia excepteur id dolore excepteur nostrud ullamco commodo. Excepteur enim anim esse occaecat quis cupidatat consectetur. Reprehenderit tempor fugiat laborum labore fugiat eiusmod quis.\r\n", + "address": "2 Verona Place", + "city": "Connerton", + "state": "Utah", + "zip": 18395, + "country": "Hungary", + "email": "dionnerusso@scentric.com", + "phone": "(890) 461-3250", + "color": "rgb(229,252,247)" + }, + { + "index": 446, + "name": "Schneider Small", + "first": "West", + "last": "Buckner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eyronn/73.jpg", + "expanded": false, + "guid": "4fdfdfc4-3a77-47b8-acab-91a565572331", + "integer": 44, + "date": "Fri Jul 16 2004 09:13:39 GMT-0700 (PDT)", + "shortText": "sunt esse Lorem", + "mediumText": "Irure dolor minim dolore voluptate ut laborum Lorem nostrud nostrud voluptate nisi sunt culpa. Proident pariatur sit id occaecat do qui reprehenderit laboris exercitation qui ad.", + "longText": "Labore nostrud consequat laboris amet do sint pariatur. Commodo incididunt amet reprehenderit laboris enim eu nostrud ea velit. In nisi proident ullamco in deserunt elit labore. Irure exercitation ipsum officia sint magna tempor do et sit.\r\nMollit nulla aliquip pariatur excepteur dolore sint ipsum mollit qui consectetur id. In amet laborum ea deserunt duis ipsum dolor magna aliquip non ea reprehenderit proident. Excepteur labore dolore reprehenderit elit. Est commodo esse est ea. Amet cupidatat exercitation eiusmod id sit.\r\nAliqua dolor anim est in esse ex id ad incididunt mollit occaecat ad sint. Lorem dolore ipsum ad amet cillum excepteur sint anim pariatur. Ipsum consectetur irure dolore fugiat duis anim id. Esse non est id mollit quis proident qui ex labore sit. Consequat mollit veniam nisi irure cupidatat nostrud.\r\n", + "address": "2 Fuller Place", + "city": "Felt", + "state": "Idaho", + "zip": 83579, + "country": "Kenya", + "email": "westbuckner@scentric.com", + "phone": "(972) 592-3400", + "color": "rgb(90,160,183)" + }, + { + "index": 447, + "name": "Jones Fields", + "first": "Trujillo", + "last": "Morales", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gulian/73.jpg", + "expanded": false, + "guid": "c09e1f92-8061-47f3-a5ae-13fe4589613e", + "integer": 97, + "date": "Wed Feb 14 2007 05:02:54 GMT-0800 (PST)", + "shortText": "tempor laborum commodo nostrud", + "mediumText": "Cillum nulla veniam ipsum exercitation nulla dolor anim in amet. Velit proident excepteur nisi et minim anim incididunt sit. Et sit eu eu est anim nulla. Ex consectetur fugiat cupidatat eiusmod in commodo cupidatat irure.", + "longText": "Aute ex exercitation nulla pariatur eu. Labore veniam amet voluptate occaecat consectetur consectetur nostrud laborum. Sit consequat nulla tempor culpa minim labore exercitation laboris incididunt sint. Dolor nisi quis id ullamco eu qui non ullamco esse amet irure dolor aute non. Ex exercitation irure ad laboris eiusmod non minim non anim ex in magna.\r\nCommodo ullamco excepteur culpa cillum incididunt. Ad nostrud est aliqua officia. Aliqua et laboris incididunt est. Irure reprehenderit ea ut minim culpa.\r\n", + "address": "3 Goodwin Place", + "city": "Lacomb", + "state": "Arkansas", + "zip": 64762, + "country": "Honduras", + "email": "trujillomorales@scentric.com", + "phone": "(908) 595-3540", + "color": "rgb(252,248,234)" + }, + { + "index": 448, + "name": "Ester Weber", + "first": "Eve", + "last": "Bonner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/drebbits/73.jpg", + "expanded": false, + "guid": "daccfe7a-2e90-4485-b570-2ea85b7b196f", + "integer": 29, + "date": "Wed Aug 08 1979 00:51:20 GMT-0700 (PDT)", + "shortText": "qui", + "mediumText": "Magna dolore commodo aute ad excepteur ex proident non veniam proident irure dolore adipisicing deserunt. Anim mollit velit laboris velit labore pariatur. Non amet qui ut magna.", + "longText": "Cupidatat ea sit dolor eu sit tempor culpa magna. Ipsum excepteur nulla elit sit laboris dolor commodo. Deserunt aliquip officia minim sunt non sunt. Elit tempor consequat ullamco irure in ullamco. Ad do adipisicing sunt nisi eu veniam aliquip anim.\r\nAute ullamco incididunt dolore mollit fugiat deserunt adipisicing occaecat cupidatat sunt aute. Velit excepteur ullamco excepteur incididunt velit. Do adipisicing aute sint commodo qui adipisicing aliqua incididunt mollit. Adipisicing consectetur nulla consequat sunt nulla est sunt anim consequat ipsum ad dolor.\r\n", + "address": "4 Furman Avenue", + "city": "Devon", + "state": "Delaware", + "zip": 13560, + "country": "Eritrea", + "email": "evebonner@scentric.com", + "phone": "(993) 461-3721", + "color": "rgb(220,194,238)" + }, + { + "index": 449, + "name": "Jaclyn Bright", + "first": "Christy", + "last": "Graham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alexhaniotis/73.jpg", + "expanded": false, + "guid": "3d5752b1-b775-4866-9151-376be7d53cdd", + "integer": 47, + "date": "Fri Oct 07 1994 14:59:41 GMT-0700 (PDT)", + "shortText": "ut minim in laboris officia", + "mediumText": "Esse mollit ad sunt incididunt labore dolore exercitation nostrud commodo minim nisi sit. Enim tempor tempor veniam culpa laboris incididunt sunt ex magna fugiat. Quis veniam adipisicing est sunt proident aliquip enim commodo sunt duis sint est nulla Lorem.", + "longText": "Sint aliquip qui aliqua ipsum magna eiusmod non ea exercitation non duis cupidatat officia. Proident esse mollit culpa excepteur irure consectetur consequat amet ipsum sit ut officia amet. Deserunt non in qui sit aliquip et irure et commodo mollit esse ullamco consequat. Commodo ea mollit incididunt ex anim labore sint eu sint sunt deserunt commodo irure ex. Magna reprehenderit voluptate anim commodo et excepteur amet nulla sint. Qui laboris qui et veniam eiusmod pariatur voluptate eiusmod ea occaecat cillum dolore velit magna.\r\nNostrud in esse est tempor minim ex fugiat qui Lorem. Non enim tempor amet consequat pariatur irure voluptate enim aliqua tempor exercitation. Lorem reprehenderit et deserunt velit deserunt pariatur elit et consectetur irure. Culpa velit aliquip sit sunt adipisicing exercitation. Eiusmod mollit consequat laboris non nostrud pariatur laborum quis anim consectetur veniam amet culpa esse. Consequat irure aute commodo incididunt tempor elit aliqua est reprehenderit sunt ex veniam id.\r\nProident eu cillum est eiusmod sint quis in eiusmod occaecat adipisicing quis tempor adipisicing ea. Adipisicing reprehenderit exercitation eu reprehenderit elit cupidatat nostrud pariatur. Veniam officia quis Lorem magna reprehenderit esse ipsum minim quis laborum reprehenderit.\r\n", + "address": "3 Kathleen Court", + "city": "Groveville", + "state": "Federated States Of Micronesia", + "zip": 97417, + "country": "Tajikistan", + "email": "christygraham@scentric.com", + "phone": "(943) 493-3287", + "color": "rgb(201,124,187)" + }, + { + "index": 450, + "name": "Burton Valdez", + "first": "Aurora", + "last": "Morse", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/twahlin/73.jpg", + "expanded": false, + "guid": "7ea797c6-ef0a-49c2-b043-2ca76a30e148", + "integer": 66, + "date": "Mon Jul 09 1984 05:20:31 GMT-0700 (PDT)", + "shortText": "officia", + "mediumText": "Nulla ut eiusmod consequat sunt est proident mollit elit laboris nulla ex Lorem tempor culpa.", + "longText": "Laborum labore ad cupidatat fugiat laborum proident mollit elit Lorem elit. Voluptate ex magna voluptate ex incididunt eiusmod dolor anim sit. Aliquip sint reprehenderit officia ex irure veniam aliquip laborum eu exercitation magna veniam enim. Minim culpa Lorem et sit. Velit aute elit et incididunt do velit mollit qui.\r\n", + "address": "2 Sheffield Avenue", + "city": "Sheatown", + "state": "Guam", + "zip": 73715, + "country": "Brunei Darussalam", + "email": "auroramorse@scentric.com", + "phone": "(866) 493-3254", + "color": "rgb(60,132,78)" + }, + { + "index": 451, + "name": "Sharpe Mccall", + "first": "Leanna", + "last": "Day", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ntfblog/73.jpg", + "expanded": false, + "guid": "241e6ae2-b23e-44bc-b8ed-aeb9d50f0395", + "integer": 7, + "date": "Sun Oct 27 2002 01:07:01 GMT-0700 (PDT)", + "shortText": "sit", + "mediumText": "Commodo commodo nostrud deserunt nostrud velit tempor culpa exercitation occaecat. Officia officia fugiat consectetur deserunt eu sunt ullamco commodo elit veniam nostrud dolore. Aute duis occaecat nisi culpa nulla laborum deserunt aliquip irure.", + "longText": "Qui do ex nostrud qui officia velit. Quis laborum aute nulla sint excepteur magna nisi est eu. Commodo qui id ex pariatur est sit. Do quis mollit minim consectetur exercitation. Elit reprehenderit labore minim laboris laborum adipisicing incididunt adipisicing. Ad reprehenderit enim reprehenderit sit.\r\nIpsum veniam nulla et enim. Consectetur sint laborum voluptate nulla non non eiusmod. Incididunt laborum voluptate voluptate cupidatat amet minim culpa sint laborum commodo. Ad mollit ea culpa sit fugiat.\r\nEx ex incididunt eu dolore laboris duis culpa duis magna eu minim sint. Ea sunt sunt mollit ut voluptate duis. Magna sit irure voluptate Lorem tempor consectetur eu aute sunt eiusmod deserunt laboris anim. Ut aliqua irure pariatur cillum eiusmod Lorem cupidatat qui mollit laborum excepteur irure. Officia voluptate aute officia incididunt deserunt velit enim sint anim mollit aliqua deserunt. Excepteur dolor irure sint quis nulla ipsum sint duis consectetur. Eiusmod id cillum exercitation veniam in anim tempor velit id culpa in.\r\nLabore amet non culpa ea in ullamco duis dolore cillum commodo laborum. In et elit ex aliqua commodo labore dolor proident et mollit. Dolor Lorem deserunt ipsum adipisicing sunt enim nulla ullamco. Enim ullamco ea irure sit elit cillum reprehenderit mollit voluptate enim aliquip ad officia.\r\nLaborum eiusmod esse sit excepteur duis. Quis magna cillum proident tempor qui ex sunt amet ex cillum id elit. Lorem sit cillum exercitation eu reprehenderit ea ex. Fugiat commodo irure elit est esse labore laboris do ullamco dolor. Adipisicing excepteur et culpa occaecat. Ea aute et deserunt quis laborum eiusmod et exercitation mollit excepteur duis nulla.\r\n", + "address": "2 Sapphire Street", + "city": "Delco", + "state": "Pennsylvania", + "zip": 99885, + "country": "Macedonia", + "email": "leannaday@scentric.com", + "phone": "(926) 463-2373", + "color": "rgb(219,81,203)" + }, + { + "index": 452, + "name": "Richmond Clayton", + "first": "Sherrie", + "last": "Robertson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/commoncentssss/73.jpg", + "expanded": false, + "guid": "dd129f81-2042-434a-9563-8047b70bad0a", + "integer": 45, + "date": "Sat Apr 07 2001 06:49:07 GMT-0700 (PDT)", + "shortText": "in", + "mediumText": "Adipisicing excepteur ad proident id veniam consectetur sit.", + "longText": "Amet commodo do aliquip ipsum sunt dolor id magna officia officia commodo minim. Qui duis occaecat in cillum ipsum pariatur excepteur officia velit incididunt exercitation irure mollit quis. Et cillum id velit elit et fugiat qui nisi officia incididunt voluptate cupidatat duis. Ut fugiat dolore eiusmod non ad aliquip labore sit proident. Duis amet aliqua deserunt commodo do anim quis elit excepteur. Sunt dolore magna dolore enim labore minim do enim anim officia cupidatat cupidatat. Aliqua anim veniam tempor sit incididunt quis ex ex laboris reprehenderit Lorem.\r\nExercitation irure tempor proident culpa. Ut enim culpa nulla ipsum consectetur enim eu dolor fugiat occaecat pariatur ex. Fugiat aliqua anim veniam aliquip irure nostrud adipisicing id. Tempor laborum enim excepteur ipsum dolore pariatur anim sit id qui duis duis sit duis. Dolore deserunt do est irure consectetur consequat ea aliqua veniam enim qui Lorem. Ipsum et nulla eiusmod Lorem et id anim aliquip. Velit mollit dolor non ullamco do aliqua qui mollit excepteur qui amet.\r\n", + "address": "4 Opal Court", + "city": "Dawn", + "state": "New Hampshire", + "zip": 25154, + "country": "French Polynesia", + "email": "sherrierobertson@scentric.com", + "phone": "(950) 518-2372", + "color": "rgb(116,89,161)" + }, + { + "index": 453, + "name": "Small Church", + "first": "Sylvia", + "last": "Terrell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anissa_anwar/73.jpg", + "expanded": false, + "guid": "5653dcb2-2ec5-4de9-93a5-534b963da42d", + "integer": 32, + "date": "Sat Mar 10 2001 07:02:05 GMT-0800 (PST)", + "shortText": "velit et non in sint", + "mediumText": "Commodo aute irure cillum laboris aliquip aute aliqua consequat qui esse do Lorem deserunt adipisicing. Velit esse nulla in do ut aliquip proident ut qui occaecat reprehenderit nisi. Velit tempor eu non in officia cupidatat fugiat culpa. Proident nostrud irure cupidatat quis enim nisi reprehenderit qui deserunt tempor eiusmod cupidatat nulla. Proident exercitation esse sint esse sunt qui ad magna eu do magna esse sunt nulla.", + "longText": "Consequat proident id laboris id labore ipsum officia officia non consectetur dolore esse cupidatat. In commodo et amet qui in et exercitation non eiusmod dolore sunt nostrud. Non quis fugiat Lorem amet voluptate excepteur. Proident officia labore aliquip sunt Lorem ex nulla fugiat incididunt. In dolore aute enim esse cupidatat commodo cupidatat commodo ipsum nulla. Officia dolore dolore eu reprehenderit.\r\nAd occaecat consequat adipisicing do eiusmod voluptate proident. Eu dolore aute aliqua cillum enim incididunt non adipisicing ipsum laborum sunt Lorem Lorem. Ex ad excepteur occaecat quis aliqua do nostrud irure in sunt aliqua amet. Commodo ea voluptate sit mollit nisi excepteur reprehenderit incididunt. Do cillum aliquip in eu.\r\n", + "address": "2 Wolcott Street", + "city": "Salix", + "state": "North Dakota", + "zip": 11231, + "country": "Bahamas", + "email": "sylviaterrell@scentric.com", + "phone": "(823) 424-2163", + "color": "rgb(216,232,199)" + }, + { + "index": 454, + "name": "Alyson Dudley", + "first": "Mckay", + "last": "Holmes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/btrig/73.jpg", + "expanded": false, + "guid": "c1a70e93-2f1c-402a-aafb-f66c1441b471", + "integer": 36, + "date": "Fri May 18 2001 01:24:33 GMT-0700 (PDT)", + "shortText": "veniam ipsum ullamco", + "mediumText": "Sunt culpa in consectetur tempor consectetur non eu ex elit aliquip incididunt eu cillum quis. Dolor laborum pariatur nulla nostrud culpa quis dolor ipsum deserunt fugiat non amet non. Magna sint sint ea voluptate nostrud consequat labore elit.", + "longText": "Enim ex consequat quis proident ipsum commodo labore dolore esse fugiat. Commodo sit eu ullamco incididunt ipsum. Qui officia eiusmod adipisicing dolor exercitation. Laborum occaecat proident deserunt dolore labore est in. Exercitation enim sunt reprehenderit est est. Ullamco dolor laborum ea quis aute aliqua.\r\nNulla sint in aliqua do minim aliqua voluptate enim deserunt occaecat esse excepteur. Qui est veniam proident anim fugiat velit qui aliqua eiusmod proident mollit. Qui velit est in consectetur ad esse consequat aute laborum. Amet cupidatat cupidatat et amet.\r\nDeserunt qui labore veniam irure eiusmod ad nisi anim non aliqua culpa ea consequat ea. Id sunt mollit minim qui sunt consequat in aliquip eu consectetur. Et nostrud velit excepteur in magna dolor elit. Reprehenderit nisi enim dolor amet ipsum in voluptate veniam voluptate consectetur aliquip. Quis sint duis ut dolor ea. Magna deserunt sunt aute quis veniam laboris aute ea ex velit irure cupidatat.\r\nQui qui labore voluptate velit ad eu mollit sit cillum non exercitation cillum aliqua. Quis tempor consectetur eiusmod aliqua id. Qui duis elit ut do nisi nostrud et ullamco mollit. Labore officia fugiat nisi dolore. Adipisicing in voluptate aliquip occaecat mollit anim pariatur occaecat sint aliqua. Anim esse adipisicing aliqua tempor sit elit deserunt sunt. Eiusmod consectetur anim ipsum est elit laborum magna consectetur id aliquip Lorem.\r\n", + "address": "3 Walker Court", + "city": "Wattsville", + "state": "Northern Mariana Islands", + "zip": 63152, + "country": "Palau", + "email": "mckayholmes@scentric.com", + "phone": "(951) 589-2723", + "color": "rgb(163,183,107)" + }, + { + "index": 455, + "name": "Curry Webb", + "first": "Sheena", + "last": "Wilkerson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ug_rick/73.jpg", + "expanded": false, + "guid": "5fdb3b33-e4f6-42fd-9ef8-f5187a85f89a", + "integer": 86, + "date": "Sat Jun 12 1976 02:00:05 GMT-0700 (PDT)", + "shortText": "labore laborum", + "mediumText": "Nostrud nisi incididunt quis enim esse proident aliquip laboris. Velit officia quis amet cillum sint pariatur aliqua velit eiusmod. Adipisicing in nisi qui duis anim dolor laborum esse aute est ex amet sit.", + "longText": "Pariatur magna sit reprehenderit sint est non velit sint veniam. Laboris qui labore esse consequat tempor ut elit elit aliquip dolor duis tempor velit cupidatat. Consequat duis fugiat id excepteur. Duis veniam laboris est ut pariatur ullamco reprehenderit elit irure. Aute elit excepteur officia pariatur labore. Commodo sit officia ullamco reprehenderit sit exercitation ad consequat.\r\nEsse nostrud voluptate anim Lorem aute do tempor cupidatat do adipisicing magna commodo et dolore. Quis eiusmod velit est in laborum sit. Elit veniam ipsum id dolor. Labore eiusmod ex anim amet. Do velit cillum velit voluptate nostrud sint consequat ipsum ullamco do eiusmod sint. Reprehenderit minim reprehenderit et sunt aliqua nisi sint magna mollit aliquip. Esse esse labore minim cillum ut cupidatat dolor incididunt proident dolor.\r\nVoluptate aute anim commodo occaecat non voluptate magna. Laboris do quis laborum qui cillum qui commodo amet minim consectetur voluptate. Labore anim tempor sint ut. Tempor nisi sit officia Lorem.\r\nMinim consectetur ex velit nulla occaecat id sunt. Veniam laboris cupidatat reprehenderit ullamco eiusmod. Cupidatat velit non nulla amet aliqua fugiat aute ullamco nisi aliqua adipisicing exercitation quis proident. Ut ullamco dolor pariatur nisi excepteur occaecat commodo proident nisi minim est consequat.\r\nOccaecat aliquip duis duis deserunt cupidatat sint. Anim id et dolore labore nostrud ad Lorem sunt pariatur ad adipisicing. Qui enim nostrud officia adipisicing voluptate ea in nisi duis velit consectetur. Ut nisi voluptate dolor quis est anim in fugiat. Eu tempor dolore reprehenderit ut est aliqua elit in non velit velit. In adipisicing ullamco minim laboris incididunt enim voluptate ea minim sint dolor ut laborum amet. Aliquip est ut ipsum veniam.\r\n", + "address": "4 Lee Avenue", + "city": "Chamberino", + "state": "South Dakota", + "zip": 13592, + "country": "Tuvalu", + "email": "sheenawilkerson@scentric.com", + "phone": "(879) 403-2513", + "color": "rgb(118,194,142)" + }, + { + "index": 456, + "name": "Christian Snyder", + "first": "Lawanda", + "last": "Bradford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/blakestevenson/73.jpg", + "expanded": false, + "guid": "bfb51aa2-d989-470d-97e5-64f04272b0ec", + "integer": 77, + "date": "Sat Jul 05 2014 23:12:53 GMT-0700 (PDT)", + "shortText": "quis ex et", + "mediumText": "Consectetur sit veniam excepteur Lorem commodo.", + "longText": "Qui dolor ut ipsum ex fugiat deserunt irure fugiat. Nisi anim culpa est non adipisicing ullamco dolore aute ex occaecat minim. Occaecat reprehenderit aliqua aute fugiat veniam officia cillum quis nostrud minim ullamco velit officia. Lorem ex labore magna qui velit commodo anim dolore veniam dolor et reprehenderit.\r\nDolor ad irure esse tempor commodo ullamco adipisicing dolore amet magna aliqua enim adipisicing. Laboris irure culpa est excepteur mollit magna consectetur id aliquip magna. Occaecat commodo elit pariatur reprehenderit eiusmod labore. Nisi aliquip minim est labore quis fugiat. Minim nulla Lorem dolore nostrud reprehenderit nulla mollit incididunt anim adipisicing.\r\n", + "address": "4 Newport Street", + "city": "Indio", + "state": "Alaska", + "zip": 48616, + "country": "Liechtenstein", + "email": "lawandabradford@scentric.com", + "phone": "(888) 481-3858", + "color": "rgb(247,122,60)" + }, + { + "index": 457, + "name": "Contreras Jenkins", + "first": "Lester", + "last": "Garrett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karalek/73.jpg", + "expanded": false, + "guid": "0618babd-91c3-4050-8bf8-5d1f94383568", + "integer": 14, + "date": "Fri Mar 31 1972 00:34:05 GMT-0800 (PST)", + "shortText": "commodo aliqua", + "mediumText": "Ullamco commodo consequat id officia duis duis amet quis incididunt consectetur consequat laboris ex dolore. Aliquip dolore cupidatat sit aliqua dolore sit irure reprehenderit anim nulla adipisicing est. Cupidatat et fugiat minim exercitation eiusmod est esse eiusmod proident.", + "longText": "Qui cillum ipsum amet adipisicing veniam Lorem ullamco. Aute ea sunt veniam nisi laboris cupidatat officia minim. Consectetur deserunt cupidatat fugiat deserunt mollit mollit. Elit magna consequat qui tempor in non velit ea cillum tempor non. Consectetur est mollit aliqua adipisicing elit cillum consequat duis enim. Reprehenderit in et dolor nulla duis.\r\nEsse cillum Lorem veniam officia voluptate eu tempor. Consectetur dolore fugiat proident duis ullamco dolore occaecat dolore sit. Consequat commodo fugiat dolor minim elit elit laborum elit do. Exercitation occaecat exercitation cillum eu occaecat sit sit magna voluptate dolor aliqua ad commodo esse. Cillum fugiat excepteur sunt incididunt nisi.\r\nLabore aute eiusmod aute ullamco sunt sint nisi aute laboris reprehenderit duis qui incididunt labore. Sint occaecat sint id esse. Consectetur pariatur minim proident do magna mollit veniam dolore commodo et officia adipisicing commodo pariatur. Consequat eu id pariatur occaecat eu nostrud proident enim eu. Id cillum consequat aliquip reprehenderit. Adipisicing Lorem eu et veniam aliquip pariatur commodo culpa anim adipisicing commodo labore. Qui adipisicing incididunt in eiusmod.\r\n", + "address": "4 Morton Street", + "city": "Yonah", + "state": "Louisiana", + "zip": 53661, + "country": "Virgin Islands (US)", + "email": "lestergarrett@scentric.com", + "phone": "(972) 517-3113", + "color": "rgb(239,120,56)" + }, + { + "index": 458, + "name": "Holly Jackson", + "first": "Susie", + "last": "Watkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elusiveanmol/73.jpg", + "expanded": false, + "guid": "2a001ee1-bb06-41ce-ba9b-334ce428a78e", + "integer": 45, + "date": "Tue Aug 24 1993 08:13:13 GMT-0700 (PDT)", + "shortText": "qui ex deserunt veniam enim", + "mediumText": "Dolore deserunt proident ex non ullamco amet esse cillum adipisicing adipisicing tempor sunt dolore. Amet mollit velit enim qui elit nostrud duis quis duis deserunt ut quis minim incididunt. Proident duis laboris sunt esse laborum duis officia esse irure esse. Cupidatat incididunt labore pariatur mollit. Sint officia aliquip adipisicing sint id et officia nulla.", + "longText": "Officia labore fugiat tempor sint est labore aliqua quis nisi labore adipisicing. Deserunt occaecat occaecat cupidatat occaecat. Minim consequat nisi non reprehenderit tempor. Irure nulla minim veniam laboris ut duis adipisicing. Occaecat culpa cillum magna sint nisi sit ex. Reprehenderit quis aliqua officia ipsum dolor irure nulla ipsum ex.\r\nIpsum proident esse tempor in ut proident reprehenderit reprehenderit fugiat pariatur reprehenderit cillum. Ipsum ipsum velit labore id do sint. Ea velit tempor cillum officia qui elit id excepteur. Fugiat laboris amet ullamco et dolor. Enim ut id fugiat qui. Sunt anim pariatur nisi fugiat ex. In ipsum nulla officia ipsum ex aliquip ad cupidatat aliqua amet adipisicing anim in amet.\r\nMagna pariatur nisi occaecat veniam reprehenderit esse dolor aliqua culpa labore. Elit do aliquip est magna culpa officia id pariatur id commodo non officia incididunt proident. Quis consequat laborum consectetur nostrud magna amet irure do irure ipsum culpa reprehenderit. Exercitation elit magna irure mollit cillum velit ullamco tempor ex.\r\nIpsum mollit reprehenderit elit aliqua nulla laborum dolor voluptate commodo ipsum laboris. Elit ut enim tempor elit nisi tempor ipsum. Ullamco velit incididunt elit aliqua amet commodo amet dolore dolore fugiat id.\r\n", + "address": "3 Beard Street", + "city": "Sterling", + "state": "Missouri", + "zip": 70724, + "country": "Svalbard and Jan Mayen Islands", + "email": "susiewatkins@scentric.com", + "phone": "(837) 537-2963", + "color": "rgb(172,67,201)" + }, + { + "index": 459, + "name": "Josefina Gonzales", + "first": "Erickson", + "last": "Bennett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shoo7830/73.jpg", + "expanded": false, + "guid": "88320e02-8633-4df8-a096-8b6cd39d0786", + "integer": 31, + "date": "Tue Jul 27 2010 06:12:05 GMT-0700 (PDT)", + "shortText": "proident nostrud", + "mediumText": "Cupidatat officia duis do sunt veniam voluptate exercitation. Ea excepteur tempor magna fugiat Lorem adipisicing dolor sit amet sunt aute laboris. Ea sunt fugiat ad commodo amet elit elit minim nostrud occaecat magna. Incididunt ea do id id laboris magna do ea. Eu duis amet cupidatat proident culpa deserunt.", + "longText": "Lorem ipsum culpa voluptate labore consectetur reprehenderit anim duis fugiat anim consequat tempor officia. Occaecat culpa tempor ad ea excepteur ad enim incididunt. Adipisicing commodo elit nisi magna incididunt. Ea est occaecat et dolor reprehenderit fugiat est id dolore. Culpa commodo ullamco est voluptate ad mollit sunt deserunt. Pariatur tempor excepteur laborum ex ea ea consectetur enim ut ad sunt nulla.\r\n", + "address": "4 Malbone Street", + "city": "Eagletown", + "state": "Kentucky", + "zip": 72696, + "country": "Ethiopia", + "email": "ericksonbennett@scentric.com", + "phone": "(937) 528-2434", + "color": "rgb(132,110,89)" + }, + { + "index": 460, + "name": "Sybil Boyle", + "first": "Rosetta", + "last": "Joseph", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/oanacr/73.jpg", + "expanded": false, + "guid": "3cf8b3eb-9567-4dbe-ad09-b792ef4b7f81", + "integer": 86, + "date": "Thu Aug 06 1992 04:15:43 GMT-0700 (PDT)", + "shortText": "reprehenderit", + "mediumText": "Consectetur irure ut minim proident laboris. Ea est et mollit voluptate aliquip qui enim incididunt nisi magna sunt tempor nulla. Pariatur officia id velit laborum quis id tempor cillum aliquip dolore sunt eiusmod enim. Elit id cillum occaecat sit exercitation fugiat eiusmod fugiat sunt cillum. Incididunt magna aliqua cupidatat fugiat voluptate nostrud voluptate.", + "longText": "Qui sunt irure veniam occaecat commodo sint labore nostrud qui do mollit. Non enim anim elit aute incididunt. Voluptate qui ullamco in sit cillum consectetur voluptate commodo. Non laboris anim minim anim nisi duis consectetur ad aute nisi nostrud. Id quis dolor consequat consequat nostrud ullamco dolore enim labore ipsum ipsum do voluptate aute.\r\nNisi dolor dolor elit veniam sint nisi eu officia incididunt ut labore elit id eu. Fugiat magna ex esse consectetur excepteur occaecat deserunt eiusmod ullamco ullamco do incididunt. Labore ad anim occaecat ullamco pariatur proident duis commodo. Quis reprehenderit consectetur exercitation fugiat dolor anim laboris dolor eu cupidatat adipisicing adipisicing Lorem. Ad voluptate officia pariatur ipsum Lorem ex aute sit non officia officia sint. Veniam aliqua labore ut enim in incididunt sit aute culpa magna officia ex officia nisi.\r\nNostrud incididunt consectetur nulla voluptate pariatur qui excepteur amet incididunt cupidatat culpa laboris sint. Sunt Lorem aute proident in velit ipsum. Magna fugiat veniam excepteur esse eiusmod sint cillum aute deserunt. Mollit magna quis excepteur in ex irure sit ea proident magna enim.\r\nConsectetur nisi culpa mollit eu in do consectetur sunt ad aliqua. Esse laboris adipisicing Lorem aute reprehenderit Lorem excepteur nisi id cupidatat aliqua cupidatat occaecat sit. Lorem Lorem ad ullamco quis reprehenderit nostrud elit enim ullamco incididunt. Culpa tempor consectetur exercitation velit consequat consequat dolore excepteur elit qui tempor est excepteur.\r\n", + "address": "4 Harman Street", + "city": "Sylvanite", + "state": "American Samoa", + "zip": 13569, + "country": "Togo", + "email": "rosettajoseph@scentric.com", + "phone": "(981) 470-3813", + "color": "rgb(209,237,158)" + }, + { + "index": 461, + "name": "Case Decker", + "first": "Santos", + "last": "Rice", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elamyr/73.jpg", + "expanded": false, + "guid": "bf49a638-bbff-435c-9756-52b76f67815d", + "integer": 66, + "date": "Tue Apr 29 2003 07:40:21 GMT-0700 (PDT)", + "shortText": "ullamco aliqua sunt fugiat", + "mediumText": "Mollit Lorem exercitation cupidatat occaecat eiusmod qui. Magna et reprehenderit labore in. Excepteur ad enim aliqua aute ullamco cupidatat esse. Officia quis qui sunt nisi ipsum eu deserunt nulla fugiat magna sunt et quis pariatur. Voluptate cillum nostrud aliqua minim nulla minim dolore labore magna.", + "longText": "Laboris amet irure aute ipsum anim irure quis elit Lorem enim non id officia. Qui quis fugiat do esse. Eiusmod anim quis magna deserunt labore proident ullamco consequat cupidatat velit laboris ut aute. Quis excepteur ullamco officia ad reprehenderit. Irure occaecat reprehenderit ad consequat id laborum amet nisi tempor eu laboris. Irure sit cillum proident occaecat in ipsum. Quis esse officia sunt sunt anim ullamco ad amet ullamco Lorem.\r\nReprehenderit excepteur est officia consequat ea cupidatat excepteur sunt id ad adipisicing occaecat magna minim. Exercitation quis irure nostrud irure eiusmod laborum pariatur fugiat commodo id velit culpa reprehenderit id. Commodo mollit aute esse laboris fugiat pariatur mollit voluptate nulla. Commodo esse proident anim aliqua et duis exercitation cupidatat incididunt est laborum incididunt laborum. Aliqua est aute qui ullamco sunt ut cillum commodo cupidatat. Est sint est id consectetur ad duis duis culpa fugiat sit sit id aute. Dolor occaecat non cillum amet proident cupidatat laboris.\r\nIn sit non nostrud labore laboris commodo sit ea nisi commodo irure reprehenderit nostrud reprehenderit. Nostrud ad velit enim magna esse adipisicing. Labore occaecat anim irure magna sit duis ullamco exercitation ipsum mollit. Laboris irure ipsum occaecat ea anim id sunt irure deserunt eu et. Incididunt ex fugiat Lorem aliquip. Anim ea duis duis aliquip ex. Qui Lorem officia cillum nisi irure Lorem.\r\n", + "address": "3 Suydam Street", + "city": "Waumandee", + "state": "Minnesota", + "zip": 74848, + "country": "Zimbabwe", + "email": "santosrice@scentric.com", + "phone": "(890) 599-3600", + "color": "rgb(95,54,177)" + }, + { + "index": 462, + "name": "Snider Monroe", + "first": "Jensen", + "last": "Atkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hmenchaca2/73.jpg", + "expanded": false, + "guid": "f24bb864-fe55-4bd6-9144-5bc756f08b1c", + "integer": 74, + "date": "Mon Sep 14 1981 09:51:33 GMT-0700 (PDT)", + "shortText": "eu", + "mediumText": "Laboris proident ullamco ipsum ea ullamco non minim id dolore ad labore. Culpa cillum nostrud deserunt ea in sunt eu ex. Est ullamco sint nulla irure anim velit in. Do sint id exercitation labore do adipisicing.", + "longText": "Non labore culpa laborum fugiat nostrud sunt labore id duis ullamco aliquip exercitation sint. Ex nisi duis nostrud consequat occaecat. Cupidatat dolore occaecat do ea ut ex amet duis mollit magna et commodo aliquip fugiat. Nostrud ut tempor est voluptate sunt enim. Labore commodo consequat ad fugiat.\r\nAute consequat enim ut esse laboris excepteur est nisi laboris veniam esse veniam Lorem Lorem. Aliquip aliquip laboris sit quis. Lorem id ipsum et eiusmod aliqua tempor ipsum cupidatat Lorem anim ipsum aute do consectetur.\r\n", + "address": "3 Boerum Street", + "city": "Crucible", + "state": "Hawaii", + "zip": 89416, + "country": "Azerbaijan", + "email": "jensenatkins@scentric.com", + "phone": "(839) 445-3763", + "color": "rgb(116,98,175)" + }, + { + "index": 463, + "name": "Calderon Pugh", + "first": "Monroe", + "last": "Travis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dparrelli/73.jpg", + "expanded": false, + "guid": "c9c9f502-618c-4896-b09e-c4d5fb42384c", + "integer": 81, + "date": "Sat Jan 21 1978 16:37:46 GMT-0800 (PST)", + "shortText": "commodo aliqua ullamco mollit excepteur", + "mediumText": "Consequat et ad nulla id velit officia aliqua nulla eu anim sit magna. Enim in ad Lorem consequat amet nisi magna pariatur in in proident esse mollit sit.", + "longText": "In ut dolore enim ullamco non culpa ea voluptate. Enim Lorem est labore magna reprehenderit laboris amet aliqua sint eiusmod cupidatat amet. Non sit eu quis minim ut. Ex mollit qui aliqua quis adipisicing consectetur esse adipisicing sunt ex tempor. Ad mollit in laboris amet occaecat cupidatat eiusmod id. Aliqua sint pariatur proident ad laboris consequat nostrud quis dolore laborum. Excepteur ipsum ea veniam minim dolore nostrud veniam et voluptate cupidatat elit.\r\nEnim laborum dolore ullamco veniam. Mollit nostrud eu occaecat eu qui laborum sit reprehenderit excepteur amet magna tempor sunt et. Nostrud pariatur qui reprehenderit Lorem amet ullamco sint sint commodo cupidatat est sint officia ea. Ut ut dolore eiusmod magna occaecat incididunt minim consequat quis dolor et duis sunt.\r\n", + "address": "3 Hawthorne Street", + "city": "Coalmont", + "state": "Alabama", + "zip": 60080, + "country": "French Southern Territories", + "email": "monroetravis@scentric.com", + "phone": "(806) 479-3754", + "color": "rgb(93,63,172)" + }, + { + "index": 464, + "name": "Colleen Haley", + "first": "Conley", + "last": "Stanley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/okansurreel/73.jpg", + "expanded": false, + "guid": "05acd8c3-414b-4b60-ac92-b0b7eba4e0c3", + "integer": 42, + "date": "Mon Mar 02 2009 03:09:26 GMT-0800 (PST)", + "shortText": "enim ad", + "mediumText": "Esse tempor voluptate aliqua culpa laborum pariatur cillum sint reprehenderit adipisicing. Elit esse anim sint duis voluptate nostrud culpa proident esse fugiat Lorem velit ut. Nostrud officia dolore voluptate proident eu ex consequat ipsum ad velit nisi laborum ea. Laboris in consequat elit et in ut. Qui ex ea reprehenderit sit dolor eiusmod minim deserunt.", + "longText": "Est dolor Lorem consequat excepteur excepteur nisi enim velit. Tempor velit veniam tempor cillum ea dolore est deserunt anim ex. Enim non id proident officia fugiat amet laborum veniam ullamco dolor est consequat incididunt occaecat. Enim culpa qui ipsum est. Amet sunt consectetur reprehenderit aute excepteur quis consequat minim tempor ullamco.\r\nEt ad aute non ut magna mollit sunt dolore laborum. Elit voluptate anim mollit est consequat officia laborum ad officia eu. Irure quis qui ipsum pariatur commodo commodo proident amet deserunt ut ea officia voluptate elit. Nulla Lorem voluptate commodo minim veniam dolore irure nulla excepteur ipsum eu pariatur. Ipsum amet commodo velit cillum. Laborum esse enim laboris sit esse labore quis proident sint officia ea Lorem.\r\nEnim quis enim consectetur elit ex duis. Tempor culpa labore excepteur mollit ea enim non reprehenderit fugiat elit laborum ea. Occaecat dolore excepteur adipisicing incididunt excepteur esse fugiat pariatur ut labore id consequat aliqua sunt. Elit est irure nisi labore quis magna consequat eiusmod culpa voluptate fugiat excepteur pariatur Lorem. Laboris magna irure consequat enim incididunt consectetur aute. Amet aliquip occaecat laboris ea. Fugiat ea non qui culpa pariatur quis nostrud commodo.\r\nDolore non do dolor culpa enim. Elit reprehenderit voluptate cupidatat fugiat. Aute enim occaecat nostrud cillum commodo mollit voluptate in esse labore fugiat. In nulla sit ullamco nisi velit. Et nostrud qui dolore ad laboris excepteur minim esse quis qui pariatur irure eu exercitation. Commodo labore in ex sint occaecat sint id esse reprehenderit commodo voluptate. Enim nostrud anim id velit id officia laborum deserunt laboris nostrud.\r\nNon excepteur exercitation eiusmod dolor laborum nulla laborum irure adipisicing id. Lorem cillum aliqua eu enim exercitation. Proident incididunt irure exercitation amet ad occaecat.\r\n", + "address": "2 Knapp Street", + "city": "Shindler", + "state": "North Carolina", + "zip": 55329, + "country": "Finland", + "email": "conleystanley@scentric.com", + "phone": "(887) 439-2117", + "color": "rgb(90,231,64)" + }, + { + "index": 465, + "name": "Barry Andrews", + "first": "Leona", + "last": "Nash", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lwilsonsmith/73.jpg", + "expanded": false, + "guid": "d6109791-de8e-41c5-9d94-00e69ae0b6e5", + "integer": 45, + "date": "Sun Jan 10 2010 12:46:09 GMT-0800 (PST)", + "shortText": "laborum", + "mediumText": "Commodo eiusmod do fugiat nostrud laborum id incididunt nulla. Tempor amet nostrud commodo id occaecat veniam. Ad ea eu eiusmod minim nostrud deserunt adipisicing reprehenderit ut ea occaecat.", + "longText": "Pariatur ea veniam fugiat officia incididunt aliquip occaecat commodo. Enim anim officia aliquip eu. Occaecat nostrud veniam laboris in Lorem excepteur laboris laborum duis laboris incididunt. Eu proident incididunt sint nostrud reprehenderit esse duis exercitation et ipsum exercitation consectetur aliquip Lorem.\r\nAdipisicing non nisi consectetur est consectetur ullamco enim dolore. Commodo eu Lorem consectetur esse. Cillum eiusmod incididunt exercitation elit labore duis esse. Adipisicing occaecat aliquip adipisicing pariatur laborum aute laboris velit incididunt amet. Nulla aliqua id ex velit consequat ex mollit minim Lorem. Irure anim ad laboris ullamco minim et consectetur adipisicing sunt sint in.\r\nEx magna excepteur esse consequat ex commodo commodo. Commodo non incididunt consequat consequat mollit duis quis Lorem non adipisicing pariatur incididunt ex nulla. Ex ut in laboris labore consequat mollit. Sint ex minim adipisicing velit cupidatat id anim excepteur nostrud consectetur proident. Commodo minim eiusmod veniam pariatur laboris cupidatat. Labore ullamco consequat velit ad consequat occaecat et tempor dolore ut sint esse ullamco amet.\r\nQui officia laborum laborum laborum. Ipsum Lorem ipsum sunt tempor exercitation dolore. Dolore reprehenderit do sit nulla dolor ea incididunt do id esse. Consectetur nulla enim ipsum velit reprehenderit non irure non.\r\n", + "address": "4 Highland Avenue", + "city": "Innsbrook", + "state": "Connecticut", + "zip": 62850, + "country": "United Arab Emirates", + "email": "leonanash@scentric.com", + "phone": "(892) 484-3082", + "color": "rgb(232,187,145)" + }, + { + "index": 466, + "name": "Lynette Shepard", + "first": "Walls", + "last": "Baxter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/klimmka/73.jpg", + "expanded": false, + "guid": "f477123a-40c0-4cb9-8d64-cbf4c127e7bf", + "integer": 54, + "date": "Tue May 06 2008 02:57:35 GMT-0700 (PDT)", + "shortText": "officia ea ullamco", + "mediumText": "Do deserunt aute duis non proident commodo occaecat do reprehenderit eu aliqua est aliqua dolor. Culpa do laboris eiusmod do eiusmod enim irure ex nostrud. Dolor eiusmod enim pariatur duis non sunt quis dolor. Cupidatat aliqua ut cillum adipisicing non. Eiusmod labore in aliquip dolore magna cillum aliqua mollit irure.", + "longText": "Sunt consequat eiusmod qui irure ex excepteur culpa. Consectetur nostrud exercitation aliquip ex dolore quis. Mollit esse et non cupidatat proident eu voluptate et dolor pariatur fugiat. Amet qui ut quis do voluptate eu dolor enim tempor adipisicing.\r\nExercitation laboris pariatur deserunt laborum irure tempor ullamco id sit adipisicing nisi enim. Do amet consectetur ullamco culpa laborum dolor ut amet sit. Exercitation magna incididunt consectetur laborum excepteur. Laboris tempor ad sint esse ipsum irure culpa eiusmod labore cillum ad fugiat magna magna. Quis ut magna labore sunt laborum nostrud excepteur exercitation aliqua do aliqua velit esse pariatur. Aliqua Lorem qui proident aliqua culpa voluptate non officia.\r\nIncididunt do sunt ex dolor aute ut anim nisi nisi et fugiat. Id pariatur do aliqua ullamco fugiat eu irure reprehenderit ea sint excepteur. Minim aliquip culpa ea nulla aliqua id pariatur culpa ut deserunt magna. Laboris eiusmod ad eu fugiat id adipisicing occaecat qui tempor culpa aute ipsum in. Ea sit veniam dolore consectetur non cupidatat velit fugiat cillum. Cillum labore id labore fugiat consequat consequat cillum laboris amet velit adipisicing ipsum pariatur. Pariatur in irure ipsum consectetur laborum esse labore sint esse occaecat irure.\r\nDolore dolor esse esse ut labore anim deserunt tempor id reprehenderit irure veniam pariatur exercitation. Proident incididunt non ad Lorem est eiusmod aute elit qui Lorem enim. Mollit magna Lorem laboris excepteur occaecat consectetur tempor commodo irure. Sunt in eiusmod ullamco ad commodo laboris Lorem Lorem ullamco cupidatat. Lorem culpa ea do voluptate voluptate exercitation nulla. Officia adipisicing ullamco nisi officia laboris reprehenderit et ipsum. Dolor excepteur duis anim exercitation quis culpa culpa anim eiusmod ex laborum cillum.\r\nDo pariatur ad laborum occaecat labore occaecat amet non. Consequat non sit ullamco nulla cupidatat officia qui duis. Laborum duis ad velit eiusmod ea eu. Tempor incididunt tempor eiusmod duis.\r\n", + "address": "2 Forest Place", + "city": "Sabillasville", + "state": "South Carolina", + "zip": 36003, + "country": "Portugal", + "email": "wallsbaxter@scentric.com", + "phone": "(910) 431-2449", + "color": "rgb(74,195,121)" + }, + { + "index": 467, + "name": "Vega Dickson", + "first": "Bishop", + "last": "Stout", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_kalibry/73.jpg", + "expanded": false, + "guid": "c40dd867-a925-4993-a4f1-e7e411637845", + "integer": 69, + "date": "Sun May 04 2008 00:14:56 GMT-0700 (PDT)", + "shortText": "sit sunt", + "mediumText": "Adipisicing sit cillum nostrud nostrud commodo. Sunt labore veniam dolor enim nostrud deserunt. Consectetur est aute laboris aliqua. Sit velit ad dolore cupidatat nisi nisi nostrud minim in est.", + "longText": "Labore esse occaecat commodo pariatur consectetur Lorem. Et minim sint in laborum. Do laborum nulla culpa ex dolor ipsum ut excepteur id deserunt ad quis aliquip. Ipsum proident amet cupidatat labore veniam aliquip ipsum laboris. Incididunt sunt excepteur non ut pariatur aute. Duis exercitation cillum cillum do nostrud minim. Labore eiusmod eiusmod voluptate consectetur id.\r\n", + "address": "3 Seeley Street", + "city": "Westmoreland", + "state": "Michigan", + "zip": 41497, + "country": "Comoros", + "email": "bishopstout@scentric.com", + "phone": "(988) 498-2056", + "color": "rgb(228,157,219)" + }, + { + "index": 468, + "name": "Noelle Mosley", + "first": "Barnes", + "last": "Bowen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dhoot_amit/73.jpg", + "expanded": false, + "guid": "987c2384-3ee6-442a-859a-8839de50f5b6", + "integer": 90, + "date": "Thu Feb 26 2009 03:38:03 GMT-0800 (PST)", + "shortText": "voluptate", + "mediumText": "Lorem enim in incididunt proident commodo adipisicing laborum ut. Magna velit nostrud ipsum velit occaecat. Laborum duis reprehenderit reprehenderit id elit aute est occaecat nostrud exercitation reprehenderit esse. Reprehenderit adipisicing laborum laboris culpa magna commodo ullamco amet dolore.", + "longText": "Commodo occaecat magna consectetur esse culpa. Sunt ea adipisicing dolore laboris adipisicing officia proident culpa adipisicing et. Duis reprehenderit sunt proident sint exercitation enim irure esse voluptate mollit irure sint. Occaecat non amet nisi nisi Lorem duis aute incididunt nostrud elit veniam adipisicing proident. Fugiat id nostrud Lorem veniam aliquip Lorem occaecat ea nulla veniam. Sit amet laboris consequat esse excepteur dolore minim.\r\nAliqua ut dolor ex esse laboris consectetur incididunt. Dolore in commodo duis et enim consectetur eiusmod anim sit officia. Eu ut excepteur labore mollit sunt aliqua culpa sunt deserunt eiusmod.\r\nVeniam occaecat reprehenderit magna nisi elit deserunt. Dolore ullamco nisi aute excepteur aliquip aliquip duis eu laboris eu exercitation tempor. Lorem anim commodo esse fugiat enim aliquip aliqua consequat ullamco non aute magna veniam qui. Esse enim eu dolor aliqua pariatur culpa ea.\r\n", + "address": "2 Barwell Terrace", + "city": "Norvelt", + "state": "Maine", + "zip": 82709, + "country": "Central African Republic", + "email": "barnesbowen@scentric.com", + "phone": "(874) 465-2581", + "color": "rgb(201,251,62)" + }, + { + "index": 469, + "name": "Parrish Fowler", + "first": "Glenna", + "last": "Gaines", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/actionsmile/73.jpg", + "expanded": false, + "guid": "82d27516-08d2-4a84-9d5c-ed237bcbbee1", + "integer": 75, + "date": "Sun Oct 29 2000 13:21:37 GMT-0800 (PST)", + "shortText": "aliqua magna ad", + "mediumText": "In qui do velit aliquip voluptate duis eu in deserunt officia fugiat exercitation irure do.", + "longText": "Qui dolor nisi adipisicing mollit laboris velit ad sunt. Magna do esse nostrud excepteur aliqua duis ea cupidatat ut. Nostrud dolore laborum id incididunt duis consectetur sint amet aliqua aliquip elit laborum minim. Proident in anim sunt enim in commodo occaecat magna. Magna est excepteur duis laboris laborum anim esse aute Lorem adipisicing.\r\nAnim voluptate minim adipisicing irure sit ipsum. Dolor dolore velit quis eu. Ex sit ex consequat minim consequat nisi aliqua incididunt voluptate incididunt id anim irure. Velit sit aliquip incididunt do commodo officia enim excepteur ut nisi laborum culpa anim. Ea sint fugiat quis nulla do. Tempor deserunt reprehenderit veniam pariatur velit velit labore culpa ut consequat reprehenderit ipsum. Eu reprehenderit ut excepteur do velit occaecat duis.\r\n", + "address": "2 Dare Court", + "city": "Muse", + "state": "Kansas", + "zip": 37729, + "country": "Gabon", + "email": "glennagaines@scentric.com", + "phone": "(819) 430-2612", + "color": "rgb(196,125,143)" + }, + { + "index": 470, + "name": "Booth Goodman", + "first": "Kathrine", + "last": "Curtis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/craftified/73.jpg", + "expanded": false, + "guid": "15c7abe9-175a-412b-b120-6bd621022908", + "integer": 6, + "date": "Sat Mar 28 1992 21:26:09 GMT-0800 (PST)", + "shortText": "proident reprehenderit", + "mediumText": "Deserunt id occaecat reprehenderit sint ea reprehenderit mollit eiusmod ea. Sint velit voluptate non Lorem deserunt dolore voluptate enim sunt laborum ad ullamco reprehenderit enim. Excepteur pariatur veniam amet qui in culpa magna. Commodo sit ad veniam deserunt excepteur aute laborum incididunt laborum ut.", + "longText": "Dolor do est occaecat ut ipsum nulla est anim minim voluptate incididunt officia dolor. Adipisicing in id sunt cillum nisi laborum cillum amet laborum aute consectetur. Officia sit dolor elit consequat adipisicing magna magna eu do non pariatur velit dolore ipsum.\r\nReprehenderit Lorem mollit irure laborum voluptate aute. Tempor enim nulla aliquip Lorem id dolor exercitation Lorem minim cupidatat irure et ipsum. Aliqua aute mollit culpa non ex labore quis eu do esse. In laborum adipisicing voluptate culpa pariatur ad et adipisicing. Ut eiusmod esse proident reprehenderit magna ut in nisi cillum sunt consequat pariatur. Consequat enim eiusmod fugiat magna nulla veniam nostrud veniam Lorem adipisicing amet consequat labore. Occaecat duis ad esse sint et cupidatat consequat culpa sint pariatur officia quis.\r\nCulpa id sit qui ea incididunt laboris laboris nisi voluptate nostrud. Enim in voluptate cillum dolore irure occaecat cupidatat pariatur ad elit excepteur. Lorem anim reprehenderit aliqua ipsum officia esse quis incididunt sint sunt esse. Deserunt culpa cillum nulla eiusmod incididunt est exercitation do ea. Voluptate magna occaecat excepteur incididunt tempor occaecat exercitation ad incididunt cupidatat dolor occaecat voluptate.\r\n", + "address": "3 Interborough Parkway", + "city": "Bethany", + "state": "Iowa", + "zip": 27481, + "country": "Cambodia", + "email": "kathrinecurtis@scentric.com", + "phone": "(857) 508-2561", + "color": "rgb(174,52,167)" + }, + { + "index": 471, + "name": "Benton Waters", + "first": "Marietta", + "last": "Cantu", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aleksitappura/73.jpg", + "expanded": false, + "guid": "f166dfbf-b1f4-4bbf-8d31-7979b09bc29c", + "integer": 84, + "date": "Sat Aug 15 1970 03:51:29 GMT-0700 (PDT)", + "shortText": "ipsum", + "mediumText": "Commodo duis laborum ut aliqua et nostrud incididunt. Cillum et sint do pariatur quis non ex duis deserunt esse eiusmod nulla aliqua id. Consequat amet cupidatat ea non ea ipsum Lorem nulla ut ipsum aliqua eiusmod do nostrud. Quis elit est esse officia.", + "longText": "In magna quis duis et. Veniam consectetur dolor excepteur aute sit minim aute aute ipsum dolor id sint quis. Ex aute Lorem commodo sit et qui esse nulla excepteur tempor. Cillum consectetur nulla consequat nisi elit ex labore. Ex officia labore sunt exercitation aliquip culpa elit commodo fugiat aute ut. Id velit velit sunt qui aliquip laborum nulla ea sit in commodo.\r\nPariatur commodo excepteur aliquip voluptate esse do velit do deserunt. Laboris anim deserunt laborum duis cillum aliqua esse cillum sunt. Ad fugiat nostrud amet sunt ipsum. Laborum deserunt qui eiusmod consequat.\r\nIrure qui enim voluptate laboris ex ad esse irure sunt officia aliquip do elit esse. Eu do commodo in excepteur ad. Aliquip nulla Lorem nisi sunt quis ex in eu fugiat minim elit consectetur occaecat.\r\n", + "address": "3 Falmouth Street", + "city": "Manchester", + "state": "Vermont", + "zip": 34619, + "country": "New Zealand", + "email": "mariettacantu@scentric.com", + "phone": "(932) 598-2276", + "color": "rgb(156,114,200)" + }, + { + "index": 472, + "name": "Lambert Spears", + "first": "Harding", + "last": "Woodward", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicollerich/73.jpg", + "expanded": false, + "guid": "32d3c3aa-0997-4d88-b2e7-9b28713b91bd", + "integer": 85, + "date": "Fri Feb 10 2006 11:58:14 GMT-0800 (PST)", + "shortText": "ullamco enim aliquip amet veniam", + "mediumText": "Excepteur magna velit est et minim veniam.", + "longText": "Ut nostrud elit dolor eiusmod est id. Sit aliqua tempor incididunt quis magna aliquip irure in elit in. Exercitation pariatur deserunt irure ullamco laboris excepteur ea. Deserunt labore laboris fugiat reprehenderit laborum quis occaecat duis voluptate labore culpa nisi aliqua ea. Veniam ea duis sint quis anim do.\r\nFugiat reprehenderit proident minim irure aliqua sunt non quis sunt ut. Eiusmod et occaecat ad quis. Velit ipsum in amet qui aliquip consequat sit voluptate est consequat. Nostrud laborum proident incididunt proident voluptate do sint minim officia.\r\n", + "address": "3 Guernsey Street", + "city": "Magnolia", + "state": "Nebraska", + "zip": 56924, + "country": "Lebanon", + "email": "hardingwoodward@scentric.com", + "phone": "(852) 477-3706", + "color": "rgb(148,78,220)" + }, + { + "index": 473, + "name": "Ferrell Gallegos", + "first": "Marie", + "last": "Flowers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrmartineau/73.jpg", + "expanded": false, + "guid": "3b7ed12d-4299-4fd6-a79a-42a27d171c9e", + "integer": 92, + "date": "Sun Jun 07 1992 13:29:12 GMT-0700 (PDT)", + "shortText": "sunt non veniam", + "mediumText": "Lorem officia duis consequat minim occaecat enim incididunt et labore consequat esse amet. Ea incididunt dolore eiusmod dolor mollit veniam laborum et cupidatat proident. Mollit sint fugiat tempor consectetur veniam ad cupidatat.", + "longText": "Do et sint pariatur in ex consectetur esse. Sit deserunt sit pariatur Lorem laboris duis ex est Lorem sunt. Qui id occaecat proident irure non aliquip tempor velit voluptate dolor adipisicing ullamco enim irure.\r\n", + "address": "4 Harden Street", + "city": "Worton", + "state": "Florida", + "zip": 87914, + "country": "Armenia", + "email": "marieflowers@scentric.com", + "phone": "(867) 463-2219", + "color": "rgb(245,149,165)" + }, + { + "index": 474, + "name": "Elena Hale", + "first": "Leola", + "last": "Byers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kuldarkalvik/73.jpg", + "expanded": false, + "guid": "248816ef-ebc8-48b6-83b8-ddf059001caf", + "integer": 36, + "date": "Fri Nov 08 1974 22:54:38 GMT-0800 (PST)", + "shortText": "sint ea eu aliqua elit", + "mediumText": "Dolor velit ullamco ullamco dolor nostrud. Qui deserunt mollit ea id cillum eu. Consectetur dolor irure esse velit sunt nostrud nostrud voluptate cillum tempor ipsum mollit do. Laboris ea esse do laboris adipisicing nisi. Labore excepteur cupidatat nostrud sit aliqua ad labore Lorem do aliquip ea veniam veniam.", + "longText": "Et esse non incididunt sunt aliqua eiusmod. Enim id ullamco in ex dolor est non eiusmod reprehenderit. Quis velit pariatur irure labore id enim. Anim esse voluptate fugiat ipsum do amet nisi velit pariatur deserunt culpa. Duis ullamco anim quis deserunt labore id laboris. Minim laborum id ex ex. Nulla mollit id esse do reprehenderit eu velit eu dolor commodo dolore aute sit.\r\nMollit magna reprehenderit velit consequat pariatur officia dolore laborum. Do sit reprehenderit qui fugiat voluptate ut cupidatat sit magna mollit sit velit Lorem. Id anim veniam aliquip aliqua adipisicing.\r\n", + "address": "2 Elliott Walk", + "city": "Gwynn", + "state": "New Jersey", + "zip": 23849, + "country": "Cayman Islands", + "email": "leolabyers@scentric.com", + "phone": "(800) 419-2994", + "color": "rgb(62,183,119)" + }, + { + "index": 475, + "name": "Deloris Warren", + "first": "Lacy", + "last": "Elliott", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erickmazer/73.jpg", + "expanded": false, + "guid": "75cda396-a179-4462-bd5f-c87f9cdcb07d", + "integer": 16, + "date": "Tue Mar 20 2012 21:38:59 GMT-0700 (PDT)", + "shortText": "labore fugiat et", + "mediumText": "Fugiat velit exercitation commodo dolor deserunt commodo cupidatat eiusmod excepteur ea. Voluptate est deserunt eiusmod nostrud.", + "longText": "Adipisicing qui esse voluptate aliqua magna aliquip esse. Tempor ad aliquip ullamco fugiat. Aliqua Lorem velit consectetur amet velit deserunt.\r\nIrure tempor anim cillum aliqua pariatur fugiat. Nostrud amet dolore nisi cillum qui sit excepteur magna fugiat aute fugiat. Irure culpa incididunt est velit non anim adipisicing culpa est qui. Pariatur est reprehenderit amet officia mollit eu.\r\nId anim exercitation ex culpa dolor amet culpa sint sint sint esse dolore ea cupidatat. Ut laborum ullamco elit proident. Sit aute id proident nulla et. Incididunt excepteur ut cupidatat reprehenderit. Labore qui laboris consequat pariatur do cillum.\r\n", + "address": "3 Ditmars Street", + "city": "Carrizo", + "state": "Wisconsin", + "zip": 21484, + "country": "Italy", + "email": "lacyelliott@scentric.com", + "phone": "(927) 422-3415", + "color": "rgb(69,169,92)" + }, + { + "index": 476, + "name": "Young Lee", + "first": "Kay", + "last": "Montgomery", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guischmitt/73.jpg", + "expanded": false, + "guid": "c41e7a43-d02b-4c42-9d72-38d7ba926b78", + "integer": 99, + "date": "Wed Sep 26 1979 16:42:55 GMT-0700 (PDT)", + "shortText": "Lorem consequat esse occaecat irure", + "mediumText": "Ex velit deserunt veniam dolor et fugiat. Mollit excepteur occaecat cupidatat mollit ut magna et. Nostrud magna esse consectetur exercitation irure magna Lorem do nulla. Sit laboris cupidatat ullamco eiusmod nisi ex.", + "longText": "Enim cupidatat magna sint velit cupidatat Lorem sint est eiusmod irure officia ea occaecat. Laborum qui officia voluptate anim enim velit cillum ipsum. Irure labore irure eiusmod Lorem sint minim laboris deserunt irure dolor. Anim quis laborum cupidatat ex ex in. Dolor ipsum fugiat ad mollit proident labore consectetur dolore labore laborum cillum sint dolore. Et ex mollit sit est. Anim incididunt deserunt incididunt proident ea velit enim anim laboris adipisicing.\r\nEa officia laborum veniam duis irure labore. Aliquip velit et quis officia veniam cillum dolor nostrud non ipsum sint sint fugiat. Occaecat tempor ea consequat consequat voluptate.\r\nNostrud officia aliquip est eu quis ex dolor sint commodo commodo reprehenderit laborum. Do deserunt voluptate laboris do. Velit fugiat incididunt fugiat proident cillum ad excepteur aute aliqua minim. Nulla voluptate fugiat sint ea incididunt esse laboris sint incididunt dolor cillum irure magna. Tempor culpa anim duis qui adipisicing culpa enim magna duis. Nisi mollit qui nisi excepteur ut ut. Dolor laboris ad in reprehenderit enim sint excepteur laborum irure aliquip.\r\nLorem sit ad excepteur cillum ad consequat fugiat aliqua mollit veniam labore sit aliquip aute. Laborum dolore proident in aute labore ad dolore duis pariatur culpa mollit commodo esse. Enim occaecat officia ipsum ad eiusmod exercitation tempor nisi proident irure ut ut. Elit amet ad ex irure enim laboris elit ex anim magna sint sunt tempor in. Et magna ipsum laborum Lorem incididunt. Amet cillum ut magna dolore elit aute.\r\nSit nulla sint non velit aliquip occaecat sint laborum. Aliqua tempor dolore velit nisi tempor magna labore sunt elit et. Occaecat nisi commodo sunt et tempor ut ullamco. Sint tempor adipisicing consequat commodo tempor deserunt voluptate ea Lorem exercitation id culpa.\r\n", + "address": "4 India Street", + "city": "Elliott", + "state": "Washington", + "zip": 78397, + "country": "Lesotho", + "email": "kaymontgomery@scentric.com", + "phone": "(803) 429-2640", + "color": "rgb(217,203,52)" + }, + { + "index": 477, + "name": "Lynn Kim", + "first": "Ericka", + "last": "Todd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mariosmaselli/73.jpg", + "expanded": false, + "guid": "e055ce4f-15a9-429c-91eb-a66e77b390f4", + "integer": 98, + "date": "Tue Mar 14 1972 10:31:22 GMT-0800 (PST)", + "shortText": "ullamco excepteur", + "mediumText": "Tempor sunt aliqua aliquip labore nisi ad eu in et eu laboris deserunt commodo ex. Ipsum minim ex dolor reprehenderit magna ullamco eu quis.", + "longText": "Sint dolore ipsum eu nulla amet amet aute commodo exercitation duis sit occaecat id. Eiusmod ex occaecat consequat tempor fugiat non ad minim anim Lorem. Magna dolore duis exercitation cupidatat elit ipsum Lorem eu mollit sint nulla reprehenderit ullamco elit. Ea est ea commodo eu do. In dolor magna reprehenderit ad dolor dolor id amet tempor occaecat. In laboris do incididunt occaecat elit quis ad amet. Anim sint elit culpa ullamco enim anim officia reprehenderit sunt.\r\nOfficia mollit cupidatat aliquip in laborum consectetur ea. Exercitation voluptate sint labore sunt excepteur eiusmod nostrud voluptate quis pariatur nulla. Esse commodo excepteur pariatur sit tempor ea laborum reprehenderit irure ex tempor.\r\nQuis labore et ad fugiat nostrud id labore non excepteur ipsum elit. Ea nulla laboris dolore nostrud quis irure magna est. Eiusmod mollit voluptate non laborum nostrud voluptate nisi voluptate. Est veniam veniam ad elit nostrud proident adipisicing ullamco aliquip commodo aliquip laborum laborum ad. Amet incididunt esse consequat nisi et consectetur. Adipisicing sunt irure Lorem elit aliqua dolore quis nostrud. Ex magna nisi excepteur occaecat veniam non dolore minim nostrud.\r\n", + "address": "3 Irving Avenue", + "city": "Stonybrook", + "state": "Oregon", + "zip": 25156, + "country": "Mongolia", + "email": "erickatodd@scentric.com", + "phone": "(854) 460-2134", + "color": "rgb(88,191,173)" + }, + { + "index": 478, + "name": "Duran Rasmussen", + "first": "Irene", + "last": "Guy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_ahmadyunus/73.jpg", + "expanded": false, + "guid": "ebebb8d9-3261-4d1f-b04c-580c3537cf32", + "integer": 5, + "date": "Mon Dec 14 1992 15:07:33 GMT-0800 (PST)", + "shortText": "excepteur", + "mediumText": "Aute ut nostrud cillum irure non veniam minim exercitation ex mollit sint veniam voluptate. Est culpa eiusmod aliquip anim. Nisi aliquip duis magna nulla est Lorem cupidatat nisi ut proident nostrud voluptate.", + "longText": "Aute consectetur qui sunt enim ad nulla velit et laborum culpa. Laboris officia exercitation nulla aute incididunt excepteur. Dolor et aliqua nulla mollit incididunt velit laborum nisi non ad excepteur. Exercitation ea dolore aliqua sunt minim dolore laboris Lorem culpa ex ut commodo.\r\nVoluptate occaecat et eu elit mollit commodo laboris eiusmod cillum mollit eiusmod est sunt labore. Ea commodo nisi culpa Lorem velit sit labore elit anim est sit sunt ex pariatur. Fugiat consectetur laborum deserunt sit excepteur exercitation qui veniam culpa sint.\r\nTempor aliquip excepteur consectetur commodo dolor magna. Aute elit esse mollit nisi dolore non laboris velit cillum cupidatat proident proident pariatur aute. Labore cillum ex magna anim voluptate esse deserunt consectetur anim est proident. Cillum Lorem sint aliqua fugiat eu qui. Aute eiusmod est qui aliqua incididunt cillum esse est laboris. Cillum et aute culpa excepteur nisi amet veniam incididunt do do sint esse in sint. Culpa ad ipsum ad nostrud id laborum.\r\n", + "address": "4 Dunham Place", + "city": "Vicksburg", + "state": "Illinois", + "zip": 21064, + "country": "Germany", + "email": "ireneguy@scentric.com", + "phone": "(895) 490-2069", + "color": "rgb(65,241,108)" + }, + { + "index": 479, + "name": "Gomez Kent", + "first": "Beverley", + "last": "Garrison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anggit_pradito/73.jpg", + "expanded": false, + "guid": "1f6414f6-bcb1-4a8e-9bd3-1f4bd3657fb8", + "integer": 52, + "date": "Sun Nov 21 1982 20:33:30 GMT-0800 (PST)", + "shortText": "sint cillum non dolore sit", + "mediumText": "Aliquip ad elit nulla veniam quis.", + "longText": "Incididunt in veniam laboris laboris. Ipsum laboris Lorem ea cupidatat laboris deserunt cillum esse. Elit qui id dolor mollit incididunt veniam aute in eiusmod. Occaecat est adipisicing dolor velit enim. Ipsum laboris nulla Lorem ex ut exercitation nulla commodo nisi occaecat excepteur et Lorem ex. Proident eu exercitation exercitation aliqua enim. Tempor magna excepteur enim aliqua.\r\nMollit fugiat veniam minim esse reprehenderit. Cillum exercitation qui elit anim proident. Aliquip ullamco irure aliqua sit commodo veniam cillum adipisicing proident ad aliquip dolore minim.\r\nQuis pariatur sint commodo mollit reprehenderit et incididunt commodo aliqua sint. Sunt nulla deserunt ad nulla in sit incididunt laborum nulla magna culpa excepteur. Deserunt ad non ullamco in amet do elit qui excepteur.\r\nQui ut do ex pariatur tempor. Anim qui labore sunt nisi amet laborum occaecat adipisicing incididunt fugiat labore. Laborum nisi duis minim pariatur labore ea consequat exercitation. Cillum reprehenderit eiusmod aute cillum laborum labore dolor aliqua in magna.\r\n", + "address": "4 Lafayette Avenue", + "city": "Esmont", + "state": "West Virginia", + "zip": 45346, + "country": "Thailand", + "email": "beverleygarrison@scentric.com", + "phone": "(923) 547-3876", + "color": "rgb(69,99,135)" + }, + { + "index": 480, + "name": "Bowers Benson", + "first": "Cannon", + "last": "Cunningham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/saschamt/73.jpg", + "expanded": false, + "guid": "de1acbb3-f26f-4448-8284-168962e64357", + "integer": 18, + "date": "Sat Jan 23 1988 03:15:57 GMT-0800 (PST)", + "shortText": "tempor dolore pariatur laboris", + "mediumText": "Cillum proident sint eiusmod qui ullamco dolore. Elit sit nisi et laboris labore Lorem tempor nulla. Dolore incididunt deserunt aute dolor ad elit nisi magna ad tempor.", + "longText": "Eiusmod id tempor id officia aliqua aliquip cillum est minim in. Est reprehenderit pariatur reprehenderit laborum nulla. Proident sit do anim minim anim minim in proident laborum pariatur laborum magna est.\r\nDolor exercitation ad enim est dolore excepteur consequat non pariatur. Eiusmod do et cupidatat ad esse do cillum elit in laboris. Labore consequat cupidatat officia do commodo sit consectetur ipsum irure consectetur. Ullamco commodo cillum officia cupidatat Lorem id.\r\nId anim culpa ex et reprehenderit do proident laboris reprehenderit. Proident quis irure duis irure ex ut velit mollit consectetur anim Lorem. Id consectetur laborum enim consectetur eiusmod excepteur id excepteur. In sunt anim magna duis ad occaecat cillum amet tempor pariatur sunt Lorem et proident. Officia in ipsum sunt aute Lorem.\r\n", + "address": "3 Eldert Lane", + "city": "Torboy", + "state": "Mississippi", + "zip": 21587, + "country": "Seychelles", + "email": "cannoncunningham@scentric.com", + "phone": "(922) 457-2557", + "color": "rgb(214,152,137)" + }, + { + "index": 481, + "name": "Duffy Moreno", + "first": "Combs", + "last": "Lamb", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anasnakawa/73.jpg", + "expanded": false, + "guid": "cc6e70c6-d769-4d53-94c3-3f39685f92b0", + "integer": 62, + "date": "Sat May 08 1971 07:47:14 GMT-0700 (PDT)", + "shortText": "ipsum in sint id amet", + "mediumText": "Voluptate sit occaecat velit elit culpa pariatur deserunt minim tempor. Ipsum sint ad voluptate ipsum.", + "longText": "Non ex consectetur nostrud et incididunt et tempor laborum fugiat aliqua ex sunt. Consectetur velit cillum ea elit anim ut qui velit sit. Dolore cillum eu sint dolore consequat est enim minim sunt dolore dolor est ut aliqua. Tempor ullamco eiusmod incididunt esse quis adipisicing ut et voluptate aliqua ullamco in. Adipisicing irure dolor irure esse velit dolore. Ea ullamco consectetur anim et in quis laboris nulla nisi sint ipsum. Enim aliquip deserunt voluptate quis sint.\r\nCommodo cupidatat occaecat elit Lorem dolor excepteur aliquip est incididunt. Sit minim aute non dolore voluptate nisi. Id non sit nostrud ad.\r\nExercitation deserunt officia nostrud occaecat qui et veniam laborum nostrud dolor dolore id. Ullamco enim esse ex aute ad incididunt aliquip. Tempor id voluptate fugiat ex fugiat dolor.\r\nAd ipsum voluptate ipsum cillum id. Exercitation labore velit occaecat adipisicing non excepteur aute amet. Culpa exercitation deserunt aute excepteur sit enim eiusmod esse Lorem anim aliqua laborum et. Dolore deserunt minim dolore nulla cupidatat proident commodo nisi. Qui exercitation sit elit aliquip mollit aliqua. Proident cupidatat labore culpa ea.\r\n", + "address": "4 Rutledge Street", + "city": "Waterford", + "state": "Rhode Island", + "zip": 58081, + "country": "Chad", + "email": "combslamb@scentric.com", + "phone": "(880) 495-3320", + "color": "rgb(104,242,253)" + }, + { + "index": 482, + "name": "Leach Middleton", + "first": "Molina", + "last": "Parsons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/just_watt/73.jpg", + "expanded": false, + "guid": "e824a101-32db-4fdd-98bc-f68a09cc9790", + "integer": 36, + "date": "Mon May 13 1996 08:23:43 GMT-0700 (PDT)", + "shortText": "est irure exercitation reprehenderit tempor", + "mediumText": "Cupidatat amet id duis occaecat ad elit quis ea consectetur consequat nostrud qui fugiat. Ea cupidatat est nisi reprehenderit in et sit et ad veniam do elit adipisicing sit. Non Lorem anim consequat velit occaecat excepteur. Officia esse magna veniam dolore ullamco fugiat enim.", + "longText": "In sunt in velit ipsum laborum minim enim sunt duis. Ut duis elit occaecat voluptate eiusmod. Cupidatat dolor laboris aliquip officia magna voluptate incididunt.\r\nFugiat irure ad quis ea aliqua proident ipsum quis ut incididunt. Aliquip culpa velit magna exercitation nostrud. Minim cupidatat irure exercitation excepteur cupidatat dolore. Excepteur amet laborum nulla adipisicing minim aliquip minim cillum nulla officia ut. Nostrud quis eu laboris quis qui minim ad quis ea reprehenderit. Proident ipsum aliquip cupidatat nisi.\r\nConsectetur sint magna id est cupidatat minim. Non cillum aliqua amet commodo aute eiusmod dolor et ad ut non culpa duis incididunt. Sint aliquip excepteur aliqua aliquip mollit commodo amet mollit. Irure minim nisi eu ea sit. Voluptate esse culpa adipisicing excepteur laborum proident laborum proident. Excepteur duis eu fugiat eiusmod labore velit do qui esse dolore labore enim. Esse quis ipsum Lorem voluptate tempor est fugiat enim reprehenderit duis.\r\nVeniam magna qui velit nulla velit incididunt aliqua qui dolore esse ex ad. Fugiat do nostrud do magna excepteur eiusmod et adipisicing aute aliquip cupidatat fugiat irure. Aliqua officia qui anim esse duis est minim excepteur est esse dolor id deserunt.\r\n", + "address": "2 Woods Place", + "city": "Leyner", + "state": "Georgia", + "zip": 45379, + "country": "Uruguay", + "email": "molinaparsons@scentric.com", + "phone": "(825) 403-3345", + "color": "rgb(74,223,146)" + }, + { + "index": 483, + "name": "Della Gomez", + "first": "Lamb", + "last": "Pierce", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/caiifr/73.jpg", + "expanded": false, + "guid": "19a7f089-3845-4441-b5ad-2b14bf2ca81a", + "integer": 50, + "date": "Mon Sep 28 1998 02:00:36 GMT-0700 (PDT)", + "shortText": "proident", + "mediumText": "Cupidatat in duis aliquip nisi consequat enim. Consectetur velit et nostrud et ea exercitation et aliquip pariatur aliqua velit eu ipsum reprehenderit.", + "longText": "Nulla nostrud ex eiusmod adipisicing. Exercitation ad dolore excepteur laborum quis non nisi duis dolor incididunt veniam fugiat laboris. Occaecat officia et eu proident ullamco dolor exercitation non laborum ea aliquip duis laborum. Exercitation voluptate ex aute nisi magna non laboris ea consequat. Est enim do tempor enim aute esse duis voluptate dolor. Aute enim minim cillum id.\r\nMollit eiusmod excepteur nisi est enim labore amet. Enim proident labore mollit dolor do incididunt deserunt irure exercitation irure magna. Incididunt irure officia consectetur magna fugiat quis fugiat voluptate nulla voluptate eu velit. Cupidatat qui proident deserunt reprehenderit veniam sunt non magna velit. Laboris labore consectetur ea et et. Non ex commodo amet enim.\r\nVeniam ex consequat minim ea adipisicing aute elit ea in in pariatur. Consequat nostrud sit non eiusmod voluptate consectetur velit cupidatat qui consectetur esse. Eu laboris cillum quis mollit minim id commodo quis laboris esse sint est irure.\r\nDolore pariatur officia sint qui consequat sunt minim culpa cillum amet qui. Anim adipisicing enim voluptate non nulla anim cupidatat ullamco consectetur elit qui culpa excepteur. Ad enim labore aliqua nulla sint consectetur ipsum occaecat occaecat ut cupidatat ad id ex. Mollit magna qui reprehenderit officia irure nisi ullamco excepteur consequat esse. Dolore commodo laboris ad culpa cillum eu laborum consectetur non occaecat. Sunt magna voluptate occaecat sunt occaecat exercitation magna sint sunt ullamco Lorem labore aliquip. Excepteur pariatur mollit ex incididunt.\r\n", + "address": "2 Dwight Street", + "city": "Newkirk", + "state": "New Mexico", + "zip": 24042, + "country": "Burkina Faso", + "email": "lambpierce@scentric.com", + "phone": "(996) 559-3096", + "color": "rgb(154,210,165)" + }, + { + "index": 484, + "name": "Holder Barker", + "first": "Patrick", + "last": "Best", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/briandiazme/73.jpg", + "expanded": false, + "guid": "c45e5d59-d200-42b3-9f8f-4ecba7a5c540", + "integer": 99, + "date": "Fri Nov 12 1971 21:30:45 GMT-0800 (PST)", + "shortText": "ea", + "mediumText": "Velit in qui nisi cupidatat qui deserunt. Quis pariatur nulla non cupidatat ad magna. Eu anim velit eu qui Lorem officia esse irure magna nulla eiusmod. Do adipisicing minim ad nulla.", + "longText": "Amet id duis eu tempor. Proident nisi pariatur id sit non adipisicing ex nostrud commodo consectetur sint sunt sunt exercitation. Eiusmod sunt est in eiusmod. Enim ut consectetur anim ea qui enim id irure deserunt eu. Tempor aute id nulla velit nostrud dolor veniam esse sint laborum ea. Non aliquip sunt nulla cupidatat amet aliqua non non.\r\nNisi ex ad ad enim eu sit proident aliquip ut incididunt reprehenderit nostrud pariatur. Sint dolor in veniam excepteur enim qui sit sunt cupidatat. Sunt velit magna culpa consectetur quis consectetur veniam do quis irure. Cupidatat aute laborum aute adipisicing amet mollit cillum amet ut. Nostrud magna adipisicing culpa sint esse ex pariatur cupidatat reprehenderit reprehenderit anim deserunt elit sunt. Ullamco minim consequat id in tempor.\r\nAmet veniam anim ullamco eu ea eiusmod est nulla velit. Aliqua nostrud laborum esse commodo laborum dolore. Pariatur magna officia eiusmod velit velit anim ad magna ipsum aliquip.\r\n", + "address": "4 Strauss Street", + "city": "Muir", + "state": "Arizona", + "zip": 26765, + "country": "Greenland", + "email": "patrickbest@scentric.com", + "phone": "(824) 579-3730", + "color": "rgb(171,74,141)" + }, + { + "index": 485, + "name": "Pitts Soto", + "first": "Vincent", + "last": "Hughes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/productpeopletv/73.jpg", + "expanded": false, + "guid": "fe55de6c-660f-4642-8677-5fdea19e5504", + "integer": 34, + "date": "Mon Dec 20 1971 02:47:54 GMT-0800 (PST)", + "shortText": "dolore officia", + "mediumText": "Et in laboris tempor laborum eu nisi consequat adipisicing et eu aliqua anim sunt sint. Culpa est esse eu reprehenderit mollit dolore. Tempor esse laboris esse ea duis dolore in nulla excepteur sit veniam enim velit.", + "longText": "Quis nostrud exercitation ullamco eiusmod proident non officia do mollit laborum exercitation. Velit irure incididunt in nisi laboris consequat eu cupidatat velit cillum nisi pariatur nostrud. Laborum ex reprehenderit culpa dolor duis culpa ut amet deserunt tempor amet. Laborum labore officia dolor occaecat elit. Lorem ullamco consectetur commodo elit et commodo deserunt enim. Sunt consequat cillum proident irure. Pariatur adipisicing ad proident culpa pariatur in tempor irure id ex sint adipisicing nulla tempor.\r\nEu cupidatat culpa non Lorem minim aliqua qui. Non ex aliquip ut reprehenderit anim aute nulla duis sit sunt ut. Nulla cupidatat non commodo adipisicing. Nisi exercitation quis veniam velit cillum incididunt. Do exercitation ut nulla Lorem culpa qui minim laboris quis ipsum elit sunt irure nulla.\r\nEt aute aliquip adipisicing labore ad irure quis consequat occaecat sunt. Reprehenderit fugiat ea eiusmod pariatur Lorem laboris anim non quis labore nisi. Mollit exercitation pariatur incididunt consequat reprehenderit officia nostrud labore duis aute quis sint. Exercitation ipsum esse sit in nulla anim.\r\nIpsum minim tempor et culpa adipisicing nisi tempor nisi laborum anim. Labore enim in sint minim duis Lorem fugiat nisi adipisicing do est elit excepteur. Velit dolore ea aliqua quis qui sit aliquip anim quis velit occaecat. Officia adipisicing ipsum ullamco cillum pariatur ad officia consectetur voluptate aliquip. Est adipisicing incididunt exercitation sunt aliqua irure consectetur excepteur adipisicing sint. Aute non ut ea ea enim. Aliqua Lorem excepteur voluptate nostrud ad proident reprehenderit ad dolore labore sit excepteur excepteur.\r\nAd tempor et veniam consequat. Duis commodo labore eiusmod reprehenderit consectetur adipisicing sint cillum laboris aliquip laboris occaecat sit. Sunt officia mollit labore culpa ea ut. Sunt commodo ea non Lorem culpa incididunt incididunt esse labore et irure tempor ex. Dolor culpa ea amet laboris ad ad mollit qui.\r\n", + "address": "2 Battery Avenue", + "city": "Westphalia", + "state": "Texas", + "zip": 12235, + "country": "Fiji", + "email": "vincenthughes@scentric.com", + "phone": "(947) 521-2627", + "color": "rgb(241,60,119)" + }, + { + "index": 486, + "name": "Morrison Frye", + "first": "Mae", + "last": "Ramirez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/darioalbini/73.jpg", + "expanded": false, + "guid": "03d96011-46bd-43a9-8186-6b5a9c45ef96", + "integer": 94, + "date": "Sat Dec 29 2012 13:16:12 GMT-0800 (PST)", + "shortText": "duis reprehenderit", + "mediumText": "Sit fugiat exercitation ut laborum.", + "longText": "Ea proident aliqua aute quis Lorem sunt ad. Qui irure fugiat aute dolore sint non sit magna. Nostrud tempor nulla eiusmod fugiat nostrud ad pariatur elit ea laboris.\r\nElit eiusmod mollit anim pariatur ea duis commodo sit eu consectetur non. Officia nisi sunt eu voluptate eu dolor laborum et irure aliquip aliquip consequat sint exercitation. Aliqua anim eiusmod laboris pariatur sit proident irure excepteur amet sint culpa dolor commodo nisi. Quis laborum est occaecat aute quis aliqua proident minim. Cillum tempor occaecat dolore irure labore nisi labore ut mollit proident eu. Eu adipisicing labore elit esse proident proident.\r\nDolore velit do ullamco ad occaecat veniam fugiat. Nulla excepteur aliqua sit magna ipsum pariatur. Anim magna esse laboris eiusmod Lorem ex. Quis mollit nostrud voluptate aliqua ea aliqua sunt non. Quis sint dolor do eu voluptate ad laborum. Eiusmod occaecat elit est labore qui ad ullamco. Esse sit nisi occaecat esse ullamco aliquip cupidatat mollit occaecat esse anim aliqua ea id.\r\nLaborum nostrud anim non excepteur aliqua ullamco minim sunt esse. Consequat ipsum aute id culpa quis minim incididunt. Dolor duis cupidatat ea cupidatat sunt magna consequat in ullamco aliqua eu voluptate. Pariatur proident esse consectetur Lorem id aliquip dolor quis occaecat eiusmod. Ad laboris reprehenderit fugiat amet excepteur. Sunt sit eu qui ad tempor cillum.\r\n", + "address": "4 Willow Place", + "city": "Biehle", + "state": "District Of Columbia", + "zip": 30874, + "country": "Viet Nam", + "email": "maeramirez@scentric.com", + "phone": "(866) 481-3384", + "color": "rgb(104,176,225)" + }, + { + "index": 487, + "name": "Diane Patrick", + "first": "Esperanza", + "last": "Rivera", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_pandajs/73.jpg", + "expanded": false, + "guid": "7f120012-357d-44c7-8dbe-9cfee5ca1f70", + "integer": 30, + "date": "Fri Jun 30 2000 14:03:45 GMT-0700 (PDT)", + "shortText": "tempor elit cupidatat labore", + "mediumText": "Exercitation reprehenderit tempor tempor esse magna in voluptate ea. Incididunt quis voluptate pariatur irure. Aliquip duis duis velit ullamco consequat ullamco ut proident Lorem dolore proident. Est qui amet ut ad exercitation aute cillum. Pariatur sit ea in consectetur qui amet minim nisi eu.", + "longText": "Adipisicing sit ut duis est tempor incididunt fugiat deserunt ad do voluptate amet eu. Excepteur eiusmod in id amet minim. Anim non velit velit id. Consequat proident irure aliquip est mollit proident cillum commodo veniam exercitation irure nostrud non. Tempor aliquip id fugiat duis elit sint. Enim ea pariatur ex ipsum cupidatat. Nulla proident labore in irure qui.\r\n", + "address": "2 Monument Walk", + "city": "Newry", + "state": "Virgin Islands", + "zip": 40958, + "country": "France, Metropolitan", + "email": "esperanzarivera@scentric.com", + "phone": "(909) 486-2560", + "color": "rgb(164,161,80)" + }, + { + "index": 488, + "name": "Ellen Rich", + "first": "Chandra", + "last": "Cote", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wellnext/73.jpg", + "expanded": false, + "guid": "02e9640e-9e9f-4b08-85b4-cb797b3b3a9b", + "integer": 71, + "date": "Sat May 01 2004 01:19:45 GMT-0700 (PDT)", + "shortText": "veniam", + "mediumText": "Irure labore ea ex culpa reprehenderit. Et ad irure aute ut quis elit. Proident magna qui sint fugiat culpa commodo aute duis proident. Officia do enim id proident occaecat fugiat eiusmod sint sint laborum ea.", + "longText": "Sunt duis est et magna excepteur laboris culpa anim pariatur officia veniam proident et. Quis tempor excepteur labore eiusmod enim. Ipsum fugiat nisi nulla minim consequat anim aliqua aliqua laboris est labore. Occaecat est qui labore ut fugiat est magna quis esse magna ex irure proident non. In dolore voluptate minim veniam anim qui reprehenderit sit irure sint duis veniam nulla qui. Sunt minim ex consequat incididunt sit ipsum cupidatat esse fugiat.\r\nExercitation magna anim adipisicing minim qui esse eiusmod. Excepteur minim Lorem pariatur in incididunt pariatur sit ipsum deserunt irure laborum. Cillum irure elit nisi dolor cupidatat eiusmod officia eu incididunt aliqua sint excepteur deserunt laboris. Non sint et velit et in aute do cupidatat nostrud sunt excepteur. Aliqua aute voluptate et exercitation exercitation tempor quis aute.\r\nLaboris ut voluptate nisi dolore fugiat. Nulla deserunt cupidatat do quis excepteur reprehenderit nostrud aute laboris Lorem eiusmod sunt. Aliquip voluptate voluptate Lorem non qui adipisicing magna occaecat ad duis.\r\nSit magna amet laboris qui deserunt eu aliquip. Eu ad nulla adipisicing occaecat eu Lorem officia magna nulla amet labore proident minim voluptate. Laboris consequat sint amet cupidatat aute aute sit aliquip excepteur minim ad reprehenderit. Et et sit amet laboris reprehenderit incididunt esse. Non ipsum sit qui anim eiusmod.\r\n", + "address": "4 Ashford Street", + "city": "Dunnavant", + "state": "Puerto Rico", + "zip": 54991, + "country": "Uganda", + "email": "chandracote@scentric.com", + "phone": "(964) 526-3818", + "color": "rgb(172,172,60)" + }, + { + "index": 489, + "name": "Adele Stanton", + "first": "Allison", + "last": "Maxwell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/skylark64/73.jpg", + "expanded": false, + "guid": "94d8f372-ebe3-4cd7-8456-4b12af0dbc7f", + "integer": 45, + "date": "Sun Oct 28 1990 07:28:14 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Exercitation excepteur nisi duis est laboris ipsum sint est laboris enim ex officia nostrud. Nisi pariatur dolor elit irure aliqua.", + "longText": "Lorem ea id veniam proident exercitation culpa dolor deserunt do cillum dolor ullamco cillum id. Esse sit tempor consectetur elit consequat laborum. Enim ea fugiat ad Lorem aliqua pariatur exercitation ipsum incididunt elit Lorem ipsum amet. Est nisi id adipisicing deserunt dolore aliquip proident commodo. Dolor qui quis excepteur eu proident.\r\nNostrud dolor fugiat nisi dolore qui sunt. Velit ullamco anim do eu. Culpa Lorem id excepteur nostrud culpa Lorem cupidatat culpa ea eiusmod laborum ex. Excepteur veniam voluptate tempor eu ex amet incididunt aute veniam magna.\r\nLabore velit dolor est consectetur ad non officia. Tempor pariatur dolor amet tempor amet eu non anim. Voluptate in fugiat est duis ad est. Id id sit fugiat sunt. Tempor ipsum nisi ea non proident id duis non exercitation ipsum minim proident. Do deserunt sit aute deserunt. Enim quis pariatur ad velit culpa dolor.\r\n", + "address": "2 Bedford Avenue", + "city": "Woodlake", + "state": "Maryland", + "zip": 25064, + "country": "Antarctica", + "email": "allisonmaxwell@scentric.com", + "phone": "(899) 448-3606", + "color": "rgb(240,230,119)" + }, + { + "index": 490, + "name": "Ilene Alston", + "first": "Cecile", + "last": "Woods", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lisekyle/73.jpg", + "expanded": false, + "guid": "1580bd0d-10e4-45df-8d7a-a7d5028512d8", + "integer": 95, + "date": "Sun Mar 29 2009 19:07:07 GMT-0700 (PDT)", + "shortText": "ullamco incididunt", + "mediumText": "Occaecat elit cillum laboris nulla culpa veniam sit non aliquip occaecat. Proident do aliquip exercitation quis proident culpa. Veniam et est incididunt reprehenderit reprehenderit sit elit eiusmod velit qui nulla tempor non. Eiusmod reprehenderit mollit non veniam nisi eiusmod mollit ullamco culpa.", + "longText": "Ea irure est pariatur est qui fugiat ut sit non enim mollit tempor. Aliquip sunt nulla pariatur dolore eu fugiat enim sunt est laboris. Aliquip reprehenderit exercitation id occaecat. Incididunt amet ex dolor sunt.\r\nDuis culpa occaecat deserunt dolore laborum. Sit non officia nisi exercitation do id minim. Voluptate esse velit do officia consectetur duis Lorem proident consequat duis laborum eiusmod officia amet.\r\nCupidatat adipisicing esse laborum sit nisi occaecat reprehenderit officia aute. Sit elit in nisi nulla ipsum mollit. Voluptate fugiat proident incididunt pariatur. Dolor consectetur occaecat est laborum id nisi minim consectetur occaecat. Minim duis occaecat commodo nulla pariatur ex.\r\n", + "address": "3 Gunnison Court", + "city": "Clara", + "state": "Massachusetts", + "zip": 31477, + "country": "Kiribati", + "email": "cecilewoods@scentric.com", + "phone": "(937) 412-3586", + "color": "rgb(218,151,77)" + }, + { + "index": 491, + "name": "Page Marsh", + "first": "Medina", + "last": "Wilson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zumwalt/73.jpg", + "expanded": false, + "guid": "4dfb0026-3202-4699-aba7-d815792762f2", + "integer": 42, + "date": "Mon Nov 03 1975 16:09:28 GMT-0800 (PST)", + "shortText": "commodo ex", + "mediumText": "Do ex ullamco eu id consectetur est.", + "longText": "Non consectetur est amet dolore pariatur adipisicing et exercitation pariatur. Duis cillum reprehenderit magna ex esse. Ex incididunt aute in dolore duis. Nisi deserunt quis ex ipsum officia. Esse ea consectetur amet aliquip sunt incididunt.\r\nConsectetur enim aute ad commodo do. Veniam fugiat culpa voluptate minim exercitation eiusmod dolore qui excepteur in laboris incididunt. Ad tempor dolore consectetur ullamco. Ad officia enim laborum minim voluptate fugiat. Laboris eu deserunt ex est. Incididunt est nulla excepteur do ipsum occaecat deserunt esse et. Officia fugiat eiusmod ut sint enim laborum pariatur dolor labore.\r\n", + "address": "4 Lewis Avenue", + "city": "Venice", + "state": "Oklahoma", + "zip": 93431, + "country": "Ecuador", + "email": "medinawilson@scentric.com", + "phone": "(915) 547-2479", + "color": "rgb(97,200,182)" + }, + { + "index": 492, + "name": "Raquel Torres", + "first": "Winters", + "last": "Moon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_winslet/73.jpg", + "expanded": false, + "guid": "2b4cd0b5-6c14-4253-afd2-667d28e069e5", + "integer": 6, + "date": "Sat May 22 1993 08:02:57 GMT-0700 (PDT)", + "shortText": "commodo consectetur culpa aliquip", + "mediumText": "Anim voluptate Lorem laborum consequat ex cillum ipsum exercitation consectetur elit. Pariatur ex qui nostrud enim consectetur eu mollit qui esse irure magna. Reprehenderit aliquip magna sunt labore. Aliqua nisi Lorem ad cupidatat laborum commodo irure non. Ut cupidatat ipsum do adipisicing incididunt.", + "longText": "Magna dolor ut incididunt pariatur cupidatat ullamco. Nisi veniam nulla est est. Nulla ex minim non excepteur quis laborum excepteur ut deserunt eiusmod consequat adipisicing mollit excepteur. Duis id tempor et aliqua laborum.\r\nVoluptate aliquip commodo sit laboris ea nisi id minim consectetur qui. Magna culpa ullamco ea enim excepteur nisi. Anim cillum nostrud ex consectetur. Sint duis voluptate est voluptate eu eu.\r\nConsectetur eiusmod officia qui exercitation ad magna. Ipsum voluptate ex culpa qui fugiat irure magna mollit nisi duis. Non laboris sit adipisicing ipsum dolor eiusmod Lorem aliqua velit ea sit reprehenderit minim aliquip. Reprehenderit non esse voluptate non aute non. Exercitation ex cillum ex sunt incididunt reprehenderit ipsum deserunt ex aliquip. Consectetur esse ut minim duis tempor ex reprehenderit veniam in proident.\r\nLaboris magna labore sint irure. Sit amet cupidatat adipisicing exercitation deserunt sint ad incididunt. Fugiat culpa adipisicing magna est voluptate. Consequat consequat velit reprehenderit aliqua anim commodo fugiat adipisicing qui occaecat dolore sint proident. Ex et officia ullamco labore ipsum consequat magna labore laboris. Adipisicing laboris non non dolore magna tempor do dolore qui nostrud sint. Incididunt enim excepteur aliqua adipisicing culpa irure eiusmod ex ullamco aliquip id cillum commodo ex.\r\n", + "address": "2 Amber Street", + "city": "Masthope", + "state": "Ohio", + "zip": 34479, + "country": "Bulgaria", + "email": "wintersmoon@scentric.com", + "phone": "(812) 514-3427", + "color": "rgb(129,103,138)" + }, + { + "index": 493, + "name": "Sasha Kinney", + "first": "Nielsen", + "last": "Callahan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kikillo/73.jpg", + "expanded": false, + "guid": "8d605d34-eb11-4110-9917-e890666b46c9", + "integer": 25, + "date": "Sun Feb 25 1996 00:22:49 GMT-0800 (PST)", + "shortText": "dolor velit", + "mediumText": "Proident occaecat voluptate eiusmod nisi ea non duis. Nostrud fugiat aliquip est exercitation laboris ipsum in dolor nisi duis magna minim. Pariatur pariatur ipsum incididunt excepteur.", + "longText": "Ex duis tempor fugiat mollit sunt enim elit commodo. Laboris in velit magna dolor. Labore labore incididunt veniam eiusmod mollit irure proident voluptate incididunt quis deserunt ad. Eiusmod eiusmod non reprehenderit aute amet eiusmod consectetur magna ea.\r\nTempor ad in cupidatat sunt dolore consectetur sunt. Anim nostrud nulla nostrud consequat. Consequat ullamco enim reprehenderit eu eu ea do duis reprehenderit quis cillum laborum pariatur. Est laborum reprehenderit in commodo enim ullamco mollit. Aute laboris incididunt elit laborum incididunt id tempor.\r\nEt do nulla voluptate magna labore ea commodo ex deserunt. Nostrud pariatur ipsum voluptate do esse non aliqua sint elit laboris ad adipisicing Lorem. Ut fugiat officia nostrud reprehenderit nisi aliqua.\r\n", + "address": "3 Lorraine Street", + "city": "Kidder", + "state": "Nevada", + "zip": 69726, + "country": "American Samoa", + "email": "nielsencallahan@scentric.com", + "phone": "(897) 548-2921", + "color": "rgb(58,212,98)" + }, + { + "index": 494, + "name": "Justice Johnston", + "first": "Francis", + "last": "Walsh", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hndragnwn/73.jpg", + "expanded": false, + "guid": "93cc4a8b-fe24-4849-a976-a91a2adabb91", + "integer": 60, + "date": "Fri Feb 24 2006 00:14:57 GMT-0800 (PST)", + "shortText": "mollit magna anim exercitation amet", + "mediumText": "Consectetur proident id adipisicing incididunt commodo fugiat tempor amet cupidatat enim nostrud laboris. Non do adipisicing proident id et voluptate enim magna exercitation ut est aliqua pariatur. Enim aute voluptate non elit id commodo commodo aliqua nisi.", + "longText": "Qui aute sunt sint mollit ullamco nisi sunt elit ut cupidatat quis reprehenderit. Amet ullamco sit esse fugiat aliqua proident ut. Nisi ea magna occaecat labore amet fugiat eiusmod cupidatat nulla nostrud mollit et laborum commodo. Lorem commodo anim magna anim in sunt cillum elit deserunt do exercitation labore nisi. Nostrud dolore consequat amet esse deserunt in fugiat non dolore magna laborum.\r\n", + "address": "3 Bethel Loop", + "city": "Williams", + "state": "Montana", + "zip": 30034, + "country": "Angola", + "email": "franciswalsh@scentric.com", + "phone": "(922) 539-3195", + "color": "rgb(80,154,75)" + }, + { + "index": 495, + "name": "Leonard Hess", + "first": "Kate", + "last": "Mccoy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fc987/73.jpg", + "expanded": false, + "guid": "0ef972c8-2eaa-4e56-baca-ec8204dee737", + "integer": 89, + "date": "Thu May 26 1988 06:59:06 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Sunt quis minim magna consectetur ullamco.", + "longText": "Cupidatat incididunt minim laboris eiusmod et ex ad laboris ut commodo ex aliqua. Ea fugiat consectetur sit ut occaecat non est nostrud id in pariatur. Est amet Lorem reprehenderit adipisicing consectetur culpa sit sunt nisi.\r\n", + "address": "4 Caton Avenue", + "city": "Biddle", + "state": "California", + "zip": 25530, + "country": "Bhutan", + "email": "katemccoy@scentric.com", + "phone": "(843) 483-2519", + "color": "rgb(132,225,73)" + }, + { + "index": 496, + "name": "Weiss Malone", + "first": "Buchanan", + "last": "Austin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lettershoppe/73.jpg", + "expanded": false, + "guid": "cfc771a6-aeb0-47ec-a5a2-c5240c1b6768", + "integer": 6, + "date": "Fri Feb 14 2014 14:08:10 GMT-0800 (PST)", + "shortText": "id ipsum culpa occaecat reprehenderit", + "mediumText": "Fugiat pariatur in Lorem ipsum ex id. Ex commodo magna enim non ullamco nulla officia velit. Et et ipsum deserunt ex pariatur laboris aliqua in elit sunt excepteur quis exercitation consequat. Fugiat est eiusmod esse amet anim ex aliquip ipsum id aliquip dolor. Qui proident veniam enim enim exercitation deserunt ex voluptate consequat.", + "longText": "Fugiat consequat incididunt aute Lorem aliquip labore tempor consequat quis cillum. Incididunt sunt ullamco proident pariatur ad incididunt. Labore pariatur reprehenderit mollit duis proident incididunt do. Excepteur ullamco cupidatat nisi culpa Lorem sit ea ea sint et sint eu. Aliqua dolore amet nulla sit amet irure nostrud nulla non ex. Lorem deserunt sint commodo amet amet incididunt irure aliqua reprehenderit ea minim adipisicing proident. Irure duis enim non commodo ut adipisicing anim ad fugiat amet qui voluptate fugiat.\r\nEiusmod voluptate nulla anim tempor nulla est excepteur ut. Tempor sunt cillum et mollit mollit anim dolore laboris aute et duis consectetur. Proident quis aliqua nisi incididunt minim voluptate eiusmod id ea. Est labore pariatur nulla incididunt anim. Anim eu mollit voluptate pariatur cillum officia exercitation. Dolor amet mollit officia exercitation minim tempor do eu.\r\nProident est do aliqua eiusmod aliquip ex veniam culpa et occaecat. Et reprehenderit ad et nulla ullamco duis pariatur labore duis ex ea minim laboris nulla. Ex cillum nostrud consectetur dolor et esse.\r\n", + "address": "2 Stockholm Street", + "city": "Darrtown", + "state": "Marshall Islands", + "zip": 54123, + "country": "Dominica", + "email": "buchananaustin@scentric.com", + "phone": "(875) 459-2571", + "color": "rgb(115,116,180)" + }, + { + "index": 497, + "name": "Hawkins Parrish", + "first": "Sandy", + "last": "Poole", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akashsharma39/73.jpg", + "expanded": false, + "guid": "00fdef08-9189-40f0-9960-6a59ab906f66", + "integer": 70, + "date": "Sun Apr 24 1994 02:10:50 GMT-0700 (PDT)", + "shortText": "deserunt non ex", + "mediumText": "Do eiusmod nostrud sint consectetur nulla elit est amet et qui voluptate consectetur ullamco elit. Voluptate enim nostrud consequat elit laboris non consequat. Consequat nulla veniam ea eiusmod nulla sunt consequat mollit.", + "longText": "Irure quis duis sint fugiat ut sunt proident esse ut. Aliquip aliqua ea ex magna mollit duis elit non elit labore veniam laborum. Deserunt ex cillum culpa qui non elit culpa ad laboris est.\r\nCillum exercitation ullamco adipisicing cillum irure ipsum sunt dolor irure ullamco. Lorem cupidatat cupidatat occaecat proident dolor sit irure quis do est non reprehenderit. Lorem elit dolore ea fugiat elit dolor. Excepteur est anim velit qui in. Minim sint adipisicing quis ullamco ipsum excepteur. Ullamco Lorem exercitation aute laboris fugiat incididunt.\r\nTempor aliqua cupidatat mollit anim Lorem irure exercitation magna non ullamco eu labore dolore velit. Aliqua enim reprehenderit consectetur est sunt labore aliqua consequat deserunt proident proident tempor mollit ad. Cupidatat velit culpa consequat ea incididunt. Pariatur irure dolore cillum voluptate ut amet sunt labore cillum laboris. Esse id aliquip labore consequat adipisicing culpa amet proident. Laborum voluptate nisi velit qui consectetur. Minim cillum duis pariatur est.\r\nCupidatat sunt consectetur laborum ex cupidatat quis ea ad sint aliqua non. Adipisicing ullamco voluptate mollit ullamco id irure proident ex culpa qui incididunt sint nostrud. Amet mollit occaecat non adipisicing tempor aliqua irure ex id. Velit dolore ea mollit fugiat velit elit eiusmod do exercitation.\r\n", + "address": "3 Manor Court", + "city": "Naomi", + "state": "Indiana", + "zip": 12933, + "country": "Egypt", + "email": "sandypoole@scentric.com", + "phone": "(945) 488-2696", + "color": "rgb(79,165,87)" + }, + { + "index": 498, + "name": "Dena Sweeney", + "first": "Kaitlin", + "last": "Brooks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fgin69/73.jpg", + "expanded": false, + "guid": "805425f6-7a36-4326-a622-fbd1a52bccca", + "integer": 37, + "date": "Thu Aug 03 1989 21:21:57 GMT-0700 (PDT)", + "shortText": "non in", + "mediumText": "Irure ullamco excepteur commodo aute magna dolore in reprehenderit commodo deserunt quis officia. Anim incididunt velit anim adipisicing dolore reprehenderit voluptate est nisi in amet.", + "longText": "Ea exercitation ipsum aliquip excepteur cillum ipsum cupidatat fugiat in do nostrud. Non culpa irure officia qui dolor esse velit. Sint officia proident occaecat laborum quis non ullamco dolor consectetur ipsum do nisi. Commodo adipisicing quis proident culpa.\r\nCupidatat adipisicing ipsum incididunt sunt consequat Lorem dolore. Aliquip adipisicing reprehenderit pariatur occaecat anim incididunt ad cillum. Voluptate cupidatat nostrud aliquip laborum esse irure duis ex culpa laborum laboris incididunt magna duis. Velit do commodo aute pariatur sunt ut voluptate quis minim. Eu mollit tempor excepteur nulla anim officia est dolor deserunt minim duis nostrud.\r\n", + "address": "4 Harrison Avenue", + "city": "Fairacres", + "state": "Tennessee", + "zip": 70961, + "country": "Chile", + "email": "kaitlinbrooks@scentric.com", + "phone": "(894) 591-3716", + "color": "rgb(131,63,152)" + }, + { + "index": 499, + "name": "Saundra Mcbride", + "first": "Rosemary", + "last": "Grimes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pdugan19/73.jpg", + "expanded": false, + "guid": "824a5e8d-254c-4041-8370-00c4d28ce820", + "integer": 65, + "date": "Mon Aug 28 2006 02:30:47 GMT-0700 (PDT)", + "shortText": "laborum", + "mediumText": "Aliqua magna proident exercitation elit occaecat ut duis. Ad ipsum duis aliqua qui pariatur cupidatat sint pariatur eiusmod do.", + "longText": "Amet sint officia anim officia nisi reprehenderit. Incididunt magna esse nisi nostrud ipsum. Dolor qui eu enim ipsum commodo deserunt ex ad reprehenderit. Commodo commodo amet ullamco aliquip deserunt excepteur aliqua minim ipsum eu. Culpa minim sunt do dolor excepteur dolore id et culpa id aliquip.\r\nNon excepteur culpa nulla consequat velit amet id. Cupidatat qui id aute reprehenderit adipisicing. Duis consectetur nostrud voluptate laboris culpa ipsum labore irure magna.\r\nLorem mollit cillum velit non proident ex ea esse anim nulla sunt ad laboris. Officia nisi culpa exercitation qui pariatur adipisicing ea incididunt consectetur Lorem. Amet minim labore aliqua nostrud. Eu cillum nulla qui enim non occaecat. Laboris exercitation ea sint cillum velit officia velit officia adipisicing do esse dolore aliqua mollit.\r\nCommodo minim sint excepteur aliquip ex consequat veniam ea culpa reprehenderit consequat est amet dolore. Eu ex amet minim quis dolore voluptate deserunt aliquip consectetur consectetur aliqua officia consequat sunt. Duis ut ex consectetur fugiat laborum duis Lorem cupidatat cupidatat excepteur amet. Id consequat dolor mollit elit pariatur dolor occaecat. Consequat ullamco excepteur cillum eu veniam aliqua ex cupidatat labore ex veniam. Dolore ad et veniam sint eiusmod anim minim.\r\nSint pariatur est enim veniam laboris eu occaecat duis. Ad veniam voluptate occaecat aliquip nostrud culpa aliquip duis proident dolor. Consectetur esse ut laborum elit sunt irure ex duis. Ex laborum eu esse incididunt laborum dolore non aute anim elit deserunt. Non Lorem deserunt culpa do ea exercitation fugiat.\r\n", + "address": "4 Chestnut Street", + "city": "Joes", + "state": "Palau", + "zip": 62428, + "country": "Norfolk Island", + "email": "rosemarygrimes@scentric.com", + "phone": "(923) 453-2279", + "color": "rgb(171,145,136)" + } +] \ No newline at end of file diff --git a/react-app/bower_components/iron-list/demo/index.html b/react-app/bower_components/iron-list/demo/index.html new file mode 100644 index 0000000000..cfd5e2a577 --- /dev/null +++ b/react-app/bower_components/iron-list/demo/index.html @@ -0,0 +1,169 @@ + + + + + + + iron-list demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/demo/scroll-threshold.html b/react-app/bower_components/iron-list/demo/scroll-threshold.html new file mode 100644 index 0000000000..f71de0fc15 --- /dev/null +++ b/react-app/bower_components/iron-list/demo/scroll-threshold.html @@ -0,0 +1,191 @@ + + + + + + + Load data using iron-scroll-threshold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/demo/selection.html b/react-app/bower_components/iron-list/demo/selection.html new file mode 100644 index 0000000000..279492ebd6 --- /dev/null +++ b/react-app/bower_components/iron-list/demo/selection.html @@ -0,0 +1,287 @@ + + + + + + + Select contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/index.html b/react-app/bower_components/iron-list/index.html new file mode 100644 index 0000000000..536371c6f0 --- /dev/null +++ b/react-app/bower_components/iron-list/index.html @@ -0,0 +1,26 @@ + + + + + + iron-list + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/iron-list.html b/react-app/bower_components/iron-list/iron-list.html new file mode 100644 index 0000000000..cda3dad4c7 --- /dev/null +++ b/react-app/bower_components/iron-list/iron-list.html @@ -0,0 +1,1591 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/basic.html b/react-app/bower_components/iron-list/test/basic.html new file mode 100644 index 0000000000..c2ef4578a7 --- /dev/null +++ b/react-app/bower_components/iron-list/test/basic.html @@ -0,0 +1,188 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/different-heights.html b/react-app/bower_components/iron-list/test/different-heights.html new file mode 100644 index 0000000000..65be9835d8 --- /dev/null +++ b/react-app/bower_components/iron-list/test/different-heights.html @@ -0,0 +1,125 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/dynamic-item-size.html b/react-app/bower_components/iron-list/test/dynamic-item-size.html new file mode 100644 index 0000000000..7bee0426d9 --- /dev/null +++ b/react-app/bower_components/iron-list/test/dynamic-item-size.html @@ -0,0 +1,121 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/focus.html b/react-app/bower_components/iron-list/test/focus.html new file mode 100644 index 0000000000..7c41c807d8 --- /dev/null +++ b/react-app/bower_components/iron-list/test/focus.html @@ -0,0 +1,113 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/helpers.html b/react-app/bower_components/iron-list/test/helpers.html new file mode 100644 index 0000000000..5952eb0cfd --- /dev/null +++ b/react-app/bower_components/iron-list/test/helpers.html @@ -0,0 +1,125 @@ + + + diff --git a/react-app/bower_components/iron-list/test/hidden-list.html b/react-app/bower_components/iron-list/test/hidden-list.html new file mode 100644 index 0000000000..ee4b85b475 --- /dev/null +++ b/react-app/bower_components/iron-list/test/hidden-list.html @@ -0,0 +1,73 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/index.html b/react-app/bower_components/iron-list/test/index.html new file mode 100644 index 0000000000..d328dd706d --- /dev/null +++ b/react-app/bower_components/iron-list/test/index.html @@ -0,0 +1,32 @@ + + + + + + + Tests + + + + + + diff --git a/react-app/bower_components/iron-list/test/mutations.html b/react-app/bower_components/iron-list/test/mutations.html new file mode 100644 index 0000000000..da466e622a --- /dev/null +++ b/react-app/bower_components/iron-list/test/mutations.html @@ -0,0 +1,292 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/physical-count.html b/react-app/bower_components/iron-list/test/physical-count.html new file mode 100644 index 0000000000..9658a321d3 --- /dev/null +++ b/react-app/bower_components/iron-list/test/physical-count.html @@ -0,0 +1,95 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/selection.html b/react-app/bower_components/iron-list/test/selection.html new file mode 100644 index 0000000000..cb38597e81 --- /dev/null +++ b/react-app/bower_components/iron-list/test/selection.html @@ -0,0 +1,352 @@ + + + + + + iron-list test + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/smoke/avg-worst-case.html b/react-app/bower_components/iron-list/test/smoke/avg-worst-case.html new file mode 100644 index 0000000000..12d6d8fd13 --- /dev/null +++ b/react-app/bower_components/iron-list/test/smoke/avg-worst-case.html @@ -0,0 +1,91 @@ + + + + + + + avg worst case + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/smoke/dummy-data.html b/react-app/bower_components/iron-list/test/smoke/dummy-data.html new file mode 100644 index 0000000000..bdfdd2eff0 --- /dev/null +++ b/react-app/bower_components/iron-list/test/smoke/dummy-data.html @@ -0,0 +1,18514 @@ + + + \ No newline at end of file diff --git a/react-app/bower_components/iron-list/test/smoke/index.html b/react-app/bower_components/iron-list/test/smoke/index.html new file mode 100644 index 0000000000..f410481983 --- /dev/null +++ b/react-app/bower_components/iron-list/test/smoke/index.html @@ -0,0 +1,205 @@ + + + + + + + iron-list demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/smoke/physical-count.html b/react-app/bower_components/iron-list/test/smoke/physical-count.html new file mode 100644 index 0000000000..b58bd1de03 --- /dev/null +++ b/react-app/bower_components/iron-list/test/smoke/physical-count.html @@ -0,0 +1,296 @@ + + + + + + + physical count + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-list/test/x-list.html b/react-app/bower_components/iron-list/test/x-list.html new file mode 100644 index 0000000000..21eaf8b217 --- /dev/null +++ b/react-app/bower_components/iron-list/test/x-list.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-media-query/.bower.json b/react-app/bower_components/iron-media-query/.bower.json new file mode 100644 index 0000000000..d9ad827eb6 --- /dev/null +++ b/react-app/bower_components/iron-media-query/.bower.json @@ -0,0 +1,41 @@ +{ + "name": "iron-media-query", + "version": "1.0.8", + "description": "Lets you bind to a CSS media query", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "media" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-media-query" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-media-query", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "iron-media-query.html", + "_release": "1.0.8", + "_resolution": { + "type": "version", + "tag": "v1.0.8", + "commit": "3f916be171af7a3e03eb019acdfea71055d3c744" + }, + "_source": "git://github.com/PolymerElements/iron-media-query.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-media-query" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-media-query/.gitignore b/react-app/bower_components/iron-media-query/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-media-query/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-media-query/.travis.yml b/react-app/bower_components/iron-media-query/.travis.yml new file mode 100644 index 0000000000..b680b6900d --- /dev/null +++ b/react-app/bower_components/iron-media-query/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: false +before_script: + - npm install web-component-tester + - npm install bower + - 'export PATH=$PWD/node_modules/.bin:$PATH' + - bower install +env: + global: + - secure: My9uxlkp4fZwSHKqo1RUv4yBhNl46XfbaiOsOStqJdI9l7hBfudSl7V2OZeLuV2pEDJC1z1ZqVU6C/K0/iTf7i66cd9g0iH5N+1qex8p2AcuP1evPWbwLw8moHH+M5E14MMXD8sPX4KauS8azmgRm61pppD5ZgKfCaeGZg7Tczs= + - secure: LgnZP4BNGBkTZhf8Vr7r9LdrOwq2/58TqqYkFFloEGBRT6HmumNSRwNbIwOh1U9jSTVkqjC2rn4G27u4XlEIs+QTD2PVSSEKy7Vbn0KxSNCvCGaOB1ZaxWTwZa7nkg09ZFRCHGh+WIbuV+BxyzsjOqlN82GSzFNSb3rxhqDM6dU= +node_js: 4 +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-media-query/CONTRIBUTING.md b/react-app/bower_components/iron-media-query/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/iron-media-query/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-media-query/README.md b/react-app/bower_components/iron-media-query/README.md new file mode 100644 index 0000000000..a2c553d9dd --- /dev/null +++ b/react-app/bower_components/iron-media-query/README.md @@ -0,0 +1,28 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-media-query.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-media-query) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-media-query)_ + + +##<iron-media-query> + + +`iron-media-query` can be used to data bind to a CSS media query. +The `query` property is a bare CSS media query. +The `query-matches` property is a boolean representing whether the page matches that media query. + +Example: + + + + diff --git a/react-app/bower_components/iron-media-query/bower.json b/react-app/bower_components/iron-media-query/bower.json new file mode 100644 index 0000000000..c69307215b --- /dev/null +++ b/react-app/bower_components/iron-media-query/bower.json @@ -0,0 +1,32 @@ +{ + "name": "iron-media-query", + "version": "1.0.8", + "description": "Lets you bind to a CSS media query", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "media" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-media-query" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-media-query", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.2", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "iron-media-query.html" +} diff --git a/react-app/bower_components/iron-media-query/demo/index.html b/react-app/bower_components/iron-media-query/demo/index.html new file mode 100644 index 0000000000..8a57dae600 --- /dev/null +++ b/react-app/bower_components/iron-media-query/demo/index.html @@ -0,0 +1,93 @@ + + + + + + iron-media-query demo + + + + + + + + + + + +
+

<iron-media-query>

+ + +
+ + + diff --git a/react-app/bower_components/iron-media-query/hero.svg b/react-app/bower_components/iron-media-query/hero.svg new file mode 100755 index 0000000000..0a7982b989 --- /dev/null +++ b/react-app/bower_components/iron-media-query/hero.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-media-query/index.html b/react-app/bower_components/iron-media-query/index.html new file mode 100644 index 0000000000..174afb5b5e --- /dev/null +++ b/react-app/bower_components/iron-media-query/index.html @@ -0,0 +1,29 @@ + + + + + + + + + iron-media-query + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-media-query/iron-media-query.html b/react-app/bower_components/iron-media-query/iron-media-query.html new file mode 100644 index 0000000000..60cb84b89b --- /dev/null +++ b/react-app/bower_components/iron-media-query/iron-media-query.html @@ -0,0 +1,121 @@ + + + + + + + diff --git a/react-app/bower_components/iron-media-query/test/basic.html b/react-app/bower_components/iron-media-query/test/basic.html new file mode 100644 index 0000000000..8649ceba3f --- /dev/null +++ b/react-app/bower_components/iron-media-query/test/basic.html @@ -0,0 +1,118 @@ + + + + + + + iron-media-query-basic + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-media-query/test/index.html b/react-app/bower_components/iron-media-query/test/index.html new file mode 100644 index 0000000000..30e527f53c --- /dev/null +++ b/react-app/bower_components/iron-media-query/test/index.html @@ -0,0 +1,26 @@ + + + + Tests + + + + + + + + + + diff --git a/react-app/bower_components/iron-meta/.bower.json b/react-app/bower_components/iron-meta/.bower.json new file mode 100644 index 0000000000..f4bfef4a7c --- /dev/null +++ b/react-app/bower_components/iron-meta/.bower.json @@ -0,0 +1,39 @@ +{ + "name": "iron-meta", + "version": "1.1.1", + "keywords": [ + "web-components", + "polymer" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Useful for sharing information across a DOM tree", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-meta.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.4", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "iron-meta.html", + "homepage": "https://github.com/polymerelements/iron-meta", + "_release": "1.1.1", + "_resolution": { + "type": "version", + "tag": "v1.1.1", + "commit": "e171ee234b482219c9514e6f9551df48ef48bd9f" + }, + "_source": "git://github.com/polymerelements/iron-meta.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/iron-meta" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-meta/.gitignore b/react-app/bower_components/iron-meta/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-meta/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-meta/.travis.yml b/react-app/bower_components/iron-meta/.travis.yml new file mode 100644 index 0000000000..fd27446be5 --- /dev/null +++ b/react-app/bower_components/iron-meta/.travis.yml @@ -0,0 +1,28 @@ +language: node_js +sudo: false +matrix: + include: + - node_js: stable + script: xvfb-run wct + addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + - node_js: node + script: + - | + if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then + wct -s 'default' + fi +before_script: +- npm install web-component-tester +- npm install bower +- export PATH=$PWD/node_modules/.bin:$PATH +- bower install +env: + global: + - secure: eGcuDAJt+1GPrC6u95vHufjnSXWbVBZpW7oKQhZjcHrN19l9COdOb7RVkTPsZzEanHaH/D6Psr4WJKyd72Wx5wj+bqGh4nPHTFSnK3+gNT4eJAgLvsxLwHxW8QkYYHEdZe8Wd6sOdal9geeLZ8fG9xELYEtuJR6lww5uLvFv/cw= + - secure: DoBz8LDaS4/lQ9sTXE5pnp8fqEvG47mmdQaQ14EnHQ+wLbajIaLk59vRfau5c7mIef8dEgaT40r/kVP5QRr3OiH5UJY3jLnCMVIxWJ3ZTkuGGuU6QDQvoGSSBhdA+b+G94bbK6LtHQxRBrkiyT9d0IzT5ZiHlDlteGbjdDWAgw0= diff --git a/react-app/bower_components/iron-meta/CONTRIBUTING.md b/react-app/bower_components/iron-meta/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/iron-meta/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-meta/README.md b/react-app/bower_components/iron-meta/README.md new file mode 100644 index 0000000000..615c85b6da --- /dev/null +++ b/react-app/bower_components/iron-meta/README.md @@ -0,0 +1,93 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/iron-meta.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-meta) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-meta)_ + + +##<iron-meta> + + +`iron-meta` is a generic element you can use for sharing information across the DOM tree. +It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any +instance of iron-meta has access to the shared +information. You can use `iron-meta` to share whatever you want (or create an extension +[like x-meta] for enhancements). + +The `iron-meta` instances containing your actual data can be loaded in an import, +or constructed in any way you see fit. The only requirement is that you create them +before you try to access them. + +Examples: + +If I create an instance like this: + + + +Note that value="foo/bar" is the metadata I've defined. I could define more +attributes or use child nodes to define additional metadata. + +Now I can access that element (and it's metadata) from any iron-meta instance +via the byKey method, e.g. + + meta.byKey('info').getAttribute('value'); + +Pure imperative form would be like: + + document.createElement('iron-meta').byKey('info').getAttribute('value'); + +Or, in a Polymer element, you can include a meta in your template: + + + ... + this.$.meta.byKey('info').getAttribute('value'); + + + +##<iron-meta-query> + + +`iron-meta` is a generic element you can use for sharing information across the DOM tree. +It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any +instance of iron-meta has access to the shared +information. You can use `iron-meta` to share whatever you want (or create an extension +[like x-meta] for enhancements). + +The `iron-meta` instances containing your actual data can be loaded in an import, +or constructed in any way you see fit. The only requirement is that you create them +before you try to access them. + +Examples: + +If I create an instance like this: + + + +Note that value="foo/bar" is the metadata I've defined. I could define more +attributes or use child nodes to define additional metadata. + +Now I can access that element (and it's metadata) from any iron-meta instance +via the byKey method, e.g. + + meta.byKey('info').getAttribute('value'); + +Pure imperative form would be like: + + document.createElement('iron-meta').byKey('info').getAttribute('value'); + +Or, in a Polymer element, you can include a meta in your template: + + + ... + this.$.meta.byKey('info').getAttribute('value'); + + diff --git a/react-app/bower_components/iron-meta/bower.json b/react-app/bower_components/iron-meta/bower.json new file mode 100644 index 0000000000..614c5b3a66 --- /dev/null +++ b/react-app/bower_components/iron-meta/bower.json @@ -0,0 +1,29 @@ +{ + "name": "iron-meta", + "version": "1.1.1", + "keywords": [ + "web-components", + "polymer" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Useful for sharing information across a DOM tree", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-meta.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "polymerelements/paper-styles#^1.0.4", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "iron-meta.html" +} diff --git a/react-app/bower_components/iron-meta/demo/index.html b/react-app/bower_components/iron-meta/demo/index.html new file mode 100644 index 0000000000..3deee3cbd5 --- /dev/null +++ b/react-app/bower_components/iron-meta/demo/index.html @@ -0,0 +1,46 @@ + + + + + + + + + iron-meta + + + + + + + +
+

<iron-meta>

+ + The value stored at key="info" is . +
+ + + + + diff --git a/react-app/bower_components/iron-meta/hero.svg b/react-app/bower_components/iron-meta/hero.svg new file mode 100755 index 0000000000..8d36c50645 --- /dev/null +++ b/react-app/bower_components/iron-meta/hero.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-meta/index.html b/react-app/bower_components/iron-meta/index.html new file mode 100644 index 0000000000..c70dc6e5da --- /dev/null +++ b/react-app/bower_components/iron-meta/index.html @@ -0,0 +1,27 @@ + + + + + + + + iron-meta + + + + + + + + + + + diff --git a/react-app/bower_components/iron-meta/iron-meta.html b/react-app/bower_components/iron-meta/iron-meta.html new file mode 100644 index 0000000000..1521be5c0e --- /dev/null +++ b/react-app/bower_components/iron-meta/iron-meta.html @@ -0,0 +1,333 @@ + + + + + + + diff --git a/react-app/bower_components/iron-meta/test/basic.html b/react-app/bower_components/iron-meta/test/basic.html new file mode 100644 index 0000000000..c561dc3cac --- /dev/null +++ b/react-app/bower_components/iron-meta/test/basic.html @@ -0,0 +1,48 @@ + + + + + + + iron-meta-basic + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-meta/test/index.html b/react-app/bower_components/iron-meta/test/index.html new file mode 100644 index 0000000000..2b9541b73a --- /dev/null +++ b/react-app/bower_components/iron-meta/test/index.html @@ -0,0 +1,30 @@ + + + + + + + + Tests + + + + + + + + + diff --git a/react-app/bower_components/iron-meta/test/iron-meta.html b/react-app/bower_components/iron-meta/test/iron-meta.html new file mode 100644 index 0000000000..c4dc2500d2 --- /dev/null +++ b/react-app/bower_components/iron-meta/test/iron-meta.html @@ -0,0 +1,195 @@ + + + + + + + iron-meta + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/.bower.json b/react-app/bower_components/iron-overlay-behavior/.bower.json new file mode 100644 index 0000000000..507595d909 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/.bower.json @@ -0,0 +1,47 @@ +{ + "name": "iron-overlay-behavior", + "version": "1.6.2", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Provides a behavior for making an element an overlay", + "private": true, + "main": "iron-overlay-behavior.html", + "keywords": [ + "web-components", + "polymer", + "behavior", + "overlay" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-overlay-behavior.git" + }, + "dependencies": { + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0", + "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.2", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/polymerelements/iron-overlay-behavior", + "_release": "1.6.2", + "_resolution": { + "type": "version", + "tag": "v1.6.2", + "commit": "be4e703b6894af6d4013a8a9f514a384ee91e2db" + }, + "_source": "git://github.com/polymerelements/iron-overlay-behavior.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/iron-overlay-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md b/react-app/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..9925d37445 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/react-app/bower_components/iron-overlay-behavior/.gitignore b/react-app/bower_components/iron-overlay-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-overlay-behavior/.travis.yml b/react-app/bower_components/iron-overlay-behavior/.travis.yml new file mode 100644 index 0000000000..3493d3a9f1 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: H8AA9JkWfG/vc3MiimoIoYi45KD10hKzitLJnExkomgzFI/f5o9SGtwjCii5P8Kvf4xndftDjYwRgbYyJpSg0IJeq8rm1WS89cY8O6/1dlI/tK1j5xbVRrhqmRQncxUb3K4MAT6Z9br1jwEeamRa+NKmq+v+VEpQY5vwuQ/BHJw= + - secure: EaE1AUVgWyn0Y6kqkb54z5r39RvTJzAOmeM0lRl7wXzr5k0mq3VGlxTksJqCVd1PdJESXEhy8eldBnlkwZir/imDTNQxKm13k7ZiFC0000XAzpLZElkH2cLlYCRWcuM+vS7dA9hytV0UcGK2VGqbxfpcesB20dPSneDEUuc5X64= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-overlay-behavior/CONTRIBUTING.md b/react-app/bower_components/iron-overlay-behavior/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-overlay-behavior/README.md b/react-app/bower_components/iron-overlay-behavior/README.md new file mode 100644 index 0000000000..2c5efa8fe9 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/README.md @@ -0,0 +1,71 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-overlay-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-overlay-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-overlay-behavior)_ + + +##<iron-overlay-backdrop> + +`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a +singleton. + +### Styling + +The following custom properties and mixins are available for styling. + +| Custom property | Description | Default | +| --- | --- | --- | +| `--iron-overlay-backdrop-background-color` | Backdrop background color | #000 | +| `--iron-overlay-backdrop-opacity` | Backdrop opacity | 0.6 | +| `--iron-overlay-backdrop` | Mixin applied to `iron-overlay-backdrop`. | {} | +| `--iron-overlay-backdrop-opened` | Mixin applied to `iron-overlay-backdrop` when it is displayed | {} | + + + +##Polymer.IronOverlayBehavior + +Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays +on top of other content. It includes an optional backdrop, and can be used to implement a variety +of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once. + +### Closing and canceling + +A dialog may be hidden by closing or canceling. The difference between close and cancel is user +intent. Closing generally implies that the user acknowledged the content on the overlay. By default, +it will cancel whenever the user taps outside it or presses the escape key. This behavior is +configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties. +`close()` should be called explicitly by the implementer when the user interacts with a control +in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled' +event. Call `preventDefault` on this event to prevent the overlay from closing. + +### Positioning + +By default the element is sized and positioned to fit and centered inside the window. You can +position and size it manually using CSS. See `Polymer.IronFitBehavior`. + +### Backdrop + +Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is +appended to `` and is of type ``. See its doc page for styling +options. + +### Limitations + +The element is styled to appear on top of other content by setting its `z-index` property. You +must ensure no element has a stacking context with a higher `z-index` than its parent stacking +context. You should place this element as a child of `` whenever possible. + + diff --git a/react-app/bower_components/iron-overlay-behavior/bower.json b/react-app/bower_components/iron-overlay-behavior/bower.json new file mode 100644 index 0000000000..f23f3cf573 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/bower.json @@ -0,0 +1,37 @@ +{ + "name": "iron-overlay-behavior", + "version": "1.6.2", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Provides a behavior for making an element an overlay", + "private": true, + "main": "iron-overlay-behavior.html", + "keywords": [ + "web-components", + "polymer", + "behavior", + "overlay" + ], + "authors": [ + "The Polymer Authors" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-overlay-behavior.git" + }, + "dependencies": { + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0", + "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.2", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-overlay-behavior/demo/index.html b/react-app/bower_components/iron-overlay-behavior/demo/index.html new file mode 100644 index 0000000000..92ed1e052d --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/demo/index.html @@ -0,0 +1,179 @@ + + + + + + + simple-overlay demo + + + + + + + + + + + + + + + + + + +

An element with IronOverlayBehavior can be opened, closed, toggled.

+ + + + +

Use with-backdrop to add a backdrop to your overlay. Tabbing will be trapped within the overlay.

+ + + + +

Use restore-focus-on-close to return the focus to the element that opened the overlay when it gets closed.

+ + + + +

The child with autofocus gets focused when opening the overlay.

+ + + + +

Multiple overlays can be opened.

+ + + + +

Use always-on-top to keep the overlay on top of others.

+ + + + +

An element with IronOverlayBehavior can be scrollable or contain scrollable content.

+ + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/demo/simple-overlay.html b/react-app/bower_components/iron-overlay-behavior/demo/simple-overlay.html new file mode 100644 index 0000000000..7eab2432ac --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/demo/simple-overlay.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/index.html b/react-app/bower_components/iron-overlay-behavior/index.html new file mode 100644 index 0000000000..d69e30442e --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-overlay-behavior + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html b/react-app/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html new file mode 100644 index 0000000000..493ee11039 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/iron-overlay-backdrop.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/iron-overlay-behavior.html b/react-app/bower_components/iron-overlay-behavior/iron-overlay-behavior.html new file mode 100644 index 0000000000..f4b60cf4d3 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/iron-overlay-behavior.html @@ -0,0 +1,597 @@ + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/iron-overlay-manager.html b/react-app/bower_components/iron-overlay-behavior/iron-overlay-manager.html new file mode 100644 index 0000000000..df2cd04ab5 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/iron-overlay-manager.html @@ -0,0 +1,372 @@ + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/test/index.html b/react-app/bower_components/iron-overlay-behavior/test/index.html new file mode 100644 index 0000000000..c25fcbf9ad --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/test/index.html @@ -0,0 +1,31 @@ + + + iron-overlay-behavior tests + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html b/react-app/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html new file mode 100644 index 0000000000..4834a50eb6 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html @@ -0,0 +1,1075 @@ + + + + + + + iron-overlay-behavior tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/test/test-buttons.html b/react-app/bower_components/iron-overlay-behavior/test/test-buttons.html new file mode 100644 index 0000000000..6ac983ca7d --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/test/test-buttons.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/test/test-menu-button.html b/react-app/bower_components/iron-overlay-behavior/test/test-menu-button.html new file mode 100644 index 0000000000..20c7c92bc3 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/test/test-menu-button.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/test/test-overlay.html b/react-app/bower_components/iron-overlay-behavior/test/test-overlay.html new file mode 100644 index 0000000000..54ed193b52 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/test/test-overlay.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-overlay-behavior/test/test-overlay2.html b/react-app/bower_components/iron-overlay-behavior/test/test-overlay2.html new file mode 100644 index 0000000000..d9a3cf3a83 --- /dev/null +++ b/react-app/bower_components/iron-overlay-behavior/test/test-overlay2.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-range-behavior/.bower.json b/react-app/bower_components/iron-range-behavior/.bower.json new file mode 100644 index 0000000000..cb6b1b33f4 --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/.bower.json @@ -0,0 +1,40 @@ +{ + "name": "iron-range-behavior", + "version": "1.0.4", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Provides a behavior for something with a minimum and maximum value", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "behavior" + ], + "main": [ + "iron-range-behavior.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-range-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-input": "PolymerElements/iron-input#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "homepage": "https://github.com/PolymerElements/iron-range-behavior", + "_release": "1.0.4", + "_resolution": { + "type": "version", + "tag": "v1.0.4", + "commit": "71774a7d8a8c377496bfe05e60b754e91216e0b9" + }, + "_source": "git://github.com/PolymerElements/iron-range-behavior.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-range-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-range-behavior/.gitignore b/react-app/bower_components/iron-range-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-range-behavior/README.md b/react-app/bower_components/iron-range-behavior/README.md new file mode 100644 index 0000000000..8d523bc69c --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/README.md @@ -0,0 +1,4 @@ +iron-range-behavior +========== + +`Polymer.IronRangeBehavior` provides the behavior for something with a minimum to maximum range. diff --git a/react-app/bower_components/iron-range-behavior/bower.json b/react-app/bower_components/iron-range-behavior/bower.json new file mode 100644 index 0000000000..b4967a7f56 --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/bower.json @@ -0,0 +1,30 @@ +{ + "name": "iron-range-behavior", + "version": "1.0.4", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Provides a behavior for something with a minimum and maximum value", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "behavior" + ], + "main": [ + "iron-range-behavior.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-range-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-input": "PolymerElements/iron-input#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/react-app/bower_components/iron-range-behavior/demo/index.html b/react-app/bower_components/iron-range-behavior/demo/index.html new file mode 100644 index 0000000000..ce397365e0 --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/demo/index.html @@ -0,0 +1,79 @@ + + + + + iron-range-behavior demo + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-range-behavior/index.html b/react-app/bower_components/iron-range-behavior/index.html new file mode 100644 index 0000000000..cc77788735 --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-range-behavior/iron-range-behavior.html b/react-app/bower_components/iron-range-behavior/iron-range-behavior.html new file mode 100644 index 0000000000..28469e9eae --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/iron-range-behavior.html @@ -0,0 +1,112 @@ + + + + + diff --git a/react-app/bower_components/iron-range-behavior/test/basic.html b/react-app/bower_components/iron-range-behavior/test/basic.html new file mode 100644 index 0000000000..37e4317dcc --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/test/basic.html @@ -0,0 +1,153 @@ + + + + + + iron-range-behavior + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-range-behavior/test/index.html b/react-app/bower_components/iron-range-behavior/test/index.html new file mode 100644 index 0000000000..155baeabed --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/test/index.html @@ -0,0 +1,25 @@ + + + + + + + Tests + + + + + + diff --git a/react-app/bower_components/iron-range-behavior/test/x-progressbar.html b/react-app/bower_components/iron-range-behavior/test/x-progressbar.html new file mode 100644 index 0000000000..f99b0d9d56 --- /dev/null +++ b/react-app/bower_components/iron-range-behavior/test/x-progressbar.html @@ -0,0 +1,18 @@ + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/.bower.json b/react-app/bower_components/iron-resizable-behavior/.bower.json new file mode 100644 index 0000000000..2e765b9324 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/.bower.json @@ -0,0 +1,41 @@ +{ + "name": "iron-resizable-behavior", + "version": "1.0.3", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Coordinates the flow of resizeable elements", + "private": true, + "main": "iron-resizable-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-resizable-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/iron-resizable-behavior", + "_release": "1.0.3", + "_resolution": { + "type": "version", + "tag": "v1.0.3", + "commit": "dda1df6aaf452aedf3e52ff0cf69e72439452216" + }, + "_source": "git://github.com/PolymerElements/iron-resizable-behavior.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-resizable-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-resizable-behavior/.gitignore b/react-app/bower_components/iron-resizable-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-resizable-behavior/.travis.yml b/react-app/bower_components/iron-resizable-behavior/.travis.yml new file mode 100644 index 0000000000..b36cb31d27 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: fs6PoLBRc5z3vn6PWJTkxmGWTHnHVcXx2c7sb7wUlLFLjWUegb93X5gAUhAQvvLvFYT8uMYxT7sNsP15O16CH9OWS8h6ZbgaPp61zRJXvGN+pOtohOloanjzANzsYNFsV3LKEFg8/BULqQAKkRAdsg4hXfMWDzPvCGl1++y5mGc= + - secure: gm+c5R0tFY/GJfKOnfV3J0IADe7QSzo5wZvRq4wZnroK9gBixuI66fq0dhRFtMjkc3dip1h+iqwmRqY8bKoMriCcl8J8ya7mG92sUTz57H7Sr6hxoYDdT4v+JUrQ+iZmTczh77IAQDZrAnxQIeEnBsLezidZD4b+EAYCICvL9WE= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-resizable-behavior/CONTRIBUTING.md b/react-app/bower_components/iron-resizable-behavior/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-resizable-behavior/README.md b/react-app/bower_components/iron-resizable-behavior/README.md new file mode 100644 index 0000000000..2f37628c12 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/README.md @@ -0,0 +1,36 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-resizable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-resizable-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-resizable-behavior)_ + + +##Polymer.IronResizableBehavior + +`IronResizableBehavior` is a behavior that can be used in Polymer elements to +coordinate the flow of resize events between "resizers" (elements that control the +size or hidden state of their children) and "resizables" (elements that need to be +notified when they are resized or un-hidden by their parents in order to take +action on their new measurements). + +Elements that perform measurement should add the `IronResizableBehavior` behavior to +their element definition and listen for the `iron-resize` event on themselves. +This event will be fired when they become showing after having been hidden, +when they are resized explicitly by another resizable, or when the window has been +resized. + +Note, the `iron-resize` event is non-bubbling. + + diff --git a/react-app/bower_components/iron-resizable-behavior/bower.json b/react-app/bower_components/iron-resizable-behavior/bower.json new file mode 100644 index 0000000000..053bfd0c88 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-resizable-behavior", + "version": "1.0.3", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Coordinates the flow of resizeable elements", + "private": true, + "main": "iron-resizable-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-resizable-behavior.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/iron-resizable-behavior/demo/index.html b/react-app/bower_components/iron-resizable-behavior/demo/index.html new file mode 100644 index 0000000000..2896c50d25 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/demo/index.html @@ -0,0 +1,29 @@ + + + + + + + iron-resizable-behavior demo + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/demo/src/x-app.html b/react-app/bower_components/iron-resizable-behavior/demo/src/x-app.html new file mode 100644 index 0000000000..c334ad3d2f --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/demo/src/x-app.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/index.html b/react-app/bower_components/iron-resizable-behavior/index.html new file mode 100644 index 0000000000..b9b8809560 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/index.html @@ -0,0 +1,25 @@ + + + + + + + iron-resizable-behavior + + + + + + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/iron-resizable-behavior.html b/react-app/bower_components/iron-resizable-behavior/iron-resizable-behavior.html new file mode 100644 index 0000000000..9ac0d3967e --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/iron-resizable-behavior.html @@ -0,0 +1,195 @@ + + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/test/basic.html b/react-app/bower_components/iron-resizable-behavior/test/basic.html new file mode 100644 index 0000000000..d3183c02e8 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/test/basic.html @@ -0,0 +1,223 @@ + + + + + + + iron-resizable-behavior tests + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/test/index.html b/react-app/bower_components/iron-resizable-behavior/test/index.html new file mode 100644 index 0000000000..fa83bf6e34 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/test/index.html @@ -0,0 +1,29 @@ + + + + Tests + + + + + + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/test/iron-resizable-behavior.html b/react-app/bower_components/iron-resizable-behavior/test/iron-resizable-behavior.html new file mode 100644 index 0000000000..9149004687 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/test/iron-resizable-behavior.html @@ -0,0 +1,88 @@ + + + + + + + iron-resizable-behavior tests + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-resizable-behavior/test/test-elements.html b/react-app/bower_components/iron-resizable-behavior/test/test-elements.html new file mode 100644 index 0000000000..d70561e174 --- /dev/null +++ b/react-app/bower_components/iron-resizable-behavior/test/test-elements.html @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/.bower.json b/react-app/bower_components/iron-scroll-target-behavior/.bower.json new file mode 100644 index 0000000000..43debbcd89 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/.bower.json @@ -0,0 +1,40 @@ +{ + "name": "iron-scroll-target-behavior", + "version": "1.0.6", + "description": "Allows to define a scroller target", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "main": "iron-scroll-target-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "scroll" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-scroll-target-behavior.git" + }, + "homepage": "https://github.com/PolymerElements/iron-scroll-target-behavior", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "_release": "1.0.6", + "_resolution": { + "type": "version", + "tag": "v1.0.6", + "commit": "33d5864e0557212eb530dbac280bfc4b4d923880" + }, + "_source": "git://github.com/PolymerElements/iron-scroll-target-behavior.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-scroll-target-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-scroll-target-behavior/.github/ISSUE_TEMPLATE.md b/react-app/bower_components/iron-scroll-target-behavior/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..c430c402e0 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/react-app/bower_components/iron-scroll-target-behavior/.gitignore b/react-app/bower_components/iron-scroll-target-behavior/.gitignore new file mode 100644 index 0000000000..1eb1fa5e92 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/.gitignore @@ -0,0 +1,2 @@ +bower_components + diff --git a/react-app/bower_components/iron-scroll-target-behavior/.travis.yml b/react-app/bower_components/iron-scroll-target-behavior/.travis.yml new file mode 100644 index 0000000000..52309c4197 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +node_js: stable +addons: + firefox: latest + sauce_connect: true + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 +before_script: +- npm install -g bower polylint web-component-tester +- bower install +- polylint +script: +- xvfb-run wct +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default'; fi +env: + global: + - CXX=g++-4.8 + - secure: V9/FfFlrGgmgHI8icv3zjSn2bupGJs3FG2KlCqBwK5irWVU3Kcshl8XnXordLIfu2UF4Q/Aa4PkD2jKNuX/jSgGPpAfAi7aOruURSMZCzPErzKTQRg8iqHovhqDyJ2d5TypCRPCYDp+nO1ZQdPT5GQ1/8EZgilZFNVNTZ9twUJIYqPEcyQ7eAlxynDgjKxhMLa04UnUXzHVZ200x09gqGXByAK6tHvzf/W3BtjmjX7BZp0CWWk7tBgiH9gBsqwaYwHG7hg+hCVsnywN6G2WsUpPM4tBu3iyiVuNDuhY07MrV1uxEW9NCjyK8GUpHuCVN9A4CxeeDJM4xR8A3JUaVvWRwhES6KJ4YEdjfU6W759o2e05Sw3q3k4YQD96xiRz5YXYrnqLvm75trLY75pWqzIQkh+6g/C/ZBxRndh/n1VrV35GtAN+KEPE733PLvE8+yUWSiSAo052GyiYqt82joZv8+a1E38jg+bWRAYGuKcYxB5zS7xCEfkoztCuBT80yR+daQGyv0q61jmDrCUgl4B2m3xNf0+C08hYhR7KPHrMzIov3LTgJhHt6oonFs21Oa9cO8moMgaXP7Az8Y4c4Bg/BXaUe6lKkZ19kyzuDbF7hFKY0ABt1SwwkHZkEJ/Bk95CJigauFOuR3rq4TW4+M1DyqebvoyzjF4H1rHBY+lo= + - secure: x0Lq3topCMeNImNyY7nKiVPUEaQHjmywaen23pqH5/slsYrmMEFUEME+2sigGDuSacmhfka7DZuXs7jZuk6DlZN5HoueW+xwF6MxnGJRibTw6yFj6g3MJ0dDD6wu3w9TVERNiWCJ5drnTH41QwvUjGMtBrJuHw6qaiCuuLzbwqCxkRynEjssOXzsYY4JlC3EgM2/BVZQ1H2lyWH+elmRXOGDADzm8BVGQkJWCj644HROvGc45j2cOP+vq5MvL1SEA4IDdRRYGOhcc9lGZUY/qOfsai2K0LzgIvMQbjAdt8kbcvz8cnCVJHreIJKQfNe7VAWFiXhNbbzGrYH4DGe52MRSM6c22oLWqzgctqF1YDYAPAoF+6Cj6HqzHmMyNAe4RkpAGnXw5V4HjX013BFYCdImMHF6Am8I2RW2q+buWWW9fZVFjKGD0woz3ay5W4jw6Z//V73J6p/jDiVgq0MT2S4Q8hCEh8QaqK69v9eS+Vxbh1KRUvFaBJvgDYfTnTQ4niuT/Y7TV0ZQ/DMAZ/kBfyMLAmyU5XWuGAnmg6uydE5JtHJHKYb+BKyZ++uImhyfM+bQkp6PxWRNxKsgNt8dcYn50/ppNnkHjXpoQxAlR5kjjiHsVmo4ZLOxkckjyr074Kb/nmDOqMxbRzdTlsBBqycJZjKtm4YX+GkrQXsEbg8= diff --git a/react-app/bower_components/iron-scroll-target-behavior/CONTRIBUTING.md b/react-app/bower_components/iron-scroll-target-behavior/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-scroll-target-behavior/README.md b/react-app/bower_components/iron-scroll-target-behavior/README.md new file mode 100644 index 0000000000..d7861f80b1 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/README.md @@ -0,0 +1,28 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-scroll-target-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-scroll-target-behavior) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-scroll-target-behavior)_ + + +##Polymer.IronScrollTargetBehavior + +`Polymer.IronScrollTargetBehavior` allows an element to respond to scroll events from a +designated scroll target. + +Elements that consume this behavior can override the `_scrollHandler` +method to add logic on the scroll event. + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/bower.json b/react-app/bower_components/iron-scroll-target-behavior/bower.json new file mode 100644 index 0000000000..3d8ee2b026 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/bower.json @@ -0,0 +1,31 @@ +{ + "name": "iron-scroll-target-behavior", + "version": "1.0.6", + "description": "Allows to define a scroller target", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "main": "iron-scroll-target-behavior.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "scroll" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-scroll-target-behavior.git" + }, + "homepage": "https://github.com/PolymerElements/iron-scroll-target-behavior", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/react-app/bower_components/iron-scroll-target-behavior/demo/document.html b/react-app/bower_components/iron-scroll-target-behavior/demo/document.html new file mode 100644 index 0000000000..a5f45f79bf --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/demo/document.html @@ -0,0 +1,39 @@ + + + + + + + iron-scroll-target-behavior using the document scrolling + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/demo/scrolling-region.html b/react-app/bower_components/iron-scroll-target-behavior/demo/scrolling-region.html new file mode 100644 index 0000000000..d60a1cf90e --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/demo/scrolling-region.html @@ -0,0 +1,51 @@ + + + + + + + iron-scroll-target-behavior using a scrolling region + + + + + + + + + + + + + +
+ +
+ + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/demo/x-scrollable.html b/react-app/bower_components/iron-scroll-target-behavior/demo/x-scrollable.html new file mode 100644 index 0000000000..98f3325352 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/demo/x-scrollable.html @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/index.html b/react-app/bower_components/iron-scroll-target-behavior/index.html new file mode 100644 index 0000000000..e48685ab32 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/index.html @@ -0,0 +1,28 @@ + + + + + + + iron-scroll-target-behavior + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/iron-scroll-target-behavior.html b/react-app/bower_components/iron-scroll-target-behavior/iron-scroll-target-behavior.html new file mode 100644 index 0000000000..ab6ee9cfd1 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/iron-scroll-target-behavior.html @@ -0,0 +1,234 @@ + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/test/basic.html b/react-app/bower_components/iron-scroll-target-behavior/test/basic.html new file mode 100644 index 0000000000..5ca98b590f --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/test/basic.html @@ -0,0 +1,298 @@ + + + + + + iron-scroll-target-behavior test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/test/index.html b/react-app/bower_components/iron-scroll-target-behavior/test/index.html new file mode 100644 index 0000000000..3f7a2e2ad6 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/test/index.html @@ -0,0 +1,32 @@ + + + + + + + + Tests + + + + + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/test/x-nested-scrollable.html b/react-app/bower_components/iron-scroll-target-behavior/test/x-nested-scrollable.html new file mode 100644 index 0000000000..e4d8b21231 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/test/x-nested-scrollable.html @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-scroll-target-behavior/test/x-scrollable.html b/react-app/bower_components/iron-scroll-target-behavior/test/x-scrollable.html new file mode 100644 index 0000000000..3b994785d5 --- /dev/null +++ b/react-app/bower_components/iron-scroll-target-behavior/test/x-scrollable.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/.bower.json b/react-app/bower_components/iron-selector/.bower.json new file mode 100644 index 0000000000..66d7d54b0f --- /dev/null +++ b/react-app/bower_components/iron-selector/.bower.json @@ -0,0 +1,42 @@ +{ + "name": "iron-selector", + "version": "1.3.0", + "description": "Manages a set of elements that can be selected", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "main": "iron-selector.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "selector" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-selector.git" + }, + "homepage": "https://github.com/PolymerElements/iron-selector", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.2.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.4", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "_release": "1.3.0", + "_resolution": { + "type": "version", + "tag": "v1.3.0", + "commit": "1662093611cda3fd29125cdab94a61d3d88093da" + }, + "_source": "git://github.com/PolymerElements/iron-selector.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-selector" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-selector/.gitignore b/react-app/bower_components/iron-selector/.gitignore new file mode 100644 index 0000000000..b13058c3b8 --- /dev/null +++ b/react-app/bower_components/iron-selector/.gitignore @@ -0,0 +1,2 @@ +bower_components +.DS_Store diff --git a/react-app/bower_components/iron-selector/.travis.yml b/react-app/bower_components/iron-selector/.travis.yml new file mode 100644 index 0000000000..bc9ed370bc --- /dev/null +++ b/react-app/bower_components/iron-selector/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: ltCkwJM0nkTS9WjikyjqBsB5J2hQon4UnVVrINk4y+Vq4v9PQJH3+83nya0jnxilKaeAJs4d2/OS02F9GkqYpsSmDz7OgXPfk0hrHA8UksvvpSALfnukleIAN2YTOcxXJKeNHcfpqCKPk1dGeNQOEM61H+QgTBIyFB3sMugygqs= + - secure: TJuu1WdpFLTaBN/prBafm8Pld/BQCySNuuG1nATbF3fqiOpgehXu8Z5URAz5syUhqZAyEmuRMxvXpEVD/t1jrtaXVwkdCFkkQ4ckkP4gTIeSGA/Puw8sveB2q7QAqXyTmeFkocNlh8fxV+B07o0SPWdhcvdZnDVU9VrpSqL+92M= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/iron-selector/CONTRIBUTING.md b/react-app/bower_components/iron-selector/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/iron-selector/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/iron-selector/README.md b/react-app/bower_components/iron-selector/README.md new file mode 100755 index 0000000000..237133b73c --- /dev/null +++ b/react-app/bower_components/iron-selector/README.md @@ -0,0 +1,74 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/iron-selector.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-selector) + +_[Demo and API docs](https://elements.polymer-project.org/elements/iron-selector)_ + + +##<iron-selector> + + `iron-selector` is an element which can be used to manage a list of elements + that can be selected. Tapping on the item will make the item selected. The `selected` indicates + which item is being selected. The default is to use the index of the item. + + Example: + +```html + +
Item 1
+
Item 2
+
Item 3
+
+``` + + If you want to use the attribute value of an element for `selected` instead of the index, + set `attrForSelected` to the name of the attribute. For example, if you want to select item by + `name`, set `attrForSelected` to `name`. + + Example: + +```html + +
Foo
+
Bar
+
Zot
+
+``` + + `iron-selector` is not styled. Use the `iron-selected` CSS class to style the selected element. + + Example: + +```html + + + ... + + +
Item 1
+
Item 2
+
Item 3
+
+``` + + + + + + diff --git a/react-app/bower_components/iron-selector/bower.json b/react-app/bower_components/iron-selector/bower.json new file mode 100755 index 0000000000..95f3f7f199 --- /dev/null +++ b/react-app/bower_components/iron-selector/bower.json @@ -0,0 +1,33 @@ +{ + "name": "iron-selector", + "version": "1.3.0", + "description": "Manages a set of elements that can be selected", + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "main": "iron-selector.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "selector" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-selector.git" + }, + "homepage": "https://github.com/PolymerElements/iron-selector", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.2.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.4", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/react-app/bower_components/iron-selector/demo/index.html b/react-app/bower_components/iron-selector/demo/index.html new file mode 100644 index 0000000000..2fa46b2cd9 --- /dev/null +++ b/react-app/bower_components/iron-selector/demo/index.html @@ -0,0 +1,86 @@ + + + + + + + iron-selector + + + + + + + + + + + + + + +
+
+

Basic

+
+ +
Item 0
+
Item 1
+
Item 2
+
Item 3
+
Item 4
+
+
+
+ +
+

Multi-select

+
+ +
Item 0
+
Item 1
+
Item 2
+
Item 3
+
Item 4
+
+
+
+ +
+

Example

+
+ +
Foo
+
Bar
+
Baz
+
Qux
+
Quux
+
+
+
+
+ + + diff --git a/react-app/bower_components/iron-selector/index.html b/react-app/bower_components/iron-selector/index.html new file mode 100755 index 0000000000..a27840bce6 --- /dev/null +++ b/react-app/bower_components/iron-selector/index.html @@ -0,0 +1,28 @@ + + + + + + + iron-selector + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/iron-multi-selectable.html b/react-app/bower_components/iron-selector/iron-multi-selectable.html new file mode 100644 index 0000000000..b20e04efdd --- /dev/null +++ b/react-app/bower_components/iron-selector/iron-multi-selectable.html @@ -0,0 +1,148 @@ + + + + + + diff --git a/react-app/bower_components/iron-selector/iron-selectable.html b/react-app/bower_components/iron-selector/iron-selectable.html new file mode 100644 index 0000000000..2a02eb2f07 --- /dev/null +++ b/react-app/bower_components/iron-selector/iron-selectable.html @@ -0,0 +1,357 @@ + + + + + + diff --git a/react-app/bower_components/iron-selector/iron-selection.html b/react-app/bower_components/iron-selector/iron-selection.html new file mode 100644 index 0000000000..c09e63c93f --- /dev/null +++ b/react-app/bower_components/iron-selector/iron-selection.html @@ -0,0 +1,118 @@ + + + + + + diff --git a/react-app/bower_components/iron-selector/iron-selector.html b/react-app/bower_components/iron-selector/iron-selector.html new file mode 100644 index 0000000000..92abe04f1b --- /dev/null +++ b/react-app/bower_components/iron-selector/iron-selector.html @@ -0,0 +1,71 @@ + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/activate-event.html b/react-app/bower_components/iron-selector/test/activate-event.html new file mode 100644 index 0000000000..9b47eb09b9 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/activate-event.html @@ -0,0 +1,149 @@ + + + + + + + iron-selector-activate-event + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/attr-for-selected-elements.html b/react-app/bower_components/iron-selector/test/attr-for-selected-elements.html new file mode 100644 index 0000000000..3acae81bbf --- /dev/null +++ b/react-app/bower_components/iron-selector/test/attr-for-selected-elements.html @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/attr-for-selected.html b/react-app/bower_components/iron-selector/test/attr-for-selected.html new file mode 100644 index 0000000000..59298af5c0 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/attr-for-selected.html @@ -0,0 +1,163 @@ + + + + + + + iron-selector attr-for-selected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/basic.html b/react-app/bower_components/iron-selector/test/basic.html new file mode 100644 index 0000000000..d934f75e41 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/basic.html @@ -0,0 +1,229 @@ + + + + + + + iron-selector-basic + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/content-element.html b/react-app/bower_components/iron-selector/test/content-element.html new file mode 100644 index 0000000000..d0cd6d7205 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/content-element.html @@ -0,0 +1,43 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/content.html b/react-app/bower_components/iron-selector/test/content.html new file mode 100644 index 0000000000..e869f98d5b --- /dev/null +++ b/react-app/bower_components/iron-selector/test/content.html @@ -0,0 +1,168 @@ + + + + + + + iron-selector-content + + + + + + + + + + + + + + + + +
item0
+
item1
+
item2
+
item3
+
+ + + item0 +
+ item1 + item2 +
+ item3 +
+ + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/excluded-local-names.html b/react-app/bower_components/iron-selector/test/excluded-local-names.html new file mode 100644 index 0000000000..377267294f --- /dev/null +++ b/react-app/bower_components/iron-selector/test/excluded-local-names.html @@ -0,0 +1,95 @@ + + + + + + + iron-selector-selected-attribute + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/index.html b/react-app/bower_components/iron-selector/test/index.html new file mode 100644 index 0000000000..dc5108cb7e --- /dev/null +++ b/react-app/bower_components/iron-selector/test/index.html @@ -0,0 +1,41 @@ + + + + Tests + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/multi.html b/react-app/bower_components/iron-selector/test/multi.html new file mode 100644 index 0000000000..3fc581f38c --- /dev/null +++ b/react-app/bower_components/iron-selector/test/multi.html @@ -0,0 +1,320 @@ + + + + + + + iron-selector-multi + + + + + + + + + + + + + + + + + + + + + + + + +
vim
+
+ + + + + + diff --git a/react-app/bower_components/iron-selector/test/next-previous.html b/react-app/bower_components/iron-selector/test/next-previous.html new file mode 100644 index 0000000000..3a830c2915 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/next-previous.html @@ -0,0 +1,134 @@ + + + + + + + iron-selector-next-previous + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/numeric-ids.html b/react-app/bower_components/iron-selector/test/numeric-ids.html new file mode 100644 index 0000000000..3ce6c45162 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/numeric-ids.html @@ -0,0 +1,72 @@ + + + + + + + iron-selector-numeric-ids + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/selected-attribute.html b/react-app/bower_components/iron-selector/test/selected-attribute.html new file mode 100644 index 0000000000..7c429786c4 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/selected-attribute.html @@ -0,0 +1,128 @@ + + + + + + + iron-selector-selected-attribute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-selector/test/template-repeat.html b/react-app/bower_components/iron-selector/test/template-repeat.html new file mode 100644 index 0000000000..4dc1f6f325 --- /dev/null +++ b/react-app/bower_components/iron-selector/test/template-repeat.html @@ -0,0 +1,103 @@ + + + + + + + iron-selector-template-repeat + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/.bower.json b/react-app/bower_components/iron-validatable-behavior/.bower.json new file mode 100644 index 0000000000..62842a49d8 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/.bower.json @@ -0,0 +1,44 @@ +{ + "name": "iron-validatable-behavior", + "version": "1.0.5", + "description": "Provides a behavior for an element that validates user input", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "main": [ + "iron-validatable-behavior.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-validatable-behavior.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-validatable-behavior", + "ignore": [], + "dependencies": { + "iron-meta": "PolymerElements/iron-meta#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.4", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "_release": "1.0.5", + "_resolution": { + "type": "version", + "tag": "v1.0.5", + "commit": "c1334b835892b3d7a329a8e6b8741d4be3a8d99c" + }, + "_source": "git://github.com/PolymerElements/iron-validatable-behavior.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/iron-validatable-behavior" +} \ No newline at end of file diff --git a/react-app/bower_components/iron-validatable-behavior/.gitignore b/react-app/bower_components/iron-validatable-behavior/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/iron-validatable-behavior/README.md b/react-app/bower_components/iron-validatable-behavior/README.md new file mode 100644 index 0000000000..48f7fb2dde --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/README.md @@ -0,0 +1,3 @@ +# iron-validatable-behavior +Implements an element validated with Polymer.IronValidatorBehavior + diff --git a/react-app/bower_components/iron-validatable-behavior/bower.json b/react-app/bower_components/iron-validatable-behavior/bower.json new file mode 100644 index 0000000000..f57fff7d56 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/bower.json @@ -0,0 +1,35 @@ +{ + "name": "iron-validatable-behavior", + "version": "1.0.5", + "description": "Provides a behavior for an element that validates user input", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "iron", + "behavior" + ], + "main": [ + "iron-validatable-behavior.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/iron-validatable-behavior.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/iron-validatable-behavior", + "ignore": [], + "dependencies": { + "iron-meta": "PolymerElements/iron-meta#^1.0.0", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.4", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "*", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/react-app/bower_components/iron-validatable-behavior/demo/cats-only.html b/react-app/bower_components/iron-validatable-behavior/demo/cats-only.html new file mode 100644 index 0000000000..83ef9ba617 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/demo/cats-only.html @@ -0,0 +1,46 @@ + + + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/demo/index.html b/react-app/bower_components/iron-validatable-behavior/demo/index.html new file mode 100644 index 0000000000..84b96a8dc2 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/demo/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + iron-validatable-behavior demo + + + + + + + + + + + +
+

<iron-validatable-behavior>

+ + + +
+ + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/demo/validatable-input.html b/react-app/bower_components/iron-validatable-behavior/demo/validatable-input.html new file mode 100644 index 0000000000..19cf477598 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/demo/validatable-input.html @@ -0,0 +1,46 @@ + + + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/index.html b/react-app/bower_components/iron-validatable-behavior/index.html new file mode 100644 index 0000000000..cfaa5b1759 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/index.html @@ -0,0 +1,30 @@ + + + + + + + + + iron-validatable-behavior + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/iron-validatable-behavior.html b/react-app/bower_components/iron-validatable-behavior/iron-validatable-behavior.html new file mode 100644 index 0000000000..8060713913 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/iron-validatable-behavior.html @@ -0,0 +1,134 @@ + + + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/test/index.html b/react-app/bower_components/iron-validatable-behavior/test/index.html new file mode 100644 index 0000000000..05194fdd8f --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/test/index.html @@ -0,0 +1,35 @@ + + + + + + paper-validatable-behavior tests + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html b/react-app/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html new file mode 100644 index 0000000000..847a3f8f09 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/test/iron-validatable-behavior.html @@ -0,0 +1,58 @@ + + + + + + iron-validatable-behavior tests + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/iron-validatable-behavior/test/test-validatable.html b/react-app/bower_components/iron-validatable-behavior/test/test-validatable.html new file mode 100644 index 0000000000..51513bff01 --- /dev/null +++ b/react-app/bower_components/iron-validatable-behavior/test/test-validatable.html @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/react-app/bower_components/neon-animation/.bower.json b/react-app/bower_components/neon-animation/.bower.json new file mode 100644 index 0000000000..df548d1c3c --- /dev/null +++ b/react-app/bower_components/neon-animation/.bower.json @@ -0,0 +1,61 @@ +{ + "name": "neon-animation", + "description": "A system for animating Polymer-based web components", + "version": "1.2.0", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "web-animations" + ], + "main": [ + "neon-animated-pages.html", + "neon-animatable-behavior.html", + "neon-animation-behavior.html", + "neon-animation-runner-behavior.html", + "neon-shared-element-animatable-behavior.html", + "neon-shared-element-animation-behavior.html", + "neon-animatable.html", + "neon-animations.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/neon-animation" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/neon-animation", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-meta": "PolymerElements/iron-meta#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "iron-selector": "PolymerElements/iron-selector#^1.0.0", + "web-animations-js": "web-animations/web-animations-js#2.1.4" + }, + "devDependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0" + }, + "_release": "1.2.0", + "_resolution": { + "type": "version", + "tag": "v1.2.0", + "commit": "2d3416a01f865a25fe581ad0cfcda6ae4f9cf142" + }, + "_source": "git://github.com/PolymerElements/neon-animation.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/neon-animation" +} \ No newline at end of file diff --git a/react-app/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md b/react-app/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..08943a1e15 --- /dev/null +++ b/react-app/bower_components/neon-animation/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/react-app/bower_components/neon-animation/.gitignore b/react-app/bower_components/neon-animation/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/neon-animation/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/neon-animation/.travis.yml b/react-app/bower_components/neon-animation/.travis.yml new file mode 100644 index 0000000000..047c9b2f9f --- /dev/null +++ b/react-app/bower_components/neon-animation/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" +env: + global: + - secure: AnPpB3uzTWU0hmrDmPyOb/3mJZRv4BgPFJrpaT/mQ/9979IBeFfFHJX6MqQlgo894lJWvKSvAjEutgK5Z3LQh6cLB3JuhPBInwKgFPUx/V14VIju+Z7jwx6RycE3flb2f9Y6y5My13ovswsTNnhJEkpDGlbRnJlh5c+HeP+6D0oFPFaGWvULZsAHQnEykir1TMPL2TD8SfuYWifmBj7QYQ2vsYnqZoAkPNedv/OtdoA3rziFXSG3GqXX2NJVnYqlaLj/HiHK7xLlZu/ODfo6En12DMtqJajBP7NfJkEUAF72ScOsYxlwiI1aYcVSUy6upkxxPwkBj5x7wDZ0tRFmlautyq2skDAh/fgIfRw9AMe8kj/YLef+T8bmZNT9IIelNaNcpfTQHpYWcOpPk2uBT3iIOcmp+Ys8RZKqzYmekBtHTwCGmQcfQrjBXjrjz5xlUaoMH7vauh7Ct7SkD7Fu87XSUvks4v2yypxxmHXO8jUilKuUdtAzb3dtOboO0ptsoLuBm/qSeURco4be6KPyVnDxdWdbYOxIZtE8JeY2DbonS45OgFtL1NKeEIhiTQIcOuSs0qwJFFzaBBAfek1tkTvBhMJP3JPWpIbNJhdZWzSd0LUSe892sbiZJY67FA4xcY8vK5JZNWnxFyKX1+A8ljPEd1yBImxMzUDMNS9t0G0= + - secure: jdh0G/FDRghnjasav0/8nOZsYgXUd5DLKgD5XrDCVrBvPwXly+AnMXE+Hr/bztEXylcEmcqrWUUfB1ODUdVn1EGk8CJaYpHyKcoMcpJiEjHYS/3i1rXRsnHs2o3dcRO69rA8A5LZeG3yYfiPVUiKlyl7MWOal3pNohDGi8dZcT0CoWnA8UaV//0uXG3GGG3X8KcbVfB2hQvG1mK6wM6W4eHVOplcBaE2xnnFDMxfU2KnRgjLSPw66PeJGczWOBR9fZql9p6kV38ZM2s4qnUsMlTZkNqn0f6CuEPqcG6+S6Tk9+0dvAHet+Ky9fgiyJPq+p6sDGfdm1ZJwOjz5MoyudzGSuHAJHH2nscQf8pUBQ1gxKaGg7GV9LUj0cjLDAFWA2KpxTlabDZhZPIMoMKFpqpvJG49gDVga5gGabom21nd/+E1i/2vvoP16kY9rjf+Gd5+tIzajXCu8Tq06Xz63idZDJbt38GjArfFFqe5k7CqE+m2vpWx/iTwe+cT70wnIq/xigvaNq6CgUuNdzkVnVBj/C7yVqwwZkfbBC7HhRna9Nyzts/j2M2vwy0oYB73WzuhpYSweaAOZq2kcUIQ5ZMGO3UkZRjwWnHxAi5mrvZhRcRIqkvJJhoMQnjwJSTah/3cz0cJh19DL+Ozde24/tuY+vOnhFb+ddo1OKD6FtM= + - CXX=g++-4.8 diff --git a/react-app/bower_components/neon-animation/CONTRIBUTING.md b/react-app/bower_components/neon-animation/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/neon-animation/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/neon-animation/README.md b/react-app/bower_components/neon-animation/README.md new file mode 100644 index 0000000000..29c0753996 --- /dev/null +++ b/react-app/bower_components/neon-animation/README.md @@ -0,0 +1,306 @@ +# neon-animation + +`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/). + +*Warning: The API may change.* + +* [A basic animatable element](#basic) +* [Animation configuration](#configuration) + * [Animation types](#configuration-types) + * [Configuration properties](#configuration-properties) + * [Using multiple animations](#configuration-multiple) + * [Running animations encapsulated in children nodes](#configuration-encapsulation) +* [Page transitions](#page-transitions) + * [Shared element animations](#shared-element) + * [Declarative page transitions](#declarative-page) +* [Included animations](#animations) +* [Demos](#demos) + + +## A basic animatable element + +Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation. + +```js +Polymer({ + is: 'my-animatable', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + animationConfig: { + value: function() { + return { + // provided by neon-animation/animations/scale-down-animation.html + name: 'scale-down-animation', + node: this + } + } + } + }, + listeners: { + // this event is fired when the animation finishes + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + animate: function() { + // run scale-down-animation + this.playAnimation(); + }, + _onNeonAnimationFinish: function() { + console.log('animation done!'); + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/basic.html) + + +## Animation configuration + + +### Animation types + +An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration. + +```js +Polymer({ + is: 'my-dialog', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + opened: { + type: Boolean + }, + animationConfig: { + value: function() { + return { + 'entry': { + // provided by neon-animation/animations/scale-up-animation.html + name: 'scale-up-animation', + node: this + }, + 'exit': { + // provided by neon-animation/animations/fade-out-animation.html + name: 'fade-out-animation', + node: this + } + } + } + } + }, + listeners: { + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + show: function() { + this.opened = true; + this.style.display = 'inline-block'; + // run scale-up-animation + this.playAnimation('entry'); + }, + hide: function() { + this.opened = false; + // run fade-out-animation + this.playAnimation('exit'); + }, + _onNeonAnimationFinish: function() { + if (!this.opened) { + this.style.display = 'none'; + } + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/types.html) + +You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations: + +```js +properties: { + entryAnimation: { + value: 'scale-up-animation' + }, + exitAnimation: { + value: 'fade-out-animation' + } +} +``` + + +### Configuration properties + +You can pass additional parameters to configure an animation in the animation configuration object. +All animations should accept the following properties: + + * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`. + * `node`: The target node to apply the animation to. Defaults to `this`. + * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The + properties include the following: + * `duration`: The duration of the animation in milliseconds. + * `delay`: The delay before the start of the animation in milliseconds. + * `easing`: A timing function for the animation. Matches the CSS timing function values. + +Animations may define additional configuration properties and they are listed in their documentation. + + +### Using multiple animations + +Set the animation configuration to an array to combine animations, like this: + +```js +animationConfig: { + value: function() { + return { + // fade-in-animation is run with a 50ms delay from slide-down-animation + 'entry': [{ + name: 'slide-down-animation', + node: this + }, { + name: 'fade-in-animation', + node: this, + timing: {delay: 50} + }] + } + } +} +``` + + +### Running animations encapsulated in children nodes + +You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property. + +```js +animationConfig: { + value: function() { + return { + // run fade-in-animation on this, and the entry animation on this.$.myAnimatable + 'entry': [ + {name: 'fade-in-animation', node: this}, + {animatable: this.$.myAnimatable, type: 'entry'} + ] + } + } +} +``` + + +## Page transitions + +*The artist formerly known as ``* + +The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page. + + +### Shared element animations + +Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation. + +In the incoming page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the incoming page defines the 'entry' animation + 'entry': { + name: 'hero-animation', + id: 'hero', + toPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.hero + } + } + } +} +``` + +In the outgoing page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the outgoing page defines the 'exit' animation + 'exit': { + name: 'hero-animation', + id: 'hero', + fromPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.otherHero + } + } + } +} +``` + + +### Declarative page transitions + +For convenience, if you define the `entry-animation` and `exit-animation` attributes on ``, those animations will apply for all page transitions. + +For example: + +```js + + 1 + 2 + 3 + 4 + 5 + +``` + +The new page will slide in from the right, and the old page slide away to the left. + + +## Included animations + +Single element animations: + + * `fade-in-animation` Animates opacity from `0` to `1`; + * `fade-out-animation` Animates opacity from `1` to `0`; + * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`; + * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`; + * `slide-down-animation` Animates transform from `none` to `translateY(100%)`; + * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`; + * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`; + * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`; + * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`; + * `slide-right-animation` Animates transform from `none` to `translateX(100%)`; + * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`; + * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`; + * `transform-animation` Animates a custom transform. + +Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties. + +Shared element animations + + * `hero-animation` Animates an element such that it looks like it scales and transforms from another element. + * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element. + +Group animations + * `cascaded-animation` Applys an animation to an array of elements with a delay between each. + + +## Demos + + * [Grid to full screen](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/grid/index.html) + * [Animation on load](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/load/index.html) + * [List item to detail](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/list/index.html) (For narrow width) + * [Dots to squares](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/tiles/index.html) + * [Declarative](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/declarative/index.html) diff --git a/react-app/bower_components/neon-animation/animations/cascaded-animation.html b/react-app/bower_components/neon-animation/animations/cascaded-animation.html new file mode 100644 index 0000000000..539975333d --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/cascaded-animation.html @@ -0,0 +1,95 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/fade-in-animation.html b/react-app/bower_components/neon-animation/animations/fade-in-animation.html new file mode 100644 index 0000000000..cdb74e3095 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/fade-in-animation.html @@ -0,0 +1,49 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/fade-out-animation.html b/react-app/bower_components/neon-animation/animations/fade-out-animation.html new file mode 100644 index 0000000000..82cc3997cf --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/fade-out-animation.html @@ -0,0 +1,49 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/hero-animation.html b/react-app/bower_components/neon-animation/animations/hero-animation.html new file mode 100644 index 0000000000..a9075e138f --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/hero-animation.html @@ -0,0 +1,83 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/opaque-animation.html b/react-app/bower_components/neon-animation/animations/opaque-animation.html new file mode 100644 index 0000000000..f5b60a4514 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/opaque-animation.html @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/reverse-ripple-animation.html b/react-app/bower_components/neon-animation/animations/reverse-ripple-animation.html new file mode 100644 index 0000000000..7284e9bd42 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/reverse-ripple-animation.html @@ -0,0 +1,86 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/ripple-animation.html b/react-app/bower_components/neon-animation/animations/ripple-animation.html new file mode 100644 index 0000000000..1f5c736e3b --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/ripple-animation.html @@ -0,0 +1,92 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/scale-down-animation.html b/react-app/bower_components/neon-animation/animations/scale-down-animation.html new file mode 100644 index 0000000000..6dc187b317 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/scale-down-animation.html @@ -0,0 +1,65 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/scale-up-animation.html b/react-app/bower_components/neon-animation/animations/scale-up-animation.html new file mode 100644 index 0000000000..b5164f7fe1 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/scale-up-animation.html @@ -0,0 +1,65 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-down-animation.html b/react-app/bower_components/neon-animation/animations/slide-down-animation.html new file mode 100644 index 0000000000..c17141f25e --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-down-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-from-bottom-animation.html b/react-app/bower_components/neon-animation/animations/slide-from-bottom-animation.html new file mode 100644 index 0000000000..18c40db26b --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-from-bottom-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-from-left-animation.html b/react-app/bower_components/neon-animation/animations/slide-from-left-animation.html new file mode 100644 index 0000000000..d248175221 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-from-left-animation.html @@ -0,0 +1,60 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-from-right-animation.html b/react-app/bower_components/neon-animation/animations/slide-from-right-animation.html new file mode 100644 index 0000000000..4ebbf11b86 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-from-right-animation.html @@ -0,0 +1,60 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-from-top-animation.html b/react-app/bower_components/neon-animation/animations/slide-from-top-animation.html new file mode 100644 index 0000000000..32920f06b8 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-from-top-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-left-animation.html b/react-app/bower_components/neon-animation/animations/slide-left-animation.html new file mode 100644 index 0000000000..7fbc446bcc --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-left-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-right-animation.html b/react-app/bower_components/neon-animation/animations/slide-right-animation.html new file mode 100644 index 0000000000..e6441c4f38 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-right-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/slide-up-animation.html b/react-app/bower_components/neon-animation/animations/slide-up-animation.html new file mode 100644 index 0000000000..fdf1186d16 --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/slide-up-animation.html @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/animations/transform-animation.html b/react-app/bower_components/neon-animation/animations/transform-animation.html new file mode 100644 index 0000000000..f5963ed05f --- /dev/null +++ b/react-app/bower_components/neon-animation/animations/transform-animation.html @@ -0,0 +1,70 @@ + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/bower.json b/react-app/bower_components/neon-animation/bower.json new file mode 100644 index 0000000000..123ff76c41 --- /dev/null +++ b/react-app/bower_components/neon-animation/bower.json @@ -0,0 +1,52 @@ +{ + "name": "neon-animation", + "description": "A system for animating Polymer-based web components", + "version": "1.2.0", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "web-animations" + ], + "main": [ + "neon-animated-pages.html", + "neon-animatable-behavior.html", + "neon-animation-behavior.html", + "neon-animation-runner-behavior.html", + "neon-shared-element-animatable-behavior.html", + "neon-shared-element-animation-behavior.html", + "neon-animatable.html", + "neon-animations.html" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/neon-animation" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/neon-animation", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-meta": "PolymerElements/iron-meta#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "iron-selector": "PolymerElements/iron-selector#^1.0.0", + "web-animations-js": "web-animations/web-animations-js#2.1.4" + }, + "devDependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0" + } +} diff --git a/react-app/bower_components/neon-animation/demo/card/index.html b/react-app/bower_components/neon-animation/demo/card/index.html new file mode 100644 index 0000000000..44993465fc --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/card/index.html @@ -0,0 +1,166 @@ + + + + + neon-animated-pages demo: card + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/card/x-card.html b/react-app/bower_components/neon-animation/demo/card/x-card.html new file mode 100644 index 0000000000..6a578fc489 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/card/x-card.html @@ -0,0 +1,97 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/card/x-cards-list.html b/react-app/bower_components/neon-animation/demo/card/x-cards-list.html new file mode 100644 index 0000000000..b817698fb5 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/card/x-cards-list.html @@ -0,0 +1,75 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/declarative/index.html b/react-app/bower_components/neon-animation/demo/declarative/index.html new file mode 100644 index 0000000000..26ba53ff9b --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/declarative/index.html @@ -0,0 +1,132 @@ + + + + + neon-animated-pages demo: declarative + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/doc/index.html b/react-app/bower_components/neon-animation/demo/doc/index.html new file mode 100644 index 0000000000..8b3875e7ec --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/doc/index.html @@ -0,0 +1,70 @@ + + + + + neon-animation demo: basic + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/doc/my-animatable.html b/react-app/bower_components/neon-animation/demo/doc/my-animatable.html new file mode 100644 index 0000000000..5063f74ba6 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/doc/my-animatable.html @@ -0,0 +1,68 @@ + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/doc/my-dialog.html b/react-app/bower_components/neon-animation/demo/doc/my-dialog.html new file mode 100644 index 0000000000..bd3344c0ea --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/doc/my-dialog.html @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/dropdown/animated-dropdown.html b/react-app/bower_components/neon-animation/demo/dropdown/animated-dropdown.html new file mode 100644 index 0000000000..9a61530fb7 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/dropdown/animated-dropdown.html @@ -0,0 +1,90 @@ + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/dropdown/index.html b/react-app/bower_components/neon-animation/demo/dropdown/index.html new file mode 100644 index 0000000000..b238474cbf --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/dropdown/index.html @@ -0,0 +1,54 @@ + + + + + neon-animated-pages demo: dropdown + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/grid/animated-grid.html b/react-app/bower_components/neon-animation/demo/grid/animated-grid.html new file mode 100644 index 0000000000..a268936416 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/grid/animated-grid.html @@ -0,0 +1,164 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html b/react-app/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html new file mode 100644 index 0000000000..63d35bbf68 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/grid/fullsize-page-with-card.html @@ -0,0 +1,122 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/grid/index.html b/react-app/bower_components/neon-animation/demo/grid/index.html new file mode 100644 index 0000000000..b102dba40b --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/grid/index.html @@ -0,0 +1,64 @@ + + + + + neon-animated-pages demo: grid + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/index.html b/react-app/bower_components/neon-animation/demo/index.html new file mode 100644 index 0000000000..1e4e1204a8 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/index.html @@ -0,0 +1,45 @@ + + + + + neon-animated pages demo + + + + + + + + + + +
+
+

Sample demos

+ +
+
+ + diff --git a/react-app/bower_components/neon-animation/demo/list/full-view.html b/react-app/bower_components/neon-animation/demo/list/full-view.html new file mode 100644 index 0000000000..565618c218 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/list/full-view.html @@ -0,0 +1,118 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/list/index.html b/react-app/bower_components/neon-animation/demo/list/index.html new file mode 100644 index 0000000000..eabb02e5b6 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/list/index.html @@ -0,0 +1,35 @@ + + + + + neon-animated-pages demo: list + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/list/list-demo.html b/react-app/bower_components/neon-animation/demo/list/list-demo.html new file mode 100644 index 0000000000..45808c8cae --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/list/list-demo.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/list/list-view.html b/react-app/bower_components/neon-animation/demo/list/list-view.html new file mode 100644 index 0000000000..ddb05502ca --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/list/list-view.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/load/animated-grid.html b/react-app/bower_components/neon-animation/demo/load/animated-grid.html new file mode 100644 index 0000000000..c1d52c1a5e --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/load/animated-grid.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/load/full-page.html b/react-app/bower_components/neon-animation/demo/load/full-page.html new file mode 100644 index 0000000000..61a11bd7ba --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/load/full-page.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/load/index.html b/react-app/bower_components/neon-animation/demo/load/index.html new file mode 100644 index 0000000000..54c8d68a5a --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/load/index.html @@ -0,0 +1,48 @@ + + + + + neon-animated-pages demo: load + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/reprojection/animated-grid.html b/react-app/bower_components/neon-animation/demo/reprojection/animated-grid.html new file mode 100644 index 0000000000..f1244b442c --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/reprojection/animated-grid.html @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/reprojection/fullsize-page-with-card.html b/react-app/bower_components/neon-animation/demo/reprojection/fullsize-page-with-card.html new file mode 100644 index 0000000000..83b8a9170c --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/reprojection/fullsize-page-with-card.html @@ -0,0 +1,120 @@ + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/reprojection/index.html b/react-app/bower_components/neon-animation/demo/reprojection/index.html new file mode 100644 index 0000000000..591d63c698 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/reprojection/index.html @@ -0,0 +1,63 @@ + + + + + neon-animated-pages demo: grid + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/reprojection/reprojected-pages.html b/react-app/bower_components/neon-animation/demo/reprojection/reprojected-pages.html new file mode 100644 index 0000000000..e71f2e055d --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/reprojection/reprojected-pages.html @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/shared-styles.html b/react-app/bower_components/neon-animation/demo/shared-styles.html new file mode 100644 index 0000000000..4e48c8c406 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/shared-styles.html @@ -0,0 +1,47 @@ + + + + + diff --git a/react-app/bower_components/neon-animation/demo/tiles/circles-page.html b/react-app/bower_components/neon-animation/demo/tiles/circles-page.html new file mode 100644 index 0000000000..70a4a75210 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/tiles/circles-page.html @@ -0,0 +1,107 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/tiles/index.html b/react-app/bower_components/neon-animation/demo/tiles/index.html new file mode 100644 index 0000000000..f509f0b5e6 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/tiles/index.html @@ -0,0 +1,70 @@ + + + + + neon-animated-pages demo: tiles + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/demo/tiles/squares-page.html b/react-app/bower_components/neon-animation/demo/tiles/squares-page.html new file mode 100644 index 0000000000..52fe7e1880 --- /dev/null +++ b/react-app/bower_components/neon-animation/demo/tiles/squares-page.html @@ -0,0 +1,100 @@ + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/guides/neon-animation.md b/react-app/bower_components/neon-animation/guides/neon-animation.md new file mode 100644 index 0000000000..69727b864f --- /dev/null +++ b/react-app/bower_components/neon-animation/guides/neon-animation.md @@ -0,0 +1,314 @@ +--- +title: neon-animation +summary: "A short guide to neon-animation and neon-animated-pages" +tags: ['animation','core-animated-pages'] +elements: ['neon-animation','neon-animated-pages'] +updated: 2015-05-26 +--- + +# neon-animation + +`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/). + +*Warning: The API may change.* + +* [A basic animatable element](#basic) +* [Animation configuration](#configuration) + * [Animation types](#configuration-types) + * [Configuration properties](#configuration-properties) + * [Using multiple animations](#configuration-multiple) + * [Running animations encapsulated in children nodes](#configuration-encapsulation) +* [Page transitions](#page-transitions) + * [Shared element animations](#shared-element) + * [Declarative page transitions](#declarative-page) +* [Included animations](#animations) +* [Demos](#demos) + + +## A basic animatable element + +Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation. + +```js +Polymer({ + is: 'my-animatable', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + animationConfig: { + value: function() { + return { + // provided by neon-animation/animations/scale-down-animation.html + name: 'scale-down-animation', + node: this + } + } + } + }, + listeners: { + // this event is fired when the animation finishes + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + animate: function() { + // run scale-down-animation + this.playAnimation(); + }, + _onNeonAnimationFinish: function() { + console.log('animation done!'); + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/basic.html) + + +## Animation configuration + + +### Animation types + +An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration. + +```js +Polymer({ + is: 'my-dialog', + behaviors: [ + Polymer.NeonAnimationRunnerBehavior + ], + properties: { + opened: { + type: Boolean + }, + animationConfig: { + value: function() { + return { + 'entry': { + // provided by neon-animation/animations/scale-up-animation.html + name: 'scale-up-animation', + node: this + }, + 'exit': { + // provided by neon-animation-animations/fade-out-animation.html + name: 'fade-out-animation', + node: this + } + } + } + } + }, + listeners: { + 'neon-animation-finish': '_onNeonAnimationFinish' + }, + show: function() { + this.opened = true; + this.style.display = 'inline-block'; + // run scale-up-animation + this.playAnimation('entry'); + }, + hide: function() { + this.opened = false; + // run fade-out-animation + this.playAnimation('exit'); + }, + _onNeonAnimationFinish: function() { + if (!this.opened) { + this.style.display = 'none'; + } + } +}); +``` + +[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/types.html) + +You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations: + +```js +properties: { + entryAnimation: { + value: 'scale-up-animation' + }, + exitAnimation: { + value: 'fade-out-animation' + } +} +``` + + +### Configuration properties + +You can pass additional parameters to configure an animation in the animation configuration object. +All animations should accept the following properties: + + * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`. + * `node`: The target node to apply the animation to. Defaults to `this`. + * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The + properties include the following: + * `duration`: The duration of the animation in milliseconds. + * `delay`: The delay before the start of the animation in milliseconds. + * `easing`: A timing function for the animation. Matches the CSS timing function values. + +Animations may define additional configuration properties and they are listed in their documentation. + + +### Using multiple animations + +Set the animation configuration to an array to combine animations, like this: + +```js +animationConfig: { + value: function() { + return { + // fade-in-animation is run with a 50ms delay from slide-down-animation + 'entry': [{ + name: 'slide-down-animation', + node: this + }, { + name: 'fade-in-animation', + node: this, + timing: {delay: 50} + }] + } + } +} +``` + + +### Running animations encapsulated in children nodes + +You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property. + +```js +animationConfig: { + value: function() { + return { + // run fade-in-animation on this, and the entry animation on this.$.myAnimatable + 'entry': [ + {name: 'fade-in-animation', node: this}, + {animatable: this.$.myAnimatable, type: 'entry'} + ] + } + } +} +``` + + +## Page transitions + +*The artist formerly known as ``* + +The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page. + + +### Shared element animations + +Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation. + +In the incoming page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the incoming page defines the 'entry' animation + 'entry': { + name: 'hero-animation', + id: 'hero', + toPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.hero + } + } + } +} +``` + +In the outgoing page: + +```js +properties: { + animationConfig: { + value: function() { + return { + // the outgoing page defines the 'exit' animation + 'exit': { + name: 'hero-animation', + id: 'hero', + fromPage: this + } + } + } + }, + sharedElements: { + value: function() { + return { + 'hero': this.$.otherHero + } + } + } +} +``` + + +### Declarative page transitions + +For convenience, if you define the `entry-animation` and `exit-animation` attributes on ``, those animations will apply for all page transitions. + +For example: + +```js + + 1 + 2 + 3 + 4 + 5 + +``` + +The new page will slide in from the right, and the old page slide away to the left. + + +## Included animations + +Single element animations: + + * `fade-in-animation` Animates opacity from `0` to `1`; + * `fade-out-animation` Animates opacity from `1` to `0`; + * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`; + * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`; + * `slide-down-animation` Animates transform from `none` to `translateY(100%)`; + * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`; + * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`; + * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`; + * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`; + * `slide-right-animation` Animates transform from `none` to `translateX(100%)`; + * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`; + * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`; + * `transform-animation` Animates a custom transform. + +Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties. + +Shared element animations + + * `hero-animation` Animates an element such that it looks like it scales and transforms from another element. + * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element. + +Group animations + * `cascaded-animation` Applys an animation to an array of elements with a delay between each. + + +## Demos + + * [Grid to full screen](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/grid/index.html) + * [Animation on load](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/load/index.html) + * [List item to detail](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/list/index.html) (For narrow width) + * [Dots to squares](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/tiles/index.html) + * [Declarative](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/declarative/index.html) diff --git a/react-app/bower_components/neon-animation/index.html b/react-app/bower_components/neon-animation/index.html new file mode 100644 index 0000000000..6f5feedf45 --- /dev/null +++ b/react-app/bower_components/neon-animation/index.html @@ -0,0 +1,30 @@ + + + + + + + + + neon-animation + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-animatable-behavior.html b/react-app/bower_components/neon-animation/neon-animatable-behavior.html new file mode 100644 index 0000000000..734563f4cf --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-animatable-behavior.html @@ -0,0 +1,162 @@ + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-animatable.html b/react-app/bower_components/neon-animation/neon-animatable.html new file mode 100644 index 0000000000..82deb610b6 --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-animatable.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-animated-pages.html b/react-app/bower_components/neon-animation/neon-animated-pages.html new file mode 100644 index 0000000000..01a6ed5340 --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-animated-pages.html @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-animation-behavior.html b/react-app/bower_components/neon-animation/neon-animation-behavior.html new file mode 100644 index 0000000000..6939d3428a --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-animation-behavior.html @@ -0,0 +1,86 @@ + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-animation-runner-behavior.html b/react-app/bower_components/neon-animation/neon-animation-runner-behavior.html new file mode 100644 index 0000000000..31923f034c --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-animation-runner-behavior.html @@ -0,0 +1,113 @@ + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-animation.html b/react-app/bower_components/neon-animation/neon-animation.html new file mode 100644 index 0000000000..da64504859 --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-animation.html @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-animations.html b/react-app/bower_components/neon-animation/neon-animations.html new file mode 100644 index 0000000000..67c4df4c76 --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-animations.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-shared-element-animatable-behavior.html b/react-app/bower_components/neon-animation/neon-shared-element-animatable-behavior.html new file mode 100644 index 0000000000..e63173d368 --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-shared-element-animatable-behavior.html @@ -0,0 +1,43 @@ + + + + + + diff --git a/react-app/bower_components/neon-animation/neon-shared-element-animation-behavior.html b/react-app/bower_components/neon-animation/neon-shared-element-animation-behavior.html new file mode 100644 index 0000000000..7787615b03 --- /dev/null +++ b/react-app/bower_components/neon-animation/neon-shared-element-animation-behavior.html @@ -0,0 +1,72 @@ + + + + + + diff --git a/react-app/bower_components/neon-animation/test/index.html b/react-app/bower_components/neon-animation/test/index.html new file mode 100644 index 0000000000..0479597d0a --- /dev/null +++ b/react-app/bower_components/neon-animation/test/index.html @@ -0,0 +1,26 @@ + + + + neon-animation tests + + + + + + + diff --git a/react-app/bower_components/neon-animation/test/neon-animated-pages-lazy.html b/react-app/bower_components/neon-animation/test/neon-animated-pages-lazy.html new file mode 100644 index 0000000000..371b4c26e0 --- /dev/null +++ b/react-app/bower_components/neon-animation/test/neon-animated-pages-lazy.html @@ -0,0 +1,73 @@ + + + + + + neon-animated-pages tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/test/neon-animated-pages.html b/react-app/bower_components/neon-animation/test/neon-animated-pages.html new file mode 100644 index 0000000000..98220b67ed --- /dev/null +++ b/react-app/bower_components/neon-animation/test/neon-animated-pages.html @@ -0,0 +1,101 @@ + + + + + + neon-animated-pages tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/test/test-resizable-pages.html b/react-app/bower_components/neon-animation/test/test-resizable-pages.html new file mode 100644 index 0000000000..7330a1ffd1 --- /dev/null +++ b/react-app/bower_components/neon-animation/test/test-resizable-pages.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/neon-animation/web-animations.html b/react-app/bower_components/neon-animation/web-animations.html new file mode 100644 index 0000000000..c871854017 --- /dev/null +++ b/react-app/bower_components/neon-animation/web-animations.html @@ -0,0 +1,11 @@ + + + diff --git a/react-app/bower_components/paper-behaviors/.bower.json b/react-app/bower_components/paper-behaviors/.bower.json new file mode 100644 index 0000000000..a6b333d335 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/.bower.json @@ -0,0 +1,51 @@ +{ + "name": "paper-behaviors", + "version": "1.0.11", + "description": "Common behaviors across the paper elements", + "authors": [ + "The Polymer Authors" + ], + "main": [ + "paper-button-behavior.html", + "paper-checked-element-behavior.html", + "paper-inky-focus-behavior.html" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "behavior" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-behaviors" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-behaviors", + "dependencies": { + "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", + "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0", + "paper-ripple": "PolymerElements/paper-ripple#^1.0.0", + "polymer": "Polymer/polymer#^1.2.1" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-material": "PolymerElements/paper-material#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "_release": "1.0.11", + "_resolution": { + "type": "version", + "tag": "v1.0.11", + "commit": "e3c1ab0c72905b58fb4d9adc2921ea73b5c085a5" + }, + "_source": "git://github.com/polymerelements/paper-behaviors.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/paper-behaviors" +} \ No newline at end of file diff --git a/react-app/bower_components/paper-behaviors/.gitignore b/react-app/bower_components/paper-behaviors/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-behaviors/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-behaviors/.travis.yml b/react-app/bower_components/paper-behaviors/.travis.yml new file mode 100644 index 0000000000..f44cf504cf --- /dev/null +++ b/react-app/bower_components/paper-behaviors/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: Mni8srJPpo7GAk5wCLTiqqVqAJxxKMpGuxYxooqIAuc050n26KkHfDWLPY69taFY9WYjU3pzVEwrYX3HqSbib1CTlcfeATGs1+q2rXKZKmBAnKKPi12CEEXOcbMoVgzVQs7rzr8MQF9LR2TLtBuMQEoAimebA7uQcYGXcSWKJR4= + - secure: LYF3qBtJ6zZcf9dsSJ9t/My4Cne5ieI6RkHFj/0MBcy0vMbUazTH38vuy+FILYlrzbaxkVs36lPQFBXH83Ue3TxjdfjeNvK8YiuEcFjE5lQi2u7+x54eSV3myp2SIdtBLGE7rqmY0zj/Oeg91fV22OdfSHhJxuV/RxFFZIuZtHY= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-behaviors/CONTRIBUTING.md b/react-app/bower_components/paper-behaviors/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-behaviors/README.md b/react-app/bower_components/paper-behaviors/README.md new file mode 100644 index 0000000000..969e7967c0 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/README.md @@ -0,0 +1,44 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/paper-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-behaviors) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/paper-behaviors)_ + + + + +##Polymer.PaperCheckedElementBehavior + +Use `Polymer.PaperCheckedElementBehavior` to implement a custom element +that has a `checked` property similar to `Polymer.IronCheckedElementBehavior` +and is compatible with having a ripple effect. + + + +##Polymer.PaperInkyFocusBehavior + +`Polymer.PaperInkyFocusBehavior` implements a ripple when the element has keyboard focus. + + + +##Polymer.PaperRippleBehavior + +`Polymer.PaperRippleBehavior` dynamically implements a ripple +when the element has focus via pointer or keyboard. + +NOTE: This behavior is intended to be used in conjunction with and after +`Polymer.IronButtonState` and `Polymer.IronControlState`. + + diff --git a/react-app/bower_components/paper-behaviors/bower.json b/react-app/bower_components/paper-behaviors/bower.json new file mode 100644 index 0000000000..5933ab1de9 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/bower.json @@ -0,0 +1,42 @@ +{ + "name": "paper-behaviors", + "version": "1.0.11", + "description": "Common behaviors across the paper elements", + "authors": [ + "The Polymer Authors" + ], + "main": [ + "paper-button-behavior.html", + "paper-checked-element-behavior.html", + "paper-inky-focus-behavior.html" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "behavior" + ], + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-behaviors" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-behaviors", + "dependencies": { + "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", + "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0", + "paper-ripple": "PolymerElements/paper-ripple#^1.0.0", + "polymer": "Polymer/polymer#^1.2.1" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-material": "PolymerElements/paper-material#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-behaviors/demo/index.html b/react-app/bower_components/paper-behaviors/demo/index.html new file mode 100644 index 0000000000..cc3b3fd334 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/demo/index.html @@ -0,0 +1,57 @@ + + + + + + + + + + + paper-behaviors demo + + + + + + + + + + + +

Normal

+ + Hello World + +

Toggles

+ + Hello World + +

Disabled

+ + Hello World + +

Radio button with focus state

+ + + + + + diff --git a/react-app/bower_components/paper-behaviors/demo/paper-button.html b/react-app/bower_components/paper-behaviors/demo/paper-button.html new file mode 100644 index 0000000000..a520a0f9ec --- /dev/null +++ b/react-app/bower_components/paper-behaviors/demo/paper-button.html @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/demo/paper-radio-button.html b/react-app/bower_components/paper-behaviors/demo/paper-radio-button.html new file mode 100644 index 0000000000..b664494284 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/demo/paper-radio-button.html @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/index.html b/react-app/bower_components/paper-behaviors/index.html new file mode 100644 index 0000000000..37184eaa0d --- /dev/null +++ b/react-app/bower_components/paper-behaviors/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/paper-button-behavior.html b/react-app/bower_components/paper-behaviors/paper-button-behavior.html new file mode 100644 index 0000000000..21b999f5b4 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/paper-button-behavior.html @@ -0,0 +1,103 @@ + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/paper-checked-element-behavior.html b/react-app/bower_components/paper-behaviors/paper-checked-element-behavior.html new file mode 100644 index 0000000000..806392aa2c --- /dev/null +++ b/react-app/bower_components/paper-behaviors/paper-checked-element-behavior.html @@ -0,0 +1,61 @@ + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/paper-inky-focus-behavior.html b/react-app/bower_components/paper-behaviors/paper-inky-focus-behavior.html new file mode 100644 index 0000000000..76fffc116b --- /dev/null +++ b/react-app/bower_components/paper-behaviors/paper-inky-focus-behavior.html @@ -0,0 +1,55 @@ + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/paper-ripple-behavior.html b/react-app/bower_components/paper-behaviors/paper-ripple-behavior.html new file mode 100644 index 0000000000..1d63b75e89 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/paper-ripple-behavior.html @@ -0,0 +1,130 @@ + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/index.html b/react-app/bower_components/paper-behaviors/test/index.html new file mode 100644 index 0000000000..693054c07e --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/paper-button-behavior.html b/react-app/bower_components/paper-behaviors/test/paper-button-behavior.html new file mode 100644 index 0000000000..ff8592520a --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/paper-button-behavior.html @@ -0,0 +1,113 @@ + + + + + + paper-button-behavior + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/paper-checked-element-behavior.html b/react-app/bower_components/paper-behaviors/test/paper-checked-element-behavior.html new file mode 100644 index 0000000000..363cf4c7bf --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/paper-checked-element-behavior.html @@ -0,0 +1,94 @@ + + + + + + paper-checked-element-behavior + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/paper-radio-button-behavior.html b/react-app/bower_components/paper-behaviors/test/paper-radio-button-behavior.html new file mode 100644 index 0000000000..0418057dd1 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/paper-radio-button-behavior.html @@ -0,0 +1,58 @@ + + + + + + paper-radio-button-behavior + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/paper-ripple-behavior.html b/react-app/bower_components/paper-behaviors/test/paper-ripple-behavior.html new file mode 100644 index 0000000000..9139dc8edd --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/paper-ripple-behavior.html @@ -0,0 +1,335 @@ + + + + + + paper-ripple-behavior + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/shadowed-ripple.html b/react-app/bower_components/paper-behaviors/test/shadowed-ripple.html new file mode 100644 index 0000000000..1ebad13e09 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/shadowed-ripple.html @@ -0,0 +1,55 @@ + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/test-button.html b/react-app/bower_components/paper-behaviors/test/test-button.html new file mode 100644 index 0000000000..3bbf356e67 --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/test-button.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-behaviors/test/test-radio-button.html b/react-app/bower_components/paper-behaviors/test/test-radio-button.html new file mode 100644 index 0000000000..0e942de46a --- /dev/null +++ b/react-app/bower_components/paper-behaviors/test/test-radio-button.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-button/.bower.json b/react-app/bower_components/paper-button/.bower.json new file mode 100644 index 0000000000..875a876743 --- /dev/null +++ b/react-app/bower_components/paper-button/.bower.json @@ -0,0 +1,52 @@ +{ + "name": "paper-button", + "version": "1.0.11", + "description": "Material design button", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "button" + ], + "main": "paper-button.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-button" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-button", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "paper-ripple": "polymerelements/paper-ripple#^1.0.0", + "paper-material": "polymerelements/paper-material#^1.0.0", + "paper-behaviors": "polymerelements/paper-behaviors#^1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0" + }, + "ignore": [], + "_release": "1.0.11", + "_resolution": { + "type": "version", + "tag": "v1.0.11", + "commit": "7d0f75300372d91835ae7298593d50987d4a610f" + }, + "_source": "git://github.com/PolymerElements/paper-button.git", + "_target": "~1.0.11", + "_originalSource": "paper-button", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/paper-button/.gitignore b/react-app/bower_components/paper-button/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-button/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-button/.travis.yml b/react-app/bower_components/paper-button/.travis.yml new file mode 100644 index 0000000000..77c5526690 --- /dev/null +++ b/react-app/bower_components/paper-button/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: false +before_script: + - npm install web-component-tester + - npm install bower + - 'export PATH=$PWD/node_modules/.bin:$PATH' + - bower install +env: + global: + - secure: geFs7Ipj7/9knSKT2FEYAB7b/zbmgWFXCgZm7cEcrG71EX/HB1do3spANGOlRly77xaZtNNF1OGYBHIP36DSyMEHRYj6TYtTrPIr2ySeHvoOv0nzYakXdscxBvfI5HJrNiFpld80KoGl8vKfroLNpVLallgumX3diydypolvW1I= + - secure: IILEhg3m49exN5hpxbPP1JA/q+s4v/QpOMbDiXVRV4Uz1XwOPGLCyrAB0ENjwzMCyeOah1Z2MyQSUiPisLheHKvZifhviNqizWN//8EDkg1gkU0R6egGdotD5mBb3UpCD0CNZ8+D0FYwOpdCWCruwr7N+zDUN+6r5H07KP/VeUU= +node_js: 4 +addons: + firefox: latest + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-button/CONTRIBUTING.md b/react-app/bower_components/paper-button/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/paper-button/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-button/README.md b/react-app/bower_components/paper-button/README.md new file mode 100644 index 0000000000..9e6a0cdc30 --- /dev/null +++ b/react-app/bower_components/paper-button/README.md @@ -0,0 +1,76 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/paper-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-button) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/paper-button)_ + + +##<paper-button> + + +Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html) + +`paper-button` is a button. When the user touches the button, a ripple effect emanates +from the point of contact. It may be flat or raised. A raised button is styled with a +shadow. + +Example: + + Flat button + Raised button + No ripple effect + Toggle-able button + +A button that has `toggles` true will remain `active` after being clicked (and +will have an `active` attribute set). For more information, see the `Polymer.IronButtonState` +behavior. + +You may use custom DOM in the button body to create a variety of buttons. For example, to +create a button with an icon and some text: + + + + custom button content + + +### Styling + +Style the button with CSS as you would a normal DOM element. + + paper-button.fancy { + background: green; + color: yellow; + } + + paper-button.fancy:hover { + background: lime; + } + + paper-button[disabled], + paper-button[toggles][active] { + background: red; + } + +By default, the ripple is the same color as the foreground at 25% opacity. You may +customize the color using the `--paper-button-ink-color` custom property. + +The following custom properties and mixins are also available for styling: + +Custom property | Description | Default +----------------|-------------|---------- +`--paper-button-ink-color` | Background color of the ripple | `Based on the button's color` +`--paper-button` | Mixin applied to the button | `{}` +`--paper-button-disabled` | Mixin applied to the disabled button. Note that you can also use the `paper-button[disabled]` selector | `{}` +`--paper-button-flat-keyboard-focus` | Mixin applied to a flat button after it's been focused using the keyboard | `{}` +`--paper-button-raised-keyboard-focus` | Mixin applied to a raised button after it's been focused using the keyboard | `{}` + + diff --git a/react-app/bower_components/paper-button/bower.json b/react-app/bower_components/paper-button/bower.json new file mode 100644 index 0000000000..bcb07a86c0 --- /dev/null +++ b/react-app/bower_components/paper-button/bower.json @@ -0,0 +1,42 @@ +{ + "name": "paper-button", + "version": "1.0.11", + "description": "Material design button", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "button" + ], + "main": "paper-button.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-button" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-button", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "paper-ripple": "polymerelements/paper-ripple#^1.0.0", + "paper-material": "polymerelements/paper-material#^1.0.0", + "paper-behaviors": "polymerelements/paper-behaviors#^1.0.0", + "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-button/demo/index.html b/react-app/bower_components/paper-button/demo/index.html new file mode 100644 index 0000000000..4f57bd5f8e --- /dev/null +++ b/react-app/bower_components/paper-button/demo/index.html @@ -0,0 +1,122 @@ + + + + + + + + + + + paper-button demo + + + + + + + + + + + +
+

Buttons can be flat, raised, toggleable, or disabled

+ + + + +

Buttons can have icons

+ + + + +

Buttons can hide the ripple effect using the noink attribute

+ + + + +

Buttons can be styled using custom properties

+ + + +
+ + diff --git a/react-app/bower_components/paper-button/index.html b/react-app/bower_components/paper-button/index.html new file mode 100644 index 0000000000..487bb5c38a --- /dev/null +++ b/react-app/bower_components/paper-button/index.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-button/paper-button.html b/react-app/bower_components/paper-button/paper-button.html new file mode 100644 index 0000000000..c5a0d18431 --- /dev/null +++ b/react-app/bower_components/paper-button/paper-button.html @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-button/test/index.html b/react-app/bower_components/paper-button/test/index.html new file mode 100644 index 0000000000..50048191aa --- /dev/null +++ b/react-app/bower_components/paper-button/test/index.html @@ -0,0 +1,24 @@ + + + + paper-button tests + + + + + + + diff --git a/react-app/bower_components/paper-button/test/paper-button.html b/react-app/bower_components/paper-button/test/paper-button.html new file mode 100644 index 0000000000..54200e63f0 --- /dev/null +++ b/react-app/bower_components/paper-button/test/paper-button.html @@ -0,0 +1,108 @@ + + + + + + paper-button basic tests + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-drawer-panel/.bower.json b/react-app/bower_components/paper-drawer-panel/.bower.json new file mode 100644 index 0000000000..6c9fcaed03 --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "paper-drawer-panel", + "version": "1.0.9", + "description": "A responsive drawer panel", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "drawer", + "responsive", + "layout" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-drawer-panel.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-drawer-panel", + "dependencies": { + "iron-media-query": "PolymerElements/iron-media-query#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "iron-selector": "PolymerElements/iron-selector#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "paper-drawer-panel.html", + "ignore": [], + "_release": "1.0.9", + "_resolution": { + "type": "version", + "tag": "v1.0.9", + "commit": "d0f2c801380397e5d4334b273a2fef63099d4a2f" + }, + "_source": "git://github.com/PolymerElements/paper-drawer-panel.git", + "_target": "~1.0.9", + "_originalSource": "PolymerElements/paper-drawer-panel", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/paper-drawer-panel/.gitignore b/react-app/bower_components/paper-drawer-panel/.gitignore new file mode 100644 index 0000000000..fbe05fc93b --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/.gitignore @@ -0,0 +1 @@ +bower_components/ diff --git a/react-app/bower_components/paper-drawer-panel/.travis.yml b/react-app/bower_components/paper-drawer-panel/.travis.yml new file mode 100644 index 0000000000..2ab76e4e1d --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: PLe0gvvFLKijrgyroIeymIP14SikK6RobNUOqHyUiLDCh9S2/vSBJUp8U5TYkVmpxMr+rcKXpfIhYt/bne97bARTnMjRQUa+rlraek6EPXyFILDsyaTosYD7rmY2f8ViiW+CM3eUA+ym0P8tvYONdTx+CEdO7S6esotfq3LHrLw= + - secure: U4i/ZSfd87xQ+0YZCKxk3knQQk23V/2IxtSrvY42OnaGi10uz04Cad5XMuBcB1kCyRkAP/e9flQyp4iLaDpG+edm2fxJNPqXepWjtMr0rVFr2LoQ7dPAQCFkzO25dSiO+Wj4ffDO//hwgF5Xl/BXnyRBfSEjURZXr4EP+NjoMWU= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-drawer-panel/CONTRIBUTING.md b/react-app/bower_components/paper-drawer-panel/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-drawer-panel/README.md b/react-app/bower_components/paper-drawer-panel/README.md new file mode 100644 index 0000000000..78ada9e077 --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/README.md @@ -0,0 +1,147 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-drawer-panel.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-drawer-panel) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-drawer-panel)_ + + +##<paper-drawer-panel> + +Material design: [Navigation drawer](https://www.google.com/design/spec/patterns/navigation-drawer.html) + +`paper-drawer-panel` contains a drawer panel and a main panel. The drawer +and the main panel are side-by-side with drawer on the left. When the browser +window size is smaller than the `responsiveWidth`, `paper-drawer-panel` +changes to narrow layout. In narrow layout, the drawer will be stacked on top +of the main panel. The drawer will slide in/out to hide/reveal the main +panel. + +Use the attribute `drawer` to indicate that the element is the drawer panel and +`main` to indicate that the element is the main panel. + +Example: + +```html + +
Drawer panel...
+
Main panel...
+
+``` + +The drawer and the main panels are not scrollable. You can set CSS overflow +property on the elements to make them scrollable or use `paper-header-panel`. + +Example: + +```html + + + +
Drawer content...
+
+ + +
Main content...
+
+
+``` + +An element that should toggle the drawer will automatically do so if it's +given the `paper-drawer-toggle` attribute. Also this element will automatically +be hidden in wide layout. + +Example: + +```html + + + +
Application
+
+
Drawer content...
+
+ + + +
Title
+
+
Main content...
+
+
+``` + +To position the drawer to the right, add `right-drawer` attribute. + +```html + +
Drawer panel...
+
Main panel...
+
+``` + +### Styling + +To change the main container: + +```css +paper-drawer-panel { + --paper-drawer-panel-main-container: { + background-color: gray; + }; +} +``` + +To change the drawer container when it's in the left side: + +```css +paper-drawer-panel { + --paper-drawer-panel-left-drawer-container: { + background-color: white; + }; +} +``` + +To change the drawer container when it's in the right side: + +```css +paper-drawer-panel { + --paper-drawer-panel-right-drawer-container: { + background-color: white; + }; +} +``` + +To customize the scrim: + +```css +paper-drawer-panel { + --paper-drawer-panel-scrim: { + background-color: red; + }; +} +``` + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-drawer-panel-scrim-opacity` | Scrim opacity | 1 | +| `--paper-drawer-panel-drawer-container` | Mixin applied to drawer container | {} | +| `--paper-drawer-panel-left-drawer-container` | Mixin applied to container when it's in the left side | {} | +| `--paper-drawer-panel-main-container` | Mixin applied to main container | {} | +| `--paper-drawer-panel-right-drawer-container` | Mixin applied to container when it's in the right side | {} | +| `--paper-drawer-panel-scrim` | Mixin applied to scrim | {} | + + diff --git a/react-app/bower_components/paper-drawer-panel/bower.json b/react-app/bower_components/paper-drawer-panel/bower.json new file mode 100644 index 0000000000..ba8ce10a5e --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/bower.json @@ -0,0 +1,38 @@ +{ + "name": "paper-drawer-panel", + "version": "1.0.9", + "description": "A responsive drawer panel", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "drawer", + "responsive", + "layout" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-drawer-panel.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-drawer-panel", + "dependencies": { + "iron-media-query": "PolymerElements/iron-media-query#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0", + "iron-selector": "PolymerElements/iron-selector#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "main": "paper-drawer-panel.html", + "ignore": [] +} diff --git a/react-app/bower_components/paper-drawer-panel/demo/index.html b/react-app/bower_components/paper-drawer-panel/demo/index.html new file mode 100644 index 0000000000..a453ae709b --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/demo/index.html @@ -0,0 +1,97 @@ + + + + + paper-drawer-panel demo + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+ flip drawer +
+
+ toggle drawer +
+
+
+ + + + + diff --git a/react-app/bower_components/paper-drawer-panel/hero.svg b/react-app/bower_components/paper-drawer-panel/hero.svg new file mode 100755 index 0000000000..b53bf754b4 --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/hero.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-drawer-panel/index.html b/react-app/bower_components/paper-drawer-panel/index.html new file mode 100644 index 0000000000..1390eccff0 --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/index.html @@ -0,0 +1,29 @@ + + + + + + + + + paper-drawer-panel + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-drawer-panel/paper-drawer-panel.html b/react-app/bower_components/paper-drawer-panel/paper-drawer-panel.html new file mode 100644 index 0000000000..35a4947a79 --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/paper-drawer-panel.html @@ -0,0 +1,841 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-drawer-panel/test/focus.html b/react-app/bower_components/paper-drawer-panel/test/focus.html new file mode 100644 index 0000000000..2a6ba4d3f1 --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/test/focus.html @@ -0,0 +1,130 @@ + + + + + + paper-drawer-panel tests + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-drawer-panel/test/index.html b/react-app/bower_components/paper-drawer-panel/test/index.html new file mode 100644 index 0000000000..1cdc93f16d --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/test/index.html @@ -0,0 +1,30 @@ + + + + + + + paper-drawer-panel tests + + + + + + diff --git a/react-app/bower_components/paper-drawer-panel/test/positioning.html b/react-app/bower_components/paper-drawer-panel/test/positioning.html new file mode 100644 index 0000000000..f70c2cf1cc --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/test/positioning.html @@ -0,0 +1,93 @@ + + + + + + paper-drawer-panel tests + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-drawer-panel/test/small-devices.html b/react-app/bower_components/paper-drawer-panel/test/small-devices.html new file mode 100644 index 0000000000..b3091cbd43 --- /dev/null +++ b/react-app/bower_components/paper-drawer-panel/test/small-devices.html @@ -0,0 +1,138 @@ + + + + + + paper-drawer-panel tests + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-header-panel/.bower.json b/react-app/bower_components/paper-header-panel/.bower.json new file mode 100644 index 0000000000..524bbbe84d --- /dev/null +++ b/react-app/bower_components/paper-header-panel/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "paper-header-panel", + "version": "1.1.5", + "description": "A header and content wrapper for layout with headers", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "layout" + ], + "main": "paper-header-panel.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-header-panel.git" + }, + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-header-panel", + "ignore": [], + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "_release": "1.1.5", + "_resolution": { + "type": "version", + "tag": "v1.1.5", + "commit": "50472a21beb7440fad7a92dd977b72fe06297e46" + }, + "_source": "git://github.com/PolymerElements/paper-header-panel.git", + "_target": "~1.1.5", + "_originalSource": "PolymerElements/paper-header-panel", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/paper-header-panel/.gitignore b/react-app/bower_components/paper-header-panel/.gitignore new file mode 100644 index 0000000000..fbe05fc93b --- /dev/null +++ b/react-app/bower_components/paper-header-panel/.gitignore @@ -0,0 +1 @@ +bower_components/ diff --git a/react-app/bower_components/paper-header-panel/.travis.yml b/react-app/bower_components/paper-header-panel/.travis.yml new file mode 100644 index 0000000000..3505733e88 --- /dev/null +++ b/react-app/bower_components/paper-header-panel/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: DCpexemWTC3r2xTSmUb1kvE9wNja3vUwljP6RtobsuPY4x40Ht0z/+IEyKazfyiFQq7+yq0WMnxyQL/rCHUAej1Ll6+9DbUj6gvbflJmTpjUqUuQEMvn8oGUMsXrpTINZAU2KPSTno63oqpu2LTB4xG0ATUaLQM3TOOrW1yiLiw= + - secure: jXcnHDCLZF7GijBmPylDzY3azCkB1xW0t3nxoYcDWhhn8cq2LYLuv+EnQ7wOEtT2rSc9xlZ11YBYPOHirKIMWJl6coF0pDJnFgtVfCpxylVIv9WQKN1wYW1HIlAaROQIHCVksnweaBJG+tlM6fREHKcT1QTDc5Asp0SoE+Nfpd8= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-header-panel/CONTRIBUTING.md b/react-app/bower_components/paper-header-panel/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/paper-header-panel/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-header-panel/README.md b/react-app/bower_components/paper-header-panel/README.md new file mode 100644 index 0000000000..f86c1121db --- /dev/null +++ b/react-app/bower_components/paper-header-panel/README.md @@ -0,0 +1,151 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-header-panel.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-header-panel) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-header-panel)_ + + +##<paper-header-panel> + +`paper-header-panel` contains a header section and a content panel section. + +__Important:__ The `paper-header-panel` will not display if its parent does not have a height. + +Using layout classes, you can make the `paper-header-panel` fill the screen + +```html + + + +
Hello World!
+
+
+ +``` + +Special support is provided for scrolling modes when one uses a paper-toolbar or equivalent for the +header section. + +Example: + +```html + + Header +
Content goes here...
+
+``` + +If you want to use other than `paper-toolbar` for the header, add `paper-header` class to that +element. + +Example: + +```html + +
Header
+
Content goes here...
+
+``` + +To have the content fit to the main area, use the `fit` class. + +```html + +
standard
+
content fits 100% below the header
+
+``` + +### Modes + +Controls header and scrolling behavior. Options are `standard`, `seamed`, `waterfall`, `waterfall-tall`, `scroll` and +`cover`. Default is `standard`. + +| Mode | Description | +| --- | --- | +| `standard` | The header is a step above the panel. The header will consume the panel at the point of entry, preventing it from passing through to the opposite side. | +| `seamed` | The header is presented as seamed with the panel. | +| `waterfall` | Similar to standard mode, but header is initially presented as seamed with panel, but then separates to form the step. | +| `waterfall-tall` | The header is initially taller (`tall` class is added to the header). As the user scrolls, the header separates (forming an edge) while condensing (`tall` class is removed from the header). | +| `scroll` | The header keeps its seam with the panel, and is pushed off screen. | +| `cover` | The panel covers the whole `paper-header-panel` including the header. This allows user to style the panel in such a way that the panel is partially covering the header. | + +Example: + +```html + +
standard
+
content fits 100% below the header
+
+``` + +### Styling + +To change the shadow that shows up underneath the header: + +```css +paper-header-panel { + --paper-header-panel-shadow: { + height: 6px; + bottom: -6px; + box-shadow: inset 0px 5px 6px -3px rgba(0, 0, 0, 0.4); + }; +} +``` + +To change the panel container in different modes: + +```css +paper-header-panel { + --paper-header-panel-standard-container: { + border: 1px solid gray; + }; + + --paper-header-panel-seamed-container: { + border: 1px solid gray; + }; + + --paper-header-panel-waterfall-container: { + border: 1px solid gray; + }; + + --paper-header-panel-waterfall-tall-container: { + border: 1px solid gray; + }; + + --paper-header-panel-scroll-container: { + border: 1px solid gray; + }; + + --paper-header-panel-cover-container: { + border: 1px solid gray; + }; +} +``` + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-header-panel` | Mixin applied to the element | `{}` | +| `--paper-header-panel-body` | Mixin applied to the element's body (i.e. everything below the toolbar) | `{}` | +| `--paper-header-panel-scroll-container` | Mixin applied to the container when in scroll mode | `{}` | +| `--paper-header-panel-cover-container` | Mixin applied to the container when in cover mode | `{}` | +| `--paper-header-panel-standard-container` | Mixin applied to the container when in standard mode | `{}` | +| `--paper-header-panel-seamed-container` | Mixin applied to the container when in seamed mode | `{}` | +| `--paper-header-panel-waterfall-container` | Mixin applied to the container when in waterfall mode | `{}` | +| `--paper-header-panel-waterfall-tall-container` | Mixin applied to the container when in tall waterfall mode | `{}` | + + diff --git a/react-app/bower_components/paper-header-panel/bower.json b/react-app/bower_components/paper-header-panel/bower.json new file mode 100644 index 0000000000..8eac15918d --- /dev/null +++ b/react-app/bower_components/paper-header-panel/bower.json @@ -0,0 +1,33 @@ +{ + "name": "paper-header-panel", + "version": "1.1.5", + "description": "A header and content wrapper for layout with headers", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "layout" + ], + "main": "paper-header-panel.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-header-panel.git" + }, + "private": true, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-header-panel", + "ignore": [], + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + } +} diff --git a/react-app/bower_components/paper-header-panel/demo/index.html b/react-app/bower_components/paper-header-panel/demo/index.html new file mode 100644 index 0000000000..13c9d9773e --- /dev/null +++ b/react-app/bower_components/paper-header-panel/demo/index.html @@ -0,0 +1,149 @@ + + + + + + + paper-header-panel demo + + + + + + + + + + + +
standard
+
+
+ + +
seamed
+
+
+ + +
scroll
+
+
+ + +
waterfall
+
+
+ + +
waterfall-tall
+
+
+ + +
waterfall-tall
tall-class: medium-tall
+
+
+ + +
cover
+
+
+ + + diff --git a/react-app/bower_components/paper-header-panel/hero.svg b/react-app/bower_components/paper-header-panel/hero.svg new file mode 100755 index 0000000000..a85f2a2d5f --- /dev/null +++ b/react-app/bower_components/paper-header-panel/hero.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-header-panel/index.html b/react-app/bower_components/paper-header-panel/index.html new file mode 100644 index 0000000000..8d0771c597 --- /dev/null +++ b/react-app/bower_components/paper-header-panel/index.html @@ -0,0 +1,36 @@ + + + + + + + + + paper-header-panel + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-header-panel/paper-header-panel.html b/react-app/bower_components/paper-header-panel/paper-header-panel.html new file mode 100644 index 0000000000..b713ef279c --- /dev/null +++ b/react-app/bower_components/paper-header-panel/paper-header-panel.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-header-panel/test/basic.html b/react-app/bower_components/paper-header-panel/test/basic.html new file mode 100644 index 0000000000..46e6d5af05 --- /dev/null +++ b/react-app/bower_components/paper-header-panel/test/basic.html @@ -0,0 +1,156 @@ + + + + + + paper-header-panel tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-header-panel/test/index.html b/react-app/bower_components/paper-header-panel/test/index.html new file mode 100644 index 0000000000..aef190d5c1 --- /dev/null +++ b/react-app/bower_components/paper-header-panel/test/index.html @@ -0,0 +1,31 @@ + + + paper-header-panel tests + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-icon-button/.bower.json b/react-app/bower_components/paper-icon-button/.bower.json new file mode 100644 index 0000000000..9686321f2b --- /dev/null +++ b/react-app/bower_components/paper-icon-button/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "paper-icon-button", + "private": true, + "version": "1.0.7", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "A material design icon button", + "main": "paper-icon-button.html", + "author": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "button", + "icon", + "control" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-icon-button.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/paper-icon-button", + "_release": "1.0.7", + "_resolution": { + "type": "version", + "tag": "v1.0.7", + "commit": "7623d73efeb6e2e88e2abdb5e4d00641d39e400f" + }, + "_source": "git://github.com/PolymerElements/paper-icon-button.git", + "_target": "~1.0.7", + "_originalSource": "PolymerElements/paper-icon-button", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/paper-icon-button/.gitignore b/react-app/bower_components/paper-icon-button/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-icon-button/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-icon-button/.travis.yml b/react-app/bower_components/paper-icon-button/.travis.yml new file mode 100644 index 0000000000..7b433ea5d9 --- /dev/null +++ b/react-app/bower_components/paper-icon-button/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: A+iEL5FUMQWkkaOduE26bo0jW49LYKxDwWGZOty9H9fCDpBNQSADOhIvLzScGtjE7Rr3jVmowVsDN0XfVSRpJneEIvj7+tHAXUFoVey8vDVklOmhlR25IH2OczEmCkOS+sAKRiSF54aptdPeJhmpbMH0FyZfuX+jJfhdonJ+YQg= + - secure: Ps1Hy0fzmYRYF/ur2Myg7ol43HpzpooCoDvqzpMbIBWkXjXcN0KlPoNc6lEFlhjSpjddMFavdajKYIO0j9adAjZA7HYlf+BglhxV45lz13o04+QlNbDSADNyAlKJLrIvFacn9DE3VXlvBwBu83m+ndHUN/uMyHyZo0VE1/ad9Iw= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-icon-button/CONTRIBUTING.md b/react-app/bower_components/paper-icon-button/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/paper-icon-button/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-icon-button/README.md b/react-app/bower_components/paper-icon-button/README.md new file mode 100644 index 0000000000..a84e492619 --- /dev/null +++ b/react-app/bower_components/paper-icon-button/README.md @@ -0,0 +1,79 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-icon-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-icon-button) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-icon-button)_ + + +##<paper-icon-button> + +Material design: [Icon toggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons) + +`paper-icon-button` is a button with an image placed at the center. When the user touches +the button, a ripple effect emanates from the center of the button. + +`paper-icon-button` includes a default icon set. Use `icon` to specify which icon +from the icon set to use. + +```html + +``` + +See [`iron-iconset`](iron-iconset) for more information about +how to use a custom icon set. + +Example: + +```html + + + + +``` + +To use `paper-icon-button` as a link, wrap it in an anchor tag. Since `paper-icon-button` +will already receive focus, you may want to prevent the anchor tag from receiving focus +as well by setting its tabindex to -1. + +```html + + + +``` + +### Styling + +Style the button with CSS as you would a normal DOM element. If you are using the icons +provided by `iron-icons`, they will inherit the foreground color of the button. + +```html +/* make a red "favorite" button */ + +``` + +By default, the ripple is the same color as the foreground at 25% opacity. You may +customize the color using the `--paper-icon-button-ink-color` custom property. + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color` | +| `--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color` | +| `--paper-icon-button` | Mixin for a button | `{}` | +| `--paper-icon-button-disabled` | Mixin for a disabled button | `{}` | +| `--paper-icon-button-hover` | Mixin for button on hover | `{}` | + + diff --git a/react-app/bower_components/paper-icon-button/bower.json b/react-app/bower_components/paper-icon-button/bower.json new file mode 100644 index 0000000000..aed79fc9b0 --- /dev/null +++ b/react-app/bower_components/paper-icon-button/bower.json @@ -0,0 +1,37 @@ +{ + "name": "paper-icon-button", + "private": true, + "version": "1.0.7", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "A material design icon button", + "main": "paper-icon-button.html", + "author": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "button", + "icon", + "control" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-icon-button.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-icon-button/demo/index.html b/react-app/bower_components/paper-icon-button/demo/index.html new file mode 100644 index 0000000000..98d496f82b --- /dev/null +++ b/react-app/bower_components/paper-icon-button/demo/index.html @@ -0,0 +1,103 @@ + + + + + paper-icon-button demo + + + + + + + + + + + + +
+

Buttons can use iron-icons or external images, and can be disabled

+ + + + +

Buttons can hide the ripple effect using the noink attribute

+ + + + +

Buttons can be styled using regular CSS and custom properties

+ + + + +

Buttons can be resized

+ + + + +

Buttons can be used as a link

+ + + +
+ + diff --git a/react-app/bower_components/paper-icon-button/index.html b/react-app/bower_components/paper-icon-button/index.html new file mode 100644 index 0000000000..78f963c7e8 --- /dev/null +++ b/react-app/bower_components/paper-icon-button/index.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-icon-button/paper-icon-button.html b/react-app/bower_components/paper-icon-button/paper-icon-button.html new file mode 100644 index 0000000000..074fe5bb58 --- /dev/null +++ b/react-app/bower_components/paper-icon-button/paper-icon-button.html @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-icon-button/test/a11y.html b/react-app/bower_components/paper-icon-button/test/a11y.html new file mode 100644 index 0000000000..a56c9f458e --- /dev/null +++ b/react-app/bower_components/paper-icon-button/test/a11y.html @@ -0,0 +1,92 @@ + + + + + + paper-icon-button a11y tests + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-icon-button/test/basic.html b/react-app/bower_components/paper-icon-button/test/basic.html new file mode 100644 index 0000000000..fa3afad87c --- /dev/null +++ b/react-app/bower_components/paper-icon-button/test/basic.html @@ -0,0 +1,75 @@ + + + + + + paper-icon-button basic tests + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-icon-button/test/index.html b/react-app/bower_components/paper-icon-button/test/index.html new file mode 100644 index 0000000000..2069ec79c4 --- /dev/null +++ b/react-app/bower_components/paper-icon-button/test/index.html @@ -0,0 +1,26 @@ + + + + paper-icon-button tests + + + + + + + diff --git a/react-app/bower_components/paper-material/.bower.json b/react-app/bower_components/paper-material/.bower.json new file mode 100644 index 0000000000..d088967775 --- /dev/null +++ b/react-app/bower_components/paper-material/.bower.json @@ -0,0 +1,44 @@ +{ + "name": "paper-material", + "version": "1.0.6", + "description": "A material design container that looks like a lifted sheet of paper", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "container" + ], + "main": "paper-material.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-material" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-material", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "web-component-tester": "^4.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0" + }, + "_release": "1.0.6", + "_resolution": { + "type": "version", + "tag": "v1.0.6", + "commit": "6aef0896fcbc25f9f5bd1dd55f7679e6ab7f92ad" + }, + "_source": "git://github.com/polymerelements/paper-material.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/paper-material" +} \ No newline at end of file diff --git a/react-app/bower_components/paper-material/.gitignore b/react-app/bower_components/paper-material/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-material/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-material/.travis.yml b/react-app/bower_components/paper-material/.travis.yml new file mode 100644 index 0000000000..1834edcaec --- /dev/null +++ b/react-app/bower_components/paper-material/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: PEaqY+YpV0ZhnQbJlNQbmfIFLqy7UvvCtii0sPoGKT5/P7ulMqMOPQV9l/zLAtYi14HEz63FKLqDrpnGaVe7Cz7jtt2WRWrWqTBdarqwSHs73Z2XqztD1+2wW6vgz/lfK00B8UplAk28B7d5dbWzwUF6Kg02zOfQMsawMpulFjo= + - secure: f/3XYrYjM8aXLe9kqM/MjHQ6IEsDRuoxDqM+l2JiR3v2Nw7lP6ZyXSNvKm8bN+VNU7ubSzAmRbUGnRU7e61BhnGzuLXjOqxYeJLWZaqoSm9TDz3re3rd7wB2ddAhRokeSSPO2KeAgr6C02P9M3Au1DiO1G66fuWVH62WtzW4+qY= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-material/CONTRIBUTING.md b/react-app/bower_components/paper-material/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/paper-material/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-material/README.md b/react-app/bower_components/paper-material/README.md new file mode 100644 index 0000000000..6a74b5e1e0 --- /dev/null +++ b/react-app/bower_components/paper-material/README.md @@ -0,0 +1,35 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/paper-material.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-material) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/paper-material)_ + + +##<paper-material> + +Material design: [Cards](https://www.google.com/design/spec/components/cards.html) + +`paper-material` is a container that renders two shadows on top of each other to +create the effect of a lifted piece of paper. + +Example: + +```html + + ... content ... + +``` + + diff --git a/react-app/bower_components/paper-material/bower.json b/react-app/bower_components/paper-material/bower.json new file mode 100644 index 0000000000..40895d2d4c --- /dev/null +++ b/react-app/bower_components/paper-material/bower.json @@ -0,0 +1,35 @@ +{ + "name": "paper-material", + "version": "1.0.6", + "description": "A material design container that looks like a lifted sheet of paper", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "paper", + "container" + ], + "main": "paper-material.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-material" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-material", + "ignore": [], + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "web-component-tester": "^4.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0" + } +} diff --git a/react-app/bower_components/paper-material/demo/index.html b/react-app/bower_components/paper-material/demo/index.html new file mode 100644 index 0000000000..c0b6d39415 --- /dev/null +++ b/react-app/bower_components/paper-material/demo/index.html @@ -0,0 +1,84 @@ + + + + + paper-material demo + + + + + + + + + + + + + +
+

Paper-materials can have different elevations

+ + + + +

Changes in elevation can be animated

+ + + +
+ + diff --git a/react-app/bower_components/paper-material/index.html b/react-app/bower_components/paper-material/index.html new file mode 100644 index 0000000000..7209e6d095 --- /dev/null +++ b/react-app/bower_components/paper-material/index.html @@ -0,0 +1,30 @@ + + + + + + + + + paper-material + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-material/paper-material-shared-styles.html b/react-app/bower_components/paper-material/paper-material-shared-styles.html new file mode 100644 index 0000000000..b795f4f47f --- /dev/null +++ b/react-app/bower_components/paper-material/paper-material-shared-styles.html @@ -0,0 +1,42 @@ + + + + + + + diff --git a/react-app/bower_components/paper-material/paper-material.html b/react-app/bower_components/paper-material/paper-material.html new file mode 100644 index 0000000000..e754d4ea33 --- /dev/null +++ b/react-app/bower_components/paper-material/paper-material.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-material/test/index.html b/react-app/bower_components/paper-material/test/index.html new file mode 100644 index 0000000000..08fda47758 --- /dev/null +++ b/react-app/bower_components/paper-material/test/index.html @@ -0,0 +1,24 @@ + + + + paper-material tests + + + + + + + diff --git a/react-app/bower_components/paper-material/test/paper-material.html b/react-app/bower_components/paper-material/test/paper-material.html new file mode 100644 index 0000000000..7949c11213 --- /dev/null +++ b/react-app/bower_components/paper-material/test/paper-material.html @@ -0,0 +1,88 @@ + + + + + + paper-material basic tests + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/.bower.json b/react-app/bower_components/paper-menu-button/.bower.json new file mode 100644 index 0000000000..7fa6eecc34 --- /dev/null +++ b/react-app/bower_components/paper-menu-button/.bower.json @@ -0,0 +1,56 @@ +{ + "name": "paper-menu-button", + "version": "1.1.0", + "description": "A material design element that composes a trigger and a dropdown menu", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "menu", + "button" + ], + "main": "paper-menu-button.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-menu-button.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-menu-button", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0", + "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", + "iron-dropdown": "PolymerElements/iron-dropdown#^1.0.0", + "neon-animation": "PolymerElements/neon-animation#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "iron-image": "PolymerElements/iron-image#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-menu": "PolymerElements/paper-menu#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "_release": "1.1.0", + "_resolution": { + "type": "version", + "tag": "v1.1.0", + "commit": "7286bc656b9082e278e6e4ba43a518487ca189af" + }, + "_source": "git://github.com/PolymerElements/paper-menu-button.git", + "_target": "~1.1.0", + "_originalSource": "PolymerElements/paper-menu-button", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/paper-menu-button/.github/ISSUE_TEMPLATE.md b/react-app/bower_components/paper-menu-button/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..194520367e --- /dev/null +++ b/react-app/bower_components/paper-menu-button/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,33 @@ + +### Description + + +### Expected outcome + + + +### Actual outcome + + + +### Live Demo + + +### Steps to reproduce + + + +### Browsers Affected + +- [ ] Chrome +- [ ] Firefox +- [ ] Safari 9 +- [ ] Safari 8 +- [ ] Safari 7 +- [ ] Edge +- [ ] IE 11 +- [ ] IE 10 diff --git a/react-app/bower_components/paper-menu-button/.gitignore b/react-app/bower_components/paper-menu-button/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-menu-button/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-menu-button/.travis.yml b/react-app/bower_components/paper-menu-button/.travis.yml new file mode 100644 index 0000000000..19f8d1ca26 --- /dev/null +++ b/react-app/bower_components/paper-menu-button/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: KylA/s+GkWGDpW9vcaBDrcr9M4xsE7HVyH36I5p7UBvQUiqPMFR/+GbFx7UoYR1OPNMf2hgHD4nd5G8hfnKjFuRl8NKe63Dnwt+83tKO9MKWrOAPq1/fMG/ZS1vRNP8Jqkp3iOsRUdatWsrs9LA5Pa6tM2OefQXs5ZF0F8s+de8Wv3+QwoGSjfJmTTC8j9tvrzEI6eOX66PAFGWUnySwV66tph+LRT/B/Y2HDcA0KbQucbyxCMnKU100xGJwK3+ZuPTEnqEqPv7R/9Z1Ggh+wXO/MduN+7OO6ZbF9//jrQNSY4QMKcz5zziYa0ugXH7F7HZijq3qxuLST0edPknozGi4xR7Vn00Zu8yHkIKYqswHrXM97qwoZZkBkwD8LEoZTkEIvk/uts68WVTiFaXV2FufBjl48E1BpjvMX1fW0hKTyFKXURXiJBphwNepyHFHpxSF29TKW1FBXy9ITiSMmKrdmqnnPliunDU44NK23tiuY90ZLKPLcOHBzLU7yzqVu67flbWxoWCCkP8gEkT6qRWHzRiZOiw0eHvXkmE1Gs+z1q/JuDg8Aaa40lm9oKC+dY8AfmQDhfXgfd89RbsF+AsJk7kp6wOVGCgmanrAeFSQcdU3qHB0ZQspS5kD1Y6mxl/R9a0iQnhtcHyLTadG8bfvc3EzP+2nYrP326Kir60= + - secure: HBHAEcnTe6APHH/ZHmN4fd1sid/RCsgUsn7abA3hRxU6PM4Jo0C4nZhet60Q8joQyxiA415FSETvJVhdY7zHUcmxd0KklEAZjKX08v5vroAGJt0OUmxpZ/scoAcC09JfnZeVFO8Df/kx1WWP+q2LydrZhasPP8ifM+BBdD2wE/ShM6Jz7E5yQHgQ+pUf5yShfOzoYy0+tYtBpm9bxxj1i9qjPEfUiOxAWmSpefJ94dcIh2mCFpakBhPRh/l6FQip0+NPT00YEpk5/fDh+I2Apg8whWm02WiqGsXUpZZZaiGn8oAO5XckrKJGm0xuGYrI3cM1zRvsieaA424WwXNCSkXt6M8s0zQTqj+wlFQMOpEoIgD8dKW0gkIEt09ChKgmhs82FKE3OuI+Nz5z9DRRrtfoOckPi0bjVsOmXNDX0x569dpNOoJB21opfj6Nyl3Ln7/9q1J4LStt/VeuHzUUhBI33GTSlqW6qg0E0difa/bOc8dhSuXQ3Y8uunAXPk1Do7sWUhszF7k/wOjZ/oMsvvl8CiNZCJn0dbvrANOACNW8qBLoAlw2eHwA0wGTuN3VCZohYnHkeioYfkAFzPZX6QR4+NdpOorGBhxuOm0R7rR2q3SIrd+6Wd+T6A4+NLL8e+A57pc2lHKhtSwOOE7DdQpzrVyfN5NOaixlScqcbAw= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-menu-button/CONTRIBUTING.md b/react-app/bower_components/paper-menu-button/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/paper-menu-button/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-menu-button/README.md b/react-app/bower_components/paper-menu-button/README.md new file mode 100644 index 0000000000..4e45429b62 --- /dev/null +++ b/react-app/bower_components/paper-menu-button/README.md @@ -0,0 +1,69 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-menu-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-menu-button) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-menu-button)_ + + +##<paper-menu-button> + +Material design: [Dropdown buttons](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons) + +`paper-menu-button` allows one to compose a designated "trigger" element with +another element that represents "content", to create a dropdown menu that +displays the "content" when the "trigger" is clicked. + +The child element with the class `dropdown-trigger` will be used as the +"trigger" element. The child element with the class `dropdown-content` will be +used as the "content" element. + +The `paper-menu-button` is sensitive to its content's `iron-select` events. If +the "content" element triggers an `iron-select` event, the `paper-menu-button` +will close automatically. + +Example: + +```html + + + + Share + Settings + Help + + +``` + +### Styling + +The following custom properties and mixins are also available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-menu-button-dropdown-background` | Background color of the paper-menu-button dropdown | `--primary-background-color` | +| `--paper-menu-button` | Mixin applied to the paper-menu-button | `{}` | +| `--paper-menu-button-disabled` | Mixin applied to the paper-menu-button when disabled | `{}` | +| `--paper-menu-button-dropdown` | Mixin applied to the paper-menu-button dropdown | `{}` | +| `--paper-menu-button-content` | Mixin applied to the paper-menu-button content | `{}` | + + + + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/bower.json b/react-app/bower_components/paper-menu-button/bower.json new file mode 100644 index 0000000000..9527cf9d7e --- /dev/null +++ b/react-app/bower_components/paper-menu-button/bower.json @@ -0,0 +1,46 @@ +{ + "name": "paper-menu-button", + "version": "1.1.0", + "description": "A material design element that composes a trigger and a dropdown menu", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "web-component", + "polymer", + "menu", + "button" + ], + "main": "paper-menu-button.html", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-menu-button.git" + }, + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/PolymerElements/paper-menu-button", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0", + "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0", + "iron-dropdown": "PolymerElements/iron-dropdown#^1.0.0", + "neon-animation": "PolymerElements/neon-animation#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-icon": "PolymerElements/iron-icon#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "iron-image": "PolymerElements/iron-image#^1.0.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-item": "PolymerElements/paper-item#^1.0.0", + "paper-menu": "PolymerElements/paper-menu#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-menu-button/demo/index.html b/react-app/bower_components/paper-menu-button/demo/index.html new file mode 100644 index 0000000000..e439951450 --- /dev/null +++ b/react-app/bower_components/paper-menu-button/demo/index.html @@ -0,0 +1,203 @@ + + + + + + + + + + + paper-menu-button + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/hero.svg b/react-app/bower_components/paper-menu-button/hero.svg new file mode 100755 index 0000000000..b67f81731a --- /dev/null +++ b/react-app/bower_components/paper-menu-button/hero.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/index.html b/react-app/bower_components/paper-menu-button/index.html new file mode 100644 index 0000000000..040b19528b --- /dev/null +++ b/react-app/bower_components/paper-menu-button/index.html @@ -0,0 +1,24 @@ + + + + + + paper-menu-button + + + + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/paper-menu-button-animations.html b/react-app/bower_components/paper-menu-button/paper-menu-button-animations.html new file mode 100644 index 0000000000..b1339f2930 --- /dev/null +++ b/react-app/bower_components/paper-menu-button/paper-menu-button-animations.html @@ -0,0 +1,109 @@ + + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/paper-menu-button.html b/react-app/bower_components/paper-menu-button/paper-menu-button.html new file mode 100644 index 0000000000..d983c2da11 --- /dev/null +++ b/react-app/bower_components/paper-menu-button/paper-menu-button.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/test/index.html b/react-app/bower_components/paper-menu-button/test/index.html new file mode 100644 index 0000000000..a1749e8de9 --- /dev/null +++ b/react-app/bower_components/paper-menu-button/test/index.html @@ -0,0 +1,24 @@ + + + + paper-menu-button tests + + + + + + + diff --git a/react-app/bower_components/paper-menu-button/test/paper-menu-button.html b/react-app/bower_components/paper-menu-button/test/paper-menu-button.html new file mode 100644 index 0000000000..56526254af --- /dev/null +++ b/react-app/bower_components/paper-menu-button/test/paper-menu-button.html @@ -0,0 +1,168 @@ + + + + + + paper-menu-button basic tests + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-progress/.bower.json b/react-app/bower_components/paper-progress/.bower.json new file mode 100644 index 0000000000..d76d4cd97d --- /dev/null +++ b/react-app/bower_components/paper-progress/.bower.json @@ -0,0 +1,42 @@ +{ + "name": "paper-progress", + "version": "1.0.9", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "A material design progress bar", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "progress" + ], + "main": "paper-progress.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-progress.git" + }, + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-range-behavior": "PolymerElements/iron-range-behavior#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/paper-progress", + "_release": "1.0.9", + "_resolution": { + "type": "version", + "tag": "v1.0.9", + "commit": "389e717d2e600bb44c6cb1537ee12b203b55fca1" + }, + "_source": "git://github.com/PolymerElements/paper-progress.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/paper-progress" +} \ No newline at end of file diff --git a/react-app/bower_components/paper-progress/.gitignore b/react-app/bower_components/paper-progress/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-progress/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-progress/.travis.yml b/react-app/bower_components/paper-progress/.travis.yml new file mode 100644 index 0000000000..cfc1bd9351 --- /dev/null +++ b/react-app/bower_components/paper-progress/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: fmp2kJysxTcVsouaQfEkPCJYPzbsuGCeq5RqvttDaYdue92n5912OR/WI476PPGpX2owvxq97saVX9CqXweVtgrmdhONsrGy31eULpW0vUonuhbjkKU87E0aAmHu478uuJnc4hU7oN7wuNEtqWmpFG+oqMqHKwUyAWLk+V4XY0nseuFYQLX52qfglD+CqipQsoe84nIM0JxQxpDw1njYZbKQzZVttyLQVv13Ahh+5v75EqqwggoD2mgU1xQIH1GarbnZpmE9BL4ETbaJwJ7Fon/Pxsrs1Zs9hEStJCwo5aTiyPJibRQBCk9Cj+PJY3TkqfE3zIwhbW1/aSCIuUg5egsh6Of6clqrDE2wWPyIURUBFcE3UXsqBEXh56K9WQh+KNIgJYoQ/tzhD2VlgQhM89geTKZc6ysSTWcukv9tw9h9gaG2gD1e+uRQ/rMyt6vlh2DNI/J8oAv1WifZwuUKRkwm7SUBP55sukFryJIQEXEMqjT0WVbjTWP+2VNiHFPo7wGdVZ8X7y4bwA7lmnlC4AnNd8L6BE0tStZUBAKv3LhzRvd+DrRvaiSPdFhGBbAiMzytKGgxfD7nhMntV7GREjfQCB/hch5anePK7Cuw58kF8PiZX9aVk8Se3VP0+rdUkzVgWTW5THhdpw2nnuIyK5QDtL4/L3l/oJhl9Jbmak4= + - secure: WzzECDnm17AwL4VDbMJD0E1cdi11p2YLahJRPi/+GZ9BFNIV3I2WZFc5l0WEiGDMB4igx5DdXHzDFk7HF2z2qRpf2skhWDTd/Ie5+exZlY9/D/tED8dJepGtV40UTuWr+vHsDJeNkXteYNpNU7ZHfNbXl14/x25ccaLYSX5yRNLBRMn9KToRNBhXA0YH/Q9AnWNKGFWb0YBfjSRywSvVuVRQr/tL43JUCTEEwjdGHVTUlvWPE5XHDs6yqjJlTI70GVvQb5WPZdQJugiolG9Z66ZRWEEuawJgzTCdlaKwBQX0UAXLdfUsQKwrcxvLnDibMHVG6hNOBw4Un73YL0klD7nKoPlhCiDHtPWoNUCvpNGxPWozw2KC50YX4MZSFKAWCkIA4/oiIhMvSUOWcrOpfHZNpJNNBCFHvv6JS5PwEiNlqM2BjqfS4Vy/03Fy0h6CyNX8o5wDAjZvJKCyZQHGy4tFWNPpyZ6SbwsnzH+bjqXSDURI6hCUNiujlIRzUT95H8rIega1mWT8sffvb4qK72iXAqf7hoQbi1Ldhjq/b0iO0PRdpjX5vusLN797KxPNrxDZc9LoaIgVMAFD5AJmwF/DilvwsW6sI4o5cpAw58/g1wpB7iX0YFWXNzXv/hZh2o4gW81Y2afM//gIgCFSitRO10bOqw+pEcGCnLrz/BQ= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-progress/CONTRIBUTING.md b/react-app/bower_components/paper-progress/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/paper-progress/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-progress/README.md b/react-app/bower_components/paper-progress/README.md new file mode 100644 index 0000000000..2f452a94f9 --- /dev/null +++ b/react-app/bower_components/paper-progress/README.md @@ -0,0 +1,94 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-progress.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-progress) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-progress)_ + + +##<paper-progress> + +Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html) + +The progress bars are for situations where the percentage completed can be +determined. They give users a quick sense of how much longer an operation +will take. + +Example: + +```html + +``` + +There is also a secondary progress which is useful for displaying intermediate +progress, such as the buffer level during a streaming playback progress bar. + +Example: + +```html + +``` + +### Styling progress bar: + +To change the active progress bar color: + +```css +paper-progress { + --paper-progress-active-color: #e91e63; +} +``` + +To change the secondary progress bar color: + +```css +paper-progress { + --paper-progress-secondary-color: #f8bbd0; +} +``` + +To change the progress bar background color: + +```css +paper-progress { + --paper-progress-container-color: #64ffda; +} +``` + +Add the class `transiting` to a paper-progress to animate the progress bar when +the value changed. You can also customize the transition: + +```css +paper-progress { + --paper-progress-transition-duration: 0.08s; + --paper-progress-transition-timing-function: ease; + --paper-progress-transition-transition-delay: 0s; +} +``` + +The following mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-progress-container-color` | Mixin applied to container | `--google-grey-300` | +| `--paper-progress-transition-duration` | Duration of the transition | `0.008s` | +| `--paper-progress-transition-timing-function` | The timing function for the transition | `ease` | +| `--paper-progress-transition-delay` | delay for the transition | `0s` | +| `--paper-progress-active-color` | The color of the active bar | `--google-green-500` | +| `--paper-progress-secondary-color` | The color of the secondary bar | `--google-green-100` | +| `--paper-progress-disabled-active-color` | The color of the active bar if disabled | `--google-grey-500` | +| `--paper-progress-disabled-secondary-color` | The color of the secondary bar if disabled | `--google-grey-300` | +| `--paper-progress-height` | The height of the progress bar | `4px` | + + diff --git a/react-app/bower_components/paper-progress/bower.json b/react-app/bower_components/paper-progress/bower.json new file mode 100644 index 0000000000..69a5c5ef22 --- /dev/null +++ b/react-app/bower_components/paper-progress/bower.json @@ -0,0 +1,32 @@ +{ + "name": "paper-progress", + "version": "1.0.9", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "A material design progress bar", + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "progress" + ], + "main": "paper-progress.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-progress.git" + }, + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-range-behavior": "PolymerElements/iron-range-behavior#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "polymer": "Polymer/polymer#^1.1.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "paper-button": "PolymerElements/paper-button#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-progress/demo/index.html b/react-app/bower_components/paper-progress/demo/index.html new file mode 100644 index 0000000000..88f4b76897 --- /dev/null +++ b/react-app/bower_components/paper-progress/demo/index.html @@ -0,0 +1,122 @@ + + + + + paper-progress demo + + + + + + + + + + + + + + + + +
+

paper-progress can be imperatively controlled

+ + + + +

paper-progress can be indeterminate

+ + + + +

It can be styled using custom properties

+ + + +
+ + + + + diff --git a/react-app/bower_components/paper-progress/hero.svg b/react-app/bower_components/paper-progress/hero.svg new file mode 100755 index 0000000000..0f569e626a --- /dev/null +++ b/react-app/bower_components/paper-progress/hero.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-progress/index.html b/react-app/bower_components/paper-progress/index.html new file mode 100644 index 0000000000..225e3dd93d --- /dev/null +++ b/react-app/bower_components/paper-progress/index.html @@ -0,0 +1,28 @@ + + + + + + + + + paper-progress + + + + + + + + + + + diff --git a/react-app/bower_components/paper-progress/paper-progress.html b/react-app/bower_components/paper-progress/paper-progress.html new file mode 100644 index 0000000000..77b1eecd01 --- /dev/null +++ b/react-app/bower_components/paper-progress/paper-progress.html @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-progress/test/basic.html b/react-app/bower_components/paper-progress/test/basic.html new file mode 100644 index 0000000000..73547501e8 --- /dev/null +++ b/react-app/bower_components/paper-progress/test/basic.html @@ -0,0 +1,148 @@ + + + + + + paper-progress test + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-progress/test/index.html b/react-app/bower_components/paper-progress/test/index.html new file mode 100644 index 0000000000..b66f1defbb --- /dev/null +++ b/react-app/bower_components/paper-progress/test/index.html @@ -0,0 +1,24 @@ + + + + Tests + + + + + + + diff --git a/react-app/bower_components/paper-ripple/.bower.json b/react-app/bower_components/paper-ripple/.bower.json new file mode 100644 index 0000000000..2f654d71c6 --- /dev/null +++ b/react-app/bower_components/paper-ripple/.bower.json @@ -0,0 +1,45 @@ +{ + "name": "paper-ripple", + "version": "1.0.5", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Adds a material design ripple to any container", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "ripple" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-ripple.git" + }, + "main": "paper-ripple.html", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0" + }, + "ignore": [], + "homepage": "https://github.com/polymerelements/paper-ripple", + "_release": "1.0.5", + "_resolution": { + "type": "version", + "tag": "v1.0.5", + "commit": "d72e7a9a8ab518b901ed18dde492df3b87a93be5" + }, + "_source": "git://github.com/polymerelements/paper-ripple.git", + "_target": "^1.0.0", + "_originalSource": "polymerelements/paper-ripple" +} \ No newline at end of file diff --git a/react-app/bower_components/paper-ripple/.gitignore b/react-app/bower_components/paper-ripple/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-ripple/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-ripple/.travis.yml b/react-app/bower_components/paper-ripple/.travis.yml new file mode 100644 index 0000000000..65cc19cbd3 --- /dev/null +++ b/react-app/bower_components/paper-ripple/.travis.yml @@ -0,0 +1,22 @@ +language: node_js +sudo: false +before_script: + - npm install web-component-tester + - npm install bower + - 'export PATH=$PWD/node_modules/.bin:$PATH' + - bower install +env: + global: + - secure: YrC5bTrJwlszZQWfnRwDbLaZNLf+KnWXTAfzvul7eij21W3/v+E0wp9pFTLQj/G3bZWgOEZSsoXxASNcNu1JUmJRyLXpJgTps25IlS/VJTRHoK7jUjt5pJG1CbcgTixQblyOVtPqT6j0V23V0d3mhQ3H2xFBbcl87iYO1w+6nmQ= + - secure: NZv74uwtibMbmarEOWRUNkEwjz/2akWEIe2JDxglag2JUECWrcAKJIQUqYsO0KNUIg09xJEqWLWED4fN73p3z27Jl/z99ssVMvPQt8duoxwZ6UwcjVWUQNjgXKN6JDZCf+3hJsmU51Lp6mpzj0Y5m8nCjhh7/bBnJahH+VRm7bA= +node_js: 4 +addons: + firefox: '42.0' + apt: + sources: + - google-chrome + packages: + - google-chrome-stable +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-ripple/CONTRIBUTING.md b/react-app/bower_components/paper-ripple/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/paper-ripple/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-ripple/README.md b/react-app/bower_components/paper-ripple/README.md new file mode 100644 index 0000000000..9e4c8cac1a --- /dev/null +++ b/react-app/bower_components/paper-ripple/README.md @@ -0,0 +1,76 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/paper-ripple.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-ripple) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/paper-ripple)_ + + +##<paper-ripple> + + +Material design: [Surface reaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction) + +`paper-ripple` provides a visual effect that other paper elements can +use to simulate a rippling effect emanating from the point of contact. The +effect can be visualized as a concentric circle with motion. + +Example: + +
+ +
+ +Note, it's important that the parent container of the ripple be relative position, otherwise +the ripple will emanate outside of the desired container. + +`paper-ripple` listens to "mousedown" and "mouseup" events so it would display ripple +effect when touches on it. You can also defeat the default behavior and +manually route the down and up actions to the ripple element. Note that it is +important if you call `downAction()` you will have to make sure to call +`upAction()` so that `paper-ripple` would end the animation loop. + +Example: + + + ... + downAction: function(e) { + this.$.ripple.downAction({x: e.x, y: e.y}); + }, + upAction: function(e) { + this.$.ripple.upAction(); + } + +Styling ripple effect: + + Use CSS color property to style the ripple: + + paper-ripple { + color: #4285f4; + } + + Note that CSS color property is inherited so it is not required to set it on + the `paper-ripple` element directly. + +By default, the ripple is centered on the point of contact. Apply the `recenters` +attribute to have the ripple grow toward the center of its container. + + + +You can also center the ripple inside its container from the start. + + + +Apply `circle` class to make the rippling effect within a circle. + + + + diff --git a/react-app/bower_components/paper-ripple/bower.json b/react-app/bower_components/paper-ripple/bower.json new file mode 100644 index 0000000000..2190e22856 --- /dev/null +++ b/react-app/bower_components/paper-ripple/bower.json @@ -0,0 +1,35 @@ +{ + "name": "paper-ripple", + "version": "1.0.5", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "Adds a material design ripple to any container", + "private": true, + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "ripple" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-ripple.git" + }, + "main": "paper-ripple.html", + "dependencies": { + "polymer": "Polymer/polymer#^1.1.0", + "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0" + }, + "devDependencies": { + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "iron-icon": "polymerelements/iron-icon#^1.0.0", + "iron-icons": "polymerelements/iron-icons#^1.0.0", + "paper-styles": "polymerelements/paper-styles#^1.0.0", + "test-fixture": "polymerelements/test-fixture#^1.0.0", + "web-component-tester": "polymer/web-component-tester#^3.4.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-ripple/demo/index.html b/react-app/bower_components/paper-ripple/demo/index.html new file mode 100644 index 0000000000..e12cde5c08 --- /dev/null +++ b/react-app/bower_components/paper-ripple/demo/index.html @@ -0,0 +1,415 @@ + + + + + paper-ripple demo + + + + + + + + + + + + + + + + + +
+ +
+
SUBMIT
+ +
+ +
+
NO INK
+ +
+ +
+
CANCEL
+ +
+ +
+
COMPOSE
+ +
+ +
+
OK
+ +
+ +
+ +
+ +
+
+1
+ +
+ +
+
+1
+ +
+ +
+
+1
+ +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + + + +
+ +
+ +
+ +
+
Permission

+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
+
+ +
+
ACCEPT
+ +
+ +
+
DECLINE
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + diff --git a/react-app/bower_components/paper-ripple/hero.svg b/react-app/bower_components/paper-ripple/hero.svg new file mode 100755 index 0000000000..96f0b4c791 --- /dev/null +++ b/react-app/bower_components/paper-ripple/hero.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-ripple/index.html b/react-app/bower_components/paper-ripple/index.html new file mode 100644 index 0000000000..e552b0bb95 --- /dev/null +++ b/react-app/bower_components/paper-ripple/index.html @@ -0,0 +1,27 @@ + + + + + + paper-ripple + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-ripple/paper-ripple.html b/react-app/bower_components/paper-ripple/paper-ripple.html new file mode 100644 index 0000000000..d765221195 --- /dev/null +++ b/react-app/bower_components/paper-ripple/paper-ripple.html @@ -0,0 +1,757 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-ripple/test/index.html b/react-app/bower_components/paper-ripple/test/index.html new file mode 100644 index 0000000000..48197c08a5 --- /dev/null +++ b/react-app/bower_components/paper-ripple/test/index.html @@ -0,0 +1,25 @@ + + + + + + + Tests + + + + + + diff --git a/react-app/bower_components/paper-ripple/test/paper-ripple.html b/react-app/bower_components/paper-ripple/test/paper-ripple.html new file mode 100644 index 0000000000..fdee96f9c7 --- /dev/null +++ b/react-app/bower_components/paper-ripple/test/paper-ripple.html @@ -0,0 +1,198 @@ + + + + + + + paper-ripple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/.bower.json b/react-app/bower_components/paper-scroll-header-panel/.bower.json new file mode 100644 index 0000000000..b20ac58fc9 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "paper-scroll-header-panel", + "description": "A header bar with scrolling behavior", + "version": "1.0.15", + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "layout", + "responsive" + ], + "main": "paper-scroll-header-panel.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-scroll-header-panel.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-media-query": "PolymerElements/iron-media-query#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-input": "PolymerElements/paper-input#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/paper-scroll-header-panel", + "_release": "1.0.15", + "_resolution": { + "type": "version", + "tag": "v1.0.15", + "commit": "9e264cc643fc36d5b35597d20623f504914ac04e" + }, + "_source": "git://github.com/PolymerElements/paper-scroll-header-panel.git", + "_target": "~1.0.15", + "_originalSource": "PolymerElements/paper-scroll-header-panel", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/paper-scroll-header-panel/.gitignore b/react-app/bower_components/paper-scroll-header-panel/.gitignore new file mode 100644 index 0000000000..8d4ae2536a --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/.gitignore @@ -0,0 +1 @@ +bower_components diff --git a/react-app/bower_components/paper-scroll-header-panel/.travis.yml b/react-app/bower_components/paper-scroll-header-panel/.travis.yml new file mode 100644 index 0000000000..4eea9b6d11 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: XFAsPXpYVWqsvZ5NX0ueW63LYhGN560ZPdFbntpau2vYIiuLKwe5N5y3pjw+zE1aJ+MV/JcW7snvP9mimdBQoKj77PLFqzo6wSozaDeV8Zx7PitkztC3rByn9WDVLO8qmlWGqFfedY24Whd4YIHAbBk7V89vaIFPZToTUm0rlUKlsaBWlhViEeG9YxmHoIUXJoRwq9pZ6enFYGIbritYlvcdMnOmTN8AJXqe2hmFel1TzE+e0z67yJdzEFBfkEgGgTAmBKpwFugFyUupOq9ZeFqoD2rg05xgfmtcUv7wrJei6/XqQ5gwbRFS+1Sbjv9AsY02hKFqmToD8a+IXjnxRB2s3OQOF/GFH70RRUeeQW+VOp9jFUaiSMdTghHhj5uMqEQPT0sxvaB+si9R8+g1cYJLaKgT3HoeJtFjcaDYwKkAiFK0ZWhL84JFbxWRqvnAf3gdgK+UWrs517amVaV0cyBjyzrIPtrgACNzJyON32sZEfuLDAKtDfpHf18rfY/QLRO/D8GjB+aWSDA2FzDe7Lrdfhrfgw/fnHq9A4ohS4swBeW8IUC5imN4Eh3FqB/GjVz6q7H0cfmxMre+b0RFCK74HroFW+or/tG5K+Tw7Z51j7NwLt8YGwyfsUDzUZpQ7jUbnW3y/5HJGHov81LkQPESZP4KxWSEYTwXnWrLKk4= + - secure: xJhCDzTM2Ud1hx17cjcMDRtI0+IzrZbvY1vYK6OhX//fP1JTatIHOsXvBVFYfHCdutib6zkKaLTi8AF3oBYdZd7BF1c8Pfv1woZtML5hKb9Ti5VdGsino8Hr0IrInCQaqE+VM+C0Jn9xbsYYMCIMvI77L8kM6HY6Qno8S3Iw99mnxZxWIOKlcwCANlOPGNxOQ3wwJITYStSniBWIwS+51yjlWL1KOhRFWi3m8tFa/eGd4dO13jUb00GPRSluzGXevhtXX78niOB53a6GLT1uObx+zsStvDJeH6HEaXzamvQFMIPtwTCIPlM90AYCaktcgrIfJeRzjG8TOsWz/DuISsRKuuZ5N+yUKp8etD1YzgR3CqQq/NqeNp8TgsKwmifLFiOv75kCvKSvDpRvNjeimwW7jI+EzM0VKewdpJGSMywhHCWTEk3qZ0Vajma6OQcV7FjpwUfheSAAs4j6vYy4/EsKcfAQ9S9eEM85yOlM2NdoNgoQsxUNSM0z01wpxP5c70bgsA3eZRSXIdPXXrd4AuyMzN/o9gkxiTSeWASE4r+OqIJfoXDXYbIH+FtGBgJAE1oPbFDolXC6HNb3C2VwsMrEJP5FMHeqy5FNqLiy0cyl4GfxzNFQz/mIPA/QOpZ80UFIfOl8ptPn2tDloV4mO9TRiE0eXHbr4UOoVH677ew= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-scroll-header-panel/CONTRIBUTING.md b/react-app/bower_components/paper-scroll-header-panel/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-scroll-header-panel/README.md b/react-app/bower_components/paper-scroll-header-panel/README.md new file mode 100644 index 0000000000..2a1c2cc88b --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/README.md @@ -0,0 +1,78 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-scroll-header-panel.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-scroll-header-panel) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-scroll-header-panel)_ + + +##<paper-scroll-header-panel> + +Material design: [Scrolling techniques](https://www.google.com/design/spec/patterns/scrolling-techniques.html) + +`paper-scroll-header-panel` contains a header section and a content section. The +header is initially on the top part of the view but it scrolls away with the +rest of the scrollable content. Upon scrolling slightly up at any point, the +header scrolls back into view. This saves screen space and allows users to +access important controls by easily moving them back to the view. + +__Important:__ The `paper-scroll-header-panel` will not display if its parent does not have a height. + +Using [layout classes](https://www.polymer-project.org/1.0/docs/migration.html#layout-attributes) or custom properties, you can easily make the `paper-scroll-header-panel` fill the screen + +```html + + + +
Hello World!
+
+
+ +``` + +or, if you would prefer to do it in CSS, just give `html`, `body`, and `paper-scroll-header-panel` a height of 100%: + +```css +html, body { + height: 100%; + margin: 0; +} +paper-scroll-header-panel { + height: 100%; +} +``` + +`paper-scroll-header-panel` works well with `paper-toolbar` but can use any element +that represents a header by adding a `paper-header` class to it. + +```html + +
Header
+
Content goes here...
+
+``` + +### Styling + +======= + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| --paper-scroll-header-panel-full-header | To change background for toolbar when it is at its full size | {} | +| --paper-scroll-header-panel-condensed-header | To change the background for toolbar when it is condensed | {} | +| --paper-scroll-header-container | To override or add container styles | {} | + + diff --git a/react-app/bower_components/paper-scroll-header-panel/bower.json b/react-app/bower_components/paper-scroll-header-panel/bower.json new file mode 100644 index 0000000000..e7f562392b --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/bower.json @@ -0,0 +1,37 @@ +{ + "name": "paper-scroll-header-panel", + "description": "A header bar with scrolling behavior", + "version": "1.0.15", + "license": "http://polymer.github.io/LICENSE.txt", + "private": true, + "authors": "The Polymer Authors", + "keywords": [ + "web-components", + "polymer", + "layout", + "responsive" + ], + "main": "paper-scroll-header-panel.html", + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-scroll-header-panel.git" + }, + "dependencies": { + "polymer": "Polymer/polymer#^1.0.0", + "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0" + }, + "devDependencies": { + "paper-styles": "PolymerElements/paper-styles#^1.0.0", + "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0", + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "iron-media-query": "PolymerElements/iron-media-query#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-input": "PolymerElements/paper-input#^1.0.0", + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/drawer-panel.html b/react-app/bower_components/paper-scroll-header-panel/demo/drawer-panel.html new file mode 100644 index 0000000000..388e6a12b8 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/drawer-panel.html @@ -0,0 +1,90 @@ + + + + + paper-scroll-header-panel: Combine with paper-drawer-panel + + + + + + + + + + + + + + + + + + + + + + + + + + Menu + + + + + + + + +
Title
+ + + +
+ +
+ + + +
+ +
+ +
+ + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/hide-header.html b/react-app/bower_components/paper-scroll-header-panel/demo/hide-header.html new file mode 100644 index 0000000000..ec7debedf4 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/hide-header.html @@ -0,0 +1,88 @@ + + + + + paper-scroll-header-panel: demo3 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ + + +
+ +
+ + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/images/bg1.jpg b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg1.jpg new file mode 100644 index 0000000000..3d8ebf151f Binary files /dev/null and b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg1.jpg differ diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/images/bg2.jpg b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg2.jpg new file mode 100644 index 0000000000..a347ac1660 Binary files /dev/null and b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg2.jpg differ diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/images/bg3.jpg b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg3.jpg new file mode 100644 index 0000000000..9463bc3242 Binary files /dev/null and b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg3.jpg differ diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/images/bg4.jpg b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg4.jpg new file mode 100644 index 0000000000..0300e0ecfc Binary files /dev/null and b/react-app/bower_components/paper-scroll-header-panel/demo/images/bg4.jpg differ diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/index.html b/react-app/bower_components/paper-scroll-header-panel/demo/index.html new file mode 100644 index 0000000000..a2c35bacbc --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/index.html @@ -0,0 +1,115 @@ + + + + + paper-scroll-header-panel: demo4 + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
Title
+
+ +
+ + + +
+ +
+ + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/keep-header.html b/react-app/bower_components/paper-scroll-header-panel/demo/keep-header.html new file mode 100644 index 0000000000..9fde31ac32 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/keep-header.html @@ -0,0 +1,86 @@ + + + + + paper-scroll-header-panel: demo1 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Title
+ + + +
+ +
+ + + +
+ +
+ + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/lorem-ipsum.html b/react-app/bower_components/paper-scroll-header-panel/demo/lorem-ipsum.html new file mode 100644 index 0000000000..ed4fb4c93e --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/lorem-ipsum.html @@ -0,0 +1,42 @@ + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/sample-content.html b/react-app/bower_components/paper-scroll-header-panel/demo/sample-content.html new file mode 100644 index 0000000000..e325fe26b2 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/sample-content.html @@ -0,0 +1,72 @@ + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/toggle-fixed-header.html b/react-app/bower_components/paper-scroll-header-panel/demo/toggle-fixed-header.html new file mode 100644 index 0000000000..dd27d792cd --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/toggle-fixed-header.html @@ -0,0 +1,130 @@ + + + + + paper-scroll-header-panel: demo7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
Title
+ +
+ +
+ +

Resize window to toggle between fixed header and scrolled header

+ + +
+ +
+ + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-1.html b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-1.html new file mode 100644 index 0000000000..e5acabcc0a --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-1.html @@ -0,0 +1,118 @@ + + + + + paper-scroll-header-panel: Transform header + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
Title
+ +
+ +
+ + + +
+ +
+ + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-2.html b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-2.html new file mode 100644 index 0000000000..dda602d160 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-2.html @@ -0,0 +1,84 @@ + + + + + paper-scroll-header-panel: transform header + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Title
+ +
+ +
+ + + +
+ +
+ + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-3.html b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-3.html new file mode 100644 index 0000000000..9cf2e19793 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-3.html @@ -0,0 +1,116 @@ + + + + + paper-scroll-header-panel: transform header + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
Title
+ +
+ +
+ + + +
+ +
+ + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-4.html b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-4.html new file mode 100644 index 0000000000..daef1b60c6 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-4.html @@ -0,0 +1,119 @@ + + + + + paper-scroll-header-panel: transform header + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
Title
+ +
+ +
+ + + +
+ +
+ + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-5.html b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-5.html new file mode 100644 index 0000000000..4dded33751 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-5.html @@ -0,0 +1,131 @@ + + + + + paper-scroll-header-panel: transform header + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
Lorem ipsum dolor sit amet
+
Iisque perfecto dissentiet cum et
+
+ + +
+ +
+ + + +
+ +
+ + + diff --git a/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-6.html b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-6.html new file mode 100644 index 0000000000..ce31080359 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/demo/transform-header-6.html @@ -0,0 +1,120 @@ + + + + + paper-scroll-header-panel: transform header + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ + + diff --git a/react-app/bower_components/paper-scroll-header-panel/hero.svg b/react-app/bower_components/paper-scroll-header-panel/hero.svg new file mode 100755 index 0000000000..25710e9160 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/hero.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/index.html b/react-app/bower_components/paper-scroll-header-panel/index.html new file mode 100644 index 0000000000..e2e7712249 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/index.html @@ -0,0 +1,28 @@ + + + + + + + + + paper-scroll-header-panel + + + + + + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/paper-scroll-header-panel.html b/react-app/bower_components/paper-scroll-header-panel/paper-scroll-header-panel.html new file mode 100644 index 0000000000..ce8b4cfd1d --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/paper-scroll-header-panel.html @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/test/basic.html b/react-app/bower_components/paper-scroll-header-panel/test/basic.html new file mode 100644 index 0000000000..a399ff7bf5 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/test/basic.html @@ -0,0 +1,127 @@ + + + + + + paper-scroll-header-panel test + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/test/header-state.html b/react-app/bower_components/paper-scroll-header-panel/test/header-state.html new file mode 100644 index 0000000000..d6da0decf9 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/test/header-state.html @@ -0,0 +1,93 @@ + + + + + + paper-scroll-header-panel test + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/test/index.html b/react-app/bower_components/paper-scroll-header-panel/test/index.html new file mode 100644 index 0000000000..b9a9097b80 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/test/index.html @@ -0,0 +1,28 @@ + + + + Tests + + + + + + + diff --git a/react-app/bower_components/paper-scroll-header-panel/test/scroll.html b/react-app/bower_components/paper-scroll-header-panel/test/scroll.html new file mode 100644 index 0000000000..728c414e03 --- /dev/null +++ b/react-app/bower_components/paper-scroll-header-panel/test/scroll.html @@ -0,0 +1,136 @@ + + + + + + paper-scroll-header-panel test + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-styles/.bower.json b/react-app/bower_components/paper-styles/.bower.json new file mode 100644 index 0000000000..ae677ef3e7 --- /dev/null +++ b/react-app/bower_components/paper-styles/.bower.json @@ -0,0 +1,42 @@ +{ + "name": "paper-styles", + "version": "1.1.4", + "description": "Common (global) styles for Material Design elements.", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-component", + "polymer", + "style" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-styles.git" + }, + "main": "paper-styles.html", + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/polymerelements/paper-styles/", + "ignore": [ + "/.*" + ], + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "font-roboto": "PolymerElements/font-roboto#^1.0.1", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "web-component-tester": "^4.0.0" + }, + "_release": "1.1.4", + "_resolution": { + "type": "version", + "tag": "v1.1.4", + "commit": "885bbd74db88dab4fb5dc229cdf994c55fb2b31b" + }, + "_source": "git://github.com/PolymerElements/paper-styles.git", + "_target": "^1.0.0", + "_originalSource": "PolymerElements/paper-styles" +} \ No newline at end of file diff --git a/react-app/bower_components/paper-styles/CONTRIBUTING.md b/react-app/bower_components/paper-styles/CONTRIBUTING.md new file mode 100644 index 0000000000..f147978a3e --- /dev/null +++ b/react-app/bower_components/paper-styles/CONTRIBUTING.md @@ -0,0 +1,77 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, fixes #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-styles/README.md b/react-app/bower_components/paper-styles/README.md new file mode 100644 index 0000000000..ca555bdb32 --- /dev/null +++ b/react-app/bower_components/paper-styles/README.md @@ -0,0 +1,49 @@ + + + +[![Build status](https://travis-ci.org/PolymerElements/paper-styles.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-styles) + +_[Demo and API docs](https://elements.polymer-project.org/elements/paper-styles)_ + + +##<paper-styles> + +The `` component provides simple ways to use Material Design CSS styles +in your application. The following imports are available: + +1. [color.html](https://github.com/PolymerElements/paper-styles/blob/master/color.html): +a complete list of the colors defined in the Material Design [palette](https://www.google.com/design/spec/style/color.html) + + +1. [default-theme.html](https://github.com/PolymerElements/paper-styles/blob/master/default-theme.html): text, +background and accent colors that match the default Material Design theme + + +1. [shadow.html](https://github.com/PolymerElements/paper-styles/blob/master/shadow.html): Material Design +[elevation](https://www.google.com/design/spec/what-is-material/elevation-shadows.html) and shadow styles + + +1. [typography.html](https://github.com/PolymerElements/paper-styles/blob/master/typography.html): +Material Design [font](http://www.google.com/design/spec/style/typography.html#typography-styles) styles and sizes + + +1. [demo-pages.html](https://github.com/PolymerElements/paper-styles/blob/master/demo-pages.html): generic styles +used in the PolymerElements demo pages + + + +We recommend importing each of these individual files, and using the style mixins +available in each ones, rather than the aggregated `paper-styles.html` as a whole. + + diff --git a/react-app/bower_components/paper-styles/bower.json b/react-app/bower_components/paper-styles/bower.json new file mode 100644 index 0000000000..f3330c3ca3 --- /dev/null +++ b/react-app/bower_components/paper-styles/bower.json @@ -0,0 +1,33 @@ +{ + "name": "paper-styles", + "version": "1.1.4", + "description": "Common (global) styles for Material Design elements.", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-component", + "polymer", + "style" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-styles.git" + }, + "main": "paper-styles.html", + "license": "http://polymer.github.io/LICENSE.txt", + "homepage": "https://github.com/polymerelements/paper-styles/", + "ignore": [ + "/.*" + ], + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "font-roboto": "PolymerElements/font-roboto#^1.0.1", + "polymer": "Polymer/polymer#^1.0.0" + }, + "devDependencies": { + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0", + "iron-component-page": "polymerelements/iron-component-page#^1.0.0", + "web-component-tester": "^4.0.0" + } +} diff --git a/react-app/bower_components/paper-styles/classes/global.html b/react-app/bower_components/paper-styles/classes/global.html new file mode 100644 index 0000000000..6f0d5ddee1 --- /dev/null +++ b/react-app/bower_components/paper-styles/classes/global.html @@ -0,0 +1,96 @@ + + + + + diff --git a/react-app/bower_components/paper-styles/classes/shadow-layout.html b/react-app/bower_components/paper-styles/classes/shadow-layout.html new file mode 100644 index 0000000000..2638aa876d --- /dev/null +++ b/react-app/bower_components/paper-styles/classes/shadow-layout.html @@ -0,0 +1,302 @@ + + diff --git a/react-app/bower_components/paper-styles/classes/shadow.html b/react-app/bower_components/paper-styles/classes/shadow.html new file mode 100644 index 0000000000..4c40a147a5 --- /dev/null +++ b/react-app/bower_components/paper-styles/classes/shadow.html @@ -0,0 +1,52 @@ + + + diff --git a/react-app/bower_components/paper-styles/classes/typography.html b/react-app/bower_components/paper-styles/classes/typography.html new file mode 100644 index 0000000000..e6163a8176 --- /dev/null +++ b/react-app/bower_components/paper-styles/classes/typography.html @@ -0,0 +1,169 @@ + + + + + diff --git a/react-app/bower_components/paper-styles/color.html b/react-app/bower_components/paper-styles/color.html new file mode 100644 index 0000000000..5188790135 --- /dev/null +++ b/react-app/bower_components/paper-styles/color.html @@ -0,0 +1,333 @@ + + + + + diff --git a/react-app/bower_components/paper-styles/default-theme.html b/react-app/bower_components/paper-styles/default-theme.html new file mode 100644 index 0000000000..cc6972812c --- /dev/null +++ b/react-app/bower_components/paper-styles/default-theme.html @@ -0,0 +1,72 @@ + + + + + + + + diff --git a/react-app/bower_components/paper-styles/demo-pages.html b/react-app/bower_components/paper-styles/demo-pages.html new file mode 100644 index 0000000000..6e900ad163 --- /dev/null +++ b/react-app/bower_components/paper-styles/demo-pages.html @@ -0,0 +1,72 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/paper-styles/demo.css b/react-app/bower_components/paper-styles/demo.css new file mode 100644 index 0000000000..efd8b471b5 --- /dev/null +++ b/react-app/bower_components/paper-styles/demo.css @@ -0,0 +1,25 @@ +/** +@license +Copyright (c) 2015 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + +*/ +body { + font-family: 'Roboto', 'Noto', sans-serif; + font-size: 14px; + margin: 0; + padding: 24px; +} + +section { + padding: 20px 0; +} + +section > div { + padding: 14px; + font-size: 16px; +} diff --git a/react-app/bower_components/paper-styles/demo/index.html b/react-app/bower_components/paper-styles/demo/index.html new file mode 100644 index 0000000000..1080cc66dd --- /dev/null +++ b/react-app/bower_components/paper-styles/demo/index.html @@ -0,0 +1,339 @@ + + + + + + + + + + + paper-styles demo + + + + + + + + + + + + + +

paper-styles

+ +
+

default-theme.html

+ +
+
+ Title +
+
+
+
+
Primary text
+
Secondary text
+
+
+ Disabled +
+
+
+ +
+

typography.html

+

+ Grumpy wizards make toxic brew for the evil Queen and Jack. +

+
+
Display 4
+
Display 3
+
Display 2
+
Display 1
+
Headline
+
Title
+
Subhead
+
Body 2
+
Body 1
+
Caption
+
Menu
+
Button
+
+ +

Paragraphs

+ +

body2

+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi + tincidunt dui sit amet mi auctor, ac gravida magna aliquam. Fusce quis + purus elementum, tempus nisi vel, volutpat nulla. Vestibulum mollis + dictum tellus, vulputate porttitor arcu. Curabitur imperdiet risus id + egestas accumsan. Donec lectus felis, dignissim id iaculis sit amet, + faucibus in leo. +

+

+ Mauris id urna ac ante ultrices commodo a imperdiet elit. Vivamus + interdum neque magna, eget dapibus est auctor et. Donec accumsan + libero nec augue scelerisque, ac egestas ante tincidunt. Proin + sollicitudin, mi eget sagittis mollis, arcu orci scelerisque turpis, a + sollicitudin tellus quam non sapien. +

+
+ +

body1

+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi + tincidunt dui sit amet mi auctor, ac gravida magna aliquam. Fusce quis + purus elementum, tempus nisi vel, volutpat nulla. Vestibulum mollis + dictum tellus, vulputate porttitor arcu. Curabitur imperdiet risus id + egestas accumsan. Donec lectus felis, dignissim id iaculis sit amet, + faucibus in leo. +

+

+ Mauris id urna ac ante ultrices commodo a imperdiet elit. Vivamus + interdum neque magna, eget dapibus est auctor et. Donec accumsan + libero nec augue scelerisque, ac egestas ante tincidunt. Proin + sollicitudin, mi eget sagittis mollis, arcu orci scelerisque turpis, a + sollicitudin tellus quam non sapien. +

+
+
+ +
+

shadow.html

+
2dp
+
3dp
+
4dp
+
6dp
+
8dp
+
12dp
+
16dp
+
+ +
+

demo-pages.html

+ +

Horizontal sections

+
+
+

Column 1

+
+
Oxygen
+
Carbon
+
Hydrogen
+
Nitrogen
+
Calcium
+
+
+ +
+

Column 2

+
+
Oxygen
+
Carbon
+
Hydrogen
+
Nitrogen
+
Calcium
+
+
+ +
+

Column 3

+
+
Oxygen
+
Carbon
+
Hydrogen
+
Nitrogen
+
Calcium
+
+
+
+ +

Vertical sections

+
+
+

Section 1

+
+
Oxygen
+
Carbon
+
Hydrogen
+
Nitrogen
+
Calcium
+
+
+
+ +
+

Section 2 (centered)

+
+
Oxygen
+
Carbon
+
Hydrogen
+
Nitrogen
+
Calcium
+
+
+
+ + + diff --git a/react-app/bower_components/paper-styles/index.html b/react-app/bower_components/paper-styles/index.html new file mode 100644 index 0000000000..8e96ebe00c --- /dev/null +++ b/react-app/bower_components/paper-styles/index.html @@ -0,0 +1,24 @@ + + + + + + paper-styles + + + + + + + + + + diff --git a/react-app/bower_components/paper-styles/paper-styles-classes.html b/react-app/bower_components/paper-styles/paper-styles-classes.html new file mode 100644 index 0000000000..ae315a57f8 --- /dev/null +++ b/react-app/bower_components/paper-styles/paper-styles-classes.html @@ -0,0 +1,14 @@ + + + + + + diff --git a/react-app/bower_components/paper-styles/paper-styles.html b/react-app/bower_components/paper-styles/paper-styles.html new file mode 100644 index 0000000000..9eca03a773 --- /dev/null +++ b/react-app/bower_components/paper-styles/paper-styles.html @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/react-app/bower_components/paper-styles/shadow.html b/react-app/bower_components/paper-styles/shadow.html new file mode 100644 index 0000000000..c511e696f2 --- /dev/null +++ b/react-app/bower_components/paper-styles/shadow.html @@ -0,0 +1,71 @@ + + + + + diff --git a/react-app/bower_components/paper-styles/typography.html b/react-app/bower_components/paper-styles/typography.html new file mode 100644 index 0000000000..055b5f99ce --- /dev/null +++ b/react-app/bower_components/paper-styles/typography.html @@ -0,0 +1,169 @@ + + + + + + diff --git a/react-app/bower_components/paper-toolbar/.bower.json b/react-app/bower_components/paper-toolbar/.bower.json new file mode 100644 index 0000000000..fcc2826e43 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "paper-toolbar", + "version": "1.1.4", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "A material design toolbar that is easily customizable", + "private": true, + "main": "paper-toolbar.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "toolbar", + "layout" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-toolbar.git" + }, + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.1.0", + "polymer": "Polymer/polymer#^1.2.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-progress": "PolymerElements/paper-progress#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [], + "homepage": "https://github.com/PolymerElements/paper-toolbar", + "_release": "1.1.4", + "_resolution": { + "type": "version", + "tag": "v1.1.4", + "commit": "e9d582733fab4d0698c680047d7faaab1a35196c" + }, + "_source": "git://github.com/PolymerElements/paper-toolbar.git", + "_target": "~1.1.4", + "_originalSource": "PolymerElements/paper-toolbar", + "_direct": true +} \ No newline at end of file diff --git a/react-app/bower_components/paper-toolbar/.gitignore b/react-app/bower_components/paper-toolbar/.gitignore new file mode 100644 index 0000000000..fbe05fc93b --- /dev/null +++ b/react-app/bower_components/paper-toolbar/.gitignore @@ -0,0 +1 @@ +bower_components/ diff --git a/react-app/bower_components/paper-toolbar/.travis.yml b/react-app/bower_components/paper-toolbar/.travis.yml new file mode 100644 index 0000000000..57a4dd51c9 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +sudo: false +before_script: + - npm install -g bower polylint web-component-tester + - bower install + - polylint +env: + global: + - secure: K2cuhKpShJ9cc0XCnsHbLpw1qCXTRWiJqkn6hFrt3T7L+1bDSsMtzmZvfk7Pp4VbJCgEKmtgMitbr7gdTjxLpIr7qQv7SmErnbcoT+wEyOTfyK96YSkAOCIIafgWHWSHrwiDdqXvFlYe3sP4JPP8yH6kuIjYzphQ2H7k0yXnW04= + - secure: Til0DgFyTBk2pkrG5WrQ64g8ckN6Rbdqxm/F+HGbzG/hVXO6/fHqetlNKxvxotoI3LBb/iYFr7GXuNTgIYaH4qGVeV1MsOj7NUnFDYUJVcx/WhZO66CY+dno7UffBDV0wgd4mpsK8iLG4+Eitf1FcMBbY5esX4mFy3fFM8/6LyE= + - CXX=g++-4.8 +node_js: stable +addons: + firefox: latest + apt: + sources: + - google-chrome + - ubuntu-toolchain-r-test + packages: + - google-chrome-stable + - g++-4.8 + sauce_connect: true +script: + - xvfb-run wct + - "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi" diff --git a/react-app/bower_components/paper-toolbar/CONTRIBUTING.md b/react-app/bower_components/paper-toolbar/CONTRIBUTING.md new file mode 100644 index 0000000000..7b10141565 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/CONTRIBUTING.md @@ -0,0 +1,72 @@ + + +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/react-app/bower_components/paper-toolbar/README.md b/react-app/bower_components/paper-toolbar/README.md new file mode 100644 index 0000000000..a58b5a6c05 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/README.md @@ -0,0 +1,107 @@ + + + +[![Build Status](https://travis-ci.org/PolymerElements/paper-toolbar.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-toolbar) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/paper-toolbar)_ + + +##<paper-toolbar> + +Material design: [Toolbars](https://www.google.com/design/spec/components/toolbars.html) + +`paper-toolbar` is a horizontal bar containing items that can be used for +label, navigation, search and actions. The items placed inside the +`paper-toolbar` are projected into a `class="horizontal center layout"` container inside of +`paper-toolbar`'s Shadow DOM. You can use flex attributes to control the items' +sizing. + +Example: + +```html + + +
Title
+ +
+``` + +`paper-toolbar` has a standard height, but can made be taller by setting `tall` +class on the `paper-toolbar`. This will make the toolbar 3x the normal height. + +```html + + + +``` + +Apply `medium-tall` class to make the toolbar medium tall. This will make the +toolbar 2x the normal height. + +```html + + + +``` + +When `tall`, items can pin to either the top (default), middle or bottom. Use +`middle` class for middle content and `bottom` class for bottom content. + +```html + + +
Middle Title
+
Bottom Title
+
+``` + +For `medium-tall` toolbar, the middle and bottom contents overlap and are +pinned to the bottom. But `middleJustify` and `bottomJustify` attributes are +still honored separately. + +To make an element completely fit at the bottom of the toolbar, use `fit` along +with `bottom`. + +```html + +
+
+``` + +When inside a `paper-header-panel` element, the class `.animate` is toggled to animate +the height change in the toolbar. + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-toolbar-title` | Mixin applied to the title of the toolbar | `{}` | +| `--paper-toolbar-background` | Toolbar background color | `--primary-color` | +| `--paper-toolbar-color` | Toolbar foreground color | `--primary-text-color` | +| `--paper-toolbar-height` | Custom height for toolbar | `64px` | +| `--paper-toolbar-sm-height` | Custom height for small screen toolbar | `56px` | +| `--paper-toolbar` | Mixin applied to the toolbar | `{}` | +| `--paper-toolbar-content` | Mixin applied to the content section of the toolbar | `{}` | +| `--paper-toolbar-medium` | Mixin applied to medium height toolbar | `{}` | +| `--paper-toolbar-tall` | Mixin applied to tall height toolbar | `{}` | +| `--paper-toolbar-transition` | Transition applied to the `.animate` class | `height 0.18s ease-in` | + +### Accessibility + +`` has `role="toolbar"` by default. Any elements with the class `title` will +be used as the label of the toolbar via `aria-labelledby`. + + diff --git a/react-app/bower_components/paper-toolbar/bower.json b/react-app/bower_components/paper-toolbar/bower.json new file mode 100644 index 0000000000..78b8553857 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/bower.json @@ -0,0 +1,37 @@ +{ + "name": "paper-toolbar", + "version": "1.1.4", + "license": "http://polymer.github.io/LICENSE.txt", + "description": "A material design toolbar that is easily customizable", + "private": true, + "main": "paper-toolbar.html", + "authors": [ + "The Polymer Authors" + ], + "keywords": [ + "web-components", + "polymer", + "toolbar", + "layout" + ], + "repository": { + "type": "git", + "url": "git://github.com/PolymerElements/paper-toolbar.git" + }, + "dependencies": { + "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0", + "paper-styles": "PolymerElements/paper-styles#^1.1.0", + "polymer": "Polymer/polymer#^1.2.0" + }, + "devDependencies": { + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", + "iron-icons": "PolymerElements/iron-icons#^1.0.0", + "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", + "paper-progress": "PolymerElements/paper-progress#^1.0.0", + "test-fixture": "PolymerElements/test-fixture#^1.0.0", + "web-component-tester": "^4.0.0", + "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" + }, + "ignore": [] +} diff --git a/react-app/bower_components/paper-toolbar/demo/index.html b/react-app/bower_components/paper-toolbar/demo/index.html new file mode 100644 index 0000000000..ddfcc4cd46 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/demo/index.html @@ -0,0 +1,185 @@ + + + + + + + + paper-toolbar demo + + + + + + + + + + + + + + + + + + +
+ +

+ A plain paper-toolbar. Use class="title" to + indicate the toolbar's title. +

+ + + + +

A styled paper-toolbar.

+ + + + +

+ paper-icon-button is styled specially when used in a toolbar + before the title element or if the button has icon="menu". +

+ + + + +

+ Use class="tall" to expand the toolbar to three sections. +

+ + + + +

+ Use class="medium-tall" to expand the toolbar to two + sections. +

+ + + + +

+ Use class="middle" and class="bottom" to + indicate which section of the toolbar an element should be placed in. + Elements are placed in the top section by default. +

+ + + + +

+ Don't use both class="middle" and class="bottom" + elements in a class="medium-tall" toolbar. +

+ + + + +

+ Elements with class="fit" expand to fit to the bottom of the + toolbar section they are in. +

+ + + + +
+ + + diff --git a/react-app/bower_components/paper-toolbar/index.html b/react-app/bower_components/paper-toolbar/index.html new file mode 100644 index 0000000000..6533b73679 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/index.html @@ -0,0 +1,38 @@ + + + + + + + + + paper-toolbar + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-toolbar/paper-toolbar.html b/react-app/bower_components/paper-toolbar/paper-toolbar.html new file mode 100644 index 0000000000..2ae0aabe16 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/paper-toolbar.html @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + diff --git a/react-app/bower_components/paper-toolbar/test/index.html b/react-app/bower_components/paper-toolbar/test/index.html new file mode 100644 index 0000000000..ed7996876c --- /dev/null +++ b/react-app/bower_components/paper-toolbar/test/index.html @@ -0,0 +1,23 @@ + + + + paper-toolbar tests + + + + + + + diff --git a/react-app/bower_components/paper-toolbar/test/paper-toolbar.html b/react-app/bower_components/paper-toolbar/test/paper-toolbar.html new file mode 100644 index 0000000000..a5998c1db2 --- /dev/null +++ b/react-app/bower_components/paper-toolbar/test/paper-toolbar.html @@ -0,0 +1,147 @@ + + + + + + paper-toolbar basic tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/polymer/.bower.json b/react-app/bower_components/polymer/.bower.json new file mode 100644 index 0000000000..3e8a4009a3 --- /dev/null +++ b/react-app/bower_components/polymer/.bower.json @@ -0,0 +1,39 @@ +{ + "name": "polymer", + "version": "1.4.0", + "main": [ + "polymer.html", + "polymer-mini.html", + "polymer-micro.html" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "ignore": [ + "/.*", + "/test/", + "gen-changelog.sh" + ], + "authors": [ + "The Polymer Authors (http://polymer.github.io/AUTHORS.txt)" + ], + "repository": { + "type": "git", + "url": "https://github.com/Polymer/polymer.git" + }, + "dependencies": { + "webcomponentsjs": "^0.7.20" + }, + "devDependencies": { + "web-component-tester": "*" + }, + "private": true, + "homepage": "https://github.com/Polymer/polymer", + "_release": "1.4.0", + "_resolution": { + "type": "version", + "tag": "v1.4.0", + "commit": "11c987b2eb3c73b388a79fc8aaea8ca01624f514" + }, + "_source": "git://github.com/Polymer/polymer.git", + "_target": "^1.0.0", + "_originalSource": "Polymer/polymer" +} \ No newline at end of file diff --git a/react-app/bower_components/polymer/LICENSE.txt b/react-app/bower_components/polymer/LICENSE.txt new file mode 100644 index 0000000000..95987bac86 --- /dev/null +++ b/react-app/bower_components/polymer/LICENSE.txt @@ -0,0 +1,27 @@ +// Copyright (c) 2014 The Polymer 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. diff --git a/react-app/bower_components/polymer/bower.json b/react-app/bower_components/polymer/bower.json new file mode 100644 index 0000000000..a3174857ed --- /dev/null +++ b/react-app/bower_components/polymer/bower.json @@ -0,0 +1,29 @@ +{ + "name": "polymer", + "version": "1.4.0", + "main": [ + "polymer.html", + "polymer-mini.html", + "polymer-micro.html" + ], + "license": "http://polymer.github.io/LICENSE.txt", + "ignore": [ + "/.*", + "/test/", + "gen-changelog.sh" + ], + "authors": [ + "The Polymer Authors (http://polymer.github.io/AUTHORS.txt)" + ], + "repository": { + "type": "git", + "url": "https://github.com/Polymer/polymer.git" + }, + "dependencies": { + "webcomponentsjs": "^0.7.20" + }, + "devDependencies": { + "web-component-tester": "*" + }, + "private": true +} diff --git a/react-app/bower_components/polymer/build.log b/react-app/bower_components/polymer/build.log new file mode 100644 index 0000000000..02051cbf8f --- /dev/null +++ b/react-app/bower_components/polymer/build.log @@ -0,0 +1,553 @@ +BUILD LOG +--------- +Build Time: 2016-03-18T10:39:17-0700 + +NODEJS INFORMATION +================== +nodejs: v5.9.0 +abbrev: 1.0.7 +accepts: 1.2.13 +accessibility-developer-tools: 2.10.0 +acorn: 3.0.4 +adm-zip: 0.4.7 +acorn-jsx: 2.0.1 +after: 0.8.1 +align-text: 0.1.4 +amdefine: 1.0.0 +ansi-cyan: 0.1.1 +ansi-escapes: 1.3.0 +ansi-regex: 2.0.0 +ansi-red: 0.1.1 +ansi-styles: 2.2.0 +ansi-wrap: 0.1.0 +archiver: 0.14.4 +append-field: 0.1.0 +argparse: 1.0.7 +arr-diff: 1.1.0 +archy: 1.0.0 +arr-flatten: 1.0.1 +arr-union: 2.1.0 +array-differ: 1.0.0 +array-find-index: 1.0.1 +array-flatten: 1.1.1 +array-slice: 0.2.3 +array-union: 1.0.1 +arraybuffer.slice: 0.0.6 +array-uniq: 1.0.2 +arrify: 1.0.1 +asap: 2.0.3 +assert-plus: 0.1.5 +asn1: 0.1.11 +assertion-error: 1.0.1 +async: 0.9.2 +aws4: 1.3.2 +aws-sign2: 0.5.0 +babel-polyfill: 6.7.2 +babel-regenerator-runtime: 6.5.0 +babel-runtime: 5.8.35 +backo2: 1.0.2 +backoff: 2.5.0 +balanced-match: 0.3.0 +base64-arraybuffer: 0.1.2 +base64-js: 0.0.8 +base64id: 0.1.0 +beeper: 1.1.0 +benchmark: 1.0.0 +better-assert: 1.0.2 +binary: 0.3.0 +binaryextensions: 1.0.0 +bl: 0.9.5 +blob: 0.0.4 +bluebird: 3.3.4 +boom: 0.4.2 +body-parser: 1.15.0 +boxen: 0.3.1 +brace-expansion: 1.1.3 +browserstack: 1.4.0 +buffer-crc32: 0.2.5 +bufferstreams: 1.1.0 +buffers: 0.1.1 +builtin-modules: 1.1.1 +bunyan: 1.8.0 +busboy: 0.2.12 +bytes: 2.2.0 +caller-path: 0.1.0 +callsite: 1.0.0 +callsites: 0.2.0 +camelcase: 2.1.1 +camelcase-keys: 2.1.0 +capture-stack-trace: 1.0.0 +caseless: 0.8.0 +center-align: 0.1.3 +chainsaw: 0.1.0 +chai: 3.5.0 +chalk: 1.1.1 +cleankill: 1.0.2 +cli-cursor: 1.0.2 +cliui: 2.1.0 +cli-width: 2.1.0 +clone-stats: 0.0.1 +clone: 1.0.2 +code-point-at: 1.0.0 +color-convert: 1.0.0 +combined-stream: 0.0.7 +commander: 2.3.0 +component-bind: 1.0.0 +component-emitter: 1.1.2 +component-inherit: 0.0.3 +compress-commons: 0.2.9 +concat-map: 0.0.1 +concat-stream: 1.5.1 +configstore: 2.0.0 +content-disposition: 0.5.1 +content-type: 1.0.1 +cookie: 0.1.5 +cookie-signature: 1.0.6 +core-js: 2.2.0 +core-util-is: 1.0.2 +crc: 3.2.1 +crc32-stream: 0.3.4 +create-error-class: 2.0.1 +cryptiles: 0.2.2 +csv: 0.4.6 +csv-generate: 0.0.6 +csv-stringify: 0.0.8 +csv-parse: 1.0.2 +ctype: 0.5.3 +d: 0.1.1 +dashdash: 1.13.0 +dateformat: 1.0.12 +debug: 2.2.0 +decamelize: 1.2.0 +debuglog: 1.0.1 +deep-eql: 0.1.3 +deep-extend: 0.4.1 +deep-is: 0.1.3 +defaults: 1.0.3 +delayed-stream: 0.0.5 +depd: 1.1.0 +del: 2.2.0 +deprecated: 0.0.1 +destroy: 1.0.4 +dezalgo: 1.0.3 +dicer: 0.2.5 +diff: 1.4.0 +doctrine: 1.2.0 +dom-serializer: 0.1.0 +domelementtype: 1.3.0 +dom5: 1.3.1 +domhandler: 2.3.0 +domutils: 1.5.1 +dot-prop: 2.4.0 +duplexer: 0.1.1 +dtrace-provider: 0.6.0 +duplexer2: 0.0.2 +ecc-jsbn: 0.1.1 +ee-first: 1.1.1 +engine.io: 1.6.8 +end-of-stream: 0.1.5 +engine.io-client: 1.6.8 +engine.io-parser: 1.2.4 +entities: 1.1.1 +es6-iterator: 2.0.0 +error-ex: 1.3.0 +es5-ext: 0.10.11 +es6-map: 0.1.3 +es6-promise: 2.3.0 +es6-set: 0.1.4 +es6-symbol: 3.0.2 +es6-weak-map: 2.0.1 +escape-html: 1.0.3 +escape-regexp-component: 1.0.2 +escape-string-regexp: 1.0.5 +escodegen: 1.8.0 +escope: 3.6.0 +eslint: 2.4.0 +espree: 3.1.3 +esprima: 2.7.2 +eslint-plugin-html: 1.4.0 +esrecurse: 4.1.0 +esutils: 2.0.2 +estraverse: 4.2.0 +etag: 1.7.0 +event-emitter: 0.3.4 +exit-hook: 1.1.1 +express: 4.13.4 +extend: 2.0.1 +extend-shallow: 1.1.4 +extsprintf: 1.2.0 +fancy-log: 1.2.0 +fast-levenshtein: 1.1.3 +figures: 1.4.0 +file-entry-cache: 1.2.4 +filled-array: 1.1.0 +finalhandler: 0.4.1 +find-index: 0.1.1 +find-up: 1.1.2 +findup-sync: 0.3.0 +first-chunk-stream: 1.0.0 +flagged-respawn: 0.3.1 +flat-cache: 1.0.10 +forever-agent: 0.5.2 +form-data: 0.2.0 +formatio: 1.1.1 +formidable: 1.0.17 +forwarded: 0.1.0 +freeport: 1.0.5 +fresh: 0.3.0 +fstream: 0.1.31 +gaze: 0.5.2 +generate-function: 2.0.0 +generate-object-property: 1.2.0 +get-stdin: 4.0.1 +github-url-from-git: 1.4.0 +github-url-from-username-repo: 1.0.2 +glob: 6.0.4 +glob-stream: 3.1.18 +glob-watcher: 0.0.6 +glob2base: 0.0.12 +globby: 4.0.0 +globals: 8.18.0 +globule: 0.1.0 +glogg: 1.0.0 +got: 5.5.0 +graceful-fs: 4.1.3 +growl: 1.8.1 +graceful-readlink: 1.0.1 +gulp: 3.9.1 +gulp-audit: 1.0.0 +gulp-eslint: 2.0.0 +gulp-rename: 1.2.2 +gulp-replace: 0.5.4 +gulp-util: 3.0.7 +gulp-vulcanize: 6.1.0 +gulplog: 1.0.0 +har-validator: 2.0.6 +has-ansi: 2.0.0 +has-binary: 0.1.7 +has-color: 0.1.7 +has-cors: 1.1.0 +has-gulplog: 0.1.0 +hawk: 1.1.1 +hoek: 0.9.1 +hosted-git-info: 2.1.4 +htmlparser2: 3.9.0 +http-errors: 1.4.0 +http-signature: 0.11.0 +hydrolysis: 1.23.1 +iconv-lite: 0.4.13 +ignore: 2.2.19 +imurmurhash: 0.1.4 +indent-string: 2.1.0 +inflight: 1.0.4 +indexof: 0.0.1 +inherits: 2.0.1 +ini: 1.3.4 +inquirer: 0.12.0 +interpret: 1.0.0 +ipaddr.js: 1.0.5 +is-absolute: 0.1.7 +is-arrayish: 0.2.1 +is-buffer: 1.1.3 +is-builtin-module: 1.0.0 +is-finite: 1.0.1 +is-fullwidth-code-point: 1.0.0 +is-my-json-valid: 2.13.1 +is-npm: 1.0.0 +is-obj: 1.0.0 +is-path-cwd: 1.0.0 +is-path-in-cwd: 1.0.0 +is-path-inside: 1.0.0 +is-plain-obj: 1.1.0 +is-property: 1.0.2 +is-redirect: 1.0.0 +is-relative: 0.1.3 +is-resolvable: 1.0.0 +is-retry-allowed: 1.0.0 +is-stream: 1.0.1 +is-typedarray: 1.0.0 +is-utf8: 0.2.1 +isarray: 1.0.0 +isexe: 1.1.2 +isstream: 0.1.2 +istextorbinary: 1.0.2 +jade: 0.26.3 +jju: 1.3.0 +jodid25519: 1.0.2 +js-yaml: 3.5.5 +jsbn: 0.1.0 +json-parse-helpfulerror: 1.0.3 +json-schema: 0.2.2 +json-stable-stringify: 1.0.1 +json-stringify-safe: 5.0.1 +json3: 3.2.6 +jsonify: 0.0.0 +jsonpointer: 2.0.0 +jsprim: 1.2.2 +keep-alive-agent: 0.0.1 +kind-of: 1.1.0 +launchpad: 0.5.1 +latest-version: 2.0.0 +lazy-cache: 1.0.3 +lazypipe: 1.0.1 +levn: 0.3.0 +lazystream: 0.1.0 +liftoff: 2.2.0 +lodash: 1.0.2 +load-json-file: 1.1.0 +lodash._basecopy: 3.0.1 +lodash._basetostring: 3.0.1 +lodash._basevalues: 3.0.0 +lodash._getnative: 3.9.1 +lodash._isiterateecall: 3.0.9 +lodash._reescape: 3.0.0 +lodash._reevaluate: 3.0.0 +lodash._reinterpolate: 3.0.0 +lodash._root: 3.0.1 +lodash.escape: 3.2.0 +lodash.isarguments: 3.0.8 +lodash.keys: 3.1.2 +lodash.isarray: 3.0.4 +lodash.restparam: 3.6.1 +lodash.template: 3.6.2 +lodash.templatesettings: 3.1.1 +lolex: 1.3.2 +longest: 1.0.1 +lowercase-keys: 1.0.0 +loud-rejection: 1.3.0 +lru-cache: 2.7.3 +map-obj: 1.0.1 +match-stream: 0.0.2 +media-typer: 0.3.0 +meow: 3.7.0 +merge-descriptors: 1.0.1 +methods: 1.1.2 +mime: 1.3.4 +mime-types: 2.1.10 +mime-db: 1.22.0 +minimatch: 3.0.0 +minimist: 1.2.0 +mocha: 2.4.5 +mkdirp: 0.5.1 +ms: 0.7.1 +moment: 2.12.0 +multer: 1.1.0 +multipipe: 0.1.2 +mute-stream: 0.0.5 +mv: 2.1.1 +nan: 2.2.0 +node-int64: 0.3.3 +ncp: 2.0.0 +node-status-codes: 1.0.0 +negotiator: 0.5.3 +node-uuid: 1.4.7 +nomnom: 1.8.1 +normalize-package-data: 2.3.5 +nopt: 3.0.6 +number-is-nan: 1.0.0 +oauth-sign: 0.5.0 +object-assign: 4.0.1 +object-component: 0.0.3 +on-finished: 2.3.0 +once: 1.3.3 +onetime: 1.1.0 +optionator: 0.8.1 +options: 0.0.6 +orchestrator: 0.3.7 +ordered-read-streams: 0.1.0 +os-homedir: 1.0.1 +os-tmpdir: 1.0.1 +osenv: 0.1.3 +over: 0.0.5 +package-json: 2.3.1 +parse-json: 2.2.0 +parse5: 1.5.1 +parseqs: 0.0.2 +parsejson: 0.0.1 +parseuri: 0.0.4 +parseurl: 1.3.1 +path-exists: 2.1.0 +path-is-absolute: 1.0.0 +path-is-inside: 1.0.1 +path-posix: 1.0.0 +path-to-regexp: 0.1.7 +pify: 2.3.0 +path-type: 1.1.0 +pinkie: 2.0.4 +pinkie-promise: 2.0.0 +plist: 1.2.0 +plugin-error: 0.1.2 +pluralize: 1.2.1 +polyclean: 1.3.1 +precond: 0.2.3 +prelude-ls: 1.1.2 +prepend-http: 1.0.3 +pretty-hrtime: 1.0.2 +process-nextick-args: 1.0.6 +progress: 1.1.8 +proxy-addr: 1.0.10 +pseudomap: 1.0.2 +pullstream: 0.4.1 +q: 1.4.1 +range-parser: 1.0.3 +qs: 6.1.0 +raw-body: 2.1.6 +rc: 1.1.6 +read-all-stream: 3.1.0 +read-installed: 3.1.5 +read-json-sync: 1.1.1 +read-package-json: 1.3.3 +read-pkg: 1.1.0 +read-pkg-up: 1.0.1 +readable-stream: 2.0.6 +readdir-scoped-modules: 1.0.2 +readline2: 1.0.1 +rechoir: 0.6.2 +redent: 1.0.0 +registry-url: 3.0.3 +repeat-string: 1.5.4 +replace-ext: 0.0.1 +repeating: 2.0.0 +replacestream: 4.0.0 +request: 2.51.0 +require-uncached: 1.0.2 +resolve: 1.1.7 +resolve-from: 1.0.1 +restify: 4.0.4 +restore-cursor: 1.0.1 +right-align: 0.1.3 +run-async: 0.1.0 +rimraf: 2.5.2 +run-sequence: 1.1.5 +rx-lite: 3.1.2 +safe-json-stringify: 1.0.3 +samsam: 1.1.2 +sauce-connect-launcher: 0.14.0 +selenium-standalone: 5.0.0 +semver-diff: 2.1.0 +semver: 4.3.6 +send: 0.11.1 +sequencify: 0.0.7 +serve-static: 1.10.2 +serve-waterfall: 1.1.1 +server-destroy: 1.0.1 +setimmediate: 1.0.4 +shelljs: 0.5.3 +sigmund: 1.0.1 +signal-exit: 2.1.2 +sinon-chai: 2.8.0 +sinon: 1.17.3 +slice-ansi: 0.0.4 +slice-stream: 1.0.0 +sntp: 0.2.4 +slide: 1.1.6 +socket.io: 1.4.5 +socket.io-adapter: 0.4.0 +socket.io-client: 1.4.5 +socket.io-parser: 2.2.6 +source-map: 0.2.0 +sparkles: 1.0.0 +spdx-correct: 1.0.2 +spdx-exceptions: 1.0.4 +spdx-expression-parse: 1.0.2 +spdx-license-ids: 1.2.0 +spdy: 1.32.5 +sprintf-js: 1.0.3 +stacky: 1.3.1 +sshpk: 1.7.4 +statuses: 1.2.1 +stream-combiner: 0.2.2 +stream-consume: 0.1.0 +stream-transform: 0.1.1 +streamsearch: 0.1.2 +string-width: 1.0.1 +string_decoder: 0.10.31 +stringstream: 0.0.5 +strip-bom: 2.0.0 +strip-ansi: 3.0.1 +strip-indent: 1.0.1 +strip-json-comments: 1.0.4 +supports-color: 2.0.0 +table: 3.7.8 +tar-stream: 1.1.5 +temp: 0.8.3 +test-fixture: 1.1.0 +text-table: 0.2.0 +through: 2.3.8 +textextensions: 1.0.1 +through2: 2.0.1 +tildify: 1.1.2 +time-stamp: 1.0.0 +timed-out: 2.0.0 +to-array: 0.1.4 +tough-cookie: 2.2.2 +traverse: 0.3.9 +trim-newlines: 1.0.0 +tryit: 1.0.2 +tunnel-agent: 0.4.2 +tweetnacl: 0.14.1 +tv4: 1.2.7 +type-check: 0.3.2 +type-detect: 1.0.0 +type-is: 1.6.12 +typedarray: 0.0.6 +uglify-js: 2.6.2 +uglify-to-browserify: 1.0.2 +ultron: 1.0.2 +underscore: 1.6.0 +underscore.string: 3.0.3 +unique-stream: 1.0.0 +unpipe: 1.0.0 +unzip: 0.1.11 +unzip-response: 1.0.0 +update-notifier: 0.6.3 +urijs: 1.16.1 +url-parse-lax: 1.0.0 +user-home: 1.1.1 +utf8: 2.1.0 +util: 0.10.3 +util-deprecate: 1.0.2 +util-extend: 1.0.3 +utils-merge: 1.0.0 +uuid: 2.0.1 +v8flags: 2.0.11 +validate-npm-package-license: 3.0.1 +vargs: 0.1.0 +vary: 1.0.1 +verror: 1.6.1 +vasync: 1.6.3 +vinyl: 0.5.3 +vinyl-fs: 0.3.14 +wct-local: 2.0.2 +vulcanize: 1.14.7 +wct-sauce: 1.8.4 +wd: 0.3.12 +web-component-tester: 4.2.2 +which: 1.2.4 +window-size: 0.1.0 +widest-line: 1.0.0 +wrappy: 1.0.1 +wordwrap: 1.0.0 +write: 0.2.1 +write-file-atomic: 1.1.4 +ws: 1.0.1 +xdg-basedir: 2.0.0 +xmlbuilder: 4.0.0 +xmlhttprequest-ssl: 1.5.1 +xmldom: 0.1.22 +xregexp: 3.1.0 +xtend: 4.0.1 +yallist: 2.0.0 +yargs: 3.10.0 +zip-stream: 0.5.2 +yeast: 0.1.2 + +REPO REVISIONS +============== +release-polymer: 27d90bfaeb13f1d1a822f8a5e6e26a5403f5ed2c + +BUILD HASHES +============ +polymer-mini.html: c1c9dad708b2d558423c340bc2f17999f22ded4d +polymer-micro.html: 08313701e799be3c21779d86efd50b832920981b +polymer.html: ab293facd7eb68f1cdb44e794d97dd8ae5285c90 \ No newline at end of file diff --git a/react-app/bower_components/polymer/polymer-micro.html b/react-app/bower_components/polymer/polymer-micro.html new file mode 100644 index 0000000000..cd3b5ea525 --- /dev/null +++ b/react-app/bower_components/polymer/polymer-micro.html @@ -0,0 +1,685 @@ + + + + + \ No newline at end of file diff --git a/react-app/bower_components/polymer/polymer-mini.html b/react-app/bower_components/polymer/polymer-mini.html new file mode 100644 index 0000000000..7b5df9c933 --- /dev/null +++ b/react-app/bower_components/polymer/polymer-mini.html @@ -0,0 +1,2166 @@ + + + + + \ No newline at end of file diff --git a/react-app/bower_components/polymer/polymer.html b/react-app/bower_components/polymer/polymer.html new file mode 100644 index 0000000000..c94128b7fe --- /dev/null +++ b/react-app/bower_components/polymer/polymer.html @@ -0,0 +1,4816 @@ + + + + + diff --git a/react-app/bower_components/web-animations-js/.bower.json b/react-app/bower_components/web-animations-js/.bower.json new file mode 100644 index 0000000000..2f36618de5 --- /dev/null +++ b/react-app/bower_components/web-animations-js/.bower.json @@ -0,0 +1,41 @@ +{ + "name": "web-animations-js", + "description": "JavaScript implementation of the Web Animations API", + "homepage": "https://github.com/web-animations/web-animations-js", + "main": "web-animations.min.js", + "moduleType": [ + "globals" + ], + "keywords": [ + "animations", + "polyfill" + ], + "license": "Apache-2.0", + "ignore": [ + "**/.*", + "node_modules", + "templates", + "test", + "src", + "Gruntfile.js", + "package.json", + "target-config.js", + "target-loader.js", + "web-animations.dev.html", + "web-animations.dev.js", + "web-animations-next.dev.html", + "web-animations-next.dev.js", + "web-animations-next-lite.dev.html", + "web-animations-next-lite.dev.js" + ], + "version": "2.1.4", + "_release": "2.1.4", + "_resolution": { + "type": "version", + "tag": "2.1.4", + "commit": "37184a99ab51d7fd8b3c9a60c3faa5c440ade147" + }, + "_source": "git://github.com/web-animations/web-animations-js.git", + "_target": "2.1.4", + "_originalSource": "web-animations/web-animations-js" +} \ No newline at end of file diff --git a/react-app/bower_components/web-animations-js/COPYING b/react-app/bower_components/web-animations-js/COPYING new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/react-app/bower_components/web-animations-js/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/react-app/bower_components/web-animations-js/History.md b/react-app/bower_components/web-animations-js/History.md new file mode 100644 index 0000000000..db80353c04 --- /dev/null +++ b/react-app/bower_components/web-animations-js/History.md @@ -0,0 +1,152 @@ +### 2.1.4 - *December 1 2015* + * Use `Date.now()` instead of `performace.now()` for mobile Safari. + +### 2.1.3 - *October 12 2015* + * Removed web-animations.min.js.gz + +### 2.1.2 - *July 8 2015* + * Fix a bug where onfinish was being called for GroupEffects before they were finished. + +### 2.1.1 - *July 1 2015* + * Add Animation.timeline getter + * Add AnimationEffect.parent getter + * Make AnimationEffectTiming (returned by AnimationEffect.timing) attributes mutable + * Expose the Animation constructor + * Change custom effects from AnimationEffects to onsample functions. Custom effects should now be created by setting the onsample attribute of a KeyframeEffect. + + For example, this is deprecated: + + var myEffect = new KeyframeEffect( + element, + function(timeFraction, target, effect) { + target.style.opacity = timeFraction; + }, + 1000); + var myAnimation = document.timeline.play(myEffect); + + and this should be used insead: + + var myEffect = new KeyframeEffect(element, [], 1000); + effect.onsample = function(timeFraction, effect, animation) { + effect.target.style.opacity = timeFraction; + }; + var myAnimation = document.timeline.play(myEffect); + +### 2.1.0 - *June 15 2015* + * Fix bug affecting GroupEffects with infinite iteration children + * Add GroupEffect.firstChild and GroupEffect.lastChild + * Add initial values for most CSS properties + * Allow `timeline.play()` to be called with no arguments + * Add AnimationEffect.clone + * Add GroupEffect.append and GroupEffect.prepend + * Add AnimationEffect.remove + * Add Animation.ready and Animation.finished promises + +### 2.0.0 - *April 5 2015* + + * Improve behavior of group Animation playback rate. + * Rename Animation to KeyframeEffect. + * Rename AnimationSequence to SequenceEffect. + * Rename AnimationGroup to GroupEffect. + * Rename AnimationPlayer to Animation. + * Remove KeyframeEffect.effect and add KeyframeEffect.getFrames. + * Rename Animation.source to Animation.effect. + * Rename Timeline.getAnimationPlayers to Timeline.getAnimations. + * Rename Element.getAnimationPlayers to Element.getAnimations. + +### 1.0.7 - *March 10 2015* + + * Improve performance of constructing groups and sequences. + * Remove support for animating zoom. + * Add bower file. + +### 1.0.6 - *February 5 2015* + + * Implement playbackRate setter for group players. + * Fix pausing a group player before its first tick. + * Fix cancelling a group player before its first tick. + * Fix excess CPU use on idle pages where custom effects and groups were used. + * Suppress AnimationTiming.playbackRate deprecation warning for cases where AnimationTiming.playbackRate == 1. + +### 1.0.5 - *January 6 2015* + + * Fix loading the polyfill in an SVG document + * Fix a problem where groups didn't take effect in their first frame + * Don't rely on performance.now + +### 1.0.4 - *December 8 2014* + + * Fix a critical bug where deprecation logic wasn't being loaded + when `web-animations-next` and `web-animations-next-lite` were + executed on top of a native `element.animate`. + +### 1.0.3 - *December 4 2014* + + * Fix a critical bug on iOS 7 and Safari <= 6. Due to limitations, + inline style patching is not supported on these platforms. + +### 1.0.2 - *November 28 2014* + + * Deprecated `AnimationTiming.playbackRate`. + + For example, this is no longer supported: + + var player = element.animate( + keyframes, + {duration: 1000, playbackRate: 2}); + + Use `AnimationPlayer.playbackRate` instead: + + var player = element.animate( + keyframes, + {duration: 1000}); + player.playbackRate = 2; + + If you have any feedback on this change, please start a discussion + on the public-fx mailing list: + http://lists.w3.org/Archives/Public/public-fx/ + + Or file an issue against the specification on GitHub: + https://github.com/w3c/web-animations/issues/new + +### 1.0.1 - *November 26 2014* + + * Players should be constructed in idle state + * `play()` and `reverse()` should not force a start times + * Add `requestAnimationFrame` ids and `cancelAnimationFrame` + +### 1.0.0 — *November 21 2014* + + The web-animations-js hackers are pleased to announce the release of + a new codebase for the Web Animations Polyfill: + https://github.com/web-animations/web-animations-js + + The previous polyfill has been moved to: + https://github.com/web-animations/web-animations-js-legacy + + The new codebase is focused on code-size -- our smallest target is + now only 33kb or 11kb after gzip. + + We've implemented native fallback. If the target browser provides + Web Animations features natively, the Polyfill will use them. + + We now provide three different build targets: + + `web-animations.min.js` - Tracks the Web Animations features that + are supported natively in browsers. Today that means Element.animate + and Playback Control in Chrome. If you’re not sure what features you + will need, start with this. + + `web-animations-next.min.js` - All of web-animations.min.js plus + features that are still undergoing discussion or have yet to be + implemented natively. + + `web-animations-next-lite.min.js` - A cut down version of + web-animations-next, removes several lesser used property handlers + and some of the larger and less used features such as matrix + interpolation/decomposition. + + Not all features of the previous polyfill have been ported to the + new codebase; most notably mutation of Animations and Groups and + Additive Animations are not yet supported. These features are still + important and will be implemented in the coming weeks. diff --git a/react-app/bower_components/web-animations-js/README.md b/react-app/bower_components/web-animations-js/README.md new file mode 100644 index 0000000000..08f98dac44 --- /dev/null +++ b/react-app/bower_components/web-animations-js/README.md @@ -0,0 +1,172 @@ + +Quick Start +----------- + +To provide native Chrome Web Animation features (`Element.animate` and Playback +Control) in other browsers, use `web-animations.min.js`. To explore all of the +proposed Web Animations API, use `web-animations-next.min.js`. + +What is Web Animations? +----------------------- + +Web Animations is a new JavaScript API for driving animated content on the web. +By unifying the animation features of SVG and CSS, Web Animations unlocks +features previously only usable declaratively, and exposes powerful, +high-performance animation capabilities to developers. + +For more details see the +[W3C specification](http://w3c.github.io/web-animations/). + +What is the polyfill? +--------------------- + +The polyfill is a JavaScript implementation of the Web Animations API. It is +supported on modern versions of all major browsers, including: + +* Chrome +* Firefox 27+ +* IE10+ (including Edge) +* Safari (iOS) 7.1+ +* Safari (Mac) 9+ + +Getting Started +--------------- + +Here's a simple example of an animation that scales and changes the opacity of +a `
` over 0.5 seconds. The animation alternates producing a pulsing +effect. + +```html + +
Hello world!
+ +``` + +Web Animations supports off-main-thread animations, and also allows procedural +generation of animations and fine-grained control of animation playback. See + for ideas and inspiration! + +Native Fallback +--------------- + +When the polyfill runs on a browser that implements `Element.animate` and +`Animation` Playback Control it will detect and use the underlying native +features. + +Different Build Targets +----------------------- + +### web-animations.min.js + +Tracks the Web Animations features that are supported natively in browsers. +Today that means Element.animate and Playback Control in Chrome. If you’re not +sure what features you will need, start with this. + +### web-animations-next.min.js + +Contains all of web-animations.min.js plus features that are still undergoing +discussion or have yet to be implemented natively. + +### web-animations-next-lite.min.js + +A cut down version of web-animations-next, it removes several lesser used +property handlers and some of the larger and less used features such as matrix +interpolation/decomposition. + +### Build Target Comparison + +| | web-animations | web-animations-next | web-animations-next-lite | +|------------------------|:--------------:|:-------------------:|:------------------------:| +|Size (gzipped) | 12.5kb | 14kb | 10.5kb | +|Element.animate | ✔ | ✔ | ✔ | +|Timing input (easings, duration, fillMode, etc.) for animation effects| ✔ | ✔ | ✔ | +|Playback control | ✔ | ✔ | ✔ | +|Support for animating lengths, transforms and opacity| ✔ | ✔ | ✔ | +|Support for animating other CSS properties| ✔ | ✔ | 🚫 | +|Matrix fallback for transform animations | ✔ | ✔ | 🚫 | +|KeyframeEffect constructor | 🚫 | ✔ | ✔ | +|Simple GroupEffects & SequenceEffects | 🚫 | ✔ | ✔ | +|Custom Effects | 🚫 | ✔ | ✔ | +|Timing input (easings, duration, fillMode, etc.) for groups
| 🚫 | 🚫\* | 🚫 | +|Additive animation | 🚫\* | 🚫\* | 🚫 | +|Motion path | 🚫\* | 🚫\* | 🚫 | +|Modifiable keyframe effect timing| 🚫 | 🚫\* | 🚫\* | +|Modifiable group timing | 🚫 | 🚫\* | 🚫\* | +|Usable inline style\*\* | ✔ | ✔ | 🚫 | + +\* support is planned for these features. +\*\* see inline style caveat below. + +Caveats +------- + +Some things won’t ever be faithful to the native implementation due to browser +and CSS API limitations. These include: + +### Inline Style + +Inline style modification is the mechanism used by the polyfill to animate +properties. Both web-animations and web-animations-next incorporate a module +that emulates a vanilla inline style object, so that style modification from +JavaScript can still work in the presence of animations. However, to keep the +size of web-animations-next-lite as small as possible, the style emulation +module is not included. When using this version of the polyfill, JavaScript +inline style modification will be overwritten by animations. +Due to browser constraints inline style modification is not supported on iOS 7 +or Safari 6 (or earlier versions). + +### Prefix handling + +The polyfill will automatically detect the correctly prefixed name to use when +writing animated properties back to the platform. Where possible, the polyfill +will only accept unprefixed versions of experimental features. For example: + +```js +var effect = new KeyframeEffect(elem, {"transform": "translate(100px, 100px)"}, 2000); +``` + +will work in all browsers that implement a conforming version of transform, but + +```js +var effect = new KeyframeEffect(elem, {"-webkit-transform": "translate(100px, 100px)"}, 2000); +``` + +will not work anywhere. + +API and Specification Feedback +------------------------------ + +File an issue on GitHub: . +Alternatively, send an email to with subject line +“[web-animations] … message topic …” +([archives](http://lists.w3.org/Archives/Public/public-fx/)). + +Polyfill Issues +--------------- + +Report any issues with this implementation on GitHub: +. + +Breaking changes +---------------- + +When we make a potentially breaking change to the polyfill's API +surface (like a rename) we will, where possible, continue supporting the +old version, deprecated, for three months, and ensure that there are +console warnings to indicate that a change is pending. After three +months, the old version of the API surface (e.g. the old version of a +function name) will be removed. *If you see deprecation warnings you +can't avoid it by not updating*. + +We also announce anything that isn't a bug fix on +[web-animations-changes@googlegroups.com](https://groups.google.com/forum/#!forum/web-animations-changes). diff --git a/react-app/bower_components/web-animations-js/bower.json b/react-app/bower_components/web-animations-js/bower.json new file mode 100644 index 0000000000..22f26b5e5c --- /dev/null +++ b/react-app/bower_components/web-animations-js/bower.json @@ -0,0 +1,31 @@ +{ + "name": "web-animations-js", + "description": "JavaScript implementation of the Web Animations API", + "homepage": "https://github.com/web-animations/web-animations-js", + "main": "web-animations.min.js", + "moduleType": [ + "globals" + ], + "keywords": [ + "animations", + "polyfill" + ], + "license": "Apache-2.0", + "ignore": [ + "**/.*", + "node_modules", + "templates", + "test", + "src", + "Gruntfile.js", + "package.json", + "target-config.js", + "target-loader.js", + "web-animations.dev.html", + "web-animations.dev.js", + "web-animations-next.dev.html", + "web-animations-next.dev.js", + "web-animations-next-lite.dev.html", + "web-animations-next-lite.dev.js" + ] +} diff --git a/react-app/bower_components/web-animations-js/web-animations-next-lite.min.js b/react-app/bower_components/web-animations-js/web-animations-next-lite.min.js new file mode 100644 index 0000000000..6299969864 --- /dev/null +++ b/react-app/bower_components/web-animations-js/web-animations-next-lite.min.js @@ -0,0 +1,17 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +!function(a,b){b["true"]=a;var c={},d={},e={},f=null;!function(a){function b(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function c(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear"}function d(b,d){var e=new c;return d&&(e.fill="both",e.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof e[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==s.indexOf(b[c]))return;if("direction"==c&&-1==t.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;e[c]=b[c]}}):e.duration=b,e}function e(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function f(b,c){b=a.numericTimingToObject(b);var e=d(b,c);return e._easing=i(e.easing),e}function g(a,b,c,d){return 0>a||a>1||0>c||c>1?B:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(0==e||1==e)return e;for(var g=0,h=1;;){var i=(g+h)/2,j=f(a,c,i);if(Math.abs(e-j)<.001)return f(b,d,i);e>j?g=i:h=i}}}function h(a,b){return function(c){if(c>=1)return 1;var d=1/a;return c+=b*d,c-c%d}}function i(a){var b=z.exec(a);if(b)return g.apply(this,b.slice(1).map(Number));var c=A.exec(a);if(c)return h(Number(c[1]),{start:u,middle:v,end:w}[c[2]]);var d=x[a];return d?d:B}function j(a){return Math.abs(k(a)/a.playbackRate)}function k(a){return a.duration*a.iterations}function l(a,b,c){return null==b?C:b=c.delay+a?E:F}function m(a,b,c,d,e){switch(d){case D:return"backwards"==b||"both"==b?0:null;case F:return c-e;case E:return"forwards"==b||"both"==b?a:null;case C:return null}}function n(a,b,c,d){return(d.playbackRate<0?b-a:b)*d.playbackRate+c}function o(a,b,c,d,e){return 1/0===c||c===-1/0||c-d==b&&e.iterations&&(e.iterations+e.iterationStart)%1==0?a:c%a}function p(a,b,c,d){return 0===c?0:b==a?d.iterationStart+d.iterations-1:Math.floor(c/a)}function q(a,b,c,d){var e=a%2>=1,f="normal"==d.direction||d.direction==(e?"alternate-reverse":"alternate"),g=f?c:b-c,h=g/b;return b*d.easing(h)}function r(a,b,c){var d=l(a,b,c),e=m(a,c.fill,b,d,c.delay);if(null===e)return null;if(0===a)return d===D?0:1;var f=c.iterationStart*c.duration,g=n(a,e,f,c),h=o(c.duration,k(c),g,f,c),i=p(c.duration,h,g,c);return q(i,c.duration,h,c)/c.duration}var s="backwards|forwards|both|none".split("|"),t="reverse|alternate|alternate-reverse".split("|");c.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(a.normalizeTimingInput(this._effect._timingInput)),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){this._setMember("iterations",a)},get iterations(){return this._iterations}};var u=1,v=.5,w=0,x={ease:g(.25,.1,.25,1),"ease-in":g(.42,0,1,1),"ease-out":g(0,0,.58,1),"ease-in-out":g(.42,0,.58,1),"step-start":h(1,u),"step-middle":h(1,v),"step-end":h(1,w)},y="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",z=new RegExp("cubic-bezier\\("+y+","+y+","+y+","+y+"\\)"),A=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,B=function(a){return a},C=0,D=1,E=2,F=3;a.cloneTimingInput=b,a.makeTiming=d,a.numericTimingToObject=e,a.normalizeTimingInput=f,a.calculateActiveDuration=j,a.calculateTimeFraction=r,a.calculatePhase=l,a.toTimingFunction=i}(c,f),function(a){function b(a,b){return a in h?h[a][b]||b:b}function c(a,c,d){var g=e[a];if(g){f.style[a]=c;for(var h in g){var i=g[h],j=f.style[i];d[i]=b(i,j)}}else d[a]=b(a,c)}function d(b){function d(){var a=e.length;null==e[a-1].offset&&(e[a-1].offset=1),a>1&&null==e[0].offset&&(e[0].offset=0);for(var b=0,c=e[0].offset,d=1;a>d;d++){var f=e[d].offset;if(null!=f){for(var g=1;d-b>g;g++)e[b+g].offset=c+(f-c)*g/(d-b);b=d,c=f}}}if(!Array.isArray(b)&&null!==b)throw new TypeError("Keyframes must be null or an array of keyframes");if(null==b)return[];for(var e=b.map(function(b){var d={};for(var e in b){var f=b[e];if("offset"==e){if(null!=f&&(f=Number(f),!isFinite(f)))throw new TypeError("keyframe offsets must be numbers.")}else{if("composite"==e)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};f="easing"==e?a.toTimingFunction(f):""+f}c(e,f,d)}return void 0==d.offset&&(d.offset=null),void 0==d.easing&&(d.easing=a.toTimingFunction("linear")),d}),f=!0,g=-1/0,h=0;hi)throw{code:DOMException.INVALID_MODIFICATION_ERR,name:"InvalidModificationError",message:"Keyframes are not loosely sorted by offset. Sort or specify offsets."};g=i}else f=!1}return e=e.filter(function(a){return a.offset>=0&&a.offset<=1}),f||d(),e}var e={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},f=document.createElementNS("http://www.w3.org/1999/xhtml","div"),g={thin:"1px",medium:"3px",thick:"5px"},h={borderBottomWidth:g,borderLeftWidth:g,borderRightWidth:g,borderTopWidth:g,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:g,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.normalizeKeyframes=d}(c,f),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),h>g?(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,!1):!0},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b){function c(a){for(var b={},c=0;c=c&&0==a.startTime||c>=1&&1==a.endTime||c>=a.startTime&&c<=a.endTime}).forEach(function(d){var e=c-d.startTime,f=d.endTime-d.startTime,g=0==f?0:d.easing(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d,f),function(a){function b(a,b,c){e[c]=e[c]||[],e[c].push([a,b])}function c(a,c,d){for(var e=0;ed?a:c;if(a.length==c.length){for(var e=[],f=0;f0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._tickCurrentTime(a,!0),b.invalidateEffects()))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.invalidateEffects())},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var b=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&this.play(),null!=b&&(this.currentTime=b)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._currentTime=this._playbackRate>0?0:this._totalDuration,this._startTime=null,b.invalidateEffects()),this._finishedFlag=!1,b.restart(),this._idle=!1,this._ensureAlive()},pause:function(){this._isFinished||this._paused||this._idle||(this._currentTimePending=!0),this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1)},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this.currentTime=0,this._startTime=null,this._effect._update(null),b.invalidateEffects(),b.restart())},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){var b=this._isFinished;if((b||this._idle)&&!this._finishedFlag){var d=new c(this,this._currentTime,a),e=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){e.forEach(function(a){a.call(d.target,d)})},0)}this._finishedFlag=b},_tick:function(a){return this._idle||this._paused||(null==this._startTime?this.startTime=a-this._currentTime/this.playbackRate:this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),this._currentTimePending=!1,this._fireEvents(a),!this._idle&&(this._inEffect||!this._finishedFlag)}}}(c,d,f),function(a,b){function c(a){var b=i;i=[],a0&&(s.currentTime+=q*(Math.floor((a-s.currentTime)/q)+1)),g(s.currentTime)}return f(),r.apply(this,arguments)}});var s=new e;b.timeline=s}(c,d,f),function(a){function b(a,b){var c=a.exec(b);return c?(c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]):void 0}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);return c?[c[0],c[1].replace(/^\s*/,"")]:void 0}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],g=b(d,e),!g||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d=c))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){var d=a(c);return d?d:[b,c]}}function i(b,c){for(var d=[],e=0;ek;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h=c?a:c>=1?b:"visible"}]:void 0}a.addPropertiesHandler(String,b,["visibility"])}(d),function(a){function b(a){a=a.trim(),e.fillStyle="#000",e.fillStyle=a;var b=e.fillStyle;if(e.fillStyle="#fff",e.fillStyle=a,b==e.fillStyle){e.fillRect(0,0,1,1);var c=e.getImageData(0,0,1,1).data;e.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function c(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;3>d;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=d.height=1;var e=d.getContext("2d");a.addPropertiesHandler(b,c,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","outline-color","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,b),a.mergeColors=c}(d,f),function(a,b){function c(a,b){if(b=b.trim().toLowerCase(),"0"==b&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var c={};b=b.replace(a,function(a){return c[a]=null,"U"+a});for(var d="U("+a.source+")",e=b.replace(/[-+]?(\d*\.)?\d+/g,"N").replace(new RegExp("N"+d,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),f=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],g=0;g1?"calc("+c+")":c}]}var f="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",g=c.bind(null,new RegExp(f,"g")),h=c.bind(null,new RegExp(f+"|%","g")),i=c.bind(null,/deg|rad|grad|turn/g);a.parseLength=g,a.parseLengthOrPercent=h,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,h),a.parseAngle=i,a.mergeDimensions=e;var j=a.consumeParenthesised.bind(null,g),k=a.consumeRepeated.bind(void 0,j,/^/),l=a.consumeRepeated.bind(void 0,k,/^,/);a.consumeSizePairList=l;var m=function(a){var b=l(a);return b&&""==b[1]?b[0]:void 0},n=a.mergeNestedRepeated.bind(void 0,d," "),o=a.mergeNestedRepeated.bind(void 0,n,",");a.mergeNonNegativeSizePair=n,a.addPropertiesHandler(m,o,["background-size"]),a.addPropertiesHandler(h,d,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(h,e,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","text-indent","top","vertical-align","word-spacing"])}(d,f),function(a){function b(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function c(c){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,b,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],c);return d&&4==d[0].length?d[0]:void 0}function d(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function e(a){return"rect("+a+")"}var f=a.mergeWrappedNestedRepeated.bind(null,e,d,", ");a.parseBox=c,a.mergeBoxes=f,a.addPropertiesHandler(c,f,["clip"])}(d,f),function(a){function b(a){return function(b){var c=0;return a.map(function(a){return a===j?b[c++]:a})}}function c(a){return a}function d(b){if(b=b.toLowerCase().trim(),"none"==b)return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=m[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.lengtha||a>1||0>c||c>1?B:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(0==e||1==e)return e;for(var g=0,h=1;;){var i=(g+h)/2,j=f(a,c,i);if(Math.abs(e-j)<.001)return f(b,d,i);e>j?g=i:h=i}}}function h(a,b){return function(c){if(c>=1)return 1;var d=1/a;return c+=b*d,c-c%d}}function i(a){var b=z.exec(a);if(b)return g.apply(this,b.slice(1).map(Number));var c=A.exec(a);if(c)return h(Number(c[1]),{start:u,middle:v,end:w}[c[2]]);var d=x[a];return d?d:B}function j(a){return Math.abs(k(a)/a.playbackRate)}function k(a){return a.duration*a.iterations}function l(a,b,c){return null==b?C:b=c.delay+a?E:F}function m(a,b,c,d,e){switch(d){case D:return"backwards"==b||"both"==b?0:null;case F:return c-e;case E:return"forwards"==b||"both"==b?a:null;case C:return null}}function n(a,b,c,d){return(d.playbackRate<0?b-a:b)*d.playbackRate+c}function o(a,b,c,d,e){return 1/0===c||c===-1/0||c-d==b&&e.iterations&&(e.iterations+e.iterationStart)%1==0?a:c%a}function p(a,b,c,d){return 0===c?0:b==a?d.iterationStart+d.iterations-1:Math.floor(c/a)}function q(a,b,c,d){var e=a%2>=1,f="normal"==d.direction||d.direction==(e?"alternate-reverse":"alternate"),g=f?c:b-c,h=g/b;return b*d.easing(h)}function r(a,b,c){var d=l(a,b,c),e=m(a,c.fill,b,d,c.delay);if(null===e)return null;if(0===a)return d===D?0:1;var f=c.iterationStart*c.duration,g=n(a,e,f,c),h=o(c.duration,k(c),g,f,c),i=p(c.duration,h,g,c);return q(i,c.duration,h,c)/c.duration}var s="backwards|forwards|both|none".split("|"),t="reverse|alternate|alternate-reverse".split("|");c.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(a.normalizeTimingInput(this._effect._timingInput)),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){this._setMember("iterations",a)},get iterations(){return this._iterations}};var u=1,v=.5,w=0,x={ease:g(.25,.1,.25,1),"ease-in":g(.42,0,1,1),"ease-out":g(0,0,.58,1),"ease-in-out":g(.42,0,.58,1),"step-start":h(1,u),"step-middle":h(1,v),"step-end":h(1,w)},y="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",z=new RegExp("cubic-bezier\\("+y+","+y+","+y+","+y+"\\)"),A=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,B=function(a){return a},C=0,D=1,E=2,F=3;a.cloneTimingInput=b,a.makeTiming=d,a.numericTimingToObject=e,a.normalizeTimingInput=f,a.calculateActiveDuration=j,a.calculateTimeFraction=r,a.calculatePhase=l,a.toTimingFunction=i}(c,f),function(a){function b(a,b){return a in h?h[a][b]||b:b}function c(a,c,d){var g=e[a];if(g){f.style[a]=c;for(var h in g){var i=g[h],j=f.style[i];d[i]=b(i,j)}}else d[a]=b(a,c)}function d(b){function d(){var a=e.length;null==e[a-1].offset&&(e[a-1].offset=1),a>1&&null==e[0].offset&&(e[0].offset=0);for(var b=0,c=e[0].offset,d=1;a>d;d++){var f=e[d].offset;if(null!=f){for(var g=1;d-b>g;g++)e[b+g].offset=c+(f-c)*g/(d-b);b=d,c=f}}}if(!Array.isArray(b)&&null!==b)throw new TypeError("Keyframes must be null or an array of keyframes");if(null==b)return[];for(var e=b.map(function(b){var d={};for(var e in b){var f=b[e];if("offset"==e){if(null!=f&&(f=Number(f),!isFinite(f)))throw new TypeError("keyframe offsets must be numbers.")}else{if("composite"==e)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};f="easing"==e?a.toTimingFunction(f):""+f}c(e,f,d)}return void 0==d.offset&&(d.offset=null),void 0==d.easing&&(d.easing=a.toTimingFunction("linear")),d}),f=!0,g=-1/0,h=0;hi)throw{code:DOMException.INVALID_MODIFICATION_ERR,name:"InvalidModificationError",message:"Keyframes are not loosely sorted by offset. Sort or specify offsets."};g=i}else f=!1}return e=e.filter(function(a){return a.offset>=0&&a.offset<=1}),f||d(),e}var e={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},f=document.createElementNS("http://www.w3.org/1999/xhtml","div"),g={thin:"1px",medium:"3px",thick:"5px"},h={borderBottomWidth:g,borderLeftWidth:g,borderRightWidth:g,borderTopWidth:g,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:g,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.normalizeKeyframes=d}(c,f),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),h>g?(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,!1):!0},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b){function c(a){for(var b={},c=0;c=c&&0==a.startTime||c>=1&&1==a.endTime||c>=a.startTime&&c<=a.endTime}).forEach(function(d){var e=c-d.startTime,f=d.endTime-d.startTime,g=0==f?0:d.easing(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d,f),function(a){function b(a,b,c){e[c]=e[c]||[],e[c].push([a,b])}function c(a,c,d){for(var e=0;ethis._surrogateStyle.length;)this._length--,Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,value:void 0})},_set:function(a,b){this._style[a]=b,this._isAnimatedProperty[a]=!0},_clear:function(a){this._style[a]=this._surrogateStyle[a],delete this._isAnimatedProperty[a]}};for(var h in f)c.prototype[h]=function(a,b){return function(){var c=this._surrogateStyle[a].apply(this._surrogateStyle,arguments);return b&&(this._isAnimatedProperty[arguments[0]]||this._style[a].apply(this._style,arguments),this._updateIndices()),c}}(h,h in g);for(var i in document.documentElement.style)i in e||i in f||!function(a){b(c.prototype,a,{get:function(){return this._surrogateStyle[a]},set:function(b){this._surrogateStyle[a]=b,this._updateIndices(),this._isAnimatedProperty[a]||(this._style[a]=b)}})}(i);a.apply=function(b,c,e){d(b),b.style._set(a.propertyName(c),e)},a.clear=function(b,c){b._webAnimationsPatchedStyle&&b.style._clear(a.propertyName(c))}}(d,f),function(a){window.Element.prototype.animate=function(b,c){return a.timeline._play(a.KeyframeEffect(this,b,c))}}(d),function(a){function b(a,c,d){if("number"==typeof a&&"number"==typeof c)return a*(1-d)+c*d;if("boolean"==typeof a&&"boolean"==typeof c)return.5>d?a:c;if(a.length==c.length){for(var e=[],f=0;fj;j++)g.push(c[j]*(Math.cos(e*h)-f*i)+d[j]*i);return g}var d=function(){function a(a,b){for(var c=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],d=0;4>d;d++)for(var e=0;4>e;e++)for(var f=0;4>f;f++)c[d][e]+=b[d][f]*a[f][e];return c}function b(a){return 0==a[0][2]&&0==a[0][3]&&0==a[1][2]&&0==a[1][3]&&0==a[2][0]&&0==a[2][1]&&1==a[2][2]&&0==a[2][3]&&0==a[3][2]&&1==a[3][3]}function c(c,d,e,f,g){for(var h=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],i=0;4>i;i++)h[i][3]=g[i];for(var i=0;3>i;i++)for(var j=0;3>j;j++)h[3][i]+=c[j]*h[j][i];var k=f[0],l=f[1],m=f[2],n=f[3],o=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];o[0][0]=1-2*(l*l+m*m),o[0][1]=2*(k*l-m*n),o[0][2]=2*(k*m+l*n),o[1][0]=2*(k*l+m*n),o[1][1]=1-2*(k*k+m*m),o[1][2]=2*(l*m-k*n),o[2][0]=2*(k*m-l*n),o[2][1]=2*(l*m+k*n),o[2][2]=1-2*(k*k+l*l),h=a(h,o);var p=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];e[2]&&(p[2][1]=e[2],h=a(h,p)),e[1]&&(p[2][1]=0,p[2][0]=e[0],h=a(h,p)),e[0]&&(p[2][0]=0,p[1][0]=e[0],h=a(h,p));for(var i=0;3>i;i++)for(var j=0;3>j;j++)h[i][j]*=d[i];return b(h)?[h[0][0],h[0][1],h[1][0],h[1][1],h[3][0],h[3][1]]:h[0].concat(h[1],h[2],h[3])}return c}();a.composeMatrix=d,a.quat=c}(d,f),function(a,b){a.sequenceNumber=0;var c=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!1,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this._inEffect=this._effect._update(this.playbackRate<0&&0===this.currentTime?-1:this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._tickCurrentTime(a,!0),b.invalidateEffects()))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.invalidateEffects())},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var b=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&this.play(),null!=b&&(this.currentTime=b)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._currentTime=this._playbackRate>0?0:this._totalDuration,this._startTime=null,b.invalidateEffects()),this._finishedFlag=!1,b.restart(),this._idle=!1,this._ensureAlive()},pause:function(){this._isFinished||this._paused||this._idle||(this._currentTimePending=!0),this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1)},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this.currentTime=0,this._startTime=null,this._effect._update(null),b.invalidateEffects(),b.restart())},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){var b=this._isFinished;if((b||this._idle)&&!this._finishedFlag){var d=new c(this,this._currentTime,a),e=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){e.forEach(function(a){a.call(d.target,d)})},0)}this._finishedFlag=b},_tick:function(a){return this._idle||this._paused||(null==this._startTime?this.startTime=a-this._currentTime/this.playbackRate:this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),this._currentTimePending=!1,this._fireEvents(a),!this._idle&&(this._inEffect||!this._finishedFlag)}}}(c,d,f),function(a,b){function c(a){var b=i;i=[],a0&&(s.currentTime+=q*(Math.floor((a-s.currentTime)/q)+1)),g(s.currentTime)}return f(),r.apply(this,arguments)}});var s=new e;b.timeline=s}(c,d,f),function(a){function b(a,b){for(var c=0,d=0;do;o++){for(var p=0,q=0;3>q;q++)p+=b[3][q]*m[q][o];n.push(p)}return n.push(1),m.push(n),m}function d(a){return[[a[0][0],a[1][0],a[2][0],a[3][0]],[a[0][1],a[1][1],a[2][1],a[3][1]],[a[0][2],a[1][2],a[2][2],a[3][2]],[a[0][3],a[1][3],a[2][3],a[3][3]]]}function e(a,b){for(var c=[],d=0;4>d;d++){for(var e=0,f=0;4>f;f++)e+=a[f]*b[f][d];c.push(e)}return c}function f(a){var b=g(a);return[a[0]/b,a[1]/b,a[2]/b]}function g(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function h(a,b,c,d){return[c*a[0]+d*b[0],c*a[1]+d*b[1],c*a[2]+d*b[2]]}function i(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function j(j){var k=[j.slice(0,4),j.slice(4,8),j.slice(8,12),j.slice(12,16)];if(1!==k[3][3])return null;for(var l=[],m=0;4>m;m++)l.push(k[m].slice());for(var m=0;3>m;m++)l[m][3]=0;if(0===a(l))return!1;var n,o=[];if(k[0][3]||k[1][3]||k[2][3]){o.push(k[0][3]),o.push(k[1][3]),o.push(k[2][3]),o.push(k[3][3]);var p=c(l),q=d(p);n=e(o,q)}else n=[0,0,0,1];var r=k[3].slice(0,3),s=[];s.push(k[0].slice(0,3));var t=[];t.push(g(s[0])),s[0]=f(s[0]);var u=[];s.push(k[1].slice(0,3)),u.push(b(s[0],s[1])),s[1]=h(s[1],s[0],1,-u[0]),t.push(g(s[1])),s[1]=f(s[1]),u[0]/=t[1],s.push(k[2].slice(0,3)),u.push(b(s[0],s[2])),s[2]=h(s[2],s[0],1,-u[1]),u.push(b(s[1],s[2])),s[2]=h(s[2],s[1],1,-u[2]),t.push(g(s[2])),s[2]=f(s[2]),u[1]/=t[2],u[2]/=t[2];var v=i(s[1],s[2]);if(b(s[0],v)<0)for(var m=0;3>m;m++)t[m]*=-1,s[m][0]*=-1,s[m][1]*=-1,s[m][2]*=-1;var w,x,y=s[0][0]+s[1][1]+s[2][2]+1;return y>1e-4?(w=.5/Math.sqrt(y),x=[(s[2][1]-s[1][2])*w,(s[0][2]-s[2][0])*w,(s[1][0]-s[0][1])*w,.25/w]):s[0][0]>s[1][1]&&s[0][0]>s[2][2]?(w=2*Math.sqrt(1+s[0][0]-s[1][1]-s[2][2]),x=[.25*w,(s[0][1]+s[1][0])/w,(s[0][2]+s[2][0])/w,(s[2][1]-s[1][2])/w]):s[1][1]>s[2][2]?(w=2*Math.sqrt(1+s[1][1]-s[0][0]-s[2][2]),x=[(s[0][1]+s[1][0])/w,.25*w,(s[1][2]+s[2][1])/w,(s[0][2]-s[2][0])/w]):(w=2*Math.sqrt(1+s[2][2]-s[0][0]-s[1][1]),x=[(s[0][2]+s[2][0])/w,(s[1][2]+s[2][1])/w,.25*w,(s[1][0]-s[0][1])/w]),[r,t,u,x,n]}return j}();a.dot=b,a.makeMatrixDecomposition=f}(d,f),function(a){function b(a,b){var c=a.exec(b);return c?(c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]):void 0}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);return c?[c[0],c[1].replace(/^\s*/,"")]:void 0}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],g=b(d,e),!g||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d=c))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){var d=a(c);return d?d:[b,c]}}function i(b,c){for(var d=[],e=0;ek;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h=c?a:c>=1?b:"visible"}]:void 0}a.addPropertiesHandler(String,b,["visibility"])}(d),function(a){function b(a){a=a.trim(),e.fillStyle="#000",e.fillStyle=a;var b=e.fillStyle;if(e.fillStyle="#fff",e.fillStyle=a,b==e.fillStyle){e.fillRect(0,0,1,1);var c=e.getImageData(0,0,1,1).data;e.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function c(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;3>d;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=d.height=1;var e=d.getContext("2d");a.addPropertiesHandler(b,c,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","outline-color","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,b),a.mergeColors=c +}(d,f),function(a,b){function c(a,b){if(b=b.trim().toLowerCase(),"0"==b&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var c={};b=b.replace(a,function(a){return c[a]=null,"U"+a});for(var d="U("+a.source+")",e=b.replace(/[-+]?(\d*\.)?\d+/g,"N").replace(new RegExp("N"+d,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),f=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],g=0;g1?"calc("+c+")":c}]}var f="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",g=c.bind(null,new RegExp(f,"g")),h=c.bind(null,new RegExp(f+"|%","g")),i=c.bind(null,/deg|rad|grad|turn/g);a.parseLength=g,a.parseLengthOrPercent=h,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,h),a.parseAngle=i,a.mergeDimensions=e;var j=a.consumeParenthesised.bind(null,g),k=a.consumeRepeated.bind(void 0,j,/^/),l=a.consumeRepeated.bind(void 0,k,/^,/);a.consumeSizePairList=l;var m=function(a){var b=l(a);return b&&""==b[1]?b[0]:void 0},n=a.mergeNestedRepeated.bind(void 0,d," "),o=a.mergeNestedRepeated.bind(void 0,n,",");a.mergeNonNegativeSizePair=n,a.addPropertiesHandler(m,o,["background-size"]),a.addPropertiesHandler(h,d,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(h,e,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","text-indent","top","vertical-align","word-spacing"])}(d,f),function(a){function b(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function c(c){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,b,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],c);return d&&4==d[0].length?d[0]:void 0}function d(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function e(a){return"rect("+a+")"}var f=a.mergeWrappedNestedRepeated.bind(null,e,d,", ");a.parseBox=c,a.mergeBoxes=f,a.addPropertiesHandler(c,f,["clip"])}(d,f),function(a){function b(a){return function(b){var c=0;return a.map(function(a){return a===j?b[c++]:a})}}function c(a){return a}function d(b){if(b=b.toLowerCase().trim(),"none"==b)return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=m[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.lengthb||b>900||b%100!==0?void 0:b}function c(b){return b=100*Math.round(b/100),b=a.clamp(100,900,b),400===b?"normal":700===b?"bold":String(b)}function d(a,b){return[a,b,c]}a.addPropertiesHandler(b,d,["font-weight"])}(d),function(a){function b(a){var b={};for(var c in a)b[c]=-a[c];return b}function c(b){return a.consumeToken(/^(left|center|right|top|bottom)\b/i,b)||a.consumeLengthOrPercent(b)}function d(b,d){var e=a.consumeRepeated(c,/^/,d);if(e&&""==e[1]){var f=e[0];if(f[0]=f[0]||"center",f[1]=f[1]||"center",3==b&&(f[2]=f[2]||{px:0}),f.length==b){if(/top|bottom/.test(f[0])||/left|right/.test(f[1])){var h=f[0];f[0]=f[1],f[1]=h}if(/left|right|center|Object/.test(f[0])&&/top|bottom|center|Object/.test(f[1]))return f.map(function(a){return"object"==typeof a?a:g[a]})}}}function e(d){var e=a.consumeRepeated(c,/^/,d);if(e){for(var f=e[0],h=[{"%":50},{"%":50}],i=0,j=!1,k=0;k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/bower_components/web-animations-js/web-animations.min.js b/react-app/bower_components/web-animations-js/web-animations.min.js new file mode 100644 index 0000000000..07a5b180ec --- /dev/null +++ b/react-app/bower_components/web-animations-js/web-animations.min.js @@ -0,0 +1,17 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +!function(a,b){b["true"]=a,function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}var c={},d={},e={},f=null;!function(a){function b(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function c(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear"}function d(b,d){var e=new c;return d&&(e.fill="both",e.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof e[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==s.indexOf(b[c]))return;if("direction"==c&&-1==t.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;e[c]=b[c]}}):e.duration=b,e}function e(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function f(b,c){b=a.numericTimingToObject(b);var e=d(b,c);return e._easing=i(e.easing),e}function g(a,b,c,d){return 0>a||a>1||0>c||c>1?B:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(0==e||1==e)return e;for(var g=0,h=1;;){var i=(g+h)/2,j=f(a,c,i);if(Math.abs(e-j)<.001)return f(b,d,i);e>j?g=i:h=i}}}function h(a,b){return function(c){if(c>=1)return 1;var d=1/a;return c+=b*d,c-c%d}}function i(a){var b=z.exec(a);if(b)return g.apply(this,b.slice(1).map(Number));var c=A.exec(a);if(c)return h(Number(c[1]),{start:u,middle:v,end:w}[c[2]]);var d=x[a];return d?d:B}function j(a){return Math.abs(k(a)/a.playbackRate)}function k(a){return a.duration*a.iterations}function l(a,b,c){return null==b?C:b=c.delay+a?E:F}function m(a,b,c,d,e){switch(d){case D:return"backwards"==b||"both"==b?0:null;case F:return c-e;case E:return"forwards"==b||"both"==b?a:null;case C:return null}}function n(a,b,c,d){return(d.playbackRate<0?b-a:b)*d.playbackRate+c}function o(a,b,c,d,e){return 1/0===c||c===-1/0||c-d==b&&e.iterations&&(e.iterations+e.iterationStart)%1==0?a:c%a}function p(a,b,c,d){return 0===c?0:b==a?d.iterationStart+d.iterations-1:Math.floor(c/a)}function q(a,b,c,d){var e=a%2>=1,f="normal"==d.direction||d.direction==(e?"alternate-reverse":"alternate"),g=f?c:b-c,h=g/b;return b*d.easing(h)}function r(a,b,c){var d=l(a,b,c),e=m(a,c.fill,b,d,c.delay);if(null===e)return null;if(0===a)return d===D?0:1;var f=c.iterationStart*c.duration,g=n(a,e,f,c),h=o(c.duration,k(c),g,f,c),i=p(c.duration,h,g,c);return q(i,c.duration,h,c)/c.duration}var s="backwards|forwards|both|none".split("|"),t="reverse|alternate|alternate-reverse".split("|");c.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(a.normalizeTimingInput(this._effect._timingInput)),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){this._setMember("iterations",a)},get iterations(){return this._iterations}};var u=1,v=.5,w=0,x={ease:g(.25,.1,.25,1),"ease-in":g(.42,0,1,1),"ease-out":g(0,0,.58,1),"ease-in-out":g(.42,0,.58,1),"step-start":h(1,u),"step-middle":h(1,v),"step-end":h(1,w)},y="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",z=new RegExp("cubic-bezier\\("+y+","+y+","+y+","+y+"\\)"),A=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,B=function(a){return a},C=0,D=1,E=2,F=3;a.cloneTimingInput=b,a.makeTiming=d,a.numericTimingToObject=e,a.normalizeTimingInput=f,a.calculateActiveDuration=j,a.calculateTimeFraction=r,a.calculatePhase=l,a.toTimingFunction=i}(c,f),function(a){function b(a,b){return a in h?h[a][b]||b:b}function c(a,c,d){var g=e[a];if(g){f.style[a]=c;for(var h in g){var i=g[h],j=f.style[i];d[i]=b(i,j)}}else d[a]=b(a,c)}function d(b){function d(){var a=e.length;null==e[a-1].offset&&(e[a-1].offset=1),a>1&&null==e[0].offset&&(e[0].offset=0);for(var b=0,c=e[0].offset,d=1;a>d;d++){var f=e[d].offset;if(null!=f){for(var g=1;d-b>g;g++)e[b+g].offset=c+(f-c)*g/(d-b);b=d,c=f}}}if(!Array.isArray(b)&&null!==b)throw new TypeError("Keyframes must be null or an array of keyframes");if(null==b)return[];for(var e=b.map(function(b){var d={};for(var e in b){var f=b[e];if("offset"==e){if(null!=f&&(f=Number(f),!isFinite(f)))throw new TypeError("keyframe offsets must be numbers.")}else{if("composite"==e)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};f="easing"==e?a.toTimingFunction(f):""+f}c(e,f,d)}return void 0==d.offset&&(d.offset=null),void 0==d.easing&&(d.easing=a.toTimingFunction("linear")),d}),f=!0,g=-1/0,h=0;hi)throw{code:DOMException.INVALID_MODIFICATION_ERR,name:"InvalidModificationError",message:"Keyframes are not loosely sorted by offset. Sort or specify offsets."};g=i}else f=!1}return e=e.filter(function(a){return a.offset>=0&&a.offset<=1}),f||d(),e}var e={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},f=document.createElementNS("http://www.w3.org/1999/xhtml","div"),g={thin:"1px",medium:"3px",thick:"5px"},h={borderBottomWidth:g,borderLeftWidth:g,borderRightWidth:g,borderTopWidth:g,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:g,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.normalizeKeyframes=d}(c,f),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),h>g?(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,!1):!0},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(a,b){function c(a){for(var b={},c=0;c=c&&0==a.startTime||c>=1&&1==a.endTime||c>=a.startTime&&c<=a.endTime}).forEach(function(d){var e=c-d.startTime,f=d.endTime-d.startTime,g=0==f?0:d.easing(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d,f),function(a){function b(a,b,c){e[c]=e[c]||[],e[c].push([a,b])}function c(a,c,d){for(var e=0;ethis._surrogateStyle.length;)this._length--,Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,value:void 0})},_set:function(a,b){this._style[a]=b,this._isAnimatedProperty[a]=!0},_clear:function(a){this._style[a]=this._surrogateStyle[a],delete this._isAnimatedProperty[a]}};for(var h in f)c.prototype[h]=function(a,b){return function(){var c=this._surrogateStyle[a].apply(this._surrogateStyle,arguments);return b&&(this._isAnimatedProperty[arguments[0]]||this._style[a].apply(this._style,arguments),this._updateIndices()),c}}(h,h in g);for(var i in document.documentElement.style)i in e||i in f||!function(a){b(c.prototype,a,{get:function(){return this._surrogateStyle[a]},set:function(b){this._surrogateStyle[a]=b,this._updateIndices(),this._isAnimatedProperty[a]||(this._style[a]=b)}})}(i);a.apply=function(b,c,e){d(b),b.style._set(a.propertyName(c),e)},a.clear=function(b,c){b._webAnimationsPatchedStyle&&b.style._clear(a.propertyName(c))}}(d,f),function(a){window.Element.prototype.animate=function(b,c){return a.timeline._play(a.KeyframeEffect(this,b,c))}}(d),function(a){function b(a,c,d){if("number"==typeof a&&"number"==typeof c)return a*(1-d)+c*d;if("boolean"==typeof a&&"boolean"==typeof c)return.5>d?a:c;if(a.length==c.length){for(var e=[],f=0;fj;j++)g.push(c[j]*(Math.cos(e*h)-f*i)+d[j]*i);return g}var d=function(){function a(a,b){for(var c=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],d=0;4>d;d++)for(var e=0;4>e;e++)for(var f=0;4>f;f++)c[d][e]+=b[d][f]*a[f][e];return c}function b(a){return 0==a[0][2]&&0==a[0][3]&&0==a[1][2]&&0==a[1][3]&&0==a[2][0]&&0==a[2][1]&&1==a[2][2]&&0==a[2][3]&&0==a[3][2]&&1==a[3][3]}function c(c,d,e,f,g){for(var h=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],i=0;4>i;i++)h[i][3]=g[i];for(var i=0;3>i;i++)for(var j=0;3>j;j++)h[3][i]+=c[j]*h[j][i];var k=f[0],l=f[1],m=f[2],n=f[3],o=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];o[0][0]=1-2*(l*l+m*m),o[0][1]=2*(k*l-m*n),o[0][2]=2*(k*m+l*n),o[1][0]=2*(k*l+m*n),o[1][1]=1-2*(k*k+m*m),o[1][2]=2*(l*m-k*n),o[2][0]=2*(k*m-l*n),o[2][1]=2*(l*m+k*n),o[2][2]=1-2*(k*k+l*l),h=a(h,o);var p=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];e[2]&&(p[2][1]=e[2],h=a(h,p)),e[1]&&(p[2][1]=0,p[2][0]=e[0],h=a(h,p)),e[0]&&(p[2][0]=0,p[1][0]=e[0],h=a(h,p));for(var i=0;3>i;i++)for(var j=0;3>j;j++)h[i][j]*=d[i];return b(h)?[h[0][0],h[0][1],h[1][0],h[1][1],h[3][0],h[3][1]]:h[0].concat(h[1],h[2],h[3])}return c}();a.composeMatrix=d,a.quat=c}(d,f),function(a,b){a.sequenceNumber=0;var c=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!1,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this._inEffect=this._effect._update(this.playbackRate<0&&0===this.currentTime?-1:this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._tickCurrentTime(a,!0),b.invalidateEffects()))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.invalidateEffects())},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var b=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&this.play(),null!=b&&(this.currentTime=b)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._currentTime=this._playbackRate>0?0:this._totalDuration,this._startTime=null,b.invalidateEffects()),this._finishedFlag=!1,b.restart(),this._idle=!1,this._ensureAlive()},pause:function(){this._isFinished||this._paused||this._idle||(this._currentTimePending=!0),this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1)},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this.currentTime=0,this._startTime=null,this._effect._update(null),b.invalidateEffects(),b.restart())},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){var b=this._isFinished;if((b||this._idle)&&!this._finishedFlag){var d=new c(this,this._currentTime,a),e=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){e.forEach(function(a){a.call(d.target,d)})},0)}this._finishedFlag=b},_tick:function(a){return this._idle||this._paused||(null==this._startTime?this.startTime=a-this._currentTime/this.playbackRate:this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),this._currentTimePending=!1,this._fireEvents(a),!this._idle&&(this._inEffect||!this._finishedFlag)}}}(c,d,f),function(a,b){function c(a){var b=i;i=[],a0&&(s.currentTime+=q*(Math.floor((a-s.currentTime)/q)+1)),g(s.currentTime)}return f(),r.apply(this,arguments)}});var s=new e;b.timeline=s}(c,d,f),function(a){function b(a,b){for(var c=0,d=0;do;o++){for(var p=0,q=0;3>q;q++)p+=b[3][q]*m[q][o];n.push(p)}return n.push(1),m.push(n),m}function d(a){return[[a[0][0],a[1][0],a[2][0],a[3][0]],[a[0][1],a[1][1],a[2][1],a[3][1]],[a[0][2],a[1][2],a[2][2],a[3][2]],[a[0][3],a[1][3],a[2][3],a[3][3]]]}function e(a,b){for(var c=[],d=0;4>d;d++){for(var e=0,f=0;4>f;f++)e+=a[f]*b[f][d];c.push(e)}return c}function f(a){var b=g(a);return[a[0]/b,a[1]/b,a[2]/b]}function g(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function h(a,b,c,d){return[c*a[0]+d*b[0],c*a[1]+d*b[1],c*a[2]+d*b[2]]}function i(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function j(j){var k=[j.slice(0,4),j.slice(4,8),j.slice(8,12),j.slice(12,16)];if(1!==k[3][3])return null;for(var l=[],m=0;4>m;m++)l.push(k[m].slice());for(var m=0;3>m;m++)l[m][3]=0;if(0===a(l))return!1;var n,o=[];if(k[0][3]||k[1][3]||k[2][3]){o.push(k[0][3]),o.push(k[1][3]),o.push(k[2][3]),o.push(k[3][3]);var p=c(l),q=d(p);n=e(o,q)}else n=[0,0,0,1];var r=k[3].slice(0,3),s=[];s.push(k[0].slice(0,3));var t=[];t.push(g(s[0])),s[0]=f(s[0]);var u=[];s.push(k[1].slice(0,3)),u.push(b(s[0],s[1])),s[1]=h(s[1],s[0],1,-u[0]),t.push(g(s[1])),s[1]=f(s[1]),u[0]/=t[1],s.push(k[2].slice(0,3)),u.push(b(s[0],s[2])),s[2]=h(s[2],s[0],1,-u[1]),u.push(b(s[1],s[2])),s[2]=h(s[2],s[1],1,-u[2]),t.push(g(s[2])),s[2]=f(s[2]),u[1]/=t[2],u[2]/=t[2];var v=i(s[1],s[2]);if(b(s[0],v)<0)for(var m=0;3>m;m++)t[m]*=-1,s[m][0]*=-1,s[m][1]*=-1,s[m][2]*=-1;var w,x,y=s[0][0]+s[1][1]+s[2][2]+1;return y>1e-4?(w=.5/Math.sqrt(y),x=[(s[2][1]-s[1][2])*w,(s[0][2]-s[2][0])*w,(s[1][0]-s[0][1])*w,.25/w]):s[0][0]>s[1][1]&&s[0][0]>s[2][2]?(w=2*Math.sqrt(1+s[0][0]-s[1][1]-s[2][2]),x=[.25*w,(s[0][1]+s[1][0])/w,(s[0][2]+s[2][0])/w,(s[2][1]-s[1][2])/w]):s[1][1]>s[2][2]?(w=2*Math.sqrt(1+s[1][1]-s[0][0]-s[2][2]),x=[(s[0][1]+s[1][0])/w,.25*w,(s[1][2]+s[2][1])/w,(s[0][2]-s[2][0])/w]):(w=2*Math.sqrt(1+s[2][2]-s[0][0]-s[1][1]),x=[(s[0][2]+s[2][0])/w,(s[1][2]+s[2][1])/w,.25*w,(s[1][0]-s[0][1])/w]),[r,t,u,x,n]}return j}();a.dot=b,a.makeMatrixDecomposition=f}(d,f),function(a){function b(a,b){var c=a.exec(b);return c?(c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]):void 0}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);return c?[c[0],c[1].replace(/^\s*/,"")]:void 0}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],g=b(d,e),!g||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d=c))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){var d=a(c);return d?d:[b,c]}}function i(b,c){for(var d=[],e=0;ek;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h=c?a:c>=1?b:"visible"}]:void 0}a.addPropertiesHandler(String,b,["visibility"])}(d),function(a){function b(a){a=a.trim(),e.fillStyle="#000",e.fillStyle=a;var b=e.fillStyle;if(e.fillStyle="#fff",e.fillStyle=a,b==e.fillStyle){e.fillRect(0,0,1,1);var c=e.getImageData(0,0,1,1).data;e.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function c(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;3>d;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=d.height=1;var e=d.getContext("2d");a.addPropertiesHandler(b,c,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","outline-color","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,b),a.mergeColors=c +}(d,f),function(a,b){function c(a,b){if(b=b.trim().toLowerCase(),"0"==b&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var c={};b=b.replace(a,function(a){return c[a]=null,"U"+a});for(var d="U("+a.source+")",e=b.replace(/[-+]?(\d*\.)?\d+/g,"N").replace(new RegExp("N"+d,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),f=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],g=0;g1?"calc("+c+")":c}]}var f="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",g=c.bind(null,new RegExp(f,"g")),h=c.bind(null,new RegExp(f+"|%","g")),i=c.bind(null,/deg|rad|grad|turn/g);a.parseLength=g,a.parseLengthOrPercent=h,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,h),a.parseAngle=i,a.mergeDimensions=e;var j=a.consumeParenthesised.bind(null,g),k=a.consumeRepeated.bind(void 0,j,/^/),l=a.consumeRepeated.bind(void 0,k,/^,/);a.consumeSizePairList=l;var m=function(a){var b=l(a);return b&&""==b[1]?b[0]:void 0},n=a.mergeNestedRepeated.bind(void 0,d," "),o=a.mergeNestedRepeated.bind(void 0,n,",");a.mergeNonNegativeSizePair=n,a.addPropertiesHandler(m,o,["background-size"]),a.addPropertiesHandler(h,d,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(h,e,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","text-indent","top","vertical-align","word-spacing"])}(d,f),function(a){function b(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function c(c){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,b,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],c);return d&&4==d[0].length?d[0]:void 0}function d(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function e(a){return"rect("+a+")"}var f=a.mergeWrappedNestedRepeated.bind(null,e,d,", ");a.parseBox=c,a.mergeBoxes=f,a.addPropertiesHandler(c,f,["clip"])}(d,f),function(a){function b(a){return function(b){var c=0;return a.map(function(a){return a===j?b[c++]:a})}}function c(a){return a}function d(b){if(b=b.toLowerCase().trim(),"none"==b)return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=m[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.lengthb||b>900||b%100!==0?void 0:b}function c(b){return b=100*Math.round(b/100),b=a.clamp(100,900,b),400===b?"normal":700===b?"bold":String(b)}function d(a,b){return[a,b,c]}a.addPropertiesHandler(b,d,["font-weight"])}(d),function(a){function b(a){var b={};for(var c in a)b[c]=-a[c];return b}function c(b){return a.consumeToken(/^(left|center|right|top|bottom)\b/i,b)||a.consumeLengthOrPercent(b)}function d(b,d){var e=a.consumeRepeated(c,/^/,d);if(e&&""==e[1]){var f=e[0];if(f[0]=f[0]||"center",f[1]=f[1]||"center",3==b&&(f[2]=f[2]||{px:0}),f.length==b){if(/top|bottom/.test(f[0])||/left|right/.test(f[1])){var h=f[0];f[0]=f[1],f[1]=h}if(/left|right|center|Object/.test(f[0])&&/top|bottom|center|Object/.test(f[1]))return f.map(function(a){return"object"==typeof a?a:g[a]})}}}function e(d){var e=a.consumeRepeated(c,/^/,d);if(e){for(var f=e[0],h=[{"%":50},{"%":50}],i=0,j=!1,k=0;k>> 0) + (counter++ + "__"); + }; + WeakMap.prototype = { + set: function(key, value) { + var entry = key[this.name]; + if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { + value: [ key, value ], + writable: true + }); + return this; + }, + get: function(key) { + var entry; + return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; + }, + "delete": function(key) { + var entry = key[this.name]; + if (!entry || entry[0] !== key) return false; + entry[0] = entry[1] = undefined; + return true; + }, + has: function(key) { + var entry = key[this.name]; + if (!entry) return false; + return entry[0] === key; + } + }; + window.WeakMap = WeakMap; + })(); +} + +(function(global) { + if (global.JsMutationObserver) { + return; + } + var registrationsTable = new WeakMap(); + var setImmediate; + if (/Trident|Edge/.test(navigator.userAgent)) { + setImmediate = setTimeout; + } else if (window.setImmediate) { + setImmediate = window.setImmediate; + } else { + var setImmediateQueue = []; + var sentinel = String(Math.random()); + window.addEventListener("message", function(e) { + if (e.data === sentinel) { + var queue = setImmediateQueue; + setImmediateQueue = []; + queue.forEach(function(func) { + func(); + }); + } + }); + setImmediate = function(func) { + setImmediateQueue.push(func); + window.postMessage(sentinel, "*"); + }; + } + var isScheduled = false; + var scheduledObservers = []; + function scheduleCallback(observer) { + scheduledObservers.push(observer); + if (!isScheduled) { + isScheduled = true; + setImmediate(dispatchCallbacks); + } + } + function wrapIfNeeded(node) { + return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; + } + function dispatchCallbacks() { + isScheduled = false; + var observers = scheduledObservers; + scheduledObservers = []; + observers.sort(function(o1, o2) { + return o1.uid_ - o2.uid_; + }); + var anyNonEmpty = false; + observers.forEach(function(observer) { + var queue = observer.takeRecords(); + removeTransientObserversFor(observer); + if (queue.length) { + observer.callback_(queue, observer); + anyNonEmpty = true; + } + }); + if (anyNonEmpty) dispatchCallbacks(); + } + function removeTransientObserversFor(observer) { + observer.nodes_.forEach(function(node) { + var registrations = registrationsTable.get(node); + if (!registrations) return; + registrations.forEach(function(registration) { + if (registration.observer === observer) registration.removeTransientObservers(); + }); + }); + } + function forEachAncestorAndObserverEnqueueRecord(target, callback) { + for (var node = target; node; node = node.parentNode) { + var registrations = registrationsTable.get(node); + if (registrations) { + for (var j = 0; j < registrations.length; j++) { + var registration = registrations[j]; + var options = registration.options; + if (node !== target && !options.subtree) continue; + var record = callback(options); + if (record) registration.enqueue(record); + } + } + } + } + var uidCounter = 0; + function JsMutationObserver(callback) { + this.callback_ = callback; + this.nodes_ = []; + this.records_ = []; + this.uid_ = ++uidCounter; + } + JsMutationObserver.prototype = { + observe: function(target, options) { + target = wrapIfNeeded(target); + if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { + throw new SyntaxError(); + } + var registrations = registrationsTable.get(target); + if (!registrations) registrationsTable.set(target, registrations = []); + var registration; + for (var i = 0; i < registrations.length; i++) { + if (registrations[i].observer === this) { + registration = registrations[i]; + registration.removeListeners(); + registration.options = options; + break; + } + } + if (!registration) { + registration = new Registration(this, target, options); + registrations.push(registration); + this.nodes_.push(target); + } + registration.addListeners(); + }, + disconnect: function() { + this.nodes_.forEach(function(node) { + var registrations = registrationsTable.get(node); + for (var i = 0; i < registrations.length; i++) { + var registration = registrations[i]; + if (registration.observer === this) { + registration.removeListeners(); + registrations.splice(i, 1); + break; + } + } + }, this); + this.records_ = []; + }, + takeRecords: function() { + var copyOfRecords = this.records_; + this.records_ = []; + return copyOfRecords; + } + }; + function MutationRecord(type, target) { + this.type = type; + this.target = target; + this.addedNodes = []; + this.removedNodes = []; + this.previousSibling = null; + this.nextSibling = null; + this.attributeName = null; + this.attributeNamespace = null; + this.oldValue = null; + } + function copyMutationRecord(original) { + var record = new MutationRecord(original.type, original.target); + record.addedNodes = original.addedNodes.slice(); + record.removedNodes = original.removedNodes.slice(); + record.previousSibling = original.previousSibling; + record.nextSibling = original.nextSibling; + record.attributeName = original.attributeName; + record.attributeNamespace = original.attributeNamespace; + record.oldValue = original.oldValue; + return record; + } + var currentRecord, recordWithOldValue; + function getRecord(type, target) { + return currentRecord = new MutationRecord(type, target); + } + function getRecordWithOldValue(oldValue) { + if (recordWithOldValue) return recordWithOldValue; + recordWithOldValue = copyMutationRecord(currentRecord); + recordWithOldValue.oldValue = oldValue; + return recordWithOldValue; + } + function clearRecords() { + currentRecord = recordWithOldValue = undefined; + } + function recordRepresentsCurrentMutation(record) { + return record === recordWithOldValue || record === currentRecord; + } + function selectRecord(lastRecord, newRecord) { + if (lastRecord === newRecord) return lastRecord; + if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; + return null; + } + function Registration(observer, target, options) { + this.observer = observer; + this.target = target; + this.options = options; + this.transientObservedNodes = []; + } + Registration.prototype = { + enqueue: function(record) { + var records = this.observer.records_; + var length = records.length; + if (records.length > 0) { + var lastRecord = records[length - 1]; + var recordToReplaceLast = selectRecord(lastRecord, record); + if (recordToReplaceLast) { + records[length - 1] = recordToReplaceLast; + return; + } + } else { + scheduleCallback(this.observer); + } + records[length] = record; + }, + addListeners: function() { + this.addListeners_(this.target); + }, + addListeners_: function(node) { + var options = this.options; + if (options.attributes) node.addEventListener("DOMAttrModified", this, true); + if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); + if (options.childList) node.addEventListener("DOMNodeInserted", this, true); + if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); + }, + removeListeners: function() { + this.removeListeners_(this.target); + }, + removeListeners_: function(node) { + var options = this.options; + if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); + if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); + if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); + if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); + }, + addTransientObserver: function(node) { + if (node === this.target) return; + this.addListeners_(node); + this.transientObservedNodes.push(node); + var registrations = registrationsTable.get(node); + if (!registrations) registrationsTable.set(node, registrations = []); + registrations.push(this); + }, + removeTransientObservers: function() { + var transientObservedNodes = this.transientObservedNodes; + this.transientObservedNodes = []; + transientObservedNodes.forEach(function(node) { + this.removeListeners_(node); + var registrations = registrationsTable.get(node); + for (var i = 0; i < registrations.length; i++) { + if (registrations[i] === this) { + registrations.splice(i, 1); + break; + } + } + }, this); + }, + handleEvent: function(e) { + e.stopImmediatePropagation(); + switch (e.type) { + case "DOMAttrModified": + var name = e.attrName; + var namespace = e.relatedNode.namespaceURI; + var target = e.target; + var record = new getRecord("attributes", target); + record.attributeName = name; + record.attributeNamespace = namespace; + var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; + forEachAncestorAndObserverEnqueueRecord(target, function(options) { + if (!options.attributes) return; + if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { + return; + } + if (options.attributeOldValue) return getRecordWithOldValue(oldValue); + return record; + }); + break; + + case "DOMCharacterDataModified": + var target = e.target; + var record = getRecord("characterData", target); + var oldValue = e.prevValue; + forEachAncestorAndObserverEnqueueRecord(target, function(options) { + if (!options.characterData) return; + if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); + return record; + }); + break; + + case "DOMNodeRemoved": + this.addTransientObserver(e.target); + + case "DOMNodeInserted": + var changedNode = e.target; + var addedNodes, removedNodes; + if (e.type === "DOMNodeInserted") { + addedNodes = [ changedNode ]; + removedNodes = []; + } else { + addedNodes = []; + removedNodes = [ changedNode ]; + } + var previousSibling = changedNode.previousSibling; + var nextSibling = changedNode.nextSibling; + var record = getRecord("childList", e.target.parentNode); + record.addedNodes = addedNodes; + record.removedNodes = removedNodes; + record.previousSibling = previousSibling; + record.nextSibling = nextSibling; + forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { + if (!options.childList) return; + return record; + }); + } + clearRecords(); + } + }; + global.JsMutationObserver = JsMutationObserver; + if (!global.MutationObserver) { + global.MutationObserver = JsMutationObserver; + JsMutationObserver._isPolyfilled = true; + } +})(self); + +(function(scope) { + "use strict"; + if (!window.performance) { + var start = Date.now(); + window.performance = { + now: function() { + return Date.now() - start; + } + }; + } + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function() { + var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; + return nativeRaf ? function(callback) { + return nativeRaf(function() { + callback(performance.now()); + }); + } : function(callback) { + return window.setTimeout(callback, 1e3 / 60); + }; + }(); + } + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function() { + return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { + clearTimeout(id); + }; + }(); + } + var workingDefaultPrevented = function() { + var e = document.createEvent("Event"); + e.initEvent("foo", true, true); + e.preventDefault(); + return e.defaultPrevented; + }(); + if (!workingDefaultPrevented) { + var origPreventDefault = Event.prototype.preventDefault; + Event.prototype.preventDefault = function() { + if (!this.cancelable) { + return; + } + origPreventDefault.call(this); + Object.defineProperty(this, "defaultPrevented", { + get: function() { + return true; + }, + configurable: true + }); + }; + } + var isIE = /Trident/.test(navigator.userAgent); + if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") { + window.CustomEvent = function(inType, params) { + params = params || {}; + var e = document.createEvent("CustomEvent"); + e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); + return e; + }; + window.CustomEvent.prototype = window.Event.prototype; + } + if (!window.Event || isIE && typeof window.Event !== "function") { + var origEvent = window.Event; + window.Event = function(inType, params) { + params = params || {}; + var e = document.createEvent("Event"); + e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable)); + return e; + }; + window.Event.prototype = origEvent.prototype; + } +})(window.WebComponents); + +window.CustomElements = window.CustomElements || { + flags: {} +}; + +(function(scope) { + var flags = scope.flags; + var modules = []; + var addModule = function(module) { + modules.push(module); + }; + var initializeModules = function() { + modules.forEach(function(module) { + module(scope); + }); + }; + scope.addModule = addModule; + scope.initializeModules = initializeModules; + scope.hasNative = Boolean(document.registerElement); + scope.isIE = /Trident/.test(navigator.userAgent); + scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative); +})(window.CustomElements); + +window.CustomElements.addModule(function(scope) { + var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none"; + function forSubtree(node, cb) { + findAllElements(node, function(e) { + if (cb(e)) { + return true; + } + forRoots(e, cb); + }); + forRoots(node, cb); + } + function findAllElements(node, find, data) { + var e = node.firstElementChild; + if (!e) { + e = node.firstChild; + while (e && e.nodeType !== Node.ELEMENT_NODE) { + e = e.nextSibling; + } + } + while (e) { + if (find(e, data) !== true) { + findAllElements(e, find, data); + } + e = e.nextElementSibling; + } + return null; + } + function forRoots(node, cb) { + var root = node.shadowRoot; + while (root) { + forSubtree(root, cb); + root = root.olderShadowRoot; + } + } + function forDocumentTree(doc, cb) { + _forDocumentTree(doc, cb, []); + } + function _forDocumentTree(doc, cb, processingDocuments) { + doc = window.wrap(doc); + if (processingDocuments.indexOf(doc) >= 0) { + return; + } + processingDocuments.push(doc); + var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]"); + for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) { + if (n.import) { + _forDocumentTree(n.import, cb, processingDocuments); + } + } + cb(doc); + } + scope.forDocumentTree = forDocumentTree; + scope.forSubtree = forSubtree; +}); + +window.CustomElements.addModule(function(scope) { + var flags = scope.flags; + var forSubtree = scope.forSubtree; + var forDocumentTree = scope.forDocumentTree; + function addedNode(node, isAttached) { + return added(node, isAttached) || addedSubtree(node, isAttached); + } + function added(node, isAttached) { + if (scope.upgrade(node, isAttached)) { + return true; + } + if (isAttached) { + attached(node); + } + } + function addedSubtree(node, isAttached) { + forSubtree(node, function(e) { + if (added(e, isAttached)) { + return true; + } + }); + } + var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"]; + scope.hasPolyfillMutations = hasThrottledAttached; + scope.hasThrottledAttached = hasThrottledAttached; + var isPendingMutations = false; + var pendingMutations = []; + function deferMutation(fn) { + pendingMutations.push(fn); + if (!isPendingMutations) { + isPendingMutations = true; + setTimeout(takeMutations); + } + } + function takeMutations() { + isPendingMutations = false; + var $p = pendingMutations; + for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { + p(); + } + pendingMutations = []; + } + function attached(element) { + if (hasThrottledAttached) { + deferMutation(function() { + _attached(element); + }); + } else { + _attached(element); + } + } + function _attached(element) { + if (element.__upgraded__ && !element.__attached) { + element.__attached = true; + if (element.attachedCallback) { + element.attachedCallback(); + } + } + } + function detachedNode(node) { + detached(node); + forSubtree(node, function(e) { + detached(e); + }); + } + function detached(element) { + if (hasThrottledAttached) { + deferMutation(function() { + _detached(element); + }); + } else { + _detached(element); + } + } + function _detached(element) { + if (element.__upgraded__ && element.__attached) { + element.__attached = false; + if (element.detachedCallback) { + element.detachedCallback(); + } + } + } + function inDocument(element) { + var p = element; + var doc = window.wrap(document); + while (p) { + if (p == doc) { + return true; + } + p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host; + } + } + function watchShadow(node) { + if (node.shadowRoot && !node.shadowRoot.__watched) { + flags.dom && console.log("watching shadow-root for: ", node.localName); + var root = node.shadowRoot; + while (root) { + observe(root); + root = root.olderShadowRoot; + } + } + } + function handler(root, mutations) { + if (flags.dom) { + var mx = mutations[0]; + if (mx && mx.type === "childList" && mx.addedNodes) { + if (mx.addedNodes) { + var d = mx.addedNodes[0]; + while (d && d !== document && !d.host) { + d = d.parentNode; + } + var u = d && (d.URL || d._URL || d.host && d.host.localName) || ""; + u = u.split("/?").shift().split("/").pop(); + } + } + console.group("mutations (%d) [%s]", mutations.length, u || ""); + } + var isAttached = inDocument(root); + mutations.forEach(function(mx) { + if (mx.type === "childList") { + forEach(mx.addedNodes, function(n) { + if (!n.localName) { + return; + } + addedNode(n, isAttached); + }); + forEach(mx.removedNodes, function(n) { + if (!n.localName) { + return; + } + detachedNode(n); + }); + } + }); + flags.dom && console.groupEnd(); + } + function takeRecords(node) { + node = window.wrap(node); + if (!node) { + node = window.wrap(document); + } + while (node.parentNode) { + node = node.parentNode; + } + var observer = node.__observer; + if (observer) { + handler(node, observer.takeRecords()); + takeMutations(); + } + } + var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); + function observe(inRoot) { + if (inRoot.__observer) { + return; + } + var observer = new MutationObserver(handler.bind(this, inRoot)); + observer.observe(inRoot, { + childList: true, + subtree: true + }); + inRoot.__observer = observer; + } + function upgradeDocument(doc) { + doc = window.wrap(doc); + flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop()); + var isMainDocument = doc === window.wrap(document); + addedNode(doc, isMainDocument); + observe(doc); + flags.dom && console.groupEnd(); + } + function upgradeDocumentTree(doc) { + forDocumentTree(doc, upgradeDocument); + } + var originalCreateShadowRoot = Element.prototype.createShadowRoot; + if (originalCreateShadowRoot) { + Element.prototype.createShadowRoot = function() { + var root = originalCreateShadowRoot.call(this); + window.CustomElements.watchShadow(this); + return root; + }; + } + scope.watchShadow = watchShadow; + scope.upgradeDocumentTree = upgradeDocumentTree; + scope.upgradeDocument = upgradeDocument; + scope.upgradeSubtree = addedSubtree; + scope.upgradeAll = addedNode; + scope.attached = attached; + scope.takeRecords = takeRecords; +}); + +window.CustomElements.addModule(function(scope) { + var flags = scope.flags; + function upgrade(node, isAttached) { + if (node.localName === "template") { + if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) { + HTMLTemplateElement.decorate(node); + } + } + if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) { + var is = node.getAttribute("is"); + var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is); + if (definition) { + if (is && definition.tag == node.localName || !is && !definition.extends) { + return upgradeWithDefinition(node, definition, isAttached); + } + } + } + } + function upgradeWithDefinition(element, definition, isAttached) { + flags.upgrade && console.group("upgrade:", element.localName); + if (definition.is) { + element.setAttribute("is", definition.is); + } + implementPrototype(element, definition); + element.__upgraded__ = true; + created(element); + if (isAttached) { + scope.attached(element); + } + scope.upgradeSubtree(element, isAttached); + flags.upgrade && console.groupEnd(); + return element; + } + function implementPrototype(element, definition) { + if (Object.__proto__) { + element.__proto__ = definition.prototype; + } else { + customMixin(element, definition.prototype, definition.native); + element.__proto__ = definition.prototype; + } + } + function customMixin(inTarget, inSrc, inNative) { + var used = {}; + var p = inSrc; + while (p !== inNative && p !== HTMLElement.prototype) { + var keys = Object.getOwnPropertyNames(p); + for (var i = 0, k; k = keys[i]; i++) { + if (!used[k]) { + Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k)); + used[k] = 1; + } + } + p = Object.getPrototypeOf(p); + } + } + function created(element) { + if (element.createdCallback) { + element.createdCallback(); + } + } + scope.upgrade = upgrade; + scope.upgradeWithDefinition = upgradeWithDefinition; + scope.implementPrototype = implementPrototype; +}); + +window.CustomElements.addModule(function(scope) { + var isIE = scope.isIE; + var upgradeDocumentTree = scope.upgradeDocumentTree; + var upgradeAll = scope.upgradeAll; + var upgradeWithDefinition = scope.upgradeWithDefinition; + var implementPrototype = scope.implementPrototype; + var useNative = scope.useNative; + function register(name, options) { + var definition = options || {}; + if (!name) { + throw new Error("document.registerElement: first argument `name` must not be empty"); + } + if (name.indexOf("-") < 0) { + throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'."); + } + if (isReservedTag(name)) { + throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid."); + } + if (getRegisteredDefinition(name)) { + throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered"); + } + if (!definition.prototype) { + definition.prototype = Object.create(HTMLElement.prototype); + } + definition.__name = name.toLowerCase(); + definition.lifecycle = definition.lifecycle || {}; + definition.ancestry = ancestry(definition.extends); + resolveTagName(definition); + resolvePrototypeChain(definition); + overrideAttributeApi(definition.prototype); + registerDefinition(definition.__name, definition); + definition.ctor = generateConstructor(definition); + definition.ctor.prototype = definition.prototype; + definition.prototype.constructor = definition.ctor; + if (scope.ready) { + upgradeDocumentTree(document); + } + return definition.ctor; + } + function overrideAttributeApi(prototype) { + if (prototype.setAttribute._polyfilled) { + return; + } + var setAttribute = prototype.setAttribute; + prototype.setAttribute = function(name, value) { + changeAttribute.call(this, name, value, setAttribute); + }; + var removeAttribute = prototype.removeAttribute; + prototype.removeAttribute = function(name) { + changeAttribute.call(this, name, null, removeAttribute); + }; + prototype.setAttribute._polyfilled = true; + } + function changeAttribute(name, value, operation) { + name = name.toLowerCase(); + var oldValue = this.getAttribute(name); + operation.apply(this, arguments); + var newValue = this.getAttribute(name); + if (this.attributeChangedCallback && newValue !== oldValue) { + this.attributeChangedCallback(name, oldValue, newValue); + } + } + function isReservedTag(name) { + for (var i = 0; i < reservedTagList.length; i++) { + if (name === reservedTagList[i]) { + return true; + } + } + } + var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ]; + function ancestry(extnds) { + var extendee = getRegisteredDefinition(extnds); + if (extendee) { + return ancestry(extendee.extends).concat([ extendee ]); + } + return []; + } + function resolveTagName(definition) { + var baseTag = definition.extends; + for (var i = 0, a; a = definition.ancestry[i]; i++) { + baseTag = a.is && a.tag; + } + definition.tag = baseTag || definition.__name; + if (baseTag) { + definition.is = definition.__name; + } + } + function resolvePrototypeChain(definition) { + if (!Object.__proto__) { + var nativePrototype = HTMLElement.prototype; + if (definition.is) { + var inst = document.createElement(definition.tag); + nativePrototype = Object.getPrototypeOf(inst); + } + var proto = definition.prototype, ancestor; + var foundPrototype = false; + while (proto) { + if (proto == nativePrototype) { + foundPrototype = true; + } + ancestor = Object.getPrototypeOf(proto); + if (ancestor) { + proto.__proto__ = ancestor; + } + proto = ancestor; + } + if (!foundPrototype) { + console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is); + } + definition.native = nativePrototype; + } + } + function instantiate(definition) { + return upgradeWithDefinition(domCreateElement(definition.tag), definition); + } + var registry = {}; + function getRegisteredDefinition(name) { + if (name) { + return registry[name.toLowerCase()]; + } + } + function registerDefinition(name, definition) { + registry[name] = definition; + } + function generateConstructor(definition) { + return function() { + return instantiate(definition); + }; + } + var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; + function createElementNS(namespace, tag, typeExtension) { + if (namespace === HTML_NAMESPACE) { + return createElement(tag, typeExtension); + } else { + return domCreateElementNS(namespace, tag); + } + } + function createElement(tag, typeExtension) { + if (tag) { + tag = tag.toLowerCase(); + } + if (typeExtension) { + typeExtension = typeExtension.toLowerCase(); + } + var definition = getRegisteredDefinition(typeExtension || tag); + if (definition) { + if (tag == definition.tag && typeExtension == definition.is) { + return new definition.ctor(); + } + if (!typeExtension && !definition.is) { + return new definition.ctor(); + } + } + var element; + if (typeExtension) { + element = createElement(tag); + element.setAttribute("is", typeExtension); + return element; + } + element = domCreateElement(tag); + if (tag.indexOf("-") >= 0) { + implementPrototype(element, HTMLElement); + } + return element; + } + var domCreateElement = document.createElement.bind(document); + var domCreateElementNS = document.createElementNS.bind(document); + var isInstance; + if (!Object.__proto__ && !useNative) { + isInstance = function(obj, ctor) { + if (obj instanceof ctor) { + return true; + } + var p = obj; + while (p) { + if (p === ctor.prototype) { + return true; + } + p = p.__proto__; + } + return false; + }; + } else { + isInstance = function(obj, base) { + return obj instanceof base; + }; + } + function wrapDomMethodToForceUpgrade(obj, methodName) { + var orig = obj[methodName]; + obj[methodName] = function() { + var n = orig.apply(this, arguments); + upgradeAll(n); + return n; + }; + } + wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode"); + wrapDomMethodToForceUpgrade(document, "importNode"); + if (isIE) { + (function() { + var importNode = document.importNode; + document.importNode = function() { + var n = importNode.apply(document, arguments); + if (n.nodeType == n.DOCUMENT_FRAGMENT_NODE) { + var f = document.createDocumentFragment(); + f.appendChild(n); + return f; + } else { + return n; + } + }; + })(); + } + document.registerElement = register; + document.createElement = createElement; + document.createElementNS = createElementNS; + scope.registry = registry; + scope.instanceof = isInstance; + scope.reservedTagList = reservedTagList; + scope.getRegisteredDefinition = getRegisteredDefinition; + document.register = document.registerElement; +}); + +(function(scope) { + var useNative = scope.useNative; + var initializeModules = scope.initializeModules; + var isIE = scope.isIE; + if (useNative) { + var nop = function() {}; + scope.watchShadow = nop; + scope.upgrade = nop; + scope.upgradeAll = nop; + scope.upgradeDocumentTree = nop; + scope.upgradeSubtree = nop; + scope.takeRecords = nop; + scope.instanceof = function(obj, base) { + return obj instanceof base; + }; + } else { + initializeModules(); + } + var upgradeDocumentTree = scope.upgradeDocumentTree; + var upgradeDocument = scope.upgradeDocument; + if (!window.wrap) { + if (window.ShadowDOMPolyfill) { + window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded; + window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded; + } else { + window.wrap = window.unwrap = function(node) { + return node; + }; + } + } + if (window.HTMLImports) { + window.HTMLImports.__importsParsingHook = function(elt) { + if (elt.import) { + upgradeDocument(wrap(elt.import)); + } + }; + } + function bootstrap() { + upgradeDocumentTree(window.wrap(document)); + window.CustomElements.ready = true; + var requestAnimationFrame = window.requestAnimationFrame || function(f) { + setTimeout(f, 16); + }; + requestAnimationFrame(function() { + setTimeout(function() { + window.CustomElements.readyTime = Date.now(); + if (window.HTMLImports) { + window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime; + } + document.dispatchEvent(new CustomEvent("WebComponentsReady", { + bubbles: true + })); + }); + }); + } + if (document.readyState === "complete" || scope.flags.eager) { + bootstrap(); + } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) { + bootstrap(); + } else { + var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded"; + window.addEventListener(loadEvent, bootstrap); + } +})(window.CustomElements); \ No newline at end of file diff --git a/react-app/bower_components/webcomponentsjs/CustomElements.min.js b/react-app/bower_components/webcomponentsjs/CustomElements.min.js new file mode 100644 index 0000000000..192d49380c --- /dev/null +++ b/react-app/bower_components/webcomponentsjs/CustomElements.min.js @@ -0,0 +1,11 @@ +/** + * @license + * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +// @version 0.7.21 +"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){E.push(e),b||(b=!0,w(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){b=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r0){var r=n[o-1],i=m(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),d=0,s=r.length;s>d&&(o=r[d]);d++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function o(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function r(e){N.push(e),y||(y=!0,setTimeout(i))}function i(){y=!1;for(var e,t=N,n=0,o=t.length;o>n&&(e=t[n]);n++)e();N=[]}function a(e){_?r(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function s(e){u(e),b(e,function(e){u(e)})}function u(e){_?r(function(){c(e)}):c(e)}function c(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)w(t),t=t.olderShadowRoot}}function m(e,n){if(g.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&s(e)}))}),g.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(m(e,t.takeRecords()),i())}function w(e){if(!e.__observer){var t=new MutationObserver(m.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),w(e),g.dom&&console.groupEnd()}function h(e){E(e,v)}var g=e.flags,b=e.forSubtree,E=e.forDocumentTree,_=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=_,e.hasThrottledAttached=_;var y=!1,N=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),O=Element.prototype.createShadowRoot;O&&(Element.prototype.createShadowRoot=function(){var e=O.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=f,e.upgradeDocumentTree=h,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),d=0;i=a[d];d++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var s=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(u(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return s.prototype||(s.prototype=Object.create(HTMLElement.prototype)),s.__name=t.toLowerCase(),s.lifecycle=s.lifecycle||{},s.ancestry=i(s["extends"]),a(s),d(s),n(s.prototype),c(s.__name,s),s.ctor=l(s),s.ctor.prototype=s.prototype,s.prototype.constructor=s.ctor,e.ready&&h(document),s.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t=0&&E(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return g(e),e}}var w,v=e.isIE,h=e.upgradeDocumentTree,g=e.upgradeAll,b=e.upgradeWithDefinition,E=e.implementPrototype,_=e.useNative,y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],N={},M="http://www.w3.org/1999/xhtml",O=document.createElement.bind(document),D=document.createElementNS.bind(document);w=Object.__proto__||_?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),v&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=m,document.createElementNS=f,e.registry=N,e["instanceof"]=w,e.reservedTagList=y,e.getRegisteredDefinition=u,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var d=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(d,t)}else t()}(window.CustomElements); \ No newline at end of file diff --git a/react-app/bower_components/webcomponentsjs/HTMLImports.js b/react-app/bower_components/webcomponentsjs/HTMLImports.js new file mode 100644 index 0000000000..047e5ac326 --- /dev/null +++ b/react-app/bower_components/webcomponentsjs/HTMLImports.js @@ -0,0 +1,1157 @@ +/** + * @license + * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +// @version 0.7.21 +if (typeof WeakMap === "undefined") { + (function() { + var defineProperty = Object.defineProperty; + var counter = Date.now() % 1e9; + var WeakMap = function() { + this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); + }; + WeakMap.prototype = { + set: function(key, value) { + var entry = key[this.name]; + if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { + value: [ key, value ], + writable: true + }); + return this; + }, + get: function(key) { + var entry; + return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; + }, + "delete": function(key) { + var entry = key[this.name]; + if (!entry || entry[0] !== key) return false; + entry[0] = entry[1] = undefined; + return true; + }, + has: function(key) { + var entry = key[this.name]; + if (!entry) return false; + return entry[0] === key; + } + }; + window.WeakMap = WeakMap; + })(); +} + +(function(global) { + if (global.JsMutationObserver) { + return; + } + var registrationsTable = new WeakMap(); + var setImmediate; + if (/Trident|Edge/.test(navigator.userAgent)) { + setImmediate = setTimeout; + } else if (window.setImmediate) { + setImmediate = window.setImmediate; + } else { + var setImmediateQueue = []; + var sentinel = String(Math.random()); + window.addEventListener("message", function(e) { + if (e.data === sentinel) { + var queue = setImmediateQueue; + setImmediateQueue = []; + queue.forEach(function(func) { + func(); + }); + } + }); + setImmediate = function(func) { + setImmediateQueue.push(func); + window.postMessage(sentinel, "*"); + }; + } + var isScheduled = false; + var scheduledObservers = []; + function scheduleCallback(observer) { + scheduledObservers.push(observer); + if (!isScheduled) { + isScheduled = true; + setImmediate(dispatchCallbacks); + } + } + function wrapIfNeeded(node) { + return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; + } + function dispatchCallbacks() { + isScheduled = false; + var observers = scheduledObservers; + scheduledObservers = []; + observers.sort(function(o1, o2) { + return o1.uid_ - o2.uid_; + }); + var anyNonEmpty = false; + observers.forEach(function(observer) { + var queue = observer.takeRecords(); + removeTransientObserversFor(observer); + if (queue.length) { + observer.callback_(queue, observer); + anyNonEmpty = true; + } + }); + if (anyNonEmpty) dispatchCallbacks(); + } + function removeTransientObserversFor(observer) { + observer.nodes_.forEach(function(node) { + var registrations = registrationsTable.get(node); + if (!registrations) return; + registrations.forEach(function(registration) { + if (registration.observer === observer) registration.removeTransientObservers(); + }); + }); + } + function forEachAncestorAndObserverEnqueueRecord(target, callback) { + for (var node = target; node; node = node.parentNode) { + var registrations = registrationsTable.get(node); + if (registrations) { + for (var j = 0; j < registrations.length; j++) { + var registration = registrations[j]; + var options = registration.options; + if (node !== target && !options.subtree) continue; + var record = callback(options); + if (record) registration.enqueue(record); + } + } + } + } + var uidCounter = 0; + function JsMutationObserver(callback) { + this.callback_ = callback; + this.nodes_ = []; + this.records_ = []; + this.uid_ = ++uidCounter; + } + JsMutationObserver.prototype = { + observe: function(target, options) { + target = wrapIfNeeded(target); + if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { + throw new SyntaxError(); + } + var registrations = registrationsTable.get(target); + if (!registrations) registrationsTable.set(target, registrations = []); + var registration; + for (var i = 0; i < registrations.length; i++) { + if (registrations[i].observer === this) { + registration = registrations[i]; + registration.removeListeners(); + registration.options = options; + break; + } + } + if (!registration) { + registration = new Registration(this, target, options); + registrations.push(registration); + this.nodes_.push(target); + } + registration.addListeners(); + }, + disconnect: function() { + this.nodes_.forEach(function(node) { + var registrations = registrationsTable.get(node); + for (var i = 0; i < registrations.length; i++) { + var registration = registrations[i]; + if (registration.observer === this) { + registration.removeListeners(); + registrations.splice(i, 1); + break; + } + } + }, this); + this.records_ = []; + }, + takeRecords: function() { + var copyOfRecords = this.records_; + this.records_ = []; + return copyOfRecords; + } + }; + function MutationRecord(type, target) { + this.type = type; + this.target = target; + this.addedNodes = []; + this.removedNodes = []; + this.previousSibling = null; + this.nextSibling = null; + this.attributeName = null; + this.attributeNamespace = null; + this.oldValue = null; + } + function copyMutationRecord(original) { + var record = new MutationRecord(original.type, original.target); + record.addedNodes = original.addedNodes.slice(); + record.removedNodes = original.removedNodes.slice(); + record.previousSibling = original.previousSibling; + record.nextSibling = original.nextSibling; + record.attributeName = original.attributeName; + record.attributeNamespace = original.attributeNamespace; + record.oldValue = original.oldValue; + return record; + } + var currentRecord, recordWithOldValue; + function getRecord(type, target) { + return currentRecord = new MutationRecord(type, target); + } + function getRecordWithOldValue(oldValue) { + if (recordWithOldValue) return recordWithOldValue; + recordWithOldValue = copyMutationRecord(currentRecord); + recordWithOldValue.oldValue = oldValue; + return recordWithOldValue; + } + function clearRecords() { + currentRecord = recordWithOldValue = undefined; + } + function recordRepresentsCurrentMutation(record) { + return record === recordWithOldValue || record === currentRecord; + } + function selectRecord(lastRecord, newRecord) { + if (lastRecord === newRecord) return lastRecord; + if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; + return null; + } + function Registration(observer, target, options) { + this.observer = observer; + this.target = target; + this.options = options; + this.transientObservedNodes = []; + } + Registration.prototype = { + enqueue: function(record) { + var records = this.observer.records_; + var length = records.length; + if (records.length > 0) { + var lastRecord = records[length - 1]; + var recordToReplaceLast = selectRecord(lastRecord, record); + if (recordToReplaceLast) { + records[length - 1] = recordToReplaceLast; + return; + } + } else { + scheduleCallback(this.observer); + } + records[length] = record; + }, + addListeners: function() { + this.addListeners_(this.target); + }, + addListeners_: function(node) { + var options = this.options; + if (options.attributes) node.addEventListener("DOMAttrModified", this, true); + if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); + if (options.childList) node.addEventListener("DOMNodeInserted", this, true); + if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); + }, + removeListeners: function() { + this.removeListeners_(this.target); + }, + removeListeners_: function(node) { + var options = this.options; + if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); + if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); + if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); + if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); + }, + addTransientObserver: function(node) { + if (node === this.target) return; + this.addListeners_(node); + this.transientObservedNodes.push(node); + var registrations = registrationsTable.get(node); + if (!registrations) registrationsTable.set(node, registrations = []); + registrations.push(this); + }, + removeTransientObservers: function() { + var transientObservedNodes = this.transientObservedNodes; + this.transientObservedNodes = []; + transientObservedNodes.forEach(function(node) { + this.removeListeners_(node); + var registrations = registrationsTable.get(node); + for (var i = 0; i < registrations.length; i++) { + if (registrations[i] === this) { + registrations.splice(i, 1); + break; + } + } + }, this); + }, + handleEvent: function(e) { + e.stopImmediatePropagation(); + switch (e.type) { + case "DOMAttrModified": + var name = e.attrName; + var namespace = e.relatedNode.namespaceURI; + var target = e.target; + var record = new getRecord("attributes", target); + record.attributeName = name; + record.attributeNamespace = namespace; + var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; + forEachAncestorAndObserverEnqueueRecord(target, function(options) { + if (!options.attributes) return; + if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { + return; + } + if (options.attributeOldValue) return getRecordWithOldValue(oldValue); + return record; + }); + break; + + case "DOMCharacterDataModified": + var target = e.target; + var record = getRecord("characterData", target); + var oldValue = e.prevValue; + forEachAncestorAndObserverEnqueueRecord(target, function(options) { + if (!options.characterData) return; + if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); + return record; + }); + break; + + case "DOMNodeRemoved": + this.addTransientObserver(e.target); + + case "DOMNodeInserted": + var changedNode = e.target; + var addedNodes, removedNodes; + if (e.type === "DOMNodeInserted") { + addedNodes = [ changedNode ]; + removedNodes = []; + } else { + addedNodes = []; + removedNodes = [ changedNode ]; + } + var previousSibling = changedNode.previousSibling; + var nextSibling = changedNode.nextSibling; + var record = getRecord("childList", e.target.parentNode); + record.addedNodes = addedNodes; + record.removedNodes = removedNodes; + record.previousSibling = previousSibling; + record.nextSibling = nextSibling; + forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { + if (!options.childList) return; + return record; + }); + } + clearRecords(); + } + }; + global.JsMutationObserver = JsMutationObserver; + if (!global.MutationObserver) { + global.MutationObserver = JsMutationObserver; + JsMutationObserver._isPolyfilled = true; + } +})(self); + +(function(scope) { + "use strict"; + if (!window.performance) { + var start = Date.now(); + window.performance = { + now: function() { + return Date.now() - start; + } + }; + } + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function() { + var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; + return nativeRaf ? function(callback) { + return nativeRaf(function() { + callback(performance.now()); + }); + } : function(callback) { + return window.setTimeout(callback, 1e3 / 60); + }; + }(); + } + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function() { + return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { + clearTimeout(id); + }; + }(); + } + var workingDefaultPrevented = function() { + var e = document.createEvent("Event"); + e.initEvent("foo", true, true); + e.preventDefault(); + return e.defaultPrevented; + }(); + if (!workingDefaultPrevented) { + var origPreventDefault = Event.prototype.preventDefault; + Event.prototype.preventDefault = function() { + if (!this.cancelable) { + return; + } + origPreventDefault.call(this); + Object.defineProperty(this, "defaultPrevented", { + get: function() { + return true; + }, + configurable: true + }); + }; + } + var isIE = /Trident/.test(navigator.userAgent); + if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") { + window.CustomEvent = function(inType, params) { + params = params || {}; + var e = document.createEvent("CustomEvent"); + e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); + return e; + }; + window.CustomEvent.prototype = window.Event.prototype; + } + if (!window.Event || isIE && typeof window.Event !== "function") { + var origEvent = window.Event; + window.Event = function(inType, params) { + params = params || {}; + var e = document.createEvent("Event"); + e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable)); + return e; + }; + window.Event.prototype = origEvent.prototype; + } +})(window.WebComponents); + +window.HTMLImports = window.HTMLImports || { + flags: {} +}; + +(function(scope) { + var IMPORT_LINK_TYPE = "import"; + var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link")); + var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill); + var wrap = function(node) { + return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node; + }; + var rootDocument = wrap(document); + var currentScriptDescriptor = { + get: function() { + var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null); + return wrap(script); + }, + configurable: true + }; + Object.defineProperty(document, "_currentScript", currentScriptDescriptor); + Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor); + var isIE = /Trident/.test(navigator.userAgent); + function whenReady(callback, doc) { + doc = doc || rootDocument; + whenDocumentReady(function() { + watchImportsLoad(callback, doc); + }, doc); + } + var requiredReadyState = isIE ? "complete" : "interactive"; + var READY_EVENT = "readystatechange"; + function isDocumentReady(doc) { + return doc.readyState === "complete" || doc.readyState === requiredReadyState; + } + function whenDocumentReady(callback, doc) { + if (!isDocumentReady(doc)) { + var checkReady = function() { + if (doc.readyState === "complete" || doc.readyState === requiredReadyState) { + doc.removeEventListener(READY_EVENT, checkReady); + whenDocumentReady(callback, doc); + } + }; + doc.addEventListener(READY_EVENT, checkReady); + } else if (callback) { + callback(); + } + } + function markTargetLoaded(event) { + event.target.__loaded = true; + } + function watchImportsLoad(callback, doc) { + var imports = doc.querySelectorAll("link[rel=import]"); + var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = []; + function checkDone() { + if (parsedCount == importCount && callback) { + callback({ + allImports: imports, + loadedImports: newImports, + errorImports: errorImports + }); + } + } + function loadedImport(e) { + markTargetLoaded(e); + newImports.push(this); + parsedCount++; + checkDone(); + } + function errorLoadingImport(e) { + errorImports.push(this); + parsedCount++; + checkDone(); + } + if (importCount) { + for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) { + if (isImportLoaded(imp)) { + newImports.push(this); + parsedCount++; + checkDone(); + } else { + imp.addEventListener("load", loadedImport); + imp.addEventListener("error", errorLoadingImport); + } + } + } else { + checkDone(); + } + } + function isImportLoaded(link) { + return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed; + } + if (useNative) { + new MutationObserver(function(mxns) { + for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) { + if (m.addedNodes) { + handleImports(m.addedNodes); + } + } + }).observe(document.head, { + childList: true + }); + function handleImports(nodes) { + for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { + if (isImport(n)) { + handleImport(n); + } + } + } + function isImport(element) { + return element.localName === "link" && element.rel === "import"; + } + function handleImport(element) { + var loaded = element.import; + if (loaded) { + markTargetLoaded({ + target: element + }); + } else { + element.addEventListener("load", markTargetLoaded); + element.addEventListener("error", markTargetLoaded); + } + } + (function() { + if (document.readyState === "loading") { + var imports = document.querySelectorAll("link[rel=import]"); + for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) { + handleImport(imp); + } + } + })(); + } + whenReady(function(detail) { + window.HTMLImports.ready = true; + window.HTMLImports.readyTime = new Date().getTime(); + var evt = rootDocument.createEvent("CustomEvent"); + evt.initCustomEvent("HTMLImportsLoaded", true, true, detail); + rootDocument.dispatchEvent(evt); + }); + scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; + scope.useNative = useNative; + scope.rootDocument = rootDocument; + scope.whenReady = whenReady; + scope.isIE = isIE; +})(window.HTMLImports); + +(function(scope) { + var modules = []; + var addModule = function(module) { + modules.push(module); + }; + var initializeModules = function() { + modules.forEach(function(module) { + module(scope); + }); + }; + scope.addModule = addModule; + scope.initializeModules = initializeModules; +})(window.HTMLImports); + +window.HTMLImports.addModule(function(scope) { + var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g; + var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g; + var path = { + resolveUrlsInStyle: function(style, linkUrl) { + var doc = style.ownerDocument; + var resolver = doc.createElement("a"); + style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver); + return style; + }, + resolveUrlsInCssText: function(cssText, linkUrl, urlObj) { + var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP); + r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP); + return r; + }, + replaceUrls: function(text, urlObj, linkUrl, regexp) { + return text.replace(regexp, function(m, pre, url, post) { + var urlPath = url.replace(/["']/g, ""); + if (linkUrl) { + urlPath = new URL(urlPath, linkUrl).href; + } + urlObj.href = urlPath; + urlPath = urlObj.href; + return pre + "'" + urlPath + "'" + post; + }); + } + }; + scope.path = path; +}); + +window.HTMLImports.addModule(function(scope) { + var xhr = { + async: true, + ok: function(request) { + return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0; + }, + load: function(url, next, nextContext) { + var request = new XMLHttpRequest(); + if (scope.flags.debug || scope.flags.bust) { + url += "?" + Math.random(); + } + request.open("GET", url, xhr.async); + request.addEventListener("readystatechange", function(e) { + if (request.readyState === 4) { + var redirectedUrl = null; + try { + var locationHeader = request.getResponseHeader("Location"); + if (locationHeader) { + redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader; + } + } catch (e) { + console.error(e.message); + } + next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl); + } + }); + request.send(); + return request; + }, + loadDocument: function(url, next, nextContext) { + this.load(url, next, nextContext).responseType = "document"; + } + }; + scope.xhr = xhr; +}); + +window.HTMLImports.addModule(function(scope) { + var xhr = scope.xhr; + var flags = scope.flags; + var Loader = function(onLoad, onComplete) { + this.cache = {}; + this.onload = onLoad; + this.oncomplete = onComplete; + this.inflight = 0; + this.pending = {}; + }; + Loader.prototype = { + addNodes: function(nodes) { + this.inflight += nodes.length; + for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { + this.require(n); + } + this.checkDone(); + }, + addNode: function(node) { + this.inflight++; + this.require(node); + this.checkDone(); + }, + require: function(elt) { + var url = elt.src || elt.href; + elt.__nodeUrl = url; + if (!this.dedupe(url, elt)) { + this.fetch(url, elt); + } + }, + dedupe: function(url, elt) { + if (this.pending[url]) { + this.pending[url].push(elt); + return true; + } + var resource; + if (this.cache[url]) { + this.onload(url, elt, this.cache[url]); + this.tail(); + return true; + } + this.pending[url] = [ elt ]; + return false; + }, + fetch: function(url, elt) { + flags.load && console.log("fetch", url, elt); + if (!url) { + setTimeout(function() { + this.receive(url, elt, { + error: "href must be specified" + }, null); + }.bind(this), 0); + } else if (url.match(/^data:/)) { + var pieces = url.split(","); + var header = pieces[0]; + var body = pieces[1]; + if (header.indexOf(";base64") > -1) { + body = atob(body); + } else { + body = decodeURIComponent(body); + } + setTimeout(function() { + this.receive(url, elt, null, body); + }.bind(this), 0); + } else { + var receiveXhr = function(err, resource, redirectedUrl) { + this.receive(url, elt, err, resource, redirectedUrl); + }.bind(this); + xhr.load(url, receiveXhr); + } + }, + receive: function(url, elt, err, resource, redirectedUrl) { + this.cache[url] = resource; + var $p = this.pending[url]; + for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { + this.onload(url, p, resource, err, redirectedUrl); + this.tail(); + } + this.pending[url] = null; + }, + tail: function() { + --this.inflight; + this.checkDone(); + }, + checkDone: function() { + if (!this.inflight) { + this.oncomplete(); + } + } + }; + scope.Loader = Loader; +}); + +window.HTMLImports.addModule(function(scope) { + var Observer = function(addCallback) { + this.addCallback = addCallback; + this.mo = new MutationObserver(this.handler.bind(this)); + }; + Observer.prototype = { + handler: function(mutations) { + for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) { + if (m.type === "childList" && m.addedNodes.length) { + this.addedNodes(m.addedNodes); + } + } + }, + addedNodes: function(nodes) { + if (this.addCallback) { + this.addCallback(nodes); + } + for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) { + if (n.children && n.children.length) { + this.addedNodes(n.children); + } + } + }, + observe: function(root) { + this.mo.observe(root, { + childList: true, + subtree: true + }); + } + }; + scope.Observer = Observer; +}); + +window.HTMLImports.addModule(function(scope) { + var path = scope.path; + var rootDocument = scope.rootDocument; + var flags = scope.flags; + var isIE = scope.isIE; + var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; + var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]"; + var importParser = { + documentSelectors: IMPORT_SELECTOR, + importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","), + map: { + link: "parseLink", + script: "parseScript", + style: "parseStyle" + }, + dynamicElements: [], + parseNext: function() { + var next = this.nextToParse(); + if (next) { + this.parse(next); + } + }, + parse: function(elt) { + if (this.isParsed(elt)) { + flags.parse && console.log("[%s] is already parsed", elt.localName); + return; + } + var fn = this[this.map[elt.localName]]; + if (fn) { + this.markParsing(elt); + fn.call(this, elt); + } + }, + parseDynamic: function(elt, quiet) { + this.dynamicElements.push(elt); + if (!quiet) { + this.parseNext(); + } + }, + markParsing: function(elt) { + flags.parse && console.log("parsing", elt); + this.parsingElement = elt; + }, + markParsingComplete: function(elt) { + elt.__importParsed = true; + this.markDynamicParsingComplete(elt); + if (elt.__importElement) { + elt.__importElement.__importParsed = true; + this.markDynamicParsingComplete(elt.__importElement); + } + this.parsingElement = null; + flags.parse && console.log("completed", elt); + }, + markDynamicParsingComplete: function(elt) { + var i = this.dynamicElements.indexOf(elt); + if (i >= 0) { + this.dynamicElements.splice(i, 1); + } + }, + parseImport: function(elt) { + elt.import = elt.__doc; + if (window.HTMLImports.__importsParsingHook) { + window.HTMLImports.__importsParsingHook(elt); + } + if (elt.import) { + elt.import.__importParsed = true; + } + this.markParsingComplete(elt); + if (elt.__resource && !elt.__error) { + elt.dispatchEvent(new CustomEvent("load", { + bubbles: false + })); + } else { + elt.dispatchEvent(new CustomEvent("error", { + bubbles: false + })); + } + if (elt.__pending) { + var fn; + while (elt.__pending.length) { + fn = elt.__pending.shift(); + if (fn) { + fn({ + target: elt + }); + } + } + } + this.parseNext(); + }, + parseLink: function(linkElt) { + if (nodeIsImport(linkElt)) { + this.parseImport(linkElt); + } else { + linkElt.href = linkElt.href; + this.parseGeneric(linkElt); + } + }, + parseStyle: function(elt) { + var src = elt; + elt = cloneStyle(elt); + src.__appliedElement = elt; + elt.__importElement = src; + this.parseGeneric(elt); + }, + parseGeneric: function(elt) { + this.trackElement(elt); + this.addElementToDocument(elt); + }, + rootImportForElement: function(elt) { + var n = elt; + while (n.ownerDocument.__importLink) { + n = n.ownerDocument.__importLink; + } + return n; + }, + addElementToDocument: function(elt) { + var port = this.rootImportForElement(elt.__importElement || elt); + port.parentNode.insertBefore(elt, port); + }, + trackElement: function(elt, callback) { + var self = this; + var done = function(e) { + elt.removeEventListener("load", done); + elt.removeEventListener("error", done); + if (callback) { + callback(e); + } + self.markParsingComplete(elt); + self.parseNext(); + }; + elt.addEventListener("load", done); + elt.addEventListener("error", done); + if (isIE && elt.localName === "style") { + var fakeLoad = false; + if (elt.textContent.indexOf("@import") == -1) { + fakeLoad = true; + } else if (elt.sheet) { + fakeLoad = true; + var csr = elt.sheet.cssRules; + var len = csr ? csr.length : 0; + for (var i = 0, r; i < len && (r = csr[i]); i++) { + if (r.type === CSSRule.IMPORT_RULE) { + fakeLoad = fakeLoad && Boolean(r.styleSheet); + } + } + } + if (fakeLoad) { + setTimeout(function() { + elt.dispatchEvent(new CustomEvent("load", { + bubbles: false + })); + }); + } + } + }, + parseScript: function(scriptElt) { + var script = document.createElement("script"); + script.__importElement = scriptElt; + script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt); + scope.currentScript = scriptElt; + this.trackElement(script, function(e) { + if (script.parentNode) { + script.parentNode.removeChild(script); + } + scope.currentScript = null; + }); + this.addElementToDocument(script); + }, + nextToParse: function() { + this._mayParse = []; + return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic()); + }, + nextToParseInDoc: function(doc, link) { + if (doc && this._mayParse.indexOf(doc) < 0) { + this._mayParse.push(doc); + var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc)); + for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { + if (!this.isParsed(n)) { + if (this.hasResource(n)) { + return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n; + } else { + return; + } + } + } + } + return link; + }, + nextToParseDynamic: function() { + return this.dynamicElements[0]; + }, + parseSelectorsForNode: function(node) { + var doc = node.ownerDocument || node; + return doc === rootDocument ? this.documentSelectors : this.importsSelectors; + }, + isParsed: function(node) { + return node.__importParsed; + }, + needsDynamicParsing: function(elt) { + return this.dynamicElements.indexOf(elt) >= 0; + }, + hasResource: function(node) { + if (nodeIsImport(node) && node.__doc === undefined) { + return false; + } + return true; + } + }; + function nodeIsImport(elt) { + return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE; + } + function generateScriptDataUrl(script) { + var scriptContent = generateScriptContent(script); + return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent); + } + function generateScriptContent(script) { + return script.textContent + generateSourceMapHint(script); + } + function generateSourceMapHint(script) { + var owner = script.ownerDocument; + owner.__importedScripts = owner.__importedScripts || 0; + var moniker = script.ownerDocument.baseURI; + var num = owner.__importedScripts ? "-" + owner.__importedScripts : ""; + owner.__importedScripts++; + return "\n//# sourceURL=" + moniker + num + ".js\n"; + } + function cloneStyle(style) { + var clone = style.ownerDocument.createElement("style"); + clone.textContent = style.textContent; + path.resolveUrlsInStyle(clone); + return clone; + } + scope.parser = importParser; + scope.IMPORT_SELECTOR = IMPORT_SELECTOR; +}); + +window.HTMLImports.addModule(function(scope) { + var flags = scope.flags; + var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; + var IMPORT_SELECTOR = scope.IMPORT_SELECTOR; + var rootDocument = scope.rootDocument; + var Loader = scope.Loader; + var Observer = scope.Observer; + var parser = scope.parser; + var importer = { + documents: {}, + documentPreloadSelectors: IMPORT_SELECTOR, + importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","), + loadNode: function(node) { + importLoader.addNode(node); + }, + loadSubtree: function(parent) { + var nodes = this.marshalNodes(parent); + importLoader.addNodes(nodes); + }, + marshalNodes: function(parent) { + return parent.querySelectorAll(this.loadSelectorsForNode(parent)); + }, + loadSelectorsForNode: function(node) { + var doc = node.ownerDocument || node; + return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors; + }, + loaded: function(url, elt, resource, err, redirectedUrl) { + flags.load && console.log("loaded", url, elt); + elt.__resource = resource; + elt.__error = err; + if (isImportLink(elt)) { + var doc = this.documents[url]; + if (doc === undefined) { + doc = err ? null : makeDocument(resource, redirectedUrl || url); + if (doc) { + doc.__importLink = elt; + this.bootDocument(doc); + } + this.documents[url] = doc; + } + elt.__doc = doc; + } + parser.parseNext(); + }, + bootDocument: function(doc) { + this.loadSubtree(doc); + this.observer.observe(doc); + parser.parseNext(); + }, + loadedAll: function() { + parser.parseNext(); + } + }; + var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer)); + importer.observer = new Observer(); + function isImportLink(elt) { + return isLinkRel(elt, IMPORT_LINK_TYPE); + } + function isLinkRel(elt, rel) { + return elt.localName === "link" && elt.getAttribute("rel") === rel; + } + function hasBaseURIAccessor(doc) { + return !!Object.getOwnPropertyDescriptor(doc, "baseURI"); + } + function makeDocument(resource, url) { + var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE); + doc._URL = url; + var base = doc.createElement("base"); + base.setAttribute("href", url); + if (!doc.baseURI && !hasBaseURIAccessor(doc)) { + Object.defineProperty(doc, "baseURI", { + value: url + }); + } + var meta = doc.createElement("meta"); + meta.setAttribute("charset", "utf-8"); + doc.head.appendChild(meta); + doc.head.appendChild(base); + doc.body.innerHTML = resource; + if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) { + HTMLTemplateElement.bootstrap(doc); + } + return doc; + } + if (!document.baseURI) { + var baseURIDescriptor = { + get: function() { + var base = document.querySelector("base"); + return base ? base.href : window.location.href; + }, + configurable: true + }; + Object.defineProperty(document, "baseURI", baseURIDescriptor); + Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor); + } + scope.importer = importer; + scope.importLoader = importLoader; +}); + +window.HTMLImports.addModule(function(scope) { + var parser = scope.parser; + var importer = scope.importer; + var dynamic = { + added: function(nodes) { + var owner, parsed, loading; + for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { + if (!owner) { + owner = n.ownerDocument; + parsed = parser.isParsed(owner); + } + loading = this.shouldLoadNode(n); + if (loading) { + importer.loadNode(n); + } + if (this.shouldParseNode(n) && parsed) { + parser.parseDynamic(n, loading); + } + } + }, + shouldLoadNode: function(node) { + return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node)); + }, + shouldParseNode: function(node) { + return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node)); + } + }; + importer.observer.addCallback = dynamic.added.bind(dynamic); + var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector; +}); + +(function(scope) { + var initializeModules = scope.initializeModules; + var isIE = scope.isIE; + if (scope.useNative) { + return; + } + initializeModules(); + var rootDocument = scope.rootDocument; + function bootstrap() { + window.HTMLImports.importer.bootDocument(rootDocument); + } + if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) { + bootstrap(); + } else { + document.addEventListener("DOMContentLoaded", bootstrap); + } +})(window.HTMLImports); \ No newline at end of file diff --git a/react-app/bower_components/webcomponentsjs/HTMLImports.min.js b/react-app/bower_components/webcomponentsjs/HTMLImports.min.js new file mode 100644 index 0000000000..c7773e028e --- /dev/null +++ b/react-app/bower_components/webcomponentsjs/HTMLImports.min.js @@ -0,0 +1,11 @@ +/** + * @license + * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +// @version 0.7.21 +"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){E.push(e),g||(g=!0,f(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o0){var o=n[r-1],i=m(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;nm&&(h=s[m]);m++)a(h)?(u.push(this),d++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)d(t)&&c(t)}function d(e){return"link"===e.localName&&"import"===e.rel}function c(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),m=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=m(document),f={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return m(e)},configurable:!0};Object.defineProperty(document,"_currentScript",f),Object.defineProperty(p,"_currentScript",f);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",b="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)c(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,d=a.length;d>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,d=e.flags,c=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(d.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){d.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,d.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),c&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,d=0;s>d&&(i=a[d]);d++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,d=e.rootDocument,c=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){m.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);m.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===d?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var d=this.documents[e];void 0===d&&(d=a?null:o(r,s||e),d&&(d.__importLink=n,this.bootDocument(d)),this.documents[e]=d),n.__doc=d}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},m=new c(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(d,"baseURI",p)}e.importer=h,e.importLoader=m}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,d=e.length;d>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports); \ No newline at end of file diff --git a/react-app/bower_components/webcomponentsjs/MutationObserver.js b/react-app/bower_components/webcomponentsjs/MutationObserver.js new file mode 100644 index 0000000000..84965e5752 --- /dev/null +++ b/react-app/bower_components/webcomponentsjs/MutationObserver.js @@ -0,0 +1,350 @@ +/** + * @license + * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +// @version 0.7.21 +if (typeof WeakMap === "undefined") { + (function() { + var defineProperty = Object.defineProperty; + var counter = Date.now() % 1e9; + var WeakMap = function() { + this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); + }; + WeakMap.prototype = { + set: function(key, value) { + var entry = key[this.name]; + if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { + value: [ key, value ], + writable: true + }); + return this; + }, + get: function(key) { + var entry; + return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; + }, + "delete": function(key) { + var entry = key[this.name]; + if (!entry || entry[0] !== key) return false; + entry[0] = entry[1] = undefined; + return true; + }, + has: function(key) { + var entry = key[this.name]; + if (!entry) return false; + return entry[0] === key; + } + }; + window.WeakMap = WeakMap; + })(); +} + +(function(global) { + if (global.JsMutationObserver) { + return; + } + var registrationsTable = new WeakMap(); + var setImmediate; + if (/Trident|Edge/.test(navigator.userAgent)) { + setImmediate = setTimeout; + } else if (window.setImmediate) { + setImmediate = window.setImmediate; + } else { + var setImmediateQueue = []; + var sentinel = String(Math.random()); + window.addEventListener("message", function(e) { + if (e.data === sentinel) { + var queue = setImmediateQueue; + setImmediateQueue = []; + queue.forEach(function(func) { + func(); + }); + } + }); + setImmediate = function(func) { + setImmediateQueue.push(func); + window.postMessage(sentinel, "*"); + }; + } + var isScheduled = false; + var scheduledObservers = []; + function scheduleCallback(observer) { + scheduledObservers.push(observer); + if (!isScheduled) { + isScheduled = true; + setImmediate(dispatchCallbacks); + } + } + function wrapIfNeeded(node) { + return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; + } + function dispatchCallbacks() { + isScheduled = false; + var observers = scheduledObservers; + scheduledObservers = []; + observers.sort(function(o1, o2) { + return o1.uid_ - o2.uid_; + }); + var anyNonEmpty = false; + observers.forEach(function(observer) { + var queue = observer.takeRecords(); + removeTransientObserversFor(observer); + if (queue.length) { + observer.callback_(queue, observer); + anyNonEmpty = true; + } + }); + if (anyNonEmpty) dispatchCallbacks(); + } + function removeTransientObserversFor(observer) { + observer.nodes_.forEach(function(node) { + var registrations = registrationsTable.get(node); + if (!registrations) return; + registrations.forEach(function(registration) { + if (registration.observer === observer) registration.removeTransientObservers(); + }); + }); + } + function forEachAncestorAndObserverEnqueueRecord(target, callback) { + for (var node = target; node; node = node.parentNode) { + var registrations = registrationsTable.get(node); + if (registrations) { + for (var j = 0; j < registrations.length; j++) { + var registration = registrations[j]; + var options = registration.options; + if (node !== target && !options.subtree) continue; + var record = callback(options); + if (record) registration.enqueue(record); + } + } + } + } + var uidCounter = 0; + function JsMutationObserver(callback) { + this.callback_ = callback; + this.nodes_ = []; + this.records_ = []; + this.uid_ = ++uidCounter; + } + JsMutationObserver.prototype = { + observe: function(target, options) { + target = wrapIfNeeded(target); + if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { + throw new SyntaxError(); + } + var registrations = registrationsTable.get(target); + if (!registrations) registrationsTable.set(target, registrations = []); + var registration; + for (var i = 0; i < registrations.length; i++) { + if (registrations[i].observer === this) { + registration = registrations[i]; + registration.removeListeners(); + registration.options = options; + break; + } + } + if (!registration) { + registration = new Registration(this, target, options); + registrations.push(registration); + this.nodes_.push(target); + } + registration.addListeners(); + }, + disconnect: function() { + this.nodes_.forEach(function(node) { + var registrations = registrationsTable.get(node); + for (var i = 0; i < registrations.length; i++) { + var registration = registrations[i]; + if (registration.observer === this) { + registration.removeListeners(); + registrations.splice(i, 1); + break; + } + } + }, this); + this.records_ = []; + }, + takeRecords: function() { + var copyOfRecords = this.records_; + this.records_ = []; + return copyOfRecords; + } + }; + function MutationRecord(type, target) { + this.type = type; + this.target = target; + this.addedNodes = []; + this.removedNodes = []; + this.previousSibling = null; + this.nextSibling = null; + this.attributeName = null; + this.attributeNamespace = null; + this.oldValue = null; + } + function copyMutationRecord(original) { + var record = new MutationRecord(original.type, original.target); + record.addedNodes = original.addedNodes.slice(); + record.removedNodes = original.removedNodes.slice(); + record.previousSibling = original.previousSibling; + record.nextSibling = original.nextSibling; + record.attributeName = original.attributeName; + record.attributeNamespace = original.attributeNamespace; + record.oldValue = original.oldValue; + return record; + } + var currentRecord, recordWithOldValue; + function getRecord(type, target) { + return currentRecord = new MutationRecord(type, target); + } + function getRecordWithOldValue(oldValue) { + if (recordWithOldValue) return recordWithOldValue; + recordWithOldValue = copyMutationRecord(currentRecord); + recordWithOldValue.oldValue = oldValue; + return recordWithOldValue; + } + function clearRecords() { + currentRecord = recordWithOldValue = undefined; + } + function recordRepresentsCurrentMutation(record) { + return record === recordWithOldValue || record === currentRecord; + } + function selectRecord(lastRecord, newRecord) { + if (lastRecord === newRecord) return lastRecord; + if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; + return null; + } + function Registration(observer, target, options) { + this.observer = observer; + this.target = target; + this.options = options; + this.transientObservedNodes = []; + } + Registration.prototype = { + enqueue: function(record) { + var records = this.observer.records_; + var length = records.length; + if (records.length > 0) { + var lastRecord = records[length - 1]; + var recordToReplaceLast = selectRecord(lastRecord, record); + if (recordToReplaceLast) { + records[length - 1] = recordToReplaceLast; + return; + } + } else { + scheduleCallback(this.observer); + } + records[length] = record; + }, + addListeners: function() { + this.addListeners_(this.target); + }, + addListeners_: function(node) { + var options = this.options; + if (options.attributes) node.addEventListener("DOMAttrModified", this, true); + if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); + if (options.childList) node.addEventListener("DOMNodeInserted", this, true); + if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); + }, + removeListeners: function() { + this.removeListeners_(this.target); + }, + removeListeners_: function(node) { + var options = this.options; + if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); + if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); + if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); + if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); + }, + addTransientObserver: function(node) { + if (node === this.target) return; + this.addListeners_(node); + this.transientObservedNodes.push(node); + var registrations = registrationsTable.get(node); + if (!registrations) registrationsTable.set(node, registrations = []); + registrations.push(this); + }, + removeTransientObservers: function() { + var transientObservedNodes = this.transientObservedNodes; + this.transientObservedNodes = []; + transientObservedNodes.forEach(function(node) { + this.removeListeners_(node); + var registrations = registrationsTable.get(node); + for (var i = 0; i < registrations.length; i++) { + if (registrations[i] === this) { + registrations.splice(i, 1); + break; + } + } + }, this); + }, + handleEvent: function(e) { + e.stopImmediatePropagation(); + switch (e.type) { + case "DOMAttrModified": + var name = e.attrName; + var namespace = e.relatedNode.namespaceURI; + var target = e.target; + var record = new getRecord("attributes", target); + record.attributeName = name; + record.attributeNamespace = namespace; + var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; + forEachAncestorAndObserverEnqueueRecord(target, function(options) { + if (!options.attributes) return; + if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { + return; + } + if (options.attributeOldValue) return getRecordWithOldValue(oldValue); + return record; + }); + break; + + case "DOMCharacterDataModified": + var target = e.target; + var record = getRecord("characterData", target); + var oldValue = e.prevValue; + forEachAncestorAndObserverEnqueueRecord(target, function(options) { + if (!options.characterData) return; + if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); + return record; + }); + break; + + case "DOMNodeRemoved": + this.addTransientObserver(e.target); + + case "DOMNodeInserted": + var changedNode = e.target; + var addedNodes, removedNodes; + if (e.type === "DOMNodeInserted") { + addedNodes = [ changedNode ]; + removedNodes = []; + } else { + addedNodes = []; + removedNodes = [ changedNode ]; + } + var previousSibling = changedNode.previousSibling; + var nextSibling = changedNode.nextSibling; + var record = getRecord("childList", e.target.parentNode); + record.addedNodes = addedNodes; + record.removedNodes = removedNodes; + record.previousSibling = previousSibling; + record.nextSibling = nextSibling; + forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { + if (!options.childList) return; + return record; + }); + } + clearRecords(); + } + }; + global.JsMutationObserver = JsMutationObserver; + if (!global.MutationObserver) { + global.MutationObserver = JsMutationObserver; + JsMutationObserver._isPolyfilled = true; + } +})(self); \ No newline at end of file diff --git a/react-app/bower_components/webcomponentsjs/MutationObserver.min.js b/react-app/bower_components/webcomponentsjs/MutationObserver.min.js new file mode 100644 index 0000000000..a50ec72ab0 --- /dev/null +++ b/react-app/bower_components/webcomponentsjs/MutationObserver.min.js @@ -0,0 +1,11 @@ +/** + * @license + * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +// @version 0.7.21 +"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,r=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};r.prototype={set:function(t,r){var i=t[this.name];return i&&i[0]===t?i[1]=r:e(t,this.name,{value:[t,r],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=r}(),function(e){function t(e){N.push(e),O||(O=!0,b(i))}function r(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function i(){O=!1;var e=N;N=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var r=e.takeRecords();n(e),r.length&&(e.callback_(r,e),t=!0)}),t&&i()}function n(e){e.nodes_.forEach(function(t){var r=p.get(t);r&&r.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function a(e,t){for(var r=e;r;r=r.parentNode){var i=p.get(r);if(i)for(var n=0;n0){var n=r[i-1],a=l(n,e);if(a)return void(r[i-1]=a)}else t(this.observer);r[i]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=p.get(e);t||p.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=p.get(e),r=0;r` tags in the main document block the loading of such imports. This is to ensure the imports have loaded and any registered elements in them have been upgraded. + +The webcomponents.js and webcomponents-lite.js polyfills parse element definitions and handle their upgrade asynchronously. If prematurely fetching the element from the DOM before it has an opportunity to upgrade, you'll be working with an `HTMLUnknownElement`. + +For these situations (or when you need an approximate replacement for the Polymer 0.5 `polymer-ready` behavior), you can use the `WebComponentsReady` event as a signal before interacting with the element. The criteria for this event to fire is all Custom Elements with definitions registered by the time HTML Imports available at load time have loaded have upgraded. + +```js +window.addEventListener('WebComponentsReady', function(e) { + // imports are loaded and elements have been registered + console.log('Components are ready'); +}); +``` + +## Known Issues + + * [Limited CSS encapsulation](#encapsulation) + * [Element wrapping / unwrapping limitations](#wrapping) + * [Custom element's constructor property is unreliable](#constructor) + * [Contenteditable elements do not trigger MutationObserver](#contentedit) + * [ShadowCSS: :host-context(...):host(...) doesn't work](#hostcontext) + * [ShadowCSS: :host(.zot:not(.bar:nth-child(2))) doesn't work](#nestedparens) + * [HTML imports: document.currentScript doesn't work as expected](#currentscript) + * [execCommand isn't supported under Shadow DOM](#execcommand) + +### Limited CSS encapsulation +Under native Shadow DOM, CSS selectors cannot cross the shadow boundary. This means document level styles don't apply to shadow roots, and styles defined within a shadow root don't apply outside of that shadow root. [Several selectors](http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/) are provided to be able to deal with the shadow boundary. + +The Shadow DOM polyfill can't prevent document styles from leaking into shadow roots. It can, however, encapsulate styles within shadow roots to some extent. This behavior isn't automatically emulated by the Shadow DOM polyfill, but it can be achieved by manually using the included ShadowCSS shim: + +``` +WebComponents.ShadowCSS.shimStyling( shadowRoot, scope ); +``` + +... where `shadowRoot` is the shadow root of a DOM element, and `scope` is the name of the scope used to prefix the selectors. This removes all ` \ No newline at end of file diff --git a/react-app/data/contacts.json b/react-app/data/contacts.json new file mode 100644 index 0000000000..2cde665a7f --- /dev/null +++ b/react-app/data/contacts.json @@ -0,0 +1,11002 @@ +[ + { + "index": 0, + "name": "Liz Grimes", + "first": "Isabel", + "last": "Conrad", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/enda/73.jpg", + "expanded": false, + "guid": "8ea90ed8-83e1-4a28-a371-e5c0e1d0e021", + "integer": 28, + "date": "Sun Aug 14 1994 03:27:03 GMT-0700 (PDT)", + "shortText": "est ad reprehenderit occaecat consequat", + "mediumText": "Non duis commodo dolore et esse non adipisicing nisi tempor. Nisi culpa adipisicing quis dolore amet anim nulla aliqua excepteur labore. Adipisicing fugiat anim commodo velit in nisi ex exercitation.", + "longText": "Id aliqua ullamco ullamco commodo ipsum Lorem. Amet ut eu voluptate cillum occaecat Lorem et cillum excepteur ullamco mollit enim. Ea nostrud dolore culpa nulla nostrud ex voluptate anim laborum esse commodo sunt. Velit laboris pariatur labore dolore occaecat enim fugiat qui. Sit in eu ex aute minim deserunt qui consectetur laboris nostrud ad quis qui id.\r\n", + "address": "3 Vista Place", + "city": "Longbranch", + "state": "North Carolina", + "zip": 64470, + "country": "Lesotho", + "email": "isabelconrad@scentric.com", + "phone": "(817) 426-2901", + "color": "rgb(76,120,108)" + }, + { + "index": 1, + "name": "Frazier Lara", + "first": "Jocelyn", + "last": "Wooten", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guillogo/73.jpg", + "expanded": false, + "guid": "7017f9b1-690e-4c9d-8eee-f63285ca5148", + "integer": 10, + "date": "Tue May 24 1988 14:10:20 GMT-0700 (PDT)", + "shortText": "consectetur culpa adipisicing voluptate enim", + "mediumText": "Occaecat in do proident et deserunt quis commodo veniam occaecat mollit. Nulla enim elit nulla excepteur.", + "longText": "Laboris nisi cupidatat occaecat officia ea sunt ex deserunt mollit. Est laboris in amet eu reprehenderit nisi minim. Id nulla fugiat ad nostrud nostrud tempor adipisicing. Minim duis esse irure nostrud cillum cupidatat. Cupidatat proident labore id duis deserunt cupidatat do incididunt sint minim consectetur. Ea Lorem reprehenderit fugiat culpa dolore consequat exercitation labore sit sunt culpa laborum dolore.\r\nAd nisi incididunt ea ex ullamco magna tempor. Ipsum fugiat commodo reprehenderit deserunt in adipisicing. Reprehenderit aliqua mollit ut enim. Veniam ipsum occaecat nisi ut pariatur dolor magna ea tempor eiusmod adipisicing aliqua adipisicing. Fugiat irure laborum incididunt nostrud cupidatat consectetur.\r\nEx esse cupidatat exercitation aute eu est excepteur tempor consectetur elit elit amet. Ullamco sunt aliqua veniam eu eiusmod esse sit. Incididunt aute non ex irure in deserunt. Nulla sit nulla sunt quis Lorem tempor officia exercitation nulla esse ipsum. Non qui sint ullamco minim ut consequat consectetur Lorem consequat.\r\nEiusmod irure aliqua magna non ea enim incididunt. Irure ea sunt deserunt laboris qui. Officia nostrud aute commodo sit sunt nisi irure officia cillum tempor id do tempor et. Est cupidatat esse consequat laboris culpa minim exercitation laboris eu. Ea incididunt nulla fugiat est pariatur do velit consectetur. Veniam dolor mollit veniam dolore ea consequat qui dolore deserunt adipisicing officia officia eu est. Velit dolor nostrud veniam reprehenderit consectetur quis ad consequat aliquip dolore labore.\r\nIn nisi non sunt elit aute nisi elit in adipisicing excepteur ex. Anim nulla ex tempor qui nulla dolor aute fugiat et sit ipsum sunt eiusmod sunt. Irure est dolore proident qui est adipisicing minim. Sint consequat adipisicing aute amet adipisicing adipisicing. Do labore ea enim occaecat cupidatat et. Elit deserunt anim commodo ullamco. Consequat elit excepteur nisi mollit ea.\r\n", + "address": "2 Catherine Street", + "city": "Healy", + "state": "Connecticut", + "zip": 41121, + "country": "Mongolia", + "email": "jocelynwooten@scentric.com", + "phone": "(901) 441-2582", + "color": "rgb(134,91,60)" + }, + { + "index": 2, + "name": "Dora Griffith", + "first": "Valentine", + "last": "Meyer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iboldurev/73.jpg", + "expanded": false, + "guid": "8c3bd9ad-e8d6-4ea4-85e6-d145295f3f91", + "integer": 99, + "date": "Sat Feb 17 1973 03:45:57 GMT-0800 (PST)", + "shortText": "veniam qui", + "mediumText": "Nulla ex consectetur dolore dolore cillum. Proident dolor cupidatat consequat irure enim nostrud aliqua fugiat tempor commodo et eiusmod irure. Lorem deserunt eiusmod laborum velit tempor do nostrud reprehenderit exercitation amet occaecat eiusmod aliqua sint. Dolore commodo ex ea id veniam ullamco et cupidatat dolore. Sit nostrud minim irure sint eiusmod ea est est ipsum eiusmod.", + "longText": "Ullamco eiusmod velit labore sunt deserunt excepteur commodo sunt anim incididunt ullamco adipisicing labore Lorem. Est id nostrud ad eiusmod ad ex aliqua quis irure dolore nostrud. Aute nostrud magna tempor ex pariatur cupidatat occaecat cillum ipsum reprehenderit cillum aute proident ex. Lorem ea ipsum quis adipisicing sit exercitation ipsum. Consectetur amet nulla id amet exercitation labore minim eu nisi ullamco id do. Cillum laborum sint elit laborum eiusmod irure nulla irure.\r\nId officia mollit commodo do laborum ut officia officia. Irure reprehenderit aliqua mollit pariatur. Exercitation laborum reprehenderit fugiat nisi pariatur anim mollit magna aliquip eu labore culpa reprehenderit. Irure ad quis magna laboris nisi commodo.\r\nPariatur ea exercitation labore laborum amet et mollit. Magna tempor laboris officia commodo exercitation consectetur ullamco esse. Non cillum laborum et et nisi. Culpa laboris ad amet est minim qui ea. Consequat nulla voluptate incididunt enim qui proident consectetur et adipisicing mollit. Esse elit incididunt excepteur deserunt reprehenderit quis irure eu Lorem tempor. Qui ea pariatur laborum culpa nulla eu consectetur exercitation.\r\nDo nisi occaecat eiusmod ad cupidatat nostrud deserunt ea ex ullamco do exercitation. Sit aliqua magna Lorem tempor commodo duis duis eu ex. Do labore voluptate proident elit ad id. Lorem laboris nostrud esse occaecat. Deserunt elit nisi et labore fugiat consectetur excepteur esse culpa. Amet ipsum sunt minim sint laboris incididunt. Esse excepteur excepteur mollit ea ipsum exercitation.\r\nIn dolore nulla eiusmod exercitation culpa in voluptate voluptate ipsum dolore proident. Minim enim veniam occaecat deserunt eiusmod consectetur consectetur elit id magna laboris reprehenderit nisi. Magna enim cupidatat non laborum minim anim consequat. Exercitation cupidatat tempor irure consequat.\r\n", + "address": "4 Whitty Lane", + "city": "Nicholson", + "state": "South Carolina", + "zip": 41343, + "country": "Germany", + "email": "valentinemeyer@scentric.com", + "phone": "(956) 428-2996", + "color": "rgb(201,142,97)" + }, + { + "index": 3, + "name": "Shelley Molina", + "first": "Silva", + "last": "Alexander", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/smalonso/73.jpg", + "expanded": false, + "guid": "37224065-ac71-4716-be9a-108ecddfee47", + "integer": 16, + "date": "Wed Aug 02 1995 07:03:12 GMT-0700 (PDT)", + "shortText": "laboris do velit ipsum non", + "mediumText": "Eiusmod ut magna sint ut dolor magna anim ipsum non velit. Occaecat reprehenderit ex aliquip consequat. Eu dolor non in pariatur dolore minim.", + "longText": "Cillum ullamco ullamco sunt sunt incididunt ea commodo enim nulla irure irure. Magna sunt incididunt do duis ad. Magna pariatur dolore commodo duis reprehenderit commodo aliqua anim sit deserunt veniam aute officia. Consequat non deserunt deserunt cupidatat ad do culpa. Labore aliqua aliqua ex sint ut.\r\nEnim ullamco elit eu mollit id ullamco. Tempor velit amet anim sint est ea consequat commodo ea. Aliquip magna veniam pariatur sint ullamco est aliquip do reprehenderit qui. Anim nulla occaecat commodo quis velit fugiat veniam ut.\r\nEst nisi proident id incididunt occaecat aliquip in cillum reprehenderit non et. Incididunt consectetur fugiat aute excepteur eu reprehenderit ex laboris dolore dolor reprehenderit mollit. Amet laboris ipsum ullamco id pariatur commodo excepteur est sint cillum incididunt.\r\n", + "address": "2 Berkeley Place", + "city": "Manila", + "state": "Michigan", + "zip": 22009, + "country": "Thailand", + "email": "silvaalexander@scentric.com", + "phone": "(823) 415-2224", + "color": "rgb(113,105,251)" + }, + { + "index": 4, + "name": "Rita Lopez", + "first": "Hopkins", + "last": "Wong", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taherrapee/73.jpg", + "expanded": false, + "guid": "1ea0922e-179d-4057-abeb-d8fe63e55da8", + "integer": 94, + "date": "Wed Sep 21 2011 04:03:55 GMT-0700 (PDT)", + "shortText": "ad esse ullamco", + "mediumText": "Fugiat nostrud et consectetur mollit labore incididunt est duis nostrud id tempor veniam ad. Nulla voluptate est irure ipsum commodo do nostrud. Minim aliqua voluptate officia sit tempor nulla esse pariatur eu. Ipsum deserunt est magna veniam adipisicing nisi aute officia.", + "longText": "Officia do consequat ullamco est voluptate voluptate. Esse tempor irure aute ullamco. Aliqua veniam esse mollit veniam elit consectetur aliqua anim. Irure aute nostrud voluptate tempor consequat ut elit elit ipsum cupidatat. Aliqua duis duis minim tempor mollit qui. Labore id adipisicing laborum commodo. Tempor aliqua velit excepteur velit laborum Lorem id amet pariatur.\r\nEt nisi reprehenderit aliquip dolore ea ut aliquip duis laboris pariatur tempor cillum. Pariatur quis mollit aliquip ut proident sunt. Est aute laboris tempor officia. Sint anim qui officia deserunt amet Lorem occaecat aliquip. In eiusmod elit anim id elit eiusmod ex veniam sit sit adipisicing aliquip.\r\nQuis irure fugiat labore ex pariatur fugiat est irure. Deserunt commodo in nostrud sit Lorem amet non quis commodo eu. Nulla voluptate id enim commodo fugiat esse qui magna nostrud occaecat. Excepteur sunt cupidatat esse consequat sit voluptate ipsum magna excepteur deserunt sunt laboris labore minim. Labore ipsum ullamco dolore sint ut aliqua id nisi sunt id ipsum ea aute magna. Consequat qui commodo velit esse anim reprehenderit ea anim ut duis et veniam deserunt. Consequat amet dolor esse cupidatat incididunt exercitation laboris esse in labore.\r\nCulpa commodo commodo veniam elit elit. Consequat proident deserunt voluptate ea ut consectetur sit ex ex proident dolore nisi. Mollit est mollit sint eiusmod mollit voluptate adipisicing tempor cupidatat nisi duis dolor irure id.\r\nEu velit aliquip consectetur mollit. Officia ipsum incididunt cupidatat occaecat consequat adipisicing. Aute cupidatat quis quis consectetur aliqua. Consequat ut eu exercitation elit Lorem incididunt sint commodo ut consectetur eu non. Pariatur pariatur ut sunt aliquip exercitation nostrud mollit cillum nostrud ea cillum.\r\n", + "address": "4 Tompkins Avenue", + "city": "Movico", + "state": "Maine", + "zip": 89440, + "country": "Seychelles", + "email": "hopkinswong@scentric.com", + "phone": "(814) 488-2063", + "color": "rgb(133,126,66)" + }, + { + "index": 5, + "name": "Wagner Shelton", + "first": "Harriet", + "last": "Sherman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ismailmayat/73.jpg", + "expanded": false, + "guid": "46a4a1bc-97af-46e0-aedd-c3cc42e6b8f5", + "integer": 27, + "date": "Wed Jul 07 2010 05:48:57 GMT-0700 (PDT)", + "shortText": "do dolore tempor labore", + "mediumText": "Enim exercitation incididunt minim eiusmod est enim qui ex sit. Sit duis eiusmod officia nostrud ullamco aliquip. Minim ipsum ad fugiat dolore sint nisi tempor. Anim minim sint nisi est ea id cillum adipisicing ullamco fugiat velit aute.", + "longText": "Do veniam eiusmod sint irure. Ad aute magna consequat sint enim duis ad laboris mollit dolore esse ex do labore. Minim pariatur incididunt velit nostrud proident minim sit ad ex Lorem dolore. Esse do do sit veniam officia non sunt aliquip non exercitation id aliquip voluptate elit.\r\n", + "address": "3 Stratford Road", + "city": "Makena", + "state": "Kansas", + "zip": 21389, + "country": "Chad", + "email": "harrietsherman@scentric.com", + "phone": "(887) 497-3612", + "color": "rgb(195,89,110)" + }, + { + "index": 6, + "name": "Bethany Adkins", + "first": "Stacie", + "last": "Bartlett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlyson/73.jpg", + "expanded": false, + "guid": "17aac57d-4644-44d8-8a6b-b2eedd3d42dc", + "integer": 49, + "date": "Sun Mar 14 1999 23:13:33 GMT-0800 (PST)", + "shortText": "deserunt", + "mediumText": "Lorem dolor sint labore minim eu ullamco cupidatat ea velit minim. Sint eiusmod dolor nisi adipisicing pariatur esse sint anim labore consectetur irure exercitation cillum. Quis labore nulla occaecat incididunt qui ex dolor voluptate sunt eiusmod sunt proident occaecat excepteur. Dolore quis magna adipisicing esse enim occaecat.", + "longText": "Aute labore ipsum id proident occaecat cillum magna commodo excepteur Lorem et ea incididunt. Labore reprehenderit minim ipsum id aliquip fugiat elit. Sit in esse aute mollit id elit sint amet minim commodo id. Esse tempor aliqua enim amet anim commodo non anim nisi.\r\n", + "address": "4 Luquer Street", + "city": "Newcastle", + "state": "Iowa", + "zip": 72190, + "country": "Uruguay", + "email": "staciebartlett@scentric.com", + "phone": "(957) 412-3261", + "color": "rgb(164,84,221)" + }, + { + "index": 7, + "name": "Angelia Rowe", + "first": "Charlene", + "last": "Stevens", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thewillbeard/73.jpg", + "expanded": false, + "guid": "f3c6a195-d50e-479f-9c2a-c54c2a629852", + "integer": 13, + "date": "Sat Jan 04 1992 04:10:22 GMT-0800 (PST)", + "shortText": "eu reprehenderit aliquip minim", + "mediumText": "Fugiat ipsum ex irure dolore. Reprehenderit laborum proident commodo ut qui ea reprehenderit duis occaecat nostrud aliqua.", + "longText": "Esse ullamco veniam aliquip cillum aliqua veniam in consequat eu cupidatat. Ad amet reprehenderit sit anim dolor sit amet labore magna irure consequat duis cupidatat cillum. Voluptate aute consectetur ea elit labore nulla reprehenderit excepteur sit laboris sit.\r\nUllamco aliqua adipisicing velit adipisicing nulla anim cillum sunt mollit labore. Et anim aliquip adipisicing non. Exercitation consectetur nisi aute ipsum eiusmod nisi dolore. Excepteur deserunt reprehenderit occaecat sunt eu culpa ullamco proident qui excepteur. Sit proident sunt elit aliqua sit dolore deserunt officia fugiat laborum eiusmod nisi est dolor.\r\nQuis fugiat duis ullamco mollit do. Cillum cupidatat magna do id proident ut nisi do nostrud fugiat cillum incididunt. Est enim tempor labore tempor qui ipsum reprehenderit aliquip commodo quis est aute eiusmod.\r\nFugiat deserunt esse laborum labore sit nisi mollit eu dolore elit non ullamco. Velit id et quis aute esse culpa deserunt nostrud. Quis consequat consectetur fugiat ex aute sit proident aliqua dolor laboris et. Ipsum aliquip minim nostrud nostrud sunt quis eiusmod ea fugiat anim sint est duis aute.\r\nVelit aliqua cillum laboris sit officia deserunt incididunt. Consequat labore ad incididunt incididunt excepteur ex ad sunt dolore nulla qui pariatur. Cupidatat aute qui velit ipsum mollit. Aliqua veniam velit elit nostrud do consequat in in ea ea. Proident ea in qui adipisicing tempor irure qui eu ex dolore deserunt. Ipsum voluptate nulla id id culpa consectetur cillum nulla amet. Amet elit fugiat dolore anim laborum irure aute.\r\n", + "address": "4 Tiffany Place", + "city": "Dargan", + "state": "Vermont", + "zip": 31427, + "country": "Burkina Faso", + "email": "charlenestevens@scentric.com", + "phone": "(946) 404-2511", + "color": "rgb(99,147,74)" + }, + { + "index": 8, + "name": "Knox Rivers", + "first": "Reyes", + "last": "Hartman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tgormtx/73.jpg", + "expanded": false, + "guid": "88e71d65-5a7a-4973-a1dc-9f5c1df485c8", + "integer": 41, + "date": "Sat May 28 1994 15:27:35 GMT-0700 (PDT)", + "shortText": "incididunt ut", + "mediumText": "Quis voluptate eu ea et id voluptate.", + "longText": "Nostrud esse proident laborum et ex. Cupidatat proident ex velit id fugiat nulla exercitation Lorem velit ullamco exercitation excepteur. Occaecat reprehenderit occaecat in in deserunt. Ea quis laborum cupidatat ullamco aliquip. Duis proident ad mollit do eiusmod non minim sint voluptate nisi in ea deserunt consequat. Nostrud aliqua voluptate sit aliqua. Do laborum dolor ex commodo irure.\r\nIrure ipsum laboris elit ullamco labore cillum consequat et esse reprehenderit culpa elit sint consectetur. Aute exercitation excepteur Lorem do occaecat voluptate ullamco ullamco commodo sint deserunt. Esse nulla laboris non dolore adipisicing fugiat enim Lorem cillum do id proident quis eu. Ullamco officia consectetur aliqua labore cupidatat anim sint. Ipsum aute aliquip magna nostrud sint officia id irure. Non ad non reprehenderit id sunt cupidatat esse tempor officia proident occaecat qui mollit ut.\r\nExcepteur excepteur ullamco aute deserunt magna laboris ipsum ullamco laborum laboris nostrud. Excepteur sunt fugiat aliquip nostrud magna cillum commodo voluptate amet ad laboris. Officia minim sint dolor nostrud fugiat. Consequat velit sint irure amet cillum enim sunt pariatur amet mollit aute ipsum cupidatat do.\r\n", + "address": "3 Wythe Place", + "city": "Coldiron", + "state": "Nebraska", + "zip": 76971, + "country": "Greenland", + "email": "reyeshartman@scentric.com", + "phone": "(910) 533-3832", + "color": "rgb(99,55,193)" + }, + { + "index": 9, + "name": "Warren Scott", + "first": "Alissa", + "last": "Duncan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/73.jpg", + "expanded": false, + "guid": "dfc23019-ab40-4597-91fe-74bcf60a9e2b", + "integer": 54, + "date": "Sun Feb 08 2009 21:57:53 GMT-0800 (PST)", + "shortText": "ullamco aliquip veniam", + "mediumText": "Officia est sint velit magna reprehenderit.", + "longText": "Eu ipsum ipsum nisi voluptate sit voluptate occaecat sunt laborum do aute. Et id amet consequat culpa sunt. Quis aliquip adipisicing velit officia adipisicing cupidatat. Sint Lorem et consequat consectetur. Anim adipisicing ullamco dolore pariatur aliquip quis aliqua qui cillum amet amet fugiat.\r\nCupidatat fugiat exercitation duis proident in esse eiusmod dolore nisi ut. Anim dolor minim elit est ex eiusmod est. In elit pariatur non non veniam nostrud consectetur.\r\n", + "address": "4 Henderson Walk", + "city": "Oley", + "state": "Florida", + "zip": 38878, + "country": "Fiji", + "email": "alissaduncan@scentric.com", + "phone": "(876) 584-3746", + "color": "rgb(218,58,52)" + }, + { + "index": 10, + "name": "Mai Shepherd", + "first": "Christina", + "last": "Craft", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mwarkentin/73.jpg", + "expanded": false, + "guid": "7b829e11-da52-4302-a645-4711c9af7df2", + "integer": 40, + "date": "Sat Apr 18 1992 20:34:36 GMT-0700 (PDT)", + "shortText": "culpa laboris aliquip veniam nostrud", + "mediumText": "Dolore voluptate esse eiusmod ea reprehenderit aliqua sunt magna pariatur tempor veniam ad reprehenderit nostrud. Deserunt esse fugiat enim nisi in fugiat eu. Enim sit deserunt nostrud adipisicing laboris voluptate eu do non exercitation culpa deserunt. Ullamco cillum occaecat cillum adipisicing cupidatat deserunt qui. Tempor nisi duis irure cillum occaecat ullamco cillum quis enim exercitation proident proident excepteur.", + "longText": "Quis incididunt in cillum in sit deserunt excepteur ipsum magna consectetur nulla. Incididunt cillum reprehenderit ut cupidatat proident officia commodo eiusmod id nulla aliquip aliquip anim pariatur. Sint tempor do elit nisi minim consequat cupidatat non mollit ex. Laboris ullamco laborum pariatur ea exercitation eu tempor. Aute incididunt voluptate ut nulla veniam sint. Eu aliquip labore aliquip dolore sunt reprehenderit elit labore elit aliqua reprehenderit duis quis. Esse qui pariatur nostrud nostrud irure nulla aliqua non pariatur.\r\nReprehenderit sunt consequat laborum eu tempor ad Lorem commodo consequat. Incididunt officia est incididunt aliquip mollit pariatur enim qui pariatur non anim veniam aute ullamco. Fugiat nisi aliqua ex in pariatur cillum aliquip nisi elit dolor laborum labore do sit.\r\nConsectetur non sit aliqua esse est aliqua. Deserunt consequat Lorem dolore proident elit occaecat in. Esse commodo aute minim adipisicing enim eiusmod aliqua magna ea magna. Qui proident id adipisicing non ea non quis sit. Et dolore dolore labore non consequat.\r\nNostrud qui irure laborum ipsum occaecat consectetur laboris. Sunt irure eiusmod irure labore cillum veniam enim. Do aliquip proident et amet sunt laborum dolore amet reprehenderit exercitation do id duis. Sunt magna labore minim nostrud enim laborum mollit ullamco amet laborum mollit magna consequat. Sunt eiusmod cupidatat tempor duis exercitation ad minim laboris. Magna dolor nulla et ut eiusmod incididunt Lorem anim magna. Ipsum sit sint quis eu deserunt nulla nisi ad in amet proident.\r\n", + "address": "3 Ocean Court", + "city": "Fairmount", + "state": "New Jersey", + "zip": 95002, + "country": "Viet Nam", + "email": "christinacraft@scentric.com", + "phone": "(842) 503-2389", + "color": "rgb(181,253,141)" + }, + { + "index": 11, + "name": "Flora Tran", + "first": "Burt", + "last": "Landry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/herkulano/73.jpg", + "expanded": false, + "guid": "3efeb9cc-5705-4e17-b800-42ee8e354d30", + "integer": 64, + "date": "Fri Apr 30 1982 14:23:53 GMT-0700 (PDT)", + "shortText": "nostrud ipsum", + "mediumText": "Excepteur mollit velit nulla nisi culpa irure laboris cillum sunt ullamco. Laborum minim excepteur dolore ea labore Lorem eiusmod adipisicing.", + "longText": "Laborum exercitation id cupidatat voluptate cupidatat laboris id. Do exercitation dolor anim occaecat officia. Fugiat esse et aliqua incididunt consequat.\r\n", + "address": "2 Butler Street", + "city": "Walker", + "state": "Wisconsin", + "zip": 56241, + "country": "France, Metropolitan", + "email": "burtlandry@scentric.com", + "phone": "(914) 461-3510", + "color": "rgb(95,147,193)" + }, + { + "index": 12, + "name": "Crawford Jordan", + "first": "Baldwin", + "last": "Hammond", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jonny_moon/73.jpg", + "expanded": false, + "guid": "758e8af9-6a3c-47e1-a062-b49e6263b6e8", + "integer": 80, + "date": "Sat Sep 22 2012 18:24:55 GMT-0700 (PDT)", + "shortText": "excepteur eiusmod sit irure", + "mediumText": "Ad esse ex exercitation aliqua cillum. Magna ut est nisi nisi aute enim officia excepteur aliqua. Excepteur aliqua dolor sunt mollit esse officia.", + "longText": "Esse fugiat laborum mollit labore exercitation dolor magna esse anim qui in. Excepteur proident exercitation duis laboris nostrud irure fugiat labore aute ut pariatur ea. Adipisicing labore ad laborum id et ad. Lorem laboris nulla velit pariatur ipsum. Cillum reprehenderit anim dolore mollit dolor. Ut velit veniam pariatur nisi dolor anim ut laborum cillum ut ad.\r\n", + "address": "3 Preston Court", + "city": "Vincent", + "state": "Washington", + "zip": 47560, + "country": "Uganda", + "email": "baldwinhammond@scentric.com", + "phone": "(800) 559-2165", + "color": "rgb(175,176,59)" + }, + { + "index": 13, + "name": "Stanley Williams", + "first": "Laverne", + "last": "Hampton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alyssalowww/73.jpg", + "expanded": false, + "guid": "718262e9-01e7-4016-b068-6edd11a14a38", + "integer": 62, + "date": "Sat Sep 27 1975 16:25:15 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Sunt voluptate magna ullamco cupidatat laborum anim irure.", + "longText": "Duis magna nulla laborum reprehenderit ullamco ipsum irure. Exercitation veniam Lorem Lorem est commodo. In et occaecat et quis veniam quis esse ea anim cupidatat labore.\r\nDeserunt commodo est consectetur velit ullamco eu do nisi consequat culpa sunt. Nulla aliquip veniam anim reprehenderit irure occaecat sit nulla. Culpa Lorem in culpa adipisicing eiusmod aute cillum fugiat voluptate deserunt.\r\nDo do enim et tempor minim aliqua incididunt aute nulla ullamco fugiat magna occaecat in. Mollit aute sunt eu culpa enim magna nulla pariatur cillum amet quis consectetur et laboris. Ex officia nulla dolor ea aliqua est voluptate do Lorem aliquip irure. Lorem velit ad eiusmod aliquip. Amet irure amet consequat est aliqua quis.\r\nEt Lorem magna sunt aliquip dolore minim. Adipisicing ea ipsum dolore commodo labore eiusmod nisi consectetur. Reprehenderit culpa officia culpa mollit. Eu nostrud ullamco elit nostrud incididunt. Reprehenderit officia fugiat est sunt sunt consectetur Lorem ex magna reprehenderit.\r\nElit laboris eiusmod sunt cupidatat elit qui irure adipisicing culpa voluptate laborum eiusmod nisi. Ullamco magna minim enim ea veniam incididunt laborum aliqua qui minim commodo laborum. Consectetur nisi adipisicing voluptate velit ex. Id anim est sunt elit dolore qui incididunt aute voluptate consectetur exercitation. Sint tempor est laboris laborum incididunt fugiat dolor. Laboris est duis ullamco laborum eiusmod incididunt aliquip aute.\r\n", + "address": "4 Varet Street", + "city": "Breinigsville", + "state": "Oregon", + "zip": 54164, + "country": "Antarctica", + "email": "lavernehampton@scentric.com", + "phone": "(988) 478-3842", + "color": "rgb(225,78,134)" + }, + { + "index": 14, + "name": "Key Keith", + "first": "Kirsten", + "last": "Chang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rafelorden/73.jpg", + "expanded": false, + "guid": "1e75c394-1574-4168-a33d-c5895f7af76d", + "integer": 47, + "date": "Tue Sep 18 1990 08:36:33 GMT-0700 (PDT)", + "shortText": "quis proident ea", + "mediumText": "Do voluptate et reprehenderit aute tempor exercitation ipsum enim quis elit dolore in quis. Veniam sunt dolore excepteur consectetur. Lorem occaecat laborum elit veniam ad commodo sint ullamco exercitation aliquip.", + "longText": "Nulla esse et consectetur in nulla nostrud laboris reprehenderit minim sit sunt nisi est fugiat. Duis elit id sit excepteur amet aute culpa incididunt. Nisi veniam ut nisi mollit sunt proident Lorem reprehenderit. Et voluptate occaecat veniam et proident ipsum non cillum aliquip laboris ad.\r\n", + "address": "4 Ryder Avenue", + "city": "Wheatfields", + "state": "Illinois", + "zip": 28092, + "country": "Kiribati", + "email": "kirstenchang@scentric.com", + "phone": "(882) 531-2818", + "color": "rgb(118,83,134)" + }, + { + "index": 15, + "name": "Lizzie Oneal", + "first": "Mercado", + "last": "Hancock", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wim1k/73.jpg", + "expanded": false, + "guid": "8fbb9f3a-64df-4069-9aec-0d3dd0c2dd3f", + "integer": 22, + "date": "Thu Jan 02 1986 03:48:22 GMT-0800 (PST)", + "shortText": "cupidatat pariatur consequat incididunt", + "mediumText": "Non do dolore consequat nostrud. Ullamco dolore sunt anim incididunt aliqua minim mollit ad consectetur do ipsum.", + "longText": "Enim consequat dolor nostrud culpa cillum consequat mollit eu sint est commodo. Sit cillum minim incididunt id mollit eiusmod non nostrud sunt proident aliquip. Excepteur occaecat amet ullamco deserunt. Nisi elit excepteur commodo nisi anim incididunt consequat laboris exercitation pariatur occaecat deserunt sint. Aliquip in non quis enim cillum eiusmod duis pariatur elit proident consequat nostrud proident culpa.\r\nMollit culpa adipisicing laboris occaecat commodo id incididunt aliquip adipisicing ex ipsum elit elit adipisicing. Officia voluptate reprehenderit elit dolore. Consequat culpa officia id ut irure eu Lorem eu mollit excepteur adipisicing aute occaecat amet. Anim reprehenderit enim deserunt velit elit ut amet. Deserunt voluptate eiusmod labore tempor duis in est consequat adipisicing excepteur sunt consequat ea. Occaecat eiusmod fugiat do elit sunt.\r\nDeserunt fugiat velit mollit do culpa sunt in enim qui tempor anim esse sunt. Do eu fugiat culpa ex aliquip quis exercitation. Culpa non culpa duis magna officia dolore officia minim culpa non. Enim voluptate minim ullamco eiusmod dolore do sit non quis et anim incididunt aliqua tempor.\r\n", + "address": "4 Sumner Place", + "city": "Ruckersville", + "state": "West Virginia", + "zip": 65886, + "country": "Ecuador", + "email": "mercadohancock@scentric.com", + "phone": "(996) 557-3624", + "color": "rgb(244,178,231)" + }, + { + "index": 16, + "name": "Bentley Guthrie", + "first": "Obrien", + "last": "Bruce", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rpeezy/73.jpg", + "expanded": false, + "guid": "720e6095-dc65-4bef-b8bf-56b3e43c13e8", + "integer": 33, + "date": "Sat Sep 09 1989 04:51:19 GMT-0700 (PDT)", + "shortText": "nulla officia ullamco anim", + "mediumText": "Incididunt ut irure quis non ad ut tempor et labore enim Lorem eiusmod. Sit laborum elit duis pariatur occaecat fugiat labore. Laborum velit incididunt dolor minim aute aute. Cillum id amet ut in. Eiusmod tempor et fugiat do qui dolor aliquip labore mollit tempor.", + "longText": "Labore et amet excepteur ea id. Anim mollit cupidatat nulla in sint. Nulla nulla proident Lorem minim consequat ea quis. Non Lorem mollit duis aliquip labore est. Eiusmod excepteur do do eiusmod officia id nisi proident consequat. Occaecat anim eiusmod dolore nostrud culpa adipisicing commodo anim incididunt laborum.\r\nDuis occaecat qui ullamco in magna nisi ad ex. Qui laboris tempor nulla magna. Ut est nulla laboris mollit do id qui esse exercitation culpa officia exercitation. Ipsum mollit amet ad exercitation ut eu Lorem reprehenderit magna. Veniam laboris officia ea voluptate sint anim qui est quis mollit qui occaecat cillum. Officia magna deserunt eu laboris culpa proident.\r\nElit est eiusmod non dolor nisi tempor et in deserunt eiusmod veniam ea quis. Elit magna anim pariatur ea do elit in duis cupidatat incididunt quis qui laboris. Ad ad ex officia proident ullamco consequat labore nulla consequat enim.\r\nProident ut elit quis anim reprehenderit amet deserunt eiusmod sit sit velit proident deserunt sunt. Est quis magna fugiat in nisi proident. Adipisicing Lorem sint enim esse laboris sit laborum.\r\n", + "address": "2 Chester Street", + "city": "Finzel", + "state": "Mississippi", + "zip": 52444, + "country": "Bulgaria", + "email": "obrienbruce@scentric.com", + "phone": "(923) 461-2312", + "color": "rgb(52,103,133)" + }, + { + "index": 17, + "name": "Marsh Cleveland", + "first": "Pearl", + "last": "Moran", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sectronov/73.jpg", + "expanded": false, + "guid": "9b385d87-2847-44f4-acae-a47970ff7c9f", + "integer": 8, + "date": "Tue Apr 26 1988 18:46:50 GMT-0700 (PDT)", + "shortText": "reprehenderit in reprehenderit dolor", + "mediumText": "Ex cillum in minim ullamco laborum. Dolor dolore adipisicing dolore ad.", + "longText": "Voluptate fugiat veniam do minim culpa. Proident irure mollit est exercitation est. Tempor pariatur proident excepteur aliquip cupidatat quis id ut fugiat excepteur tempor aliquip ea non. Consectetur ipsum Lorem reprehenderit laboris enim reprehenderit duis irure eu sint sit magna eu cupidatat. Sunt sunt laborum mollit ex fugiat ex quis. Proident quis labore occaecat est laborum quis ea irure ipsum magna ad nisi ut. Proident est culpa aliquip ullamco irure eu duis duis occaecat Lorem amet qui.\r\nMinim in adipisicing nostrud Lorem esse anim aute ullamco adipisicing ut enim magna. Cupidatat non dolor pariatur deserunt consectetur cillum dolor adipisicing. In proident commodo non exercitation cupidatat enim culpa officia voluptate. Et in sunt dolore mollit aute commodo sint et adipisicing. Labore velit esse occaecat esse commodo tempor veniam officia Lorem proident aute.\r\nEx magna aliqua adipisicing non esse labore non duis. Excepteur cupidatat eiusmod laborum laborum in quis reprehenderit id irure. Incididunt laboris qui adipisicing eu.\r\n", + "address": "4 Portland Avenue", + "city": "Henrietta", + "state": "Rhode Island", + "zip": 53764, + "country": "American Samoa", + "email": "pearlmoran@scentric.com", + "phone": "(964) 543-3486", + "color": "rgb(168,119,234)" + }, + { + "index": 18, + "name": "Maude Perry", + "first": "Underwood", + "last": "Barton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/starburst1977/73.jpg", + "expanded": false, + "guid": "0f6385b5-481e-4ddf-9ad4-b91f8e951922", + "integer": 33, + "date": "Wed Apr 23 2014 06:02:36 GMT-0700 (PDT)", + "shortText": "do pariatur quis consequat ex", + "mediumText": "Sunt magna elit adipisicing sint quis minim. Commodo irure pariatur esse deserunt proident enim incididunt et deserunt sit consectetur enim anim. Esse pariatur non magna culpa cillum culpa dolore ad id ex dolor deserunt. Dolore qui amet cupidatat et pariatur fugiat voluptate eiusmod duis commodo. Proident adipisicing irure eu aliquip nisi.", + "longText": "Nisi ipsum excepteur eiusmod irure velit. Elit ad nulla culpa eu sint veniam deserunt cupidatat. Esse culpa nisi velit aliquip esse consequat dolor amet velit culpa labore est do.\r\nLorem consectetur ad proident Lorem aute eiusmod sit incididunt. Pariatur sit cupidatat enim fugiat sunt ut. Aliquip mollit fugiat ea non laboris exercitation amet Lorem cillum.\r\n", + "address": "3 Mermaid Avenue", + "city": "Deputy", + "state": "Georgia", + "zip": 58449, + "country": "Angola", + "email": "underwoodbarton@scentric.com", + "phone": "(946) 414-3492", + "color": "rgb(112,197,153)" + }, + { + "index": 19, + "name": "Knapp Pratt", + "first": "Solomon", + "last": "Lloyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mocabyte/73.jpg", + "expanded": false, + "guid": "895a8dab-d037-46f4-b822-795814f418d9", + "integer": 72, + "date": "Thu Apr 13 1978 08:14:17 GMT-0800 (PST)", + "shortText": "nisi quis", + "mediumText": "Officia id sint exercitation excepteur aliqua enim est id duis occaecat consectetur excepteur. Ea incididunt nulla quis ea ad et ex exercitation laboris sit sit aliquip. Est magna tempor ex commodo id aliquip nostrud aliquip id culpa quis velit excepteur.", + "longText": "Ut nostrud nisi sit sit laboris labore ea ullamco fugiat enim esse. Velit fugiat adipisicing amet amet. Sint cillum eiusmod cillum esse exercitation duis adipisicing incididunt eiusmod culpa laboris eiusmod.\r\nEu cupidatat anim mollit laboris excepteur do in voluptate. In voluptate exercitation proident commodo Lorem id. Laboris cillum dolor et eiusmod do eu. Amet veniam proident in id deserunt mollit incididunt quis exercitation sunt pariatur duis cillum proident. Sunt ad deserunt adipisicing adipisicing consectetur.\r\nLorem reprehenderit deserunt reprehenderit incididunt anim elit aliquip ipsum reprehenderit. Aliqua amet sint mollit fugiat ut est ut tempor aliquip elit laboris. Esse minim qui non aliquip exercitation dolore quis incididunt incididunt. Ullamco cillum excepteur eu duis eu id in commodo.\r\nVelit duis ullamco veniam dolore exercitation aliquip magna veniam et. Excepteur ipsum duis voluptate Lorem in veniam reprehenderit eu deserunt magna reprehenderit. Minim ullamco nostrud irure irure culpa esse. Laboris ad incididunt proident elit sit eiusmod voluptate ad culpa qui duis aute. Cillum ex esse non veniam nulla excepteur quis non.\r\nEiusmod adipisicing Lorem sunt est. Duis reprehenderit esse sint aute. Est dolore cillum minim anim Lorem adipisicing amet fugiat. Esse dolor commodo labore ea nulla ipsum nulla laboris proident consequat duis ex ut minim. Occaecat irure nostrud nulla eiusmod est aliqua proident irure laboris.\r\n", + "address": "4 Glenwood Road", + "city": "Berlin", + "state": "New Mexico", + "zip": 64625, + "country": "Bhutan", + "email": "solomonlloyd@scentric.com", + "phone": "(802) 539-3360", + "color": "rgb(69,68,176)" + }, + { + "index": 20, + "name": "Jodi Tanner", + "first": "Lyons", + "last": "Stevenson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamasifmirza/73.jpg", + "expanded": false, + "guid": "f6a0ef12-6a1e-48a8-990a-da79c0bbf30e", + "integer": 79, + "date": "Tue Feb 11 2003 17:16:18 GMT-0800 (PST)", + "shortText": "et", + "mediumText": "Eu laboris adipisicing nostrud in in officia pariatur irure occaecat ut consequat commodo adipisicing elit.", + "longText": "Ullamco aliquip reprehenderit Lorem id duis ipsum sit exercitation id Lorem consequat enim ea. Aliquip officia minim dolore ea aliqua non. Aliqua cillum ipsum qui commodo non nostrud eiusmod duis commodo officia et nisi. Proident cillum deserunt eiusmod ea nisi quis incididunt id consectetur qui excepteur ad ipsum. Proident non dolor eu laboris proident Lorem aliquip elit sunt eu tempor sint fugiat Lorem.\r\nId mollit veniam amet labore id. Est proident tempor qui excepteur. Ipsum non irure sint minim sint eu cupidatat eu exercitation dolor et.\r\nSunt sunt nulla et mollit eu in amet est do qui ipsum mollit. Cillum voluptate excepteur consectetur sunt laboris tempor sunt laborum mollit veniam incididunt voluptate pariatur laboris. Mollit cupidatat esse aute sunt dolore cillum cillum qui sunt duis consequat anim. Sit ad laboris et do proident ipsum veniam amet dolor. Id elit anim ut et laborum. Dolor aliqua Lorem Lorem consectetur sint sunt.\r\n", + "address": "3 Cropsey Avenue", + "city": "Lewis", + "state": "Arizona", + "zip": 89420, + "country": "Dominica", + "email": "lyonsstevenson@scentric.com", + "phone": "(818) 424-2348", + "color": "rgb(178,99,182)" + }, + { + "index": 21, + "name": "Mamie Crane", + "first": "Swanson", + "last": "Richardson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benoitboucart/73.jpg", + "expanded": false, + "guid": "66c048df-eefc-4c09-a468-b3044e4e7f11", + "integer": 26, + "date": "Sun Jun 30 2002 05:57:21 GMT-0700 (PDT)", + "shortText": "quis aliquip aliqua", + "mediumText": "Non ad sit sit veniam officia id officia laborum qui irure eiusmod elit reprehenderit. Voluptate cillum mollit adipisicing mollit esse commodo. Labore exercitation voluptate duis pariatur magna labore ex non cillum incididunt eu esse nostrud.", + "longText": "Anim ut amet laboris culpa velit sunt ea sunt. Do anim nisi minim labore. In cillum pariatur ex non minim sint.\r\n", + "address": "3 Aurelia Court", + "city": "Inkerman", + "state": "Texas", + "zip": 10482, + "country": "Egypt", + "email": "swansonrichardson@scentric.com", + "phone": "(810) 406-3416", + "color": "rgb(230,107,202)" + }, + { + "index": 22, + "name": "Cooley Macdonald", + "first": "Aida", + "last": "Hurley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/markwienands/73.jpg", + "expanded": false, + "guid": "466a665b-b7b6-4eae-b404-e9b5a8d1641d", + "integer": 20, + "date": "Sun Jan 05 2014 15:48:57 GMT-0800 (PST)", + "shortText": "incididunt irure", + "mediumText": "Anim incididunt commodo minim voluptate enim proident aute adipisicing dolore reprehenderit commodo reprehenderit ipsum ut.", + "longText": "Id quis elit duis veniam enim cupidatat duis. Dolore proident magna minim reprehenderit Lorem. Velit tempor consequat adipisicing aute cillum exercitation eu sunt dolore.\r\nTempor ex laborum dolore voluptate aliqua in id est non. Eiusmod sunt non in culpa id magna non. Cupidatat voluptate magna aute cupidatat aliqua deserunt ut Lorem duis occaecat magna. Occaecat sit pariatur quis ipsum. Non qui non laboris cupidatat adipisicing.\r\nEst nulla aute veniam deserunt nulla labore reprehenderit reprehenderit sint. Nulla cupidatat laboris tempor labore cillum in excepteur minim laboris quis. Amet voluptate sunt in nostrud excepteur dolor in irure laborum commodo et cupidatat. Aliqua enim incididunt voluptate dolore est exercitation officia labore enim commodo quis veniam aliquip. Esse aliquip do labore eiusmod reprehenderit enim officia officia enim dolore magna dolore. Velit in sit dolore consequat.\r\nAdipisicing ea consequat voluptate proident enim commodo labore. Eu dolore ut amet aute tempor exercitation ad mollit occaecat velit non labore reprehenderit. Aute esse dolore id cillum Lorem eu quis elit exercitation ex esse sint. Sit nostrud non ullamco do esse. Voluptate velit officia eu laboris ut commodo tempor velit. Eiusmod cupidatat nostrud ex veniam sit duis. Proident fugiat laboris quis id dolor reprehenderit.\r\n", + "address": "4 Hall Street", + "city": "Stouchsburg", + "state": "District Of Columbia", + "zip": 32399, + "country": "Chile", + "email": "aidahurley@scentric.com", + "phone": "(975) 451-3272", + "color": "rgb(119,239,85)" + }, + { + "index": 23, + "name": "Snow Blankenship", + "first": "Mccormick", + "last": "Jensen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/menghe/73.jpg", + "expanded": false, + "guid": "961f5da2-2479-4f45-9132-9e89a8bc32e4", + "integer": 70, + "date": "Tue Jan 22 1974 01:18:15 GMT-0700 (PDT)", + "shortText": "aliqua commodo", + "mediumText": "Proident est sunt aliqua cillum ex sit aliquip irure ad. Pariatur dolore cillum nulla qui excepteur deserunt culpa magna consectetur et officia.", + "longText": "Culpa id veniam minim enim nulla ea enim proident. Esse sint ipsum et culpa. Cillum cillum incididunt fugiat occaecat Lorem velit. Quis esse incididunt esse sunt labore nulla. In minim ullamco officia do ad tempor. Sint sunt labore ullamco reprehenderit dolor ullamco ut occaecat.\r\n", + "address": "3 Lewis Place", + "city": "Elizaville", + "state": "Virgin Islands", + "zip": 32784, + "country": "Norfolk Island", + "email": "mccormickjensen@scentric.com", + "phone": "(961) 443-3343", + "color": "rgb(204,198,130)" + }, + { + "index": 24, + "name": "Gabriela Brock", + "first": "Ramona", + "last": "Meyers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/heyanata/73.jpg", + "expanded": false, + "guid": "07133f92-9308-420e-ae7b-e5ecd657aa85", + "integer": 76, + "date": "Sat Sep 15 1984 07:22:38 GMT-0700 (PDT)", + "shortText": "ex duis do", + "mediumText": "Aliqua qui dolore laborum aute culpa eiusmod ipsum incididunt. Incididunt cillum nisi culpa ea. Incididunt reprehenderit Lorem veniam occaecat elit anim mollit deserunt.", + "longText": "Magna nostrud laboris cupidatat sint esse pariatur ut irure sint dolore laborum. Ut id aute dolor laboris. Cillum officia id officia ut. Irure incididunt dolor exercitation eiusmod sunt nostrud labore. Ad do deserunt deserunt ad elit culpa commodo pariatur. Pariatur excepteur et nisi aute. Ex amet irure anim pariatur voluptate pariatur adipisicing dolor eiusmod dolore.\r\nVelit eu consectetur sint nulla culpa laboris ex et esse. Nostrud voluptate nostrud esse nisi proident quis consequat sit commodo consectetur ut. Ea ex irure labore ullamco proident ullamco consequat sit. Ipsum sit adipisicing mollit deserunt.\r\nEst quis ea magna aliquip anim. Cupidatat ea commodo amet tempor laboris commodo eu. Duis qui irure sunt aliquip velit elit. Laboris fugiat anim officia eiusmod enim ut aliqua incididunt eiusmod ad nulla aute esse. Sit in velit amet labore non consequat id id enim labore Lorem.\r\n", + "address": "3 Rodney Street", + "city": "Orin", + "state": "Puerto Rico", + "zip": 60446, + "country": "Japan", + "email": "ramonameyers@scentric.com", + "phone": "(839) 591-3993", + "color": "rgb(236,222,59)" + }, + { + "index": 25, + "name": "Graciela Orr", + "first": "Sharp", + "last": "Lindsay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/73.jpg", + "expanded": false, + "guid": "0ea67b0a-5ea7-4e07-8d06-48b6e2a00c6e", + "integer": 39, + "date": "Mon May 25 1970 21:04:46 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Aliqua sunt commodo occaecat nisi esse aliqua labore exercitation qui in ut officia laborum ad. Tempor nisi ad aliquip ipsum nostrud nostrud et sint commodo cillum labore. Ullamco qui fugiat consectetur minim consequat cupidatat laboris. Eu irure veniam sint esse adipisicing ipsum do aliqua pariatur.", + "longText": "Tempor Lorem reprehenderit quis exercitation sit sunt labore elit. Laborum incididunt quis deserunt fugiat culpa aliquip irure esse sit excepteur. Elit elit ad et do dolore minim enim.\r\n", + "address": "2 Tech Place", + "city": "Kraemer", + "state": "Maryland", + "zip": 24019, + "country": "Saudi Arabia", + "email": "sharplindsay@scentric.com", + "phone": "(852) 538-3232", + "color": "rgb(218,74,95)" + }, + { + "index": 26, + "name": "Ethel Wood", + "first": "Dina", + "last": "Robbins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluesix/73.jpg", + "expanded": false, + "guid": "342d8ae0-5eea-403c-9922-a85d39738463", + "integer": 22, + "date": "Sat Jun 03 1978 07:31:03 GMT-0700 (PDT)", + "shortText": "qui", + "mediumText": "Excepteur eu laboris magna cupidatat eiusmod nostrud laborum commodo officia sunt fugiat ad. Aliqua reprehenderit duis est consequat incididunt ullamco.", + "longText": "Pariatur velit exercitation aute adipisicing et enim laborum. Laboris anim nostrud consequat Lorem eu irure non aute eiusmod tempor veniam. Aute amet elit tempor irure occaecat esse labore elit veniam anim ea anim. Consequat excepteur esse mollit tempor mollit aute et sit duis. Labore veniam cillum enim nostrud ea laborum.\r\n", + "address": "2 Plymouth Street", + "city": "Bison", + "state": "Massachusetts", + "zip": 64340, + "country": "Micronesia", + "email": "dinarobbins@scentric.com", + "phone": "(967) 410-2522", + "color": "rgb(158,62,57)" + }, + { + "index": 27, + "name": "Tameka Francis", + "first": "Franco", + "last": "Carrillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/w8candice/73.jpg", + "expanded": false, + "guid": "d193f8ac-79ea-4201-9a75-c66cbf504ad5", + "integer": 37, + "date": "Mon Jul 14 1986 03:07:27 GMT-0700 (PDT)", + "shortText": "do aliqua laborum", + "mediumText": "Est incididunt exercitation voluptate culpa ut excepteur voluptate velit est minim nulla. Mollit anim ipsum velit excepteur eu occaecat exercitation. Mollit ipsum commodo aliqua voluptate do incididunt ipsum quis.", + "longText": "Anim voluptate cupidatat labore amet. Ex pariatur duis officia commodo excepteur. Quis dolor esse quis veniam. Non veniam et fugiat quis magna. Cillum ad commodo ex cupidatat labore duis aute est cillum. Ad nostrud duis officia ea proident non veniam qui quis.\r\nEx enim duis Lorem sit adipisicing laboris occaecat amet consectetur labore. Pariatur deserunt qui veniam ad exercitation proident commodo dolore aliqua. Aliquip sit Lorem mollit est culpa sint veniam veniam adipisicing elit eiusmod ipsum deserunt. Sint eiusmod consequat occaecat exercitation commodo qui. Labore et consequat dolor voluptate dolor excepteur in anim aliquip ea ullamco labore exercitation ipsum. Mollit occaecat dolor proident ipsum ad esse mollit qui laboris. Anim reprehenderit nulla magna mollit exercitation labore minim.\r\n", + "address": "2 Harkness Avenue", + "city": "Hollins", + "state": "Oklahoma", + "zip": 57691, + "country": "Liberia", + "email": "francocarrillo@scentric.com", + "phone": "(812) 540-2032", + "color": "rgb(89,84,186)" + }, + { + "index": 28, + "name": "Hendricks Levy", + "first": "Guadalupe", + "last": "Odom", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mbilderbach/73.jpg", + "expanded": false, + "guid": "cb09adfd-ad50-4ada-85f2-9a6da5e61812", + "integer": 51, + "date": "Tue Sep 12 1995 23:12:02 GMT-0700 (PDT)", + "shortText": "laboris non labore elit ea", + "mediumText": "Veniam tempor cillum non deserunt duis aliquip elit velit velit do sunt est ad et. Incididunt anim id dolore reprehenderit Lorem est laborum aliqua. Cupidatat ut irure proident pariatur nulla minim nostrud minim laborum non.", + "longText": "Dolor consectetur eu Lorem ea fugiat culpa dolore magna qui magna mollit. Minim est qui eiusmod incididunt nisi ullamco incididunt irure. Tempor officia amet ea nisi elit sunt nulla dolor non labore officia ipsum sit. Esse tempor duis labore laborum cillum nostrud sunt do quis.\r\nEx quis consequat est laborum eu non consequat exercitation aute proident ea excepteur irure ex. Adipisicing nulla laborum ipsum enim dolore. Reprehenderit labore veniam Lorem qui adipisicing dolore commodo cillum anim reprehenderit cupidatat cupidatat amet.\r\nAliqua est magna incididunt amet sit et ad laboris nostrud. Labore culpa cupidatat aliquip magna tempor elit cillum ad ut irure. Ipsum irure qui ullamco aliqua ex sit do. Ut irure nisi voluptate excepteur nulla deserunt dolor dolore id ut laboris proident pariatur. Consequat est exercitation esse id nulla culpa cupidatat deserunt deserunt nostrud in est nostrud. Incididunt eiusmod non sunt deserunt reprehenderit eiusmod officia cupidatat quis ea cupidatat pariatur dolore.\r\n", + "address": "4 Terrace Place", + "city": "Salunga", + "state": "Ohio", + "zip": 43114, + "country": "Korea (South)", + "email": "guadalupeodom@scentric.com", + "phone": "(902) 544-3976", + "color": "rgb(180,227,238)" + }, + { + "index": 29, + "name": "Porter Mcpherson", + "first": "Mcguire", + "last": "Kerr", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/coreyweb/73.jpg", + "expanded": false, + "guid": "c15b43e1-5b71-49c8-8319-7c6739d3d481", + "integer": 81, + "date": "Tue Jun 05 2012 02:47:02 GMT-0700 (PDT)", + "shortText": "do", + "mediumText": "Qui est labore deserunt velit ut adipisicing quis. Aliquip ex esse enim esse commodo duis non nisi nisi incididunt anim duis sunt magna.", + "longText": "Consequat laborum est irure eiusmod fugiat dolore fugiat do. Consequat occaecat deserunt non consectetur. Do et dolore minim dolore in ex enim.\r\nMinim pariatur tempor sit anim reprehenderit quis laboris elit veniam Lorem ipsum amet. Sunt aute reprehenderit eiusmod sint mollit proident sint veniam. Eu elit amet minim excepteur aliqua esse enim. Dolor nulla magna excepteur id nostrud Lorem magna duis.\r\n", + "address": "4 Myrtle Avenue", + "city": "Waukeenah", + "state": "Nevada", + "zip": 54957, + "country": "Pakistan", + "email": "mcguirekerr@scentric.com", + "phone": "(812) 545-2648", + "color": "rgb(122,207,233)" + }, + { + "index": 30, + "name": "Rosalie Noble", + "first": "Giles", + "last": "Miller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyshimko/73.jpg", + "expanded": false, + "guid": "490401d1-d8e8-4bd1-866c-b9ddd28804a4", + "integer": 45, + "date": "Sun Apr 21 2002 02:16:55 GMT-0700 (PDT)", + "shortText": "proident ad adipisicing duis non", + "mediumText": "Veniam esse officia laborum pariatur. Esse cillum duis sunt minim nisi irure eu in. Occaecat minim culpa adipisicing do amet in amet ipsum velit minim est. Est quis voluptate deserunt id sunt exercitation reprehenderit duis ad dolor et dolor mollit.", + "longText": "Ex dolor culpa fugiat amet esse Lorem dolor ad anim reprehenderit voluptate adipisicing. Nostrud minim laborum mollit labore Lorem officia dolor Lorem. Et voluptate in nulla id ea est duis velit. Aute adipisicing sint commodo et.\r\nNon deserunt nostrud veniam velit occaecat cupidatat adipisicing exercitation. Anim duis enim enim excepteur non voluptate mollit occaecat sunt adipisicing cillum duis. Adipisicing eiusmod nulla ex minim ipsum.\r\nLabore ea dolore fugiat culpa ad aute veniam sint id nulla sit voluptate. Esse magna cupidatat mollit eiusmod. Consectetur dolor incididunt deserunt veniam veniam voluptate elit do aute officia occaecat aliquip aliqua. Ea irure incididunt ut in elit minim et laborum minim enim culpa est do. Nostrud quis ullamco excepteur amet irure ad exercitation voluptate dolore amet pariatur non nisi.\r\n", + "address": "4 Dakota Place", + "city": "Matheny", + "state": "Montana", + "zip": 48981, + "country": "Guyana", + "email": "gilesmiller@scentric.com", + "phone": "(937) 481-3812", + "color": "rgb(117,82,141)" + }, + { + "index": 31, + "name": "Katrina Stuart", + "first": "Norton", + "last": "Carr", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pavelbuben/73.jpg", + "expanded": false, + "guid": "f9c2cf75-a70b-45c5-8a9c-cbceae872250", + "integer": 77, + "date": "Sun May 09 1993 04:38:21 GMT-0700 (PDT)", + "shortText": "labore", + "mediumText": "Adipisicing tempor ad sit ut anim eiusmod exercitation laboris. Velit pariatur occaecat minim consectetur aliquip nostrud anim.", + "longText": "Commodo anim aliquip nostrud occaecat cupidatat quis tempor aliquip consequat dolore. Ea sit ullamco amet consequat elit. Magna magna amet in reprehenderit adipisicing amet cillum tempor qui nisi ad. Eu veniam ad adipisicing aliquip officia ut occaecat exercitation do ad irure do magna veniam. Reprehenderit nisi voluptate consectetur Lorem eu duis incididunt aliquip irure duis sit ea nostrud id. Reprehenderit reprehenderit ipsum in commodo.\r\nAd excepteur adipisicing aliqua eu veniam ullamco velit eu enim nisi reprehenderit non duis nulla. Voluptate aliqua sit sit duis exercitation ad. Incididunt incididunt quis aliqua eu anim esse reprehenderit ut aliqua. Ea id pariatur dolor dolor minim tempor laboris magna non culpa ut non. Officia Lorem proident elit consectetur excepteur dolor velit id velit minim mollit aliqua qui. Aliquip dolor sint aliqua ex tempor.\r\n", + "address": "3 Estate Road", + "city": "Zortman", + "state": "California", + "zip": 33484, + "country": "Poland", + "email": "nortoncarr@scentric.com", + "phone": "(807) 556-3727", + "color": "rgb(189,210,164)" + }, + { + "index": 32, + "name": "Katy Guzman", + "first": "Marcie", + "last": "Rose", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hafeeskhan/73.jpg", + "expanded": false, + "guid": "0b1f8fd2-2acd-402f-aa66-728b60d1d8ba", + "integer": 62, + "date": "Mon Aug 05 1985 19:37:56 GMT-0700 (PDT)", + "shortText": "elit laborum esse", + "mediumText": "Nulla officia ex elit nulla aliqua magna cillum mollit ad sint. Fugiat consequat officia id ullamco ullamco excepteur aliquip. Occaecat esse eu veniam labore laboris laborum sint laborum esse eiusmod Lorem. Aliquip ex quis et adipisicing sunt cillum pariatur exercitation exercitation fugiat. Est velit anim esse consequat id in nisi adipisicing qui ad ex do non velit.", + "longText": "Amet dolor cillum voluptate occaecat quis cupidatat laborum commodo. Ut et quis ut proident qui do aliquip exercitation non. Ipsum ullamco commodo mollit Lorem do consectetur qui ad in cillum tempor irure consequat.\r\nVeniam laboris minim do exercitation eiusmod ut do sint reprehenderit anim irure proident proident. Quis adipisicing duis qui ut quis veniam dolor non velit consectetur eu voluptate. Duis mollit velit fugiat magna eu ullamco magna irure ipsum est tempor labore eu sint. Cupidatat ullamco nulla dolore quis commodo esse cupidatat quis sunt tempor proident. Labore ullamco ullamco ex Lorem laboris veniam mollit in sint eiusmod.\r\n", + "address": "4 Bedford Place", + "city": "Outlook", + "state": "Marshall Islands", + "zip": 74859, + "country": "Canada", + "email": "marcierose@scentric.com", + "phone": "(968) 546-3854", + "color": "rgb(211,242,218)" + }, + { + "index": 33, + "name": "Lindsay Vega", + "first": "Loraine", + "last": "Castro", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/timmillwood/73.jpg", + "expanded": false, + "guid": "e380ab32-0565-4177-8396-017f4ffea65f", + "integer": 16, + "date": "Thu Aug 30 1984 16:22:17 GMT-0700 (PDT)", + "shortText": "aliquip veniam duis mollit incididunt", + "mediumText": "Ut ea cillum magna nulla eiusmod velit ullamco proident quis quis duis. Culpa aliqua sint excepteur id sint velit. Ex ut consectetur occaecat officia excepteur non sit reprehenderit laboris.", + "longText": "Culpa deserunt adipisicing non anim. Elit do veniam proident incididunt dolore ut et occaecat. Ut reprehenderit commodo irure velit deserunt velit et esse nisi labore officia do nisi quis. Do reprehenderit ex exercitation tempor esse esse cupidatat. Consequat occaecat nisi adipisicing mollit excepteur adipisicing velit nostrud ex do. Et dolor labore exercitation nostrud laboris amet nostrud labore.\r\nAmet aliqua dolore velit sint non. Velit in esse aute esse nulla et quis nulla ut excepteur commodo. Culpa veniam consectetur ut ullamco minim culpa Lorem dolor aute amet qui cillum nulla id.\r\nSint excepteur in culpa occaecat minim deserunt aliquip mollit cupidatat ipsum et mollit ad deserunt. Sunt eu aliquip ut nulla cillum commodo laboris labore nisi ut dolore amet. Magna sunt ipsum ut officia pariatur dolore elit ullamco velit qui Lorem duis. Enim anim quis et incididunt aute sit consectetur. Amet non commodo exercitation quis tempor labore ex do eu et anim voluptate.\r\nIncididunt sit esse fugiat velit incididunt cillum. Est elit do deserunt elit excepteur do. Adipisicing est tempor cillum consequat.\r\nEst consectetur elit ad nisi reprehenderit tempor eiusmod culpa reprehenderit veniam anim. Mollit minim nulla commodo excepteur occaecat nulla ex deserunt irure nisi aliquip. Enim ullamco sunt duis veniam mollit nulla dolor elit nulla.\r\n", + "address": "4 Robert Street", + "city": "Ellerslie", + "state": "Indiana", + "zip": 16816, + "country": "US Minor Outlying Islands", + "email": "lorainecastro@scentric.com", + "phone": "(816) 465-3014", + "color": "rgb(76,135,180)" + }, + { + "index": 34, + "name": "Hughes Flynn", + "first": "Fry", + "last": "Harmon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butchewing/73.jpg", + "expanded": false, + "guid": "bcaa95bc-6077-4332-84f7-c432a0f25269", + "integer": 52, + "date": "Thu Sep 22 1983 12:18:11 GMT-0700 (PDT)", + "shortText": "consectetur voluptate et enim sint", + "mediumText": "Veniam duis ut aute id occaecat nisi officia qui ut anim magna eiusmod quis non. Qui duis ad nostrud et sint eu est consectetur amet ad id velit enim.", + "longText": "Cillum labore in voluptate sit pariatur laborum laboris veniam anim officia tempor. Ad nisi amet enim consequat do est est ut deserunt sunt commodo cupidatat aliqua. Irure ad dolor officia veniam commodo labore incididunt. Ex aliquip ad dolor fugiat exercitation minim cillum exercitation eiusmod velit. Aliqua minim minim exercitation dolore dolor laboris.\r\nEnim cillum do consectetur occaecat dolor nulla. Et officia culpa ad et ea irure culpa laboris ullamco ea enim aliquip proident eiusmod. Irure veniam ipsum fugiat sint exercitation deserunt commodo eu consectetur amet nostrud aute duis ullamco.\r\nAliqua minim veniam dolore exercitation non in ipsum irure et culpa irure labore excepteur exercitation. Ad reprehenderit officia deserunt velit aliqua consectetur commodo magna magna consectetur reprehenderit Lorem. Elit qui officia cillum do duis cillum. Non quis proident cillum et non deserunt elit voluptate commodo minim non. Ad occaecat dolor dolore incididunt voluptate proident.\r\n", + "address": "2 Logan Street", + "city": "Cataract", + "state": "Tennessee", + "zip": 16373, + "country": "East Timor", + "email": "fryharmon@scentric.com", + "phone": "(810) 510-3744", + "color": "rgb(157,152,156)" + }, + { + "index": 35, + "name": "Massey Merritt", + "first": "Cooper", + "last": "Sampson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dotmariusz/73.jpg", + "expanded": false, + "guid": "b3614dbf-f75d-410c-9a0a-8d805f386b40", + "integer": 75, + "date": "Tue Feb 03 1981 16:12:08 GMT-0800 (PST)", + "shortText": "enim ad ea mollit aute", + "mediumText": "Aute exercitation magna do veniam ea sunt qui id aliquip do eiusmod. Ipsum veniam cillum tempor labore. Est nostrud ut Lorem dolore. Id ad amet fugiat aliquip ea ut veniam nulla aliquip dolor.", + "longText": "Quis culpa quis nulla sunt proident consectetur ex reprehenderit est fugiat duis enim minim. Elit et culpa ex ipsum et amet eu quis exercitation et laborum ullamco commodo do. Tempor in elit veniam deserunt proident fugiat est ea excepteur et ipsum eu magna. Adipisicing ad elit officia ea velit veniam nostrud ullamco. Id nostrud exercitation esse labore dolore do.\r\nOfficia labore nulla amet ipsum. Reprehenderit dolore qui elit labore nisi ullamco dolor aliqua consequat sunt reprehenderit labore. Ad ea dolore anim proident quis reprehenderit quis consectetur ea.\r\n", + "address": "4 Doscher Street", + "city": "Bagtown", + "state": "Palau", + "zip": 32759, + "country": "Denmark", + "email": "coopersampson@scentric.com", + "phone": "(982) 438-3850", + "color": "rgb(248,164,122)" + }, + { + "index": 36, + "name": "Estelle Owen", + "first": "Rosa", + "last": "Velazquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronbeashel/73.jpg", + "expanded": false, + "guid": "bb33bd2d-a4cd-4bf2-a3f7-d82b5e108068", + "integer": 67, + "date": "Fri Jul 11 2003 11:54:17 GMT-0700 (PDT)", + "shortText": "officia consequat proident", + "mediumText": "Ex velit velit mollit consectetur eiusmod in do minim id esse excepteur nulla est. Reprehenderit incididunt deserunt ea excepteur nostrud voluptate nisi exercitation ea excepteur magna deserunt cillum proident. Exercitation minim velit sit fugiat sint ut cillum consectetur ullamco exercitation enim aliqua in aute. Laborum consequat amet aliquip laborum quis.", + "longText": "Non est irure amet eiusmod Lorem nostrud. Tempor est ut nisi nisi ullamco pariatur mollit proident eu magna sit. Amet tempor sint ut deserunt sint cillum aute anim officia mollit ex exercitation ea laborum.\r\nIn proident magna exercitation ut do. Lorem minim cillum do velit amet deserunt incididunt duis adipisicing laboris dolore officia. Sint ea id culpa labore aute sit cillum. Ut ad nisi ex culpa. Aliqua nostrud do culpa incididunt ut eiusmod nulla irure duis reprehenderit cillum. Cupidatat ea est non id cillum non adipisicing et adipisicing veniam cillum dolor ex.\r\n", + "address": "2 Wakeman Place", + "city": "Morgandale", + "state": "Virginia", + "zip": 43228, + "country": "Yemen", + "email": "rosavelazquez@scentric.com", + "phone": "(887) 500-3974", + "color": "rgb(112,251,244)" + }, + { + "index": 37, + "name": "Jamie Clarke", + "first": "Claire", + "last": "Jefferson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jina/73.jpg", + "expanded": false, + "guid": "44d98ab6-0a88-43f9-8c15-02c24bfe5a10", + "integer": 47, + "date": "Mon Aug 31 1992 20:48:08 GMT-0700 (PDT)", + "shortText": "aliqua nisi excepteur dolore", + "mediumText": "Aliqua ullamco labore occaecat laborum culpa anim exercitation. Deserunt cupidatat tempor id eu cupidatat magna veniam amet aute ea mollit.", + "longText": "Amet cupidatat eiusmod occaecat nostrud eu cillum culpa irure pariatur quis sit in. Ea id anim tempor duis sunt cillum veniam laborum culpa occaecat reprehenderit do commodo minim. Dolor aliquip cillum magna Lorem aliqua exercitation officia nisi id voluptate esse. Laborum occaecat velit deserunt tempor laboris sunt duis incididunt tempor dolore. Aliquip magna amet culpa culpa reprehenderit veniam commodo dolor fugiat commodo eu. Adipisicing veniam ipsum irure quis consectetur voluptate enim officia.\r\nNon occaecat proident nostrud do cillum ipsum tempor sit magna qui. Cupidatat Lorem aliqua adipisicing mollit. Consequat sint do pariatur est. Minim laborum duis eiusmod do do do qui Lorem. Labore anim laborum do fugiat tempor ut. Aliqua culpa id aliqua velit Lorem do consectetur consequat sunt aliqua.\r\n", + "address": "2 Jerome Avenue", + "city": "Cliff", + "state": "Wyoming", + "zip": 10308, + "country": "Laos", + "email": "clairejefferson@scentric.com", + "phone": "(897) 481-2359", + "color": "rgb(219,64,230)" + }, + { + "index": 38, + "name": "Louella Vincent", + "first": "Frieda", + "last": "Butler", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gu5taf/73.jpg", + "expanded": false, + "guid": "8169ff1e-f098-4cf7-9e00-35457f189340", + "integer": 65, + "date": "Mon Sep 09 2013 00:02:00 GMT-0700 (PDT)", + "shortText": "qui cupidatat sit velit", + "mediumText": "Sunt ad et exercitation aliqua consectetur commodo commodo adipisicing magna irure. Duis sint non duis ipsum pariatur ut pariatur dolor cillum anim et mollit laboris minim.", + "longText": "Excepteur enim laborum eiusmod exercitation aute id veniam non et ullamco. Ipsum veniam adipisicing non dolor id ad quis ex. Ipsum aliquip excepteur sunt irure adipisicing enim exercitation irure minim proident nulla ipsum id nulla. Adipisicing est do aliquip esse consectetur ipsum minim exercitation pariatur. Elit irure eiusmod commodo voluptate proident veniam quis do aliquip commodo. Amet labore incididunt exercitation commodo dolore officia ipsum ea non irure occaecat voluptate pariatur. Pariatur dolore do occaecat Lorem enim culpa cillum adipisicing incididunt labore.\r\nFugiat veniam ut culpa adipisicing cupidatat exercitation ea laboris consectetur reprehenderit nulla eiusmod ut. Tempor in non esse labore dolore labore qui duis. Duis esse consequat ex duis ea dolore voluptate id exercitation sunt eiusmod pariatur nisi ut. Excepteur amet et eu magna et.\r\nReprehenderit occaecat sunt elit cupidatat. Nostrud cupidatat id fugiat fugiat veniam mollit nostrud cillum. Laboris est ut esse cillum. Aute tempor ex veniam qui culpa deserunt mollit enim commodo velit eu. Et in adipisicing veniam sint id duis sint nulla. Ad voluptate aliquip consectetur commodo in. Exercitation ea sint non exercitation labore esse cillum.\r\nFugiat deserunt reprehenderit aliquip officia exercitation labore cupidatat pariatur aliqua in Lorem. Amet aliquip excepteur laborum do eiusmod aliqua minim anim dolore elit. Elit aute ex fugiat mollit excepteur.\r\n", + "address": "3 Rockwell Place", + "city": "Grimsley", + "state": "Colorado", + "zip": 38741, + "country": "Sierra Leone", + "email": "friedabutler@scentric.com", + "phone": "(867) 520-2422", + "color": "rgb(159,133,82)" + }, + { + "index": 39, + "name": "Schultz Rosario", + "first": "Juliana", + "last": "Gutierrez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/antonkudin/73.jpg", + "expanded": false, + "guid": "c238f75a-9f6d-41fe-bfc7-7035f020fdfa", + "integer": 62, + "date": "Tue Sep 13 1988 04:52:35 GMT-0700 (PDT)", + "shortText": "enim", + "mediumText": "Esse mollit anim dolore tempor qui aliqua Lorem. Eu adipisicing culpa nisi est commodo fugiat minim aute deserunt officia sint cillum.", + "longText": "Mollit enim deserunt aliqua nisi officia consectetur. Nostrud et ipsum eiusmod et. Proident nisi magna adipisicing occaecat consequat ut officia ea nisi proident voluptate duis commodo in. Aliquip velit fugiat Lorem ad est quis eiusmod consectetur dolore laborum voluptate minim nisi et. Pariatur non et elit laboris adipisicing reprehenderit laboris nisi. Ut laborum sint consectetur tempor excepteur in velit voluptate dolor ipsum consequat nisi.\r\nNon excepteur incididunt culpa incididunt et pariatur excepteur voluptate commodo esse. Commodo eiusmod duis ut cupidatat sint fugiat nisi ad anim enim. Pariatur qui ad aute deserunt do irure non quis et excepteur ullamco eu laboris. Qui enim velit minim tempor irure duis.\r\nQui id minim ullamco ex est elit Lorem aliqua officia ut cillum. Voluptate aute do qui pariatur nisi deserunt eu. Officia incididunt sit cillum consectetur anim fugiat sit et ad est tempor nulla fugiat mollit.\r\nEx magna ex do aute non esse excepteur. Est excepteur voluptate eiusmod eu esse ad eiusmod nisi ad. Quis irure laboris est fugiat aute culpa deserunt non ut mollit ea nisi occaecat enim.\r\nQuis dolore amet quis exercitation reprehenderit proident nisi excepteur veniam occaecat ipsum. Consectetur ad elit do quis mollit pariatur deserunt. Culpa qui cillum nulla incididunt incididunt ad nostrud duis. Deserunt pariatur non consequat sint occaecat ad dolor in mollit deserunt nulla laboris. Do eiusmod aute proident nulla eiusmod sunt voluptate.\r\n", + "address": "3 Loring Avenue", + "city": "Mulberry", + "state": "Utah", + "zip": 65299, + "country": "Nigeria", + "email": "julianagutierrez@scentric.com", + "phone": "(968) 541-2220", + "color": "rgb(102,250,175)" + }, + { + "index": 40, + "name": "April Mejia", + "first": "Mallory", + "last": "Gross", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/derekebradley/73.jpg", + "expanded": false, + "guid": "09c07ac9-6428-420c-9244-e97b458cef1c", + "integer": 95, + "date": "Mon Oct 10 1977 19:43:28 GMT-0700 (PDT)", + "shortText": "eiusmod voluptate eiusmod exercitation", + "mediumText": "Esse est laboris sint commodo enim ut fugiat excepteur pariatur eiusmod cillum. Occaecat occaecat cupidatat et occaecat do Lorem. Ad culpa sint magna tempor ex magna. Eu fugiat nisi exercitation sit ex in ad est occaecat officia ullamco pariatur non. Sit esse consequat deserunt enim.", + "longText": "Id pariatur ullamco officia excepteur. Excepteur occaecat nulla magna excepteur Lorem in laboris proident veniam veniam Lorem sint pariatur labore. Anim incididunt sint ea eiusmod tempor magna sit ullamco. Pariatur cillum id ullamco mollit tempor aute pariatur reprehenderit quis nulla quis elit. Irure duis voluptate consectetur ex anim ad. Ipsum do labore mollit commodo et cillum dolore est labore amet amet esse est. Duis et minim anim non magna sit incididunt aute consequat occaecat voluptate esse aliqua in.\r\nSint officia ad occaecat reprehenderit et velit eu consequat et esse. Occaecat et deserunt aute nulla aliqua occaecat eiusmod fugiat irure ut dolore incididunt. Ea magna magna velit consequat commodo id aliqua ad pariatur minim laborum ad.\r\nExercitation id reprehenderit enim consequat ea sunt labore cillum. Lorem tempor eiusmod elit amet velit incididunt occaecat. Amet aute tempor ea eu nostrud est velit. Amet est do duis ut do Lorem sint amet eiusmod.\r\nIrure mollit exercitation eu non. Labore ullamco do amet occaecat aute consectetur voluptate. Quis esse cillum laborum mollit exercitation. Officia quis consectetur cillum fugiat ullamco exercitation non dolore voluptate aute ex id. Ad culpa nisi quis non voluptate amet cillum in. Laborum occaecat ad aliquip aute veniam adipisicing non proident consequat voluptate commodo.\r\nVeniam anim sit officia laboris. Incididunt est ea magna nulla anim magna mollit reprehenderit adipisicing sit. Labore ex et do eu eu. Officia nostrud consectetur proident sint. Cillum dolor dolore consectetur ullamco. Reprehenderit veniam fugiat elit culpa nisi laborum magna. Consequat ea excepteur sint enim exercitation occaecat Lorem nisi culpa deserunt.\r\n", + "address": "2 Crawford Avenue", + "city": "Winchester", + "state": "Idaho", + "zip": 61697, + "country": "Netherlands", + "email": "mallorygross@scentric.com", + "phone": "(822) 493-3031", + "color": "rgb(161,51,155)" + }, + { + "index": 41, + "name": "Vicki Phelps", + "first": "Elsie", + "last": "Hahn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karachentsov/73.jpg", + "expanded": false, + "guid": "1dc69b61-c106-4a7b-83c6-e05dfed45668", + "integer": 88, + "date": "Wed Mar 28 2001 03:43:02 GMT-0800 (PST)", + "shortText": "ipsum eiusmod laboris proident", + "mediumText": "Nisi incididunt in commodo duis culpa voluptate sit laborum. Consectetur do exercitation irure nostrud.", + "longText": "Eu culpa eiusmod do sit aliquip consequat. Consectetur aliquip non culpa id reprehenderit labore non dolore in voluptate voluptate. Nisi in exercitation reprehenderit fugiat duis ea consequat nostrud labore enim ut sit.\r\nAdipisicing eiusmod mollit ipsum dolor et nisi irure elit sunt laboris. Proident tempor incididunt et consectetur fugiat nisi excepteur do nisi irure aliqua. Sit aliqua sint aute ut.\r\nFugiat quis ad nisi sunt consectetur ut ullamco laboris. Ut ea laboris ipsum Lorem eiusmod incididunt. Excepteur minim adipisicing nisi exercitation enim consectetur voluptate sunt. Est consequat irure ipsum ex qui laboris tempor. Commodo duis minim ullamco labore proident minim. Aliqua aliquip cillum dolore qui nostrud. Irure adipisicing mollit tempor occaecat excepteur.\r\nCupidatat nisi adipisicing adipisicing officia consectetur et. Laborum deserunt aute non culpa in ea aliqua sit. Sit esse incididunt qui veniam quis do excepteur exercitation nisi ipsum adipisicing quis. Mollit cupidatat occaecat adipisicing nisi irure pariatur exercitation id esse id tempor sunt. Quis deserunt eiusmod dolore ut esse eu consectetur consectetur ea veniam amet adipisicing nisi. Excepteur voluptate consectetur dolor sint nisi laborum aute eiusmod ea.\r\nNon ex eiusmod dolore est ea exercitation et quis deserunt culpa nostrud aliqua. Qui non qui laboris dolor reprehenderit enim deserunt cupidatat consequat dolore ex. In voluptate pariatur ullamco non laborum velit ea minim cillum consequat eu. Est ullamco proident ad fugiat aliqua occaecat est. Nisi dolore irure velit excepteur aliquip incididunt irure non voluptate.\r\n", + "address": "2 Coles Street", + "city": "Stockwell", + "state": "Arkansas", + "zip": 39778, + "country": "Morocco", + "email": "elsiehahn@scentric.com", + "phone": "(821) 517-2066", + "color": "rgb(63,164,79)" + }, + { + "index": 42, + "name": "Faulkner Mcdaniel", + "first": "Hayes", + "last": "Ball", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmeffess/73.jpg", + "expanded": false, + "guid": "731380cb-785a-4aa3-9e6c-281953a83daf", + "integer": 85, + "date": "Fri Jul 25 1980 06:28:07 GMT-0700 (PDT)", + "shortText": "sunt magna aliquip", + "mediumText": "Pariatur ipsum adipisicing ut quis.", + "longText": "Veniam veniam enim Lorem eu mollit consectetur ea qui est pariatur. Magna occaecat sit est exercitation exercitation irure laboris enim commodo consequat tempor mollit. Id ea elit proident exercitation. Dolore reprehenderit nostrud nostrud exercitation eiusmod nulla.\r\nDo amet duis excepteur ullamco cillum velit. Consectetur adipisicing fugiat non dolore fugiat ipsum qui est elit enim consequat Lorem laboris proident. Aliquip reprehenderit ut reprehenderit anim sunt ex. Adipisicing aliquip sint Lorem minim laborum dolor minim tempor laboris. Exercitation ad aute ullamco ea deserunt adipisicing laborum fugiat proident adipisicing veniam ut veniam laborum. Id reprehenderit labore ea esse ea officia cillum. Sit sunt pariatur cupidatat mollit velit qui ut.\r\nElit mollit do non dolor quis Lorem anim aliqua occaecat aute reprehenderit irure. Sit do labore pariatur id. Anim ad veniam ea Lorem reprehenderit ipsum minim. In elit irure nulla elit elit sit in sunt incididunt magna. Pariatur commodo anim magna ut aliquip nulla nostrud commodo aliquip incididunt commodo est. Nulla enim nostrud qui commodo reprehenderit.\r\n", + "address": "2 Cheever Place", + "city": "Interlochen", + "state": "Delaware", + "zip": 14410, + "country": "Czech Republic", + "email": "hayesball@scentric.com", + "phone": "(875) 561-3839", + "color": "rgb(215,92,182)" + }, + { + "index": 43, + "name": "Wilson Booth", + "first": "Baker", + "last": "Slater", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bmovement/73.jpg", + "expanded": false, + "guid": "4357bfc6-3fa0-41e3-8a7b-0ab1f0a2e139", + "integer": 16, + "date": "Tue Aug 18 1998 18:43:53 GMT-0700 (PDT)", + "shortText": "sunt reprehenderit fugiat in est", + "mediumText": "Exercitation nisi ut enim do incididunt eiusmod cupidatat aliquip occaecat sit occaecat elit consequat sunt. Cupidatat fugiat dolor ea proident ipsum officia exercitation reprehenderit dolore elit.", + "longText": "Et in ipsum duis amet aute qui commodo fugiat eiusmod. Enim veniam nisi non sunt ex esse eiusmod. Non amet et ex cupidatat. Veniam laboris do proident et in reprehenderit incididunt ut velit enim aliqua. Quis adipisicing tempor consequat consequat commodo consequat do. Minim laboris nostrud duis tempor aliqua fugiat pariatur incididunt Lorem nostrud velit ad.\r\nAliquip commodo laborum culpa consequat aliquip voluptate irure sit excepteur reprehenderit enim ullamco veniam do. Minim elit quis laborum eiusmod incididunt proident nostrud do laboris. Deserunt non nostrud minim ut qui proident incididunt est elit pariatur nisi. Eiusmod reprehenderit sit deserunt aliqua aliqua. Reprehenderit id pariatur magna sunt fugiat labore veniam velit pariatur minim occaecat. Nostrud duis est magna ad ad consequat proident ut laboris aliquip. Magna duis est non reprehenderit minim nulla est cupidatat ut officia do sit.\r\nPariatur officia culpa ullamco sunt. Adipisicing amet amet culpa excepteur proident officia. In dolor aliqua nostrud tempor tempor elit tempor exercitation enim sint.\r\nQuis aliqua velit magna ad occaecat minim velit eiusmod ex consequat ad nisi adipisicing. Veniam et culpa sunt ex ad non ut ad in qui magna dolor nostrud incididunt. Aliquip minim elit eu exercitation pariatur irure id non occaecat id id commodo. Ea excepteur et excepteur Lorem eiusmod elit ex laborum labore et cillum cillum. Lorem consequat non culpa eu Lorem do amet nulla velit ullamco cillum.\r\nVelit nisi consectetur dolore amet irure tempor voluptate laborum. Id sit incididunt aute nostrud fugiat adipisicing incididunt excepteur anim sunt et id deserunt. Voluptate incididunt sunt anim enim laboris. Laboris id sit aliqua nisi cillum cupidatat ipsum. Laborum veniam adipisicing velit nulla eu commodo quis do.\r\n", + "address": "2 Arlington Avenue", + "city": "Welda", + "state": "Federated States Of Micronesia", + "zip": 13497, + "country": "Cape Verde", + "email": "bakerslater@scentric.com", + "phone": "(980) 527-2867", + "color": "rgb(98,119,186)" + }, + { + "index": 44, + "name": "Galloway Michael", + "first": "Martha", + "last": "Knight", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taiyab/73.jpg", + "expanded": false, + "guid": "a12acd83-99f7-4c53-8849-e0c0a8aef81f", + "integer": 41, + "date": "Sun Jan 15 2006 04:41:03 GMT-0800 (PST)", + "shortText": "cillum fugiat cupidatat", + "mediumText": "Cupidatat eiusmod nisi commodo aute deserunt ea labore aute aliquip consequat voluptate aliquip aliqua sunt. Culpa cillum ex quis ad in nisi enim.", + "longText": "Enim ad pariatur esse ea officia ullamco consectetur ut adipisicing culpa voluptate Lorem do. Voluptate mollit enim dolore laboris Lorem id in Lorem aliquip mollit. Enim aliquip occaecat amet cupidatat elit dolor officia magna qui aute sit. In elit tempor pariatur sunt velit ad anim laboris do dolor et nisi anim voluptate. Proident aliquip anim veniam cillum ullamco laborum. Adipisicing occaecat voluptate deserunt ad consequat fugiat laborum aute fugiat deserunt exercitation incididunt. In do tempor amet excepteur non enim tempor excepteur reprehenderit anim sit aute.\r\nAmet ea est dolor adipisicing sit occaecat occaecat incididunt commodo. Veniam officia esse excepteur excepteur nostrud deserunt elit minim amet eu quis non. Quis duis tempor pariatur aute. Anim anim tempor in nisi Lorem do do adipisicing. Exercitation fugiat elit nisi nostrud aliquip id cillum exercitation elit non cupidatat. Irure ea nulla quis aliquip nulla ex exercitation est velit eiusmod.\r\nDeserunt aute nisi exercitation sunt aliquip aute proident incididunt dolor commodo non pariatur mollit laborum. Minim tempor deserunt labore non sit duis culpa. Commodo velit duis quis aliqua fugiat sit sint labore magna officia sunt eiusmod magna. Deserunt est nisi ad fugiat consectetur commodo voluptate amet nulla sit. Incididunt do adipisicing irure minim eiusmod aliqua et pariatur pariatur tempor irure.\r\n", + "address": "4 Willoughby Street", + "city": "Calverton", + "state": "Guam", + "zip": 21650, + "country": "Madagascar", + "email": "marthaknight@scentric.com", + "phone": "(893) 423-2241", + "color": "rgb(87,159,93)" + }, + { + "index": 45, + "name": "Mcintosh Evans", + "first": "Slater", + "last": "Erickson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rigelstpierre/73.jpg", + "expanded": false, + "guid": "1fa2a893-38af-4f5a-8580-a8a20f0edffe", + "integer": 89, + "date": "Wed Sep 03 2003 04:11:03 GMT-0700 (PDT)", + "shortText": "eiusmod in labore id", + "mediumText": "Cillum labore pariatur in occaecat eu. Ipsum reprehenderit occaecat ipsum in id velit pariatur ut duis. Dolor esse dolor eiusmod est duis. Elit nulla commodo cillum proident tempor anim qui nulla laboris cillum occaecat consequat.", + "longText": "Id qui sunt excepteur Lorem in occaecat id. Culpa eu dolore cupidatat cillum labore aute officia. Cupidatat ex dolore excepteur aliqua sunt elit qui excepteur sit amet sint adipisicing dolore.\r\nSint consequat ullamco exercitation anim et commodo. Mollit ad aute dolor in veniam tempor ullamco nisi ex id cupidatat incididunt. Veniam cupidatat et enim aliqua laboris officia. Dolor ipsum excepteur elit enim ipsum enim est labore do amet duis cupidatat aliqua. Officia occaecat in ex enim officia id culpa sint. Aliquip magna duis ut ea aliquip duis non ad.\r\nDolor mollit exercitation reprehenderit commodo sunt aute commodo aliquip. Aute qui culpa aliquip magna in enim occaecat quis. Proident magna sunt do tempor. Minim laboris aliqua esse culpa anim. Eu laborum ut ea nostrud excepteur laboris. Velit veniam nostrud deserunt incididunt sit incididunt Lorem cillum enim ullamco ipsum cupidatat ea laborum.\r\n", + "address": "4 Meeker Avenue", + "city": "Mansfield", + "state": "Pennsylvania", + "zip": 64998, + "country": "Austria", + "email": "slatererickson@scentric.com", + "phone": "(916) 568-2718", + "color": "rgb(61,216,133)" + }, + { + "index": 46, + "name": "Garrison Conway", + "first": "Beck", + "last": "Potts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vlajki/73.jpg", + "expanded": false, + "guid": "f4aa8b8b-f3b1-4a47-9625-0213a3ab6e8d", + "integer": 90, + "date": "Thu Jun 21 1979 14:10:02 GMT-0700 (PDT)", + "shortText": "adipisicing irure", + "mediumText": "Elit do ipsum sint qui non nulla laborum aute.", + "longText": "Sint voluptate ad irure laborum. Aliqua incididunt dolore do irure enim aliquip non officia sunt nisi consectetur. Ex laborum reprehenderit dolore laborum voluptate sit adipisicing consequat adipisicing culpa nisi ipsum anim aliqua. In est fugiat officia ullamco velit ut duis sit sint anim ex minim cupidatat. Commodo incididunt cillum non adipisicing tempor. Pariatur adipisicing dolore ut aliqua magna non amet.\r\nUt ex id enim cillum veniam consectetur ipsum sit cillum. Adipisicing qui cillum mollit consequat nulla quis elit nostrud et. Cillum dolore non voluptate magna qui officia. Lorem in quis incididunt dolore ut. Adipisicing do id fugiat elit ullamco pariatur culpa nisi.\r\nCommodo culpa dolore aliqua ex ex mollit minim. Duis cupidatat ipsum sunt quis amet est minim aute Lorem non proident. Duis cillum Lorem quis velit.\r\nTempor incididunt reprehenderit eiusmod adipisicing amet exercitation. Duis occaecat eu consequat ea officia occaecat enim Lorem ullamco. Non commodo cillum sunt amet nulla ex officia ut duis sunt. Enim minim anim minim anim non minim ad magna tempor Lorem. Enim cupidatat nostrud in sunt officia occaecat esse cupidatat. Sint veniam ullamco qui consectetur duis fugiat pariatur ad proident mollit.\r\nAd consectetur elit aute sit nostrud. Culpa non esse non nostrud id anim nulla aute in laboris id duis magna cillum. Sunt cillum ut id laborum tempor reprehenderit excepteur ut velit aliqua ad ipsum ut incididunt. Eiusmod qui quis ea deserunt excepteur amet culpa eiusmod eiusmod.\r\n", + "address": "3 Troy Avenue", + "city": "Witmer", + "state": "New Hampshire", + "zip": 85501, + "country": "Venezuela", + "email": "beckpotts@scentric.com", + "phone": "(865) 596-2021", + "color": "rgb(156,172,221)" + }, + { + "index": 47, + "name": "Hopper Anthony", + "first": "Pugh", + "last": "Douglas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/leeiio/73.jpg", + "expanded": false, + "guid": "d522fa57-486b-4ca9-9ee2-f4bddc8d8db0", + "integer": 32, + "date": "Wed Mar 16 1988 07:04:05 GMT-0800 (PST)", + "shortText": "ullamco sit elit", + "mediumText": "Nisi fugiat irure amet fugiat. Commodo ut nisi dolore cillum officia culpa. Veniam in duis aliquip voluptate do pariatur nostrud cupidatat amet consectetur reprehenderit id dolore. Anim adipisicing mollit ut enim aliqua ex elit aute ea culpa mollit. Sit cillum ut excepteur officia ullamco irure aute culpa elit.", + "longText": "Quis non cillum et sit enim culpa tempor. Veniam velit eu dolor pariatur in aute. Et tempor Lorem ad velit fugiat Lorem sunt aliqua exercitation laboris ad.\r\nExcepteur laboris et magna ea nostrud ut cillum. Exercitation anim cupidatat magna non pariatur id enim esse ullamco adipisicing deserunt anim. Duis sint nisi est voluptate deserunt proident anim nisi consequat labore culpa aliqua. Sit amet consequat ad occaecat cupidatat tempor eiusmod nostrud Lorem magna labore mollit in.\r\nPariatur qui anim culpa ex. In nostrud aliqua non adipisicing. Quis labore magna aliqua magna.\r\nAute commodo consectetur elit minim exercitation eiusmod non commodo. Aute deserunt non quis ullamco culpa ex et mollit nisi dolor. Minim amet eiusmod mollit esse Lorem eu reprehenderit nisi cillum eiusmod fugiat nostrud tempor duis. Officia quis commodo pariatur esse excepteur officia. In non incididunt aliquip mollit dolore ex labore.\r\nExcepteur commodo eu proident fugiat nulla. Minim excepteur consequat officia esse dolore irure qui anim culpa in deserunt consectetur laborum in. Exercitation in esse ad aliquip commodo. Irure duis pariatur eiusmod culpa enim mollit tempor Lorem qui proident ad. Qui exercitation elit culpa ex non dolor do pariatur proident. Anim ut velit minim voluptate labore in commodo excepteur irure proident amet officia cupidatat.\r\n", + "address": "3 Madoc Avenue", + "city": "Norfolk", + "state": "North Dakota", + "zip": 73808, + "country": "Hong Kong", + "email": "pughdouglas@scentric.com", + "phone": "(829) 562-3502", + "color": "rgb(70,112,74)" + }, + { + "index": 48, + "name": "Edwina Wiley", + "first": "Margo", + "last": "Hodges", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brad_frost/73.jpg", + "expanded": false, + "guid": "363f5f6a-2d42-4e87-845c-7cf7b881d3fa", + "integer": 26, + "date": "Fri Dec 07 2012 11:20:25 GMT-0800 (PST)", + "shortText": "fugiat fugiat", + "mediumText": "Ex commodo sit quis commodo fugiat Lorem aliquip mollit fugiat mollit veniam.", + "longText": "Ea ea aliquip consectetur in labore eu fugiat voluptate nisi ipsum sunt. Occaecat id sit qui officia culpa laboris. Deserunt aliqua duis est sint.\r\nProident consequat occaecat cillum occaecat occaecat adipisicing laboris exercitation sit ut non dolor culpa consectetur. Ipsum ex reprehenderit veniam aliquip esse. Est commodo tempor fugiat id laborum duis do fugiat magna eiusmod eiusmod. Sit sit est anim officia consequat Lorem commodo qui velit duis. Adipisicing ipsum mollit ipsum in deserunt adipisicing ad culpa dolore. Nisi excepteur consectetur id proident fugiat proident reprehenderit magna.\r\nConsectetur duis ipsum occaecat culpa sit in. Tempor elit amet est Lorem elit consectetur fugiat tempor magna. Nulla ullamco incididunt cillum quis ea. Voluptate officia officia officia sint quis cillum sit est. Aliquip non laborum et laboris in velit dolore mollit ad dolor velit amet ut laboris. Cillum sunt irure in in eu do ullamco.\r\n", + "address": "3 Vernon Avenue", + "city": "Yettem", + "state": "Northern Mariana Islands", + "zip": 84068, + "country": "Sri Lanka", + "email": "margohodges@scentric.com", + "phone": "(852) 558-3074", + "color": "rgb(56,222,148)" + }, + { + "index": 49, + "name": "Salazar Nolan", + "first": "Polly", + "last": "Mitchell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alsobrooks/73.jpg", + "expanded": false, + "guid": "36295fa8-495e-4763-b920-b8e8d9e90105", + "integer": 28, + "date": "Mon May 08 2006 04:34:39 GMT-0700 (PDT)", + "shortText": "aliquip id commodo pariatur eu", + "mediumText": "Amet fugiat nisi ut eiusmod enim. Et id mollit voluptate dolore laborum cillum qui est laborum duis fugiat.", + "longText": "Qui cillum proident id irure quis sit. Sit nisi et fugiat amet exercitation eiusmod esse enim pariatur cupidatat. Esse proident velit reprehenderit fugiat.\r\nNostrud dolore eiusmod aliquip pariatur labore duis veniam laboris velit duis proident excepteur veniam. Proident fugiat velit nisi aute veniam. Irure pariatur ex eu tempor veniam nisi et eiusmod anim mollit dolore ad ex.\r\nEu quis dolor sit amet ut consequat magna nostrud quis sit. Laboris aliqua consectetur sit tempor consectetur aliqua exercitation officia minim magna duis. Laborum eu ut veniam magna. Nisi enim cillum adipisicing sint ex. Magna proident labore sint aliquip aute. Ut nulla exercitation laboris qui nulla do adipisicing voluptate do. Nulla ullamco nulla dolore cupidatat duis ea aute est ullamco.\r\n", + "address": "4 Pilling Street", + "city": "Rushford", + "state": "South Dakota", + "zip": 48734, + "country": "Turkmenistan", + "email": "pollymitchell@scentric.com", + "phone": "(891) 598-2904", + "color": "rgb(119,240,183)" + }, + { + "index": 50, + "name": "Pat Delgado", + "first": "Brown", + "last": "Perkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thekishpatel/73.jpg", + "expanded": false, + "guid": "ec3986d2-8262-464b-bb60-352b533f186f", + "integer": 76, + "date": "Thu Jul 17 1975 16:18:22 GMT-0700 (PDT)", + "shortText": "voluptate est labore", + "mediumText": "Duis incididunt velit nulla consectetur ut labore. Ipsum culpa consectetur quis id velit nulla mollit cupidatat magna veniam consequat. Qui elit laboris veniam amet tempor Lorem dolore. Ex voluptate officia magna ipsum nulla eu Lorem.", + "longText": "Aute proident cupidatat laboris qui officia velit amet nostrud. Aliquip cupidatat sit pariatur ut id sint duis proident laborum sint aliquip. Qui cupidatat labore quis et ut magna fugiat laboris commodo proident ad ut. Consequat aute incididunt proident in cupidatat quis nisi exercitation. Et proident qui et occaecat ea minim.\r\nMinim ex do veniam do. Aliqua commodo minim dolore voluptate ullamco ea. Aliquip ad esse aliqua exercitation laboris qui incididunt dolore eu ut.\r\n", + "address": "3 Ash Street", + "city": "Loyalhanna", + "state": "Alaska", + "zip": 49922, + "country": "Burundi", + "email": "brownperkins@scentric.com", + "phone": "(908) 488-3939", + "color": "rgb(100,214,126)" + }, + { + "index": 51, + "name": "York Marks", + "first": "Janette", + "last": "Cherry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iqonicd/73.jpg", + "expanded": false, + "guid": "0da3bbca-40ca-4a5d-ab2d-dc983c50ed75", + "integer": 20, + "date": "Sat May 08 2004 23:04:24 GMT-0700 (PDT)", + "shortText": "occaecat velit fugiat dolor", + "mediumText": "Ea non aute incididunt proident sit enim officia. Ad ea eiusmod ex nisi qui duis non consectetur amet minim. Lorem magna tempor consectetur qui reprehenderit nostrud officia incididunt.", + "longText": "Anim dolore minim consequat pariatur non veniam consequat veniam et exercitation mollit eu deserunt. Duis irure duis et cillum nisi sint sit velit. Duis Lorem ut aliqua eu ullamco Lorem proident pariatur aliqua velit amet voluptate.\r\nVeniam dolore velit proident qui sint anim ea. Id ea id Lorem laborum ea aute nulla tempor elit laboris laboris nulla veniam. Laborum duis reprehenderit aute ipsum. Cillum anim nostrud dolore id ex cillum excepteur officia ipsum elit do. Veniam officia duis do consectetur sunt exercitation reprehenderit.\r\nVelit pariatur sunt enim magna elit ex ex excepteur ex id. Aliquip et amet anim non non minim veniam. Ut aliqua non exercitation commodo culpa pariatur sunt do ea.\r\nEu commodo enim pariatur pariatur. Velit anim esse irure ea id qui duis nostrud anim amet. Do enim ut aliquip elit laboris dolor culpa culpa voluptate irure ex. Est labore officia qui est incididunt proident laborum excepteur ullamco cupidatat. Velit dolore aute non dolore voluptate nisi. In id ullamco consectetur incididunt Lorem ullamco.\r\n", + "address": "3 Hubbard Street", + "city": "Beason", + "state": "Louisiana", + "zip": 10084, + "country": "Western Sahara", + "email": "janettecherry@scentric.com", + "phone": "(828) 500-2593", + "color": "rgb(100,221,172)" + }, + { + "index": 52, + "name": "Wilkinson Nelson", + "first": "Florine", + "last": "Hobbs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamlechev/73.jpg", + "expanded": false, + "guid": "4fdb5837-9e84-4ee7-8c11-0bba68a3b621", + "integer": 20, + "date": "Sun Feb 26 2012 16:07:03 GMT-0800 (PST)", + "shortText": "veniam nulla incididunt", + "mediumText": "Officia amet incididunt enim duis veniam velit aute incididunt esse qui consequat. Sit nostrud tempor minim nulla excepteur est aliquip dolor esse.", + "longText": "Pariatur commodo tempor laboris nulla minim ut nostrud nostrud in non incididunt exercitation. Pariatur enim deserunt ad dolore ut laborum cupidatat et elit ullamco voluptate eiusmod. Anim labore incididunt voluptate nulla officia dolore ipsum culpa est cupidatat laborum proident.\r\n", + "address": "2 Dodworth Street", + "city": "Hall", + "state": "Missouri", + "zip": 21320, + "country": "Mozambique", + "email": "florinehobbs@scentric.com", + "phone": "(869) 544-3589", + "color": "rgb(208,253,152)" + }, + { + "index": 53, + "name": "Alta Wright", + "first": "Farley", + "last": "Santos", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elliotpopel/73.jpg", + "expanded": false, + "guid": "19c307c0-cabb-4ab4-8b5e-857bf94a4838", + "integer": 46, + "date": "Tue Nov 27 1973 17:48:13 GMT-0800 (PST)", + "shortText": "do mollit", + "mediumText": "Proident irure in sunt id proident. Incididunt ipsum enim cupidatat nisi qui occaecat qui esse sint mollit nulla. Officia ad eiusmod eu consectetur occaecat mollit culpa deserunt qui exercitation mollit. Duis elit dolore occaecat Lorem sit minim consectetur qui culpa. Aliqua aute irure cupidatat commodo proident labore do aliqua aliquip officia.", + "longText": "Sunt aliqua laborum enim ipsum consequat adipisicing eu consequat labore sit cillum proident veniam proident. Et et sunt commodo aute nostrud mollit labore. Consequat in eu labore in incididunt officia esse mollit in minim minim mollit duis. Enim ea anim do voluptate eiusmod ut qui velit nostrud deserunt mollit.\r\nCommodo amet duis magna deserunt eu nulla eu sunt pariatur aliqua laborum cupidatat esse in. Quis do mollit nulla eiusmod exercitation. Ea eiusmod dolore minim sunt est irure minim non exercitation dolor veniam duis.\r\nIncididunt qui ex aliqua commodo qui aliquip duis. Ea dolore est duis esse sint nisi aliqua exercitation aute aliqua. Enim deserunt laboris eu eu duis nisi eu sint. Mollit est eu cillum excepteur id sit labore occaecat culpa minim adipisicing magna nulla.\r\nAd minim exercitation sunt nostrud quis. Fugiat quis officia officia irure aute eiusmod. Quis in officia do dolore duis duis. Veniam ipsum aute mollit officia pariatur deserunt. Reprehenderit adipisicing ipsum ut qui ex cupidatat sunt id nostrud reprehenderit. Eu incididunt magna duis et nisi minim exercitation laboris nisi. Adipisicing consectetur occaecat enim ad nisi voluptate ut aliquip ea labore do nulla laboris.\r\n", + "address": "3 Hanson Place", + "city": "Madaket", + "state": "Kentucky", + "zip": 95242, + "country": "Grenada", + "email": "farleysantos@scentric.com", + "phone": "(808) 507-2955", + "color": "rgb(143,68,160)" + }, + { + "index": 54, + "name": "Ivy Sparks", + "first": "Gray", + "last": "Paul", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/diesellaws/73.jpg", + "expanded": false, + "guid": "13f75baf-1bd4-4e7d-b527-a007260fe0bf", + "integer": 12, + "date": "Thu May 18 2000 12:52:37 GMT-0700 (PDT)", + "shortText": "laborum veniam ipsum", + "mediumText": "Consequat sit labore esse culpa ex officia eu enim ad sit. Deserunt consequat magna anim adipisicing eu est ipsum mollit est in. Proident et excepteur consectetur cupidatat eu aute ea magna amet qui ea culpa.", + "longText": "Dolore laborum anim sunt ea. Incididunt velit velit Lorem incididunt reprehenderit ea. Cupidatat esse laborum consectetur minim eiusmod nostrud occaecat. Elit esse cupidatat culpa tempor dolor laboris ad.\r\nIpsum ad veniam laboris eiusmod deserunt esse qui ullamco culpa magna sunt cupidatat ad. In pariatur aliquip voluptate quis voluptate qui. Minim ea velit excepteur eiusmod Lorem id consectetur tempor ex occaecat laboris ut tempor officia. Sunt irure exercitation ipsum sint elit amet duis irure.\r\n", + "address": "2 Conklin Avenue", + "city": "Sardis", + "state": "American Samoa", + "zip": 99662, + "country": "Cote D'Ivoire (Ivory Coast)", + "email": "graypaul@scentric.com", + "phone": "(896) 543-3314", + "color": "rgb(180,93,104)" + }, + { + "index": 55, + "name": "Henrietta Riddle", + "first": "Roman", + "last": "Dunlap", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/juanpablob/73.jpg", + "expanded": false, + "guid": "51bc59d2-dab6-443d-98ea-8171f77ad676", + "integer": 79, + "date": "Mon Oct 22 2007 23:28:02 GMT-0700 (PDT)", + "shortText": "sit", + "mediumText": "Est ex duis aliqua in adipisicing enim eu eiusmod consectetur. Reprehenderit nostrud aliquip sit nulla proident eu reprehenderit et minim do. Eiusmod laborum dolor ipsum exercitation nisi amet labore eu do laboris labore. Ad enim ut sunt anim reprehenderit culpa reprehenderit duis ullamco mollit.", + "longText": "Anim commodo voluptate eu voluptate voluptate sunt ipsum irure ipsum mollit cillum anim anim reprehenderit. Nulla ut reprehenderit enim occaecat consequat. Cupidatat Lorem eu qui id id adipisicing incididunt et cillum. Id enim sit cupidatat nulla ut enim consequat est sit sit culpa. Labore do consectetur pariatur qui labore proident dolor consectetur pariatur sit do tempor Lorem dolore. Et incididunt sint aliquip occaecat non dolor aute ea.\r\n", + "address": "2 Anna Court", + "city": "Stollings", + "state": "Minnesota", + "zip": 49877, + "country": "Philippines", + "email": "romandunlap@scentric.com", + "phone": "(852) 477-2611", + "color": "rgb(73,51,135)" + }, + { + "index": 56, + "name": "Odom Hicks", + "first": "Meyer", + "last": "Blackburn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/whale/73.jpg", + "expanded": false, + "guid": "5cd1a911-4464-4653-9db3-05e55a0f306b", + "integer": 20, + "date": "Mon Jul 24 1978 17:22:48 GMT-0700 (PDT)", + "shortText": "excepteur ex cupidatat ipsum", + "mediumText": "Proident excepteur nostrud sint voluptate ad sint. Exercitation commodo amet nostrud occaecat sunt officia nulla eu. Adipisicing enim velit officia proident sint minim laboris magna officia laborum do occaecat pariatur laboris. Commodo minim ipsum anim amet esse deserunt in ea ad.", + "longText": "Incididunt est pariatur est culpa dolor duis dolore sunt duis dolor qui laboris. Aliqua dolore nostrud dolor commodo esse ex laborum proident et anim. Ut consectetur in minim minim officia mollit id quis. Tempor aliqua dolore esse culpa.\r\nNostrud duis est minim pariatur reprehenderit in qui do nulla non id. Incididunt magna enim reprehenderit incididunt magna tempor duis esse sunt esse commodo. Nulla ex anim laborum laboris. Culpa officia anim reprehenderit ex laboris labore proident exercitation deserunt deserunt ipsum ea esse et. Laborum laborum eiusmod Lorem consectetur consequat. Aute tempor voluptate laboris pariatur amet esse ut labore dolore sint qui. Occaecat aliqua excepteur sit labore.\r\n", + "address": "3 Bleecker Street", + "city": "Albrightsville", + "state": "Hawaii", + "zip": 67670, + "country": "Bermuda", + "email": "meyerblackburn@scentric.com", + "phone": "(812) 415-2585", + "color": "rgb(132,80,57)" + }, + { + "index": 57, + "name": "Dalton Bishop", + "first": "Schwartz", + "last": "Garcia", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kalmerrautam/73.jpg", + "expanded": false, + "guid": "cb6c4011-ab62-4469-bdd6-120762fbd8dc", + "integer": 31, + "date": "Thu Aug 29 2013 04:23:49 GMT-0700 (PDT)", + "shortText": "irure cupidatat adipisicing", + "mediumText": "Elit esse aute dolor officia cupidatat adipisicing duis fugiat aliqua nisi nisi. Culpa reprehenderit consequat voluptate proident in deserunt tempor sint amet ad pariatur. Mollit incididunt magna ullamco deserunt commodo excepteur esse esse commodo duis elit est duis. Sunt amet nisi dolor id laboris dolor exercitation ex exercitation proident pariatur anim. Duis nisi occaecat fugiat tempor sint est incididunt laboris cillum consectetur non cillum.", + "longText": "Eu esse Lorem veniam et dolor. Ad laboris exercitation adipisicing voluptate culpa ullamco ad non sunt ad veniam sit officia consequat. Est ea fugiat consectetur duis aliquip id in reprehenderit. Tempor officia enim tempor aliqua eu. Ut tempor duis minim ea eu proident. Nisi non eiusmod do tempor proident et commodo nisi nisi occaecat. Ullamco cupidatat eiusmod ex magna cillum nisi est.\r\nNisi consequat qui reprehenderit laboris dolor esse Lorem officia dolore ipsum exercitation do. Nulla nulla eiusmod nostrud incididunt ad elit ea non eiusmod incididunt reprehenderit culpa minim. Sint aliqua magna aliquip et magna. Fugiat ut voluptate irure aliquip consequat ut exercitation minim amet enim culpa.\r\nCulpa est pariatur aliquip non amet eu elit veniam Lorem velit nulla aute. Excepteur do commodo minim eu commodo dolore. Ex dolore ea irure adipisicing Lorem labore. Ipsum sit consequat aliquip tempor est. Labore deserunt incididunt et occaecat dolore est laborum exercitation exercitation dolore. Fugiat ipsum est proident anim ullamco ipsum labore fugiat consequat velit. Anim elit cillum ex laborum ad exercitation voluptate ad magna Lorem voluptate tempor.\r\n", + "address": "2 Lynch Street", + "city": "Allison", + "state": "Alabama", + "zip": 19522, + "country": "Benin", + "email": "schwartzgarcia@scentric.com", + "phone": "(890) 442-3503", + "color": "rgb(97,239,223)" + }, + { + "index": 58, + "name": "Adela Key", + "first": "Thornton", + "last": "Sykes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicoleglynn/73.jpg", + "expanded": false, + "guid": "8b7914e5-a64e-4c6a-aa82-b62d133a71b4", + "integer": 13, + "date": "Fri Jul 22 1983 16:03:00 GMT-0700 (PDT)", + "shortText": "nisi laboris duis ullamco", + "mediumText": "Aute aliqua adipisicing adipisicing nisi anim veniam adipisicing commodo. Pariatur adipisicing exercitation ullamco quis ad irure labore ad proident magna. Ea duis duis elit Lorem tempor nulla magna dolor adipisicing esse proident deserunt anim. Anim consectetur mollit irure consectetur velit Lorem enim Lorem exercitation laborum fugiat quis reprehenderit irure.", + "longText": "Minim occaecat consequat pariatur pariatur elit amet. Ex nostrud amet in cillum esse id laborum do velit. Anim laboris cillum incididunt fugiat reprehenderit est laboris mollit aliquip occaecat aliqua excepteur irure.\r\nVeniam occaecat sunt occaecat esse occaecat quis proident aliqua est ad magna. Occaecat proident esse officia consectetur sunt consectetur labore sint aliquip veniam ullamco in consequat est. Eiusmod labore amet id nulla tempor ad.\r\nDeserunt anim ea duis eu laborum aliqua exercitation. Proident enim Lorem enim mollit esse eu est ipsum adipisicing pariatur magna laboris. Excepteur exercitation labore ut qui velit do nulla. Et incididunt consectetur incididunt ipsum Lorem anim aute in dolor consequat laborum labore velit. Adipisicing duis voluptate duis deserunt dolore. Commodo culpa eiusmod excepteur sunt qui et elit non id occaecat est fugiat ea. Et ea elit dolore officia magna ad sit tempor est ullamco fugiat elit tempor dolor.\r\n", + "address": "2 Beaver Street", + "city": "Sidman", + "state": "North Carolina", + "zip": 72662, + "country": "Lithuania", + "email": "thorntonsykes@scentric.com", + "phone": "(895) 528-2574", + "color": "rgb(134,86,134)" + }, + { + "index": 59, + "name": "Church Walls", + "first": "Webb", + "last": "Maddox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rickdt/73.jpg", + "expanded": false, + "guid": "446ed374-2f83-4fc6-933b-60892c7e61f6", + "integer": 97, + "date": "Fri Jun 11 1993 04:18:26 GMT-0700 (PDT)", + "shortText": "officia sint amet aute aliquip", + "mediumText": "Consectetur reprehenderit duis dolor duis sint adipisicing elit anim incididunt labore aliquip enim sit adipisicing.", + "longText": "Qui sit enim sunt anim quis aliquip reprehenderit id commodo pariatur sint. Ex aliquip quis voluptate id incididunt. Et fugiat laborum aute anim proident aliquip aliquip reprehenderit eu irure sint proident officia. Ipsum in commodo sint enim consectetur aliqua laboris ea proident ex. Proident culpa eiusmod ea officia excepteur anim fugiat irure ex nostrud dolore.\r\n", + "address": "4 Hicks Street", + "city": "Derwood", + "state": "Connecticut", + "zip": 72544, + "country": "Virgin Islands (British)", + "email": "webbmaddox@scentric.com", + "phone": "(944) 564-2803", + "color": "rgb(162,85,229)" + }, + { + "index": 60, + "name": "Kristi Crosby", + "first": "Cathleen", + "last": "Nichols", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/funwatercat/73.jpg", + "expanded": false, + "guid": "7a7ad168-8ae8-492d-956e-c2a16f8578e9", + "integer": 92, + "date": "Sun Jan 01 1989 18:01:36 GMT-0800 (PST)", + "shortText": "adipisicing Lorem velit quis", + "mediumText": "Velit esse consequat exercitation eu excepteur officia minim laborum cupidatat officia id ad amet occaecat. Dolor officia qui est ea nisi non.", + "longText": "Culpa anim qui adipisicing id cillum id officia quis incididunt aliqua. Anim excepteur dolore proident amet. Cillum sunt quis pariatur proident esse Lorem eiusmod et eiusmod non. Ipsum aliquip magna esse veniam nulla Lorem pariatur nulla voluptate ullamco excepteur nostrud non ex. Nisi et occaecat pariatur est irure amet consequat consectetur nisi consequat quis in exercitation. Culpa eu amet laborum ullamco do mollit mollit.\r\nIrure aliqua dolore nulla occaecat ipsum minim Lorem dolor Lorem ut. Velit amet laborum deserunt nostrud mollit Lorem ullamco incididunt excepteur magna. Eiusmod tempor pariatur anim do esse laborum sint ea elit excepteur. Commodo cillum cupidatat duis dolor ad laboris occaecat. Occaecat ad nostrud amet exercitation laborum eiusmod.\r\nAliquip ullamco officia ullamco do mollit amet non. Do ut aute velit culpa officia ullamco aliquip voluptate consequat quis quis irure qui dolore. Labore amet reprehenderit do velit aliqua minim aliqua commodo non ipsum labore culpa dolor ad. Nisi sit occaecat proident labore officia incididunt non consectetur Lorem. Consequat anim dolore duis esse ad aliqua ea sit ad ex. Consectetur est id non esse aliqua sit ut adipisicing commodo aliqua. Exercitation nisi consectetur tempor nulla.\r\nLorem in consectetur anim fugiat dolore duis fugiat. Nisi Lorem velit occaecat cillum consectetur ipsum aliqua velit et. Do cupidatat enim sit duis eu labore officia nostrud nisi qui.\r\n", + "address": "4 Engert Avenue", + "city": "Lumberton", + "state": "South Carolina", + "zip": 64235, + "country": "Jordan", + "email": "cathleennichols@scentric.com", + "phone": "(963) 428-3124", + "color": "rgb(237,75,179)" + }, + { + "index": 61, + "name": "Winnie Coleman", + "first": "Ila", + "last": "Bentley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ssiskind/73.jpg", + "expanded": false, + "guid": "2d8a81c0-1dd7-4c00-a89f-473446addf54", + "integer": 38, + "date": "Tue Jun 30 1998 19:23:01 GMT-0700 (PDT)", + "shortText": "incididunt", + "mediumText": "Ex velit voluptate aliquip adipisicing eiusmod. Occaecat aliqua voluptate nisi nostrud est sit sunt qui. Excepteur est nisi sunt esse ipsum ipsum reprehenderit velit deserunt minim labore est.", + "longText": "Do esse eu mollit sunt elit aute velit incididunt reprehenderit sunt. Ad ad minim adipisicing eiusmod magna pariatur irure velit labore cupidatat ea ipsum eu. Ipsum consequat ut in minim aliqua.\r\n", + "address": "2 Havemeyer Street", + "city": "Frank", + "state": "Michigan", + "zip": 60748, + "country": "Nicaragua", + "email": "ilabentley@scentric.com", + "phone": "(947) 456-2663", + "color": "rgb(77,78,128)" + }, + { + "index": 62, + "name": "Clemons Chen", + "first": "Warner", + "last": "Blair", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_purplebunny/73.jpg", + "expanded": false, + "guid": "1d9dfc0f-0e70-4189-9a2d-d134505173d7", + "integer": 28, + "date": "Sat Sep 12 2009 19:12:02 GMT-0700 (PDT)", + "shortText": "officia", + "mediumText": "Exercitation non labore et duis et Lorem est et irure fugiat dolore officia ex.", + "longText": "Ea aute eiusmod ipsum ipsum eu nostrud. Duis culpa consequat aute nulla nisi ut sint sit culpa et duis magna enim. Nisi sunt dolore minim quis do. Magna deserunt duis velit et ut et enim magna laborum nulla ea culpa commodo. Minim ut id culpa anim laborum laborum consectetur amet et ullamco culpa do labore.\r\nEst magna aliquip ea ullamco. Exercitation deserunt occaecat id in ut sit laborum aute. Ex ut ex anim cupidatat do amet proident mollit. Dolor magna irure id culpa. Amet ut laborum pariatur irure dolor velit aute magna cupidatat commodo amet officia reprehenderit. Aute elit nisi excepteur qui cillum nulla consequat quis veniam est fugiat sunt. Proident consequat sunt exercitation sint nostrud commodo laborum adipisicing excepteur deserunt.\r\nEiusmod sunt consequat enim non irure excepteur adipisicing. Ad id veniam consectetur fugiat excepteur ex non et velit ut Lorem. Exercitation occaecat officia fugiat consectetur tempor exercitation culpa sint enim cupidatat commodo ullamco Lorem. Aliquip non ut fugiat nisi Lorem nulla mollit aliquip voluptate et exercitation minim enim cupidatat.\r\nElit do est amet nulla aliquip proident consectetur aliquip. Lorem nulla incididunt laborum in proident. Lorem veniam enim tempor non consectetur et ea non elit. Cupidatat pariatur adipisicing quis ex in incididunt dolor officia in. Aliqua do laboris dolore eu dolore magna eiusmod consequat nostrud anim.\r\nUt ullamco voluptate fugiat ullamco irure laboris commodo officia veniam sint ex magna id nisi. Qui occaecat sit deserunt aliqua veniam. Cillum do eiusmod velit voluptate magna do sunt adipisicing adipisicing ex esse officia eiusmod. Consectetur minim sint pariatur eiusmod ipsum anim. Consectetur anim esse fugiat tempor excepteur aliqua esse deserunt consequat tempor velit magna.\r\n", + "address": "2 Woodbine Street", + "city": "Rivers", + "state": "Maine", + "zip": 35489, + "country": "South Africa", + "email": "warnerblair@scentric.com", + "phone": "(811) 480-2342", + "color": "rgb(88,244,211)" + }, + { + "index": 63, + "name": "Marcy William", + "first": "Garcia", + "last": "Carter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linkthief/73.jpg", + "expanded": false, + "guid": "bb80a091-a78d-4187-ab75-c5e5a6cb2362", + "integer": 3, + "date": "Wed Mar 20 1974 00:41:43 GMT-0700 (PDT)", + "shortText": "amet", + "mediumText": "Deserunt officia laboris velit enim do cillum enim. Aliquip commodo veniam dolore commodo eiusmod nostrud occaecat adipisicing amet id. Incididunt cillum sunt esse consequat magna eiusmod ex culpa. Aliquip irure excepteur sunt esse incididunt et sint.", + "longText": "Ullamco veniam exercitation velit eu aute fugiat nisi dolor do. Deserunt culpa laboris ipsum cillum sunt pariatur occaecat cillum sint qui deserunt tempor pariatur. Ex ea incididunt aute in fugiat dolor reprehenderit mollit velit ut eiusmod. Veniam sunt sit officia sint Lorem fugiat dolor commodo amet culpa. Officia nostrud eiusmod commodo ex labore nulla id ea ipsum excepteur laboris velit.\r\nFugiat eiusmod laboris pariatur labore. Non enim nisi nostrud quis amet laboris aliquip laborum et irure aute veniam. Anim ullamco in officia commodo aliqua minim. Amet in enim nostrud pariatur id est occaecat ad occaecat. Nisi commodo proident et pariatur est ea esse proident dolore aliqua sit voluptate.\r\nEt est fugiat duis cillum veniam nulla. Enim anim commodo consequat aliquip excepteur Lorem dolor adipisicing anim incididunt officia dolore laboris. Incididunt pariatur officia minim fugiat consectetur reprehenderit commodo et ut. Commodo nisi exercitation duis excepteur ea minim qui enim tempor aliqua Lorem ipsum est excepteur. Ullamco veniam occaecat excepteur et laborum. Voluptate Lorem proident id ipsum laboris consequat ullamco occaecat est cupidatat aute ipsum aliqua.\r\nAnim mollit laboris amet dolor occaecat tempor id. Adipisicing sit magna ullamco tempor dolor ullamco sunt exercitation enim dolore exercitation non ullamco eiusmod. Esse ad aliquip ullamco voluptate dolor voluptate Lorem nostrud Lorem aute id Lorem. Laborum nulla ex pariatur anim irure cillum veniam eiusmod commodo.\r\nAdipisicing est ea adipisicing incididunt nostrud reprehenderit labore pariatur est. Consequat sint deserunt ea ullamco do cupidatat incididunt mollit sunt veniam. Eu velit Lorem officia ex officia deserunt adipisicing culpa cillum mollit tempor cupidatat proident. Qui aliquip labore sunt commodo veniam aliqua est cillum. Ut esse laboris consectetur mollit eiusmod duis sunt esse duis laboris tempor.\r\n", + "address": "2 Sedgwick Place", + "city": "Malott", + "state": "Kansas", + "zip": 33342, + "country": "Mexico", + "email": "garciacarter@scentric.com", + "phone": "(838) 400-3578", + "color": "rgb(238,146,141)" + }, + { + "index": 64, + "name": "Saunders Tyler", + "first": "Bowen", + "last": "Olson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/73.jpg", + "expanded": false, + "guid": "81275503-dc66-4920-a852-66b9bb420ab7", + "integer": 83, + "date": "Sat Jun 05 2004 18:02:53 GMT-0700 (PDT)", + "shortText": "eu", + "mediumText": "Cillum eiusmod sit aliquip magna excepteur occaecat adipisicing culpa. Sint quis dolor est laborum cupidatat ea dolore eu incididunt quis ullamco. Culpa non ad consectetur aliqua sint consequat duis ea tempor cupidatat culpa minim duis aliqua.", + "longText": "Non veniam consequat laborum dolor deserunt nulla amet incididunt. Velit eu ut adipisicing labore nisi. Aute ea ex esse reprehenderit quis officia do. Labore dolor elit ea aliqua. Ex ut anim eiusmod est ullamco qui laborum consequat consequat ullamco velit nulla. Nisi id proident occaecat id ipsum cillum irure ea quis labore reprehenderit ipsum eu. Ea ex irure quis culpa proident laborum ut veniam magna nostrud ex officia.\r\nTempor ut sint sunt fugiat commodo dolore irure qui enim mollit. Lorem id cillum nulla ullamco amet. Proident anim proident ea ut aliquip in elit. Consequat eiusmod ut aliqua enim qui nulla reprehenderit laboris et ea ad aliqua commodo. Excepteur in proident irure esse.\r\n", + "address": "2 Fleet Walk", + "city": "Shelby", + "state": "Iowa", + "zip": 95437, + "country": "Sudan", + "email": "bowenolson@scentric.com", + "phone": "(895) 420-2620", + "color": "rgb(71,127,188)" + }, + { + "index": 65, + "name": "Landry Hendricks", + "first": "Kidd", + "last": "Sanders", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/labibjaffar/73.jpg", + "expanded": false, + "guid": "c1d57dbd-5b06-44aa-bf5b-ffa5bb4cc5ba", + "integer": 15, + "date": "Sat Oct 19 1996 17:52:51 GMT-0700 (PDT)", + "shortText": "elit duis", + "mediumText": "Laboris irure quis ipsum consequat consectetur culpa aliqua in.", + "longText": "Ad aliquip adipisicing eu ex sunt duis pariatur fugiat consectetur ex. Reprehenderit do Lorem velit et tempor. Duis ad ad minim dolore excepteur ex nostrud officia. Elit aute aliqua laboris enim velit esse ullamco. Cupidatat non sunt laborum labore eu aliqua exercitation ea. Mollit ex non consectetur ad ex. Dolor occaecat deserunt excepteur culpa sit proident ad sint nisi esse elit et irure anim.\r\nCupidatat ullamco aliquip in commodo laboris elit minim ad. Sit esse nulla et ipsum officia commodo. Dolore ad proident tempor aliquip occaecat tempor mollit.\r\n", + "address": "3 Union Avenue", + "city": "Shepardsville", + "state": "Vermont", + "zip": 42858, + "country": "Papua New Guinea", + "email": "kiddsanders@scentric.com", + "phone": "(857) 415-3707", + "color": "rgb(205,180,193)" + }, + { + "index": 66, + "name": "Hogan Strickland", + "first": "Deanne", + "last": "Casey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tnrzdmr/73.jpg", + "expanded": false, + "guid": "66bcba0b-2ae4-4fba-9b76-ebf0bacf8b3c", + "integer": 23, + "date": "Tue Mar 24 2009 07:16:09 GMT-0700 (PDT)", + "shortText": "id non labore cupidatat enim", + "mediumText": "Deserunt dolor do cillum ut proident. Ad non proident laborum sint tempor velit. Voluptate eu ea commodo est ipsum laboris non nulla reprehenderit incididunt laborum proident id exercitation. Laboris amet exercitation qui proident veniam laboris.", + "longText": "Ea proident esse nisi eu officia eiusmod laborum. Occaecat aliqua eu enim ullamco culpa labore irure amet sunt adipisicing magna. Culpa enim veniam magna qui anim ad nulla. Lorem fugiat in nostrud sunt do mollit eiusmod ut. Occaecat ipsum esse laboris nostrud reprehenderit velit.\r\nVoluptate eiusmod ullamco sunt cupidatat pariatur ea qui non. Velit commodo sint esse adipisicing pariatur ut id ad Lorem cillum. Nisi ut esse quis deserunt magna eu esse minim.\r\nIncididunt ullamco sunt sunt velit. Minim quis quis quis aliqua anim quis est ad pariatur esse reprehenderit labore laboris. Irure magna dolor in nisi sunt et.\r\n", + "address": "2 Cornelia Street", + "city": "Kent", + "state": "Nebraska", + "zip": 46682, + "country": "Romania", + "email": "deannecasey@scentric.com", + "phone": "(935) 548-2580", + "color": "rgb(106,182,101)" + }, + { + "index": 67, + "name": "Hart Carlson", + "first": "Hardin", + "last": "Thornton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyjantz/73.jpg", + "expanded": false, + "guid": "7601ed4e-21fb-4024-bb7e-36d45c052b7f", + "integer": 68, + "date": "Sat Apr 20 2002 15:29:17 GMT-0700 (PDT)", + "shortText": "ex anim", + "mediumText": "Tempor veniam proident elit proident aliqua nostrud tempor eiusmod. Commodo id dolor sint amet commodo officia. Anim sint ea amet cillum. Esse cupidatat aute veniam ipsum excepteur.", + "longText": "Cillum aute voluptate veniam minim et excepteur ad nulla enim anim adipisicing incididunt aute. Aliqua adipisicing elit minim officia id mollit laborum sunt do. Nostrud do laboris fugiat ad mollit. Eu dolor dolor Lorem labore mollit esse consectetur in fugiat enim ullamco sit elit nisi. Enim eiusmod nostrud enim velit. Lorem commodo laboris excepteur eu occaecat minim.\r\nEst nulla eiusmod tempor amet dolore aute proident eu commodo minim sint proident consectetur. Cupidatat sunt quis laboris adipisicing eiusmod aliqua mollit. Elit qui nostrud commodo irure irure ex esse sunt officia. Tempor cillum nulla anim aliqua. Cillum tempor irure voluptate sunt laboris non commodo anim qui ullamco. Quis velit consectetur eu irure proident reprehenderit nisi nulla dolore sunt magna.\r\nCulpa laborum enim enim proident sit dolore pariatur eiusmod. Excepteur proident mollit in ut do non. Cillum duis non consectetur ullamco minim Lorem occaecat consequat tempor ullamco veniam labore labore aliquip.\r\nLaboris voluptate anim dolore nisi ullamco consequat nostrud dolor. Nulla do do esse aute sint deserunt qui. Ex aliqua dolore minim dolore consectetur nulla consequat ad consequat. Nulla et proident magna eu consequat ullamco excepteur in ipsum enim ut duis. Deserunt et sunt tempor quis amet deserunt cupidatat veniam. Labore reprehenderit magna minim amet nostrud amet. Reprehenderit pariatur dolore ut culpa sint dolore.\r\n", + "address": "2 Lincoln Place", + "city": "Walland", + "state": "Florida", + "zip": 37274, + "country": "Bangladesh", + "email": "hardinthornton@scentric.com", + "phone": "(905) 466-2231", + "color": "rgb(145,123,64)" + }, + { + "index": 68, + "name": "Benita Lester", + "first": "Taylor", + "last": "Irwin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ibrahemaq/73.jpg", + "expanded": false, + "guid": "dc96c6e9-9c43-4525-8de4-9a5e504ab886", + "integer": 2, + "date": "Sat Jun 25 1977 03:55:08 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Anim laboris dolore non aliqua proident aliqua et est ad reprehenderit duis ipsum do. Irure Lorem voluptate tempor ipsum exercitation. Sint deserunt adipisicing Lorem sit ea duis ex. Et fugiat anim est non irure proident in commodo sunt pariatur nulla.", + "longText": "Ut aute anim amet minim nulla. Fugiat dolor pariatur quis do aute officia magna in culpa ipsum fugiat. Cupidatat cillum duis aliquip nulla ea quis aliqua. Cillum sunt laboris velit deserunt cupidatat ullamco. Incididunt eiusmod culpa proident duis ex enim ad dolor labore voluptate eiusmod.\r\nLabore culpa commodo amet eu elit magna nisi minim in irure. Dolor adipisicing aliquip laboris irure. Amet et enim fugiat mollit ad laboris sint elit cupidatat deserunt. Ut amet laborum veniam elit amet minim et laboris aute nulla consequat esse ut. Ea dolore sit excepteur eiusmod pariatur sit non non consequat aute.\r\nAute culpa aute ullamco sunt irure quis voluptate est laborum. Duis eu ut do laboris laborum ipsum. Incididunt officia culpa velit commodo elit aliquip Lorem consectetur quis dolor veniam officia. Voluptate cupidatat duis ipsum elit cupidatat.\r\nCillum non ad ad et. Ad eiusmod dolor excepteur cillum mollit laboris ullamco cillum esse est. Aliquip eiusmod cupidatat ex id aute do officia excepteur non.\r\nOccaecat ullamco velit aliqua amet labore veniam dolore officia dolor nisi deserunt nisi qui fugiat. Velit laborum duis reprehenderit reprehenderit laboris occaecat. Aute exercitation magna exercitation magna sit. Fugiat cupidatat tempor eiusmod voluptate enim. Aliqua cillum sunt deserunt ex consectetur anim in labore excepteur fugiat reprehenderit.\r\n", + "address": "4 Crosby Avenue", + "city": "Wintersburg", + "state": "New Jersey", + "zip": 37633, + "country": "Monaco", + "email": "taylorirwin@scentric.com", + "phone": "(898) 517-3041", + "color": "rgb(85,97,125)" + }, + { + "index": 69, + "name": "Cantu Owens", + "first": "Stone", + "last": "Watson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/croakx/73.jpg", + "expanded": false, + "guid": "32abd836-bc46-4a8e-a2c1-7dc92b9e8322", + "integer": 46, + "date": "Mon Nov 17 2003 17:10:32 GMT-0800 (PST)", + "shortText": "cupidatat officia anim ipsum aliquip", + "mediumText": "Elit duis non minim aliqua aliquip irure. Duis ex est ut exercitation laborum excepteur aliqua. Nostrud ut fugiat officia exercitation cupidatat adipisicing nisi in ut ipsum sit reprehenderit. Qui ea Lorem quis velit.", + "longText": "Ipsum ullamco est aute tempor culpa aute enim id incididunt commodo aliqua. Mollit aute sit eu sint cillum ea cupidatat nulla labore anim ut. Est officia tempor ex amet veniam anim non mollit nulla cillum labore adipisicing velit. Et ut nostrud Lorem quis minim laboris mollit sit.\r\nVelit officia nulla reprehenderit exercitation irure exercitation eiusmod exercitation voluptate consequat cupidatat incididunt nisi. Ipsum aliqua quis laborum est sunt. In consectetur eiusmod aute magna. Ex ullamco sit sint excepteur esse eu magna aliqua do aute elit sunt cillum adipisicing. Sunt irure pariatur laboris et fugiat irure. Amet ipsum nostrud est Lorem anim velit. Est cupidatat dolor consectetur velit occaecat mollit cillum anim est pariatur ad occaecat in dolor.\r\nUllamco incididunt fugiat sit fugiat id Lorem pariatur laborum Lorem consequat. Ullamco irure incididunt duis occaecat aliqua pariatur. Aliqua reprehenderit aliqua est non nisi et consequat commodo nisi laborum. Ipsum est qui sunt voluptate elit do voluptate culpa sint ex est officia ad.\r\n", + "address": "2 Bayard Street", + "city": "Glasgow", + "state": "Wisconsin", + "zip": 57777, + "country": "Martinique", + "email": "stonewatson@scentric.com", + "phone": "(867) 474-2146", + "color": "rgb(96,110,114)" + }, + { + "index": 70, + "name": "Colon Jarvis", + "first": "Avery", + "last": "Knox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_dukex/73.jpg", + "expanded": false, + "guid": "9bcf96b4-7ca7-4a59-b7b7-6d6a57293012", + "integer": 28, + "date": "Sun Jan 28 2001 22:12:27 GMT-0800 (PST)", + "shortText": "pariatur officia reprehenderit ut", + "mediumText": "Ut dolore quis eiusmod culpa laboris ad fugiat.", + "longText": "Irure sunt labore commodo ea ex in dolore. Minim reprehenderit sit non et reprehenderit qui esse ex adipisicing. Duis ipsum in culpa est. Non do nisi pariatur dolore elit do qui non pariatur. Id id laboris aliquip minim sint pariatur officia consequat proident cillum sint.\r\nFugiat duis est irure mollit. Cupidatat enim anim adipisicing mollit enim ut nostrud sit. Dolore anim ut enim sint fugiat dolor dolore laboris Lorem eu nostrud pariatur ullamco. Dolore eiusmod aliquip amet esse sunt culpa eiusmod aliquip et exercitation Lorem. Mollit deserunt eiusmod ex ipsum qui consectetur ullamco velit. Reprehenderit proident cupidatat reprehenderit cupidatat. Voluptate eu sit reprehenderit veniam ut.\r\nDo consectetur culpa deserunt dolor. Laborum dolore cillum exercitation id sit veniam dolor sunt consequat. Proident est proident sit ut incididunt tempor ullamco sunt.\r\nIn amet consectetur nulla ullamco ullamco culpa. Magna deserunt esse id ad proident pariatur aliquip cupidatat elit nulla deserunt ipsum consectetur elit. Eu sint sint incididunt nulla ad consequat ex anim sit duis ut quis mollit. Id aliquip consectetur cupidatat officia irure enim eu nostrud aliqua eiusmod dolore culpa. Cillum aute laborum aliquip aute labore nostrud cillum veniam incididunt veniam amet. Sit ad in proident cupidatat elit irure nostrud dolore.\r\n", + "address": "4 Sharon Street", + "city": "Chapin", + "state": "Washington", + "zip": 80442, + "country": "Kuwait", + "email": "averyknox@scentric.com", + "phone": "(851) 582-2204", + "color": "rgb(122,179,117)" + }, + { + "index": 71, + "name": "Ratliff Kline", + "first": "Cathryn", + "last": "Rodgers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gregsqueeb/73.jpg", + "expanded": false, + "guid": "9a177597-6ee1-4784-b217-60ded54d0072", + "integer": 32, + "date": "Fri May 07 1976 11:12:00 GMT-0700 (PDT)", + "shortText": "nostrud enim", + "mediumText": "Officia do enim nisi ullamco enim eiusmod eu enim ex tempor. Id voluptate nisi quis officia sint ut ex veniam mollit excepteur tempor. Et aliqua velit sit fugiat do voluptate ipsum aliquip veniam in sint do. Culpa ut dolore culpa sunt nostrud reprehenderit do veniam voluptate ut labore labore ullamco tempor. Voluptate voluptate veniam laborum deserunt.", + "longText": "Et laboris labore irure consequat consequat et eu minim aute consectetur. Nisi tempor sunt officia ad dolore culpa. Veniam proident minim velit nisi amet id nulla ullamco eiusmod sit ad.\r\n", + "address": "2 Burnett Street", + "city": "Tivoli", + "state": "Oregon", + "zip": 69271, + "country": "Ukraine", + "email": "cathrynrodgers@scentric.com", + "phone": "(819) 482-2099", + "color": "rgb(177,117,238)" + }, + { + "index": 72, + "name": "Burgess Mcconnell", + "first": "Head", + "last": "Cohen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/csmnng/73.jpg", + "expanded": false, + "guid": "22894c1b-29ad-4e31-a69e-d724d00cdec3", + "integer": 51, + "date": "Fri Jan 08 1993 09:39:13 GMT-0800 (PST)", + "shortText": "cupidatat ex excepteur tempor", + "mediumText": "Proident eiusmod mollit voluptate culpa incididunt et velit commodo laborum et. Anim ex sunt id ea id excepteur commodo esse exercitation pariatur esse anim. Qui dolore irure eiusmod eu dolore.", + "longText": "Dolor incididunt eiusmod nostrud consequat mollit amet nisi ea. Officia dolore mollit eiusmod ullamco anim incididunt. Laboris sint enim ex mollit consequat consequat.\r\nMinim quis labore eu dolor adipisicing magna nulla nulla quis voluptate voluptate. Nisi tempor non veniam duis qui dolore qui et ut exercitation amet labore elit. Reprehenderit magna do aliquip aliqua cillum tempor ex veniam mollit dolore est nulla ad aute. Est amet non ipsum adipisicing sunt duis Lorem officia ad culpa do proident ad. Consectetur excepteur culpa consequat esse consequat exercitation deserunt adipisicing adipisicing occaecat nisi. Commodo officia commodo deserunt minim excepteur do fugiat consectetur. Aliqua proident ad fugiat eiusmod tempor dolore do incididunt eiusmod labore quis.\r\nLabore fugiat incididunt aliquip deserunt fugiat nostrud. Velit minim aliqua sit incididunt. Velit ad et nulla est consectetur Lorem officia ut eu consequat enim ut. Consequat labore qui magna do aute deserunt consectetur. Minim aliquip in quis minim ad mollit ut non Lorem.\r\nEu laboris culpa magna dolor pariatur anim ea amet fugiat minim. Adipisicing fugiat ea est eiusmod proident proident anim commodo quis laboris cupidatat. Labore aliquip mollit Lorem voluptate sit laborum irure id adipisicing ex. Ad cillum sunt sit magna exercitation mollit eiusmod mollit est elit. Ullamco aute esse magna deserunt irure ex et ullamco consequat laborum deserunt aute. Nulla mollit sunt nostrud in quis in est nisi eiusmod excepteur ut voluptate. Do anim ex cillum eiusmod duis ut sit.\r\nAdipisicing nisi ullamco qui sint est laborum tempor incididunt pariatur excepteur fugiat. Officia sunt proident laborum fugiat quis magna veniam. Nulla do do esse magna. Labore ad sit mollit ullamco nulla aute est sit ipsum ex cupidatat. Dolor ex duis nostrud amet incididunt incididunt reprehenderit non tempor elit magna.\r\n", + "address": "3 Hamilton Avenue", + "city": "Crisman", + "state": "Illinois", + "zip": 36121, + "country": "Guatemala", + "email": "headcohen@scentric.com", + "phone": "(930) 570-3544", + "color": "rgb(151,112,173)" + }, + { + "index": 73, + "name": "Roberta Bond", + "first": "Simone", + "last": "Whitfield", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ogmenemre/73.jpg", + "expanded": false, + "guid": "4750f9fa-37f6-41d0-8599-946f9dff2e00", + "integer": 6, + "date": "Thu Sep 06 1984 11:04:11 GMT-0700 (PDT)", + "shortText": "Lorem consectetur", + "mediumText": "Ad anim sint ex in voluptate deserunt ut nulla adipisicing. Elit non velit pariatur nostrud quis do quis cillum ea et sint Lorem. Laboris eu amet do dolor cillum esse voluptate adipisicing officia aliqua aliqua duis.", + "longText": "Commodo cupidatat velit duis elit id duis aliqua. Laboris dolor laboris ad irure laborum. Dolor amet aliqua eu sint. Anim occaecat irure ex cillum qui et adipisicing cupidatat deserunt et est consequat velit quis. Magna ut cillum nostrud ea pariatur occaecat. Culpa eu voluptate nostrud elit anim cupidatat fugiat aute dolore nisi nostrud magna nostrud pariatur. Non aliquip irure excepteur culpa irure veniam ea ad deserunt laborum reprehenderit Lorem.\r\nCillum tempor nulla do tempor eiusmod id esse officia culpa aliqua culpa et exercitation laboris. Sit sit Lorem eu fugiat Lorem. Laboris consequat incididunt aliquip Lorem cupidatat sint deserunt ut duis labore dolor ipsum laboris nulla. Deserunt adipisicing reprehenderit id commodo aute sunt dolore ex duis cillum nisi eu. Anim deserunt et adipisicing fugiat anim in.\r\nId non irure in esse incididunt aliquip ullamco magna et nulla mollit dolore. Velit aliquip excepteur pariatur magna Lorem fugiat. Exercitation nisi nostrud cupidatat elit. Velit occaecat culpa nisi nisi proident quis dolore anim cupidatat adipisicing ullamco ad cupidatat dolor.\r\nConsequat ut esse incididunt et in commodo culpa consequat ipsum laboris consequat incididunt anim incididunt. Ad et nostrud amet non Lorem enim laborum id ad Lorem magna excepteur. Ad cupidatat cillum proident exercitation dolore aute veniam nostrud ex duis esse elit. Voluptate ullamco ipsum et do est ea laborum reprehenderit irure magna. Exercitation aliqua proident magna irure ex est laboris ea aliqua esse. Ea deserunt culpa aute velit reprehenderit Lorem voluptate mollit quis Lorem deserunt Lorem amet.\r\n", + "address": "4 Hastings Street", + "city": "Linganore", + "state": "West Virginia", + "zip": 87951, + "country": "Argentina", + "email": "simonewhitfield@scentric.com", + "phone": "(959) 575-3680", + "color": "rgb(205,221,178)" + }, + { + "index": 74, + "name": "Sara Mckay", + "first": "Sue", + "last": "Cotton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionutmaxim/73.jpg", + "expanded": false, + "guid": "1da2f858-f774-49c1-9d77-e8a3eb040140", + "integer": 31, + "date": "Fri Nov 25 1994 01:11:26 GMT-0800 (PST)", + "shortText": "et", + "mediumText": "Pariatur Lorem veniam ullamco cupidatat sint. Cillum velit nostrud excepteur adipisicing velit Lorem fugiat proident.", + "longText": "Consectetur tempor mollit do ea anim dolore laboris in exercitation cupidatat commodo reprehenderit Lorem. Consequat exercitation sint culpa aute quis nisi. Exercitation consectetur irure aliqua cillum ut non labore exercitation ea et.\r\nUllamco dolor consequat reprehenderit dolore id mollit laborum ad. Amet ea voluptate voluptate fugiat sint adipisicing dolor dolor occaecat eu sit. Ea ea est amet enim tempor occaecat tempor sit exercitation. Ad eu nisi dolore do culpa do anim irure aliquip officia irure. Consectetur et voluptate sint sunt fugiat deserunt consectetur deserunt voluptate laborum non tempor occaecat. Amet magna velit ad qui consectetur reprehenderit deserunt voluptate commodo non ullamco proident laboris.\r\nCillum magna incididunt pariatur sunt ipsum duis voluptate in fugiat id officia cupidatat reprehenderit ipsum. Dolore anim excepteur ea laboris labore minim. Excepteur ex adipisicing eiusmod sit ut reprehenderit. Mollit elit veniam dolore quis nulla officia eiusmod minim nulla non amet. Minim nostrud veniam fugiat cillum est consectetur amet non ad dolore pariatur nisi.\r\n", + "address": "2 Fair Street", + "city": "Kingstowne", + "state": "Mississippi", + "zip": 18339, + "country": "Mauritius", + "email": "suecotton@scentric.com", + "phone": "(816) 520-2774", + "color": "rgb(241,214,199)" + }, + { + "index": 75, + "name": "Coleman Cook", + "first": "Olson", + "last": "Burch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teylorfeliz/73.jpg", + "expanded": false, + "guid": "0788dba4-5fa8-476e-9ba6-8f387bf77e75", + "integer": 13, + "date": "Thu Jun 21 1984 02:52:09 GMT-0700 (PDT)", + "shortText": "anim anim deserunt deserunt anim", + "mediumText": "Esse sunt irure magna amet. Adipisicing aliqua ut dolor nulla non aute tempor eu ex sit id et. Magna dolore aliqua qui velit eu officia. Est sunt magna adipisicing commodo mollit aute duis magna.", + "longText": "Duis fugiat culpa proident mollit nostrud. Dolore incididunt in esse veniam eiusmod voluptate consequat amet. Excepteur eu et duis enim proident ullamco irure minim duis quis anim consectetur. Amet excepteur et do officia fugiat mollit Lorem ut elit. Eiusmod magna tempor duis Lorem nostrud. Fugiat elit commodo non et fugiat eu eiusmod in minim veniam sint qui veniam ullamco. Aliquip sint ad culpa esse laboris elit.\r\nMinim reprehenderit quis ut incididunt incididunt cupidatat. Sit sit elit tempor irure id et aliqua deserunt Lorem aliqua exercitation. Elit nisi dolor enim amet esse incididunt ad. Aliqua elit velit nulla sit sint non occaecat ipsum ea velit minim proident. Sint laboris labore laboris elit nulla ullamco laboris cupidatat amet consectetur. Do eiusmod proident id laborum fugiat nostrud voluptate fugiat. Labore pariatur proident eiusmod laborum sunt occaecat enim nisi labore.\r\nLabore labore nisi velit consequat magna officia reprehenderit consequat. Nulla eu velit laborum voluptate. Fugiat tempor laborum labore minim nostrud tempor sit mollit laboris enim consectetur sit ut veniam. Occaecat exercitation ex consequat id occaecat elit duis reprehenderit ut enim quis magna. Non do ea fugiat quis duis esse amet deserunt eu id duis est enim.\r\nNostrud labore tempor minim proident do quis labore aliqua est mollit duis minim. Esse veniam commodo velit culpa in pariatur laborum in minim exercitation excepteur labore commodo. Mollit cillum ipsum adipisicing in nulla mollit irure. Et laborum minim sit id pariatur ad voluptate nulla ullamco deserunt veniam. Deserunt non aliquip sint amet.\r\nEsse dolor adipisicing ut pariatur pariatur dolore eu mollit reprehenderit consequat. Adipisicing fugiat sunt voluptate magna Lorem est eu anim id commodo eu consectetur. Mollit ad excepteur et do velit dolor adipisicing veniam cupidatat excepteur qui.\r\n", + "address": "2 Hull Street", + "city": "Darbydale", + "state": "Rhode Island", + "zip": 97458, + "country": "St. Helena", + "email": "olsonburch@scentric.com", + "phone": "(995) 590-2366", + "color": "rgb(91,252,80)" + }, + { + "index": 76, + "name": "Walton Wagner", + "first": "Powell", + "last": "Nunez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/73.jpg", + "expanded": false, + "guid": "6c34053d-b9d3-4a75-a660-83b6fc0925a5", + "integer": 97, + "date": "Wed Nov 27 1996 04:47:04 GMT-0800 (PST)", + "shortText": "sunt voluptate dolor", + "mediumText": "Magna elit cillum enim sunt ut occaecat veniam elit elit laborum. Amet sint labore tempor tempor consectetur commodo aliquip magna duis non et. Aute labore est cupidatat do officia minim consectetur ea exercitation ex nostrud enim tempor veniam. Excepteur amet eiusmod velit exercitation eu cillum et minim sunt adipisicing dolor velit. Duis laboris dolor aliquip minim non laboris do veniam.", + "longText": "Ea esse officia reprehenderit do proident dolore ullamco. Quis officia minim sit anim tempor laborum in tempor dolore officia consectetur. Officia pariatur est commodo veniam in ex duis labore velit irure enim laboris id. Esse irure in adipisicing irure officia et veniam anim mollit. Qui qui tempor proident sunt enim incididunt elit aliqua Lorem dolore est do enim dolor. Deserunt consequat pariatur magna aute enim.\r\nDolor est culpa magna duis reprehenderit Lorem ad dolore tempor aute velit veniam sunt. Labore reprehenderit ea culpa ea reprehenderit sint amet in eiusmod dolore. Anim consequat ex labore qui nulla occaecat laborum. Id voluptate pariatur esse aute consequat et nisi. Proident dolor consequat anim esse eiusmod et veniam proident qui non commodo nulla cupidatat.\r\n", + "address": "2 Vanderveer Place", + "city": "Robinette", + "state": "Georgia", + "zip": 54771, + "country": "Suriname", + "email": "powellnunez@scentric.com", + "phone": "(992) 548-3878", + "color": "rgb(95,253,239)" + }, + { + "index": 77, + "name": "Harris Ewing", + "first": "Orr", + "last": "Buchanan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/S0ufi4n3/73.jpg", + "expanded": false, + "guid": "387624b1-451d-47c6-978f-aabd0b34e707", + "integer": 69, + "date": "Sun Aug 18 1996 22:19:42 GMT-0700 (PDT)", + "shortText": "duis ea", + "mediumText": "Irure aliquip sit excepteur incididunt nisi excepteur laboris in do proident commodo ad. Culpa dolore Lorem irure magna mollit laboris officia fugiat amet. Ut ipsum est mollit quis. In occaecat mollit officia fugiat magna occaecat.", + "longText": "Magna cillum culpa esse in sint in sit. Sint aute nulla ad pariatur commodo sint aute consectetur magna dolore labore ex Lorem culpa. Officia aute magna cupidatat dolor aliquip minim voluptate mollit aliqua pariatur ullamco. Ullamco labore ex exercitation ad culpa labore laborum deserunt mollit mollit enim ut. Incididunt dolore est id cupidatat eu do aliqua minim occaecat consectetur.\r\n", + "address": "3 Ralph Avenue", + "city": "Martell", + "state": "New Mexico", + "zip": 31746, + "country": "Greece", + "email": "orrbuchanan@scentric.com", + "phone": "(861) 535-2683", + "color": "rgb(162,149,148)" + }, + { + "index": 78, + "name": "Kerr Briggs", + "first": "Helena", + "last": "Lynch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nepdud/73.jpg", + "expanded": false, + "guid": "d16cdb93-caba-40e3-b359-8124309f23fd", + "integer": 83, + "date": "Tue Dec 27 2011 21:18:32 GMT-0800 (PST)", + "shortText": "adipisicing est laboris eiusmod", + "mediumText": "Voluptate ad eiusmod eiusmod sunt minim do et ullamco. Id incididunt do labore consectetur laborum excepteur labore id nostrud cupidatat anim officia et velit. Nostrud sunt commodo aute culpa ea et consequat laborum commodo deserunt. Dolore ad amet reprehenderit incididunt exercitation enim duis deserunt. Ea irure et veniam sunt Lorem tempor.", + "longText": "Commodo enim ullamco cupidatat ex minim et ex fugiat eiusmod exercitation minim eu. Id eu exercitation commodo fugiat elit ex laborum ea. Aute duis adipisicing mollit duis non anim anim deserunt. Nulla adipisicing irure commodo ut nostrud irure ea Lorem in enim laborum laboris laborum.\r\nSunt eiusmod dolor ullamco elit mollit esse consequat culpa non do minim reprehenderit exercitation. Id quis laborum eu id Lorem eu aute elit aliqua aliquip labore. Nisi sit mollit velit anim culpa proident esse ut sunt deserunt quis ad dolor. Incididunt excepteur non est occaecat do Lorem veniam sunt cillum velit ut exercitation et. Minim eiusmod ipsum veniam nisi nostrud anim commodo amet est amet ullamco minim ut. Magna aliquip Lorem dolore do nulla ipsum aute mollit incididunt in adipisicing pariatur ad eiusmod. Est velit Lorem incididunt ex aliquip ut laboris nulla.\r\nAd voluptate ullamco dolor culpa. Occaecat sit anim anim id esse commodo consectetur. Velit aliquip laborum fugiat occaecat consectetur magna amet tempor consequat nisi proident nisi. Aliquip et sit aliquip anim. Labore in culpa elit quis reprehenderit duis anim dolor dolore occaecat sint ad Lorem.\r\nDolore culpa irure cillum enim adipisicing enim sint ut laboris elit cillum veniam eu sit. Magna Lorem dolore sint aute cupidatat incididunt excepteur adipisicing magna ex exercitation. Duis id commodo eu adipisicing. Non labore ut laboris officia id.\r\n", + "address": "2 Wilson Avenue", + "city": "Coral", + "state": "Arizona", + "zip": 32289, + "country": "New Caledonia", + "email": "helenalynch@scentric.com", + "phone": "(880) 590-3786", + "color": "rgb(192,101,57)" + }, + { + "index": 79, + "name": "Genevieve Mooney", + "first": "Beatriz", + "last": "Case", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/amir_hooseini/73.jpg", + "expanded": false, + "guid": "f35cbf9b-3c23-45a2-80cc-959e537f5ed8", + "integer": 7, + "date": "Mon Apr 10 1972 22:46:01 GMT-0800 (PST)", + "shortText": "ut commodo excepteur cillum", + "mediumText": "Nulla aute quis minim culpa proident anim ipsum enim. Magna cillum fugiat eu dolor laboris dolore.", + "longText": "Non non eu qui nulla anim officia officia officia labore culpa. In laborum est ad aliqua laborum sit quis. Aliquip voluptate anim excepteur deserunt dolore dolor dolor ipsum.\r\nProident fugiat nisi qui eu exercitation reprehenderit sint. Elit commodo aliqua quis elit dolor eiusmod consectetur. Nostrud qui non voluptate sint sit anim laboris incididunt. Dolor labore nisi aliquip labore. Amet voluptate sunt pariatur excepteur laborum laborum anim dolor. Excepteur exercitation in labore nostrud aliquip anim duis reprehenderit aliqua dolore amet cillum est consectetur.\r\n", + "address": "4 Hoyts Lane", + "city": "Richmond", + "state": "Texas", + "zip": 12769, + "country": "Syria", + "email": "beatrizcase@scentric.com", + "phone": "(868) 586-2207", + "color": "rgb(127,85,140)" + }, + { + "index": 80, + "name": "Heidi Dillon", + "first": "Jenifer", + "last": "Contreras", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kokikillara/73.jpg", + "expanded": false, + "guid": "198e5b2c-45aa-4d86-aa99-c9e493b55d5c", + "integer": 57, + "date": "Fri Mar 05 2010 16:32:14 GMT-0800 (PST)", + "shortText": "cillum velit deserunt aute in", + "mediumText": "Mollit quis officia in commodo officia ex. Aliqua commodo incididunt cillum Lorem cillum est commodo do aliqua eiusmod. Laborum labore pariatur aute aute minim.", + "longText": "Deserunt enim nisi esse commodo enim irure ullamco eiusmod fugiat. Eiusmod sint reprehenderit minim deserunt voluptate ut sit consectetur id quis ullamco pariatur ut excepteur. Exercitation consectetur commodo ipsum minim. Culpa id occaecat non commodo amet esse magna mollit. Duis anim qui commodo voluptate aliquip ut exercitation amet ea. Quis labore ullamco irure irure ut amet consequat voluptate laborum. Nulla aliqua mollit deserunt sunt deserunt eu adipisicing ea magna ex occaecat.\r\nDuis cillum laborum et sit laborum exercitation commodo nulla magna proident duis. Nisi do excepteur enim esse minim sunt voluptate tempor dolore dolor fugiat sunt duis. Ipsum id velit mollit labore ut sunt quis aliqua adipisicing ad labore ipsum.\r\nAute cupidatat sint proident magna cupidatat sint est deserunt Lorem nisi sit ut. Duis laborum exercitation incididunt deserunt anim ipsum consectetur. Sit laborum irure commodo laboris eiusmod ut laboris ex excepteur proident labore reprehenderit mollit est. Sunt minim ea quis officia ad.\r\nCillum eiusmod ad consequat aliquip consectetur pariatur. Incididunt qui exercitation labore anim. Sint laboris ad sit est ut laboris. Aliqua sit proident cillum commodo fugiat reprehenderit ad. Est elit id sunt laborum excepteur sit Lorem. Ex anim mollit amet ex nostrud nulla irure nisi amet cupidatat non elit enim adipisicing. Cupidatat occaecat irure est fugiat amet adipisicing eu laboris aliqua quis minim sint.\r\nDolor consequat laborum sint enim qui. Sint eiusmod nostrud excepteur dolore incididunt excepteur labore amet ea non nostrud. Cupidatat nulla exercitation tempor ut adipisicing qui voluptate. Quis voluptate proident reprehenderit labore in cillum et commodo exercitation magna. Irure labore irure amet eu fugiat tempor reprehenderit laborum occaecat consectetur ut.\r\n", + "address": "4 Clove Road", + "city": "Brazos", + "state": "District Of Columbia", + "zip": 94302, + "country": "Rwanda", + "email": "jenifercontreras@scentric.com", + "phone": "(886) 401-2897", + "color": "rgb(103,86,175)" + }, + { + "index": 81, + "name": "Morrow Hendrix", + "first": "Pittman", + "last": "Powers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/christianoliff/73.jpg", + "expanded": false, + "guid": "3e7a6c19-006a-4533-86eb-5032c524f1b9", + "integer": 87, + "date": "Mon Jun 13 1977 05:06:10 GMT-0700 (PDT)", + "shortText": "culpa dolor proident non occaecat", + "mediumText": "Consectetur commodo nulla cupidatat exercitation id aliquip.", + "longText": "Reprehenderit irure esse esse esse enim aute elit occaecat officia eiusmod nostrud. Minim labore amet veniam quis laboris cupidatat elit non. Magna amet in elit duis amet velit do duis adipisicing ut. Commodo officia dolore veniam laborum laborum pariatur aute nulla magna dolore esse laboris ea. Irure adipisicing officia velit Lorem.\r\nAd officia adipisicing commodo ipsum sunt in commodo adipisicing qui eu. Esse minim anim do officia laborum deserunt aliquip deserunt ea dolor ut eiusmod non fugiat. Dolore commodo laboris ullamco consectetur amet et non occaecat labore velit est. Veniam elit deserunt eu laboris minim esse. Et ad eu eu voluptate non ad aute nostrud in in. Sint qui mollit aliquip laboris dolor elit incididunt cillum. Mollit fugiat minim tempor amet proident et esse do.\r\nDo laborum do sunt pariatur. Cillum nulla ut exercitation consectetur ad sunt qui. Incididunt Lorem voluptate veniam minim deserunt aliqua. Veniam aute reprehenderit irure excepteur ut aute laborum eu. Sit veniam nisi qui officia. Reprehenderit voluptate tempor et cupidatat cupidatat enim aute. Aliquip reprehenderit esse ad commodo dolor deserunt nisi minim duis ut tempor pariatur quis ad.\r\nEa magna non ex laboris adipisicing deserunt. Ea ad voluptate ipsum consectetur magna voluptate amet eu fugiat. Aute do excepteur exercitation esse consequat aute enim Lorem occaecat id Lorem.\r\nAdipisicing cupidatat sunt non ipsum voluptate nulla occaecat. Pariatur magna exercitation aliqua irure ipsum cillum qui nostrud exercitation ullamco anim occaecat reprehenderit qui. Exercitation voluptate enim magna excepteur eu aliquip id enim laboris aute exercitation sint aliqua. Enim officia tempor labore nulla ut veniam ullamco reprehenderit occaecat nulla. Adipisicing officia ullamco cupidatat et dolor ut cillum enim est aliqua. Cillum et laborum nostrud ex irure do aliquip qui amet cillum nisi exercitation.\r\n", + "address": "2 Lawn Court", + "city": "Alleghenyville", + "state": "Virgin Islands", + "zip": 25057, + "country": "Puerto Rico", + "email": "pittmanpowers@scentric.com", + "phone": "(814) 551-2487", + "color": "rgb(194,148,221)" + }, + { + "index": 82, + "name": "Cook Espinoza", + "first": "Kelli", + "last": "Gallagher", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andrey_maxim/73.jpg", + "expanded": false, + "guid": "77727f82-a7eb-40af-91dc-dd76a57e5761", + "integer": 4, + "date": "Sat Apr 29 1995 09:21:20 GMT-0700 (PDT)", + "shortText": "est ad non officia", + "mediumText": "Ipsum magna velit cillum cupidatat tempor ad ad amet adipisicing. Aliquip cillum irure id velit. Ullamco occaecat labore dolor sint. Sit dolor consequat in dolor commodo eiusmod anim ullamco consequat laboris non. Esse fugiat cupidatat laboris aliquip non nostrud officia amet.", + "longText": "Do elit consectetur nostrud reprehenderit deserunt culpa deserunt exercitation exercitation. Tempor eiusmod eiusmod incididunt minim mollit exercitation quis do sit amet duis. Culpa in consectetur esse ipsum voluptate sit non qui elit voluptate ea eu tempor excepteur. Enim minim fugiat quis velit dolor adipisicing sunt elit ipsum nulla culpa pariatur sint aliquip.\r\nAd magna enim culpa magna sint pariatur sunt nostrud ad fugiat cupidatat. Sunt non eiusmod nulla cupidatat eu ea eu laborum quis fugiat voluptate nulla laboris. Dolor ad reprehenderit minim commodo dolore commodo aliqua adipisicing dolor laborum pariatur eiusmod laborum irure. Sunt ex adipisicing culpa quis nostrud elit est occaecat ut ut exercitation ullamco ea. In et irure irure tempor est do do qui. Consectetur velit aute enim exercitation ipsum proident officia eiusmod nostrud deserunt nulla cupidatat ullamco.\r\nEsse nisi quis laborum commodo non proident ullamco. Ipsum qui in non adipisicing do incididunt. Magna incididunt amet dolor laboris commodo est voluptate cillum ea amet quis deserunt do. Non in laborum anim mollit sunt irure incididunt ex sit nostrud duis amet. Reprehenderit ipsum anim culpa in. Duis voluptate esse cillum ad eu incididunt.\r\nOccaecat officia in laboris proident aliquip pariatur consectetur consequat commodo enim tempor et. Sit do veniam duis mollit ipsum aliqua et id do do id sint cillum. Ad incididunt minim velit id tempor consequat eiusmod mollit sit do dolor commodo minim quis. Nulla laboris velit excepteur laborum exercitation labore aliqua est enim duis anim sint pariatur duis. Velit elit fugiat mollit ex amet dolor nulla nisi. Laborum ad ut enim ut tempor proident cillum sunt id voluptate et.\r\n", + "address": "2 Bay Avenue", + "city": "Frystown", + "state": "Puerto Rico", + "zip": 13050, + "country": "Korea (North)", + "email": "kelligallagher@scentric.com", + "phone": "(865) 413-3195", + "color": "rgb(105,173,239)" + }, + { + "index": 83, + "name": "Mari Nguyen", + "first": "Moss", + "last": "English", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/muringa/73.jpg", + "expanded": false, + "guid": "1aaee0b4-f194-4e72-8c8b-9eb7aada953a", + "integer": 29, + "date": "Sat Aug 22 1987 08:31:57 GMT-0700 (PDT)", + "shortText": "minim enim voluptate minim", + "mediumText": "Ut est et consequat culpa dolor culpa veniam eiusmod. Commodo adipisicing voluptate laboris nulla esse non reprehenderit pariatur veniam proident reprehenderit.", + "longText": "Pariatur quis sit tempor dolor sit commodo in. Pariatur consectetur sint ea aliquip pariatur dolor commodo et et dolore in esse occaecat. Velit labore nostrud sit deserunt Lorem. Proident labore elit irure consequat sit. Sunt est veniam ullamco pariatur incididunt ad cupidatat. Sit proident tempor anim cupidatat nostrud ullamco do incididunt. Magna in amet anim laboris labore fugiat duis culpa cupidatat enim ipsum ut mollit excepteur.\r\nLorem voluptate officia ut adipisicing occaecat cillum cupidatat. Culpa mollit magna duis pariatur officia officia ad. Reprehenderit reprehenderit reprehenderit proident deserunt. Dolor proident nostrud veniam ea ut. Nisi nisi esse aute adipisicing laborum nulla laboris magna do commodo voluptate sunt ipsum. Occaecat dolor pariatur esse velit eu sint adipisicing cillum magna nulla.\r\nAmet eu et anim nisi mollit ut sit minim. Aute proident non ea consequat do laborum ex consectetur. Cillum commodo minim id veniam duis commodo laboris consequat sunt. Sit ullamco veniam dolor occaecat nostrud dolor incididunt enim minim esse adipisicing id. Adipisicing velit nisi cupidatat velit velit culpa eu reprehenderit duis id aliquip quis tempor fugiat.\r\nAliquip ex elit nulla duis enim aliqua officia. Commodo proident aute labore nostrud nostrud. Et et ad nisi sit ex id eiusmod est Lorem. Enim pariatur velit sunt quis eu fugiat. Consectetur est aute est aliquip elit occaecat quis eiusmod tempor sunt nisi aliqua. Enim ex eu ipsum id sit Lorem excepteur ad voluptate.\r\nAute non est enim ullamco quis proident Lorem Lorem sunt dolor culpa irure. Nostrud quis aliqua ex commodo irure officia mollit Lorem reprehenderit sunt velit. Ut velit cillum velit et ea irure laborum adipisicing amet adipisicing anim. Voluptate exercitation pariatur culpa irure occaecat in reprehenderit ipsum esse. Excepteur quis cillum Lorem do. Tempor est tempor fugiat amet cupidatat nostrud aute cillum.\r\n", + "address": "2 Trucklemans Lane", + "city": "Waiohinu", + "state": "Maryland", + "zip": 78112, + "country": "Bosnia and Herzegovina", + "email": "mossenglish@scentric.com", + "phone": "(823) 570-2457", + "color": "rgb(97,59,63)" + }, + { + "index": 84, + "name": "Bauer Ruiz", + "first": "Marcia", + "last": "Farmer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmedelgabri/73.jpg", + "expanded": false, + "guid": "0efaa095-a6b2-4f62-9b1d-c965c8aa4407", + "integer": 49, + "date": "Wed Oct 17 1979 09:38:39 GMT-0700 (PDT)", + "shortText": "cillum cillum ipsum pariatur excepteur", + "mediumText": "Irure dolor Lorem cillum enim esse. Consectetur duis elit aute ut tempor do ea non ad velit. Officia voluptate occaecat exercitation exercitation cillum anim. Exercitation anim tempor qui tempor nulla minim eu quis ad minim.", + "longText": "Sit proident eu velit ad do velit nostrud aute consectetur. Lorem et magna non consequat enim ut. Qui duis consectetur fugiat consectetur elit sit Lorem cupidatat. Ipsum tempor dolore sunt duis. Veniam culpa exercitation sint laboris proident exercitation dolor deserunt aute est exercitation ex laboris.\r\nEsse id non veniam ut ad nostrud ex aliquip culpa quis. Cupidatat ad anim irure pariatur. Consectetur sint officia laboris non consequat proident laboris sunt ipsum. Dolor amet culpa enim pariatur proident eu labore pariatur. Do adipisicing tempor pariatur mollit laborum mollit elit mollit laboris dolore. Aute magna reprehenderit nulla magna amet minim nostrud in aute qui eu ut sunt. Exercitation eiusmod reprehenderit sint esse reprehenderit reprehenderit.\r\nTempor est Lorem eu adipisicing adipisicing est ea. Irure nulla officia culpa laboris do tempor aute laboris elit aute pariatur occaecat qui laborum. Minim duis pariatur consectetur laboris aliquip cupidatat aute enim cillum adipisicing voluptate occaecat enim dolor.\r\nAdipisicing ut voluptate et aliquip eu. Duis laborum irure ullamco voluptate labore in non. Nostrud voluptate voluptate consectetur culpa voluptate aute. Esse dolor enim ad dolor. Aliquip sint esse elit eiusmod mollit. Ipsum in est exercitation qui. Id sit amet nulla qui minim fugiat enim.\r\n", + "address": "3 Paerdegat Avenue", + "city": "Hanover", + "state": "Massachusetts", + "zip": 30524, + "country": "France", + "email": "marciafarmer@scentric.com", + "phone": "(836) 524-2616", + "color": "rgb(169,63,64)" + }, + { + "index": 85, + "name": "Ollie Melton", + "first": "Dennis", + "last": "Hill", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bobbytwoshoes/73.jpg", + "expanded": false, + "guid": "fda2534f-880f-4794-999d-d315d49ba7a9", + "integer": 84, + "date": "Fri Mar 14 2003 11:31:33 GMT-0800 (PST)", + "shortText": "in dolore", + "mediumText": "Elit reprehenderit mollit deserunt nisi. Officia ea id minim culpa id enim consectetur laborum enim non esse et fugiat proident. Consequat magna mollit amet ipsum nisi et commodo nulla officia duis amet laboris ex. Ad ad amet nisi fugiat pariatur mollit sit non culpa consectetur eiusmod.", + "longText": "Ea commodo tempor ea culpa ea quis ipsum pariatur occaecat nulla officia. Reprehenderit laboris non eiusmod aute adipisicing esse eiusmod commodo ex exercitation occaecat. Velit est reprehenderit anim adipisicing et cillum. Sit proident ipsum est reprehenderit eiusmod nulla laborum. Laboris consectetur excepteur sunt ex commodo. Aliqua laboris quis dolor cillum tempor sint do occaecat deserunt cillum dolor ea nisi ipsum.\r\nNisi adipisicing commodo et id officia non laborum et laborum eiusmod adipisicing duis. Eiusmod tempor in quis anim do ullamco exercitation est. Consequat ad commodo adipisicing nisi dolor excepteur ex incididunt anim sunt velit reprehenderit magna. Proident eiusmod eu qui officia duis amet mollit velit elit.\r\n", + "address": "4 Pacific Street", + "city": "Osmond", + "state": "Oklahoma", + "zip": 41895, + "country": "Guinea", + "email": "dennishill@scentric.com", + "phone": "(974) 511-2460", + "color": "rgb(208,193,99)" + }, + { + "index": 86, + "name": "Carlson Petty", + "first": "Miranda", + "last": "Garner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/milovanovicdu/73.jpg", + "expanded": false, + "guid": "4d705513-68a1-4d45-bf9d-593447e391e2", + "integer": 47, + "date": "Thu Dec 30 1976 16:50:53 GMT-0800 (PST)", + "shortText": "anim in do aliquip", + "mediumText": "Do aute est tempor dolore culpa. Ipsum commodo aute veniam officia aliqua enim laboris irure qui. Cupidatat laborum eu consequat laborum sint officia officia aliquip tempor qui nulla fugiat.", + "longText": "Eu consectetur sint aute fugiat duis consectetur anim nisi culpa ullamco. Duis irure dolore ullamco consectetur reprehenderit anim et proident. Officia consequat cupidatat adipisicing consequat amet sit cillum amet commodo. Duis magna dolore incididunt laborum.\r\nReprehenderit enim pariatur labore irure exercitation consectetur eu eu deserunt. Eiusmod excepteur qui elit qui enim adipisicing dolore aliquip anim enim deserunt aliquip et. Irure eiusmod qui quis consectetur est enim. Culpa Lorem nostrud cupidatat magna sint ad cillum culpa adipisicing dolore commodo in laborum cupidatat. Dolore sint minim cupidatat laboris fugiat est ad quis occaecat adipisicing laborum nisi. Magna labore qui anim non qui elit velit do ex veniam ullamco. Eiusmod minim sit pariatur cillum exercitation non occaecat qui et.\r\nUllamco esse ullamco amet amet fugiat occaecat ex in fugiat nulla. Deserunt magna labore fugiat qui officia qui enim minim. Adipisicing irure proident sunt commodo cillum aliqua velit. Esse est est ipsum est elit duis ipsum exercitation. Ipsum sit deserunt duis eu duis id sunt ipsum aute eiusmod.\r\nOfficia eu deserunt veniam deserunt do exercitation. Amet reprehenderit enim anim exercitation sunt do cillum officia laboris commodo mollit quis laboris irure. Duis nisi nulla nisi enim enim. Ipsum minim sit est culpa nostrud aute elit commodo minim laboris incididunt Lorem nostrud. Ullamco sint deserunt incididunt nisi.\r\nSit cillum occaecat officia laboris do cillum. Irure consectetur occaecat elit nostrud. Nisi commodo nulla culpa fugiat duis in consectetur sint proident Lorem non sunt. Fugiat Lorem deserunt duis mollit do sit id.\r\n", + "address": "2 Laurel Avenue", + "city": "Freetown", + "state": "Ohio", + "zip": 80225, + "country": "Senegal", + "email": "mirandagarner@scentric.com", + "phone": "(989) 558-3766", + "color": "rgb(201,116,189)" + }, + { + "index": 87, + "name": "Randolph Lewis", + "first": "Isabella", + "last": "Fry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imughal7/73.jpg", + "expanded": false, + "guid": "70e8a5f4-7b65-42d2-bdfa-cd58c31f5e45", + "integer": 2, + "date": "Mon Aug 13 1990 16:40:29 GMT-0700 (PDT)", + "shortText": "velit laboris tempor", + "mediumText": "Ullamco in esse consectetur ea tempor adipisicing ad veniam eiusmod proident.", + "longText": "Aliquip in dolore Lorem labore fugiat et ut nulla voluptate nostrud adipisicing irure. Cupidatat culpa ea consequat cillum culpa amet do deserunt amet voluptate tempor reprehenderit. Esse est excepteur incididunt esse elit laborum nulla ad. Adipisicing reprehenderit amet officia occaecat. Nisi Lorem ea duis id ex aute consequat mollit adipisicing id. Eu mollit elit nostrud labore adipisicing. Magna sunt proident duis voluptate enim ut id qui aliquip ea nisi velit.\r\nDolor duis sint tempor ad commodo sit ut minim id. Magna dolor et sunt ut laborum fugiat officia dolore adipisicing reprehenderit et ullamco nisi. Sint dolor ut laborum tempor veniam dolore eiusmod id adipisicing excepteur proident. Laborum magna fugiat pariatur dolore. Ipsum irure consequat nulla velit. Sint duis mollit exercitation enim fugiat voluptate.\r\nExcepteur adipisicing et magna sunt. Officia incididunt reprehenderit et ea culpa nostrud ex minim ad minim. Consequat magna ipsum laborum ut tempor pariatur Lorem magna minim labore cillum ad nulla nulla.\r\nMinim tempor veniam consequat veniam esse adipisicing officia sint id do veniam. Ullamco dolore ad consequat minim veniam deserunt magna sit nulla cupidatat cillum non incididunt veniam. Labore aliqua cupidatat excepteur eu veniam. Sit id id ut minim aute qui aliqua dolore id ex deserunt id ullamco laboris. Fugiat irure irure nisi in mollit ad cillum sit duis exercitation ad sint sit consectetur. Voluptate eu amet consectetur consectetur dolore ex ad.\r\n", + "address": "2 Schenck Street", + "city": "Richford", + "state": "Nevada", + "zip": 27095, + "country": "Yugoslavia", + "email": "isabellafry@scentric.com", + "phone": "(974) 558-2625", + "color": "rgb(220,182,202)" + }, + { + "index": 88, + "name": "Daniel Foley", + "first": "Stephens", + "last": "Bender", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/creative_px/73.jpg", + "expanded": false, + "guid": "e3ad719a-545a-47b0-a02a-62dfec32263f", + "integer": 98, + "date": "Thu Jan 28 1982 23:00:55 GMT-0800 (PST)", + "shortText": "anim", + "mediumText": "Dolor consequat aute ea officia non dolor consequat exercitation pariatur.", + "longText": "Sunt cupidatat officia ea officia fugiat sunt cupidatat. Esse ex adipisicing mollit ipsum aute. Consectetur non nisi nostrud eiusmod voluptate cupidatat nulla. Dolor enim nulla laboris enim qui velit tempor. Sunt Lorem do qui minim pariatur sint eu occaecat officia laboris. Pariatur reprehenderit occaecat ad ipsum occaecat ex. Magna qui ullamco laborum sint adipisicing magna velit labore sit excepteur duis ad.\r\nMagna laboris ut eiusmod tempor velit exercitation duis qui exercitation. Do occaecat ea consequat non sit eiusmod dolor aute dolor ea elit eiusmod. Ad ad qui reprehenderit culpa velit.\r\nAdipisicing non laboris magna aute pariatur. Sit irure aliquip aute minim sit velit fugiat minim excepteur. Laborum reprehenderit dolor ea ipsum aute minim Lorem velit.\r\n", + "address": "3 Aster Court", + "city": "Diaperville", + "state": "Montana", + "zip": 59636, + "country": "Uzbekistan", + "email": "stephensbender@scentric.com", + "phone": "(929) 559-3077", + "color": "rgb(214,117,159)" + }, + { + "index": 89, + "name": "Morales Mays", + "first": "Tracie", + "last": "Pate", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gabrielizalo/73.jpg", + "expanded": false, + "guid": "f420dfd4-d785-4f2d-ad37-b48a8c5e8c63", + "integer": 42, + "date": "Tue Jun 10 2014 10:24:55 GMT-0700 (PDT)", + "shortText": "elit qui deserunt veniam", + "mediumText": "Sint cupidatat laborum nostrud ullamco pariatur ea consectetur sit irure adipisicing cupidatat commodo nisi ullamco. Esse adipisicing consequat velit consequat cillum exercitation incididunt deserunt est proident. Officia incididunt et tempor esse. Adipisicing fugiat non dolor aute elit elit Lorem consectetur. Irure mollit eu est laboris ea dolor eu irure deserunt sunt nulla mollit culpa.", + "longText": "Dolor anim consequat minim exercitation incididunt voluptate dolor magna. In magna ex veniam duis ad velit commodo tempor ea excepteur. Amet veniam esse aliqua duis. Anim cupidatat voluptate culpa culpa reprehenderit in ullamco aliqua exercitation sit elit.\r\nNulla deserunt minim cupidatat labore id pariatur pariatur minim nostrud. Anim ad eu esse et incididunt labore. Incididunt culpa aliquip sit laboris magna reprehenderit Lorem quis ut commodo aliqua. Cillum velit irure eu nulla fugiat quis nisi laborum reprehenderit duis voluptate ut. Velit ea Lorem dolore ea sint excepteur eiusmod adipisicing minim proident non tempor nisi dolore. Aute dolor consectetur eu ipsum adipisicing ex exercitation consectetur proident adipisicing in.\r\nFugiat minim cupidatat ea sit velit tempor. Dolor laboris minim officia Lorem Lorem eu est ut do nisi veniam nulla adipisicing. Adipisicing veniam occaecat ex sunt id.\r\nVeniam velit ipsum Lorem est ad amet nisi adipisicing. Veniam sint pariatur velit pariatur veniam pariatur deserunt laborum ullamco sit enim et cillum commodo. Nisi incididunt et culpa occaecat aliquip. Ipsum commodo sunt proident esse amet consectetur ullamco nisi nulla voluptate magna. Consequat nostrud labore ipsum dolor mollit ullamco eu cillum occaecat.\r\nNon sit proident deserunt aliquip sunt. Ipsum quis nulla quis elit officia exercitation quis commodo. Ullamco et anim duis do nulla Lorem non commodo do ut tempor ullamco do. Commodo incididunt dolore in laborum excepteur voluptate et tempor nulla sint tempor laborum et. Consectetur amet magna consequat anim duis nisi non in. Tempor deserunt aliqua aute incididunt culpa sunt nostrud cillum laborum dolor.\r\n", + "address": "4 Herbert Street", + "city": "Wescosville", + "state": "California", + "zip": 64034, + "country": "Estonia", + "email": "traciepate@scentric.com", + "phone": "(967) 595-3876", + "color": "rgb(140,217,62)" + }, + { + "index": 90, + "name": "Christie Cobb", + "first": "Georgina", + "last": "Cardenas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/xtr1mal2/73.jpg", + "expanded": false, + "guid": "62687023-9614-4076-85b2-5cb8b60263be", + "integer": 0, + "date": "Tue Aug 27 2002 06:22:09 GMT-0700 (PDT)", + "shortText": "aliqua", + "mediumText": "Est quis aliquip tempor est elit sint adipisicing et pariatur labore deserunt ex dolore pariatur.", + "longText": "Proident pariatur ex anim proident. Et adipisicing do amet magna id fugiat mollit. Ipsum aliqua pariatur ad eu. Id officia enim enim aliqua veniam amet commodo in incididunt velit incididunt ipsum. Id adipisicing anim voluptate labore veniam cupidatat dolore quis excepteur in velit consectetur fugiat nisi. Laborum tempor duis veniam esse ut et deserunt consequat occaecat Lorem minim aliquip exercitation.\r\nEx ex id id voluptate aliqua tempor veniam non et. Enim labore ut sit quis ullamco. Et sit ea cupidatat laborum exercitation reprehenderit laborum magna enim reprehenderit commodo ex. Et ad nostrud ea nulla. Officia commodo ea ea commodo sunt pariatur in culpa incididunt voluptate magna.\r\nElit reprehenderit minim nulla officia magna proident esse proident id officia officia ea cupidatat. Pariatur duis consectetur laboris et anim excepteur labore laboris officia voluptate proident nostrud dolor incididunt. Ad laboris laborum qui occaecat do fugiat enim officia dolore sit eu.\r\n", + "address": "2 Clinton Street", + "city": "Townsend", + "state": "Marshall Islands", + "zip": 25271, + "country": "Gambia", + "email": "georginacardenas@scentric.com", + "phone": "(917) 515-3962", + "color": "rgb(108,88,246)" + }, + { + "index": 91, + "name": "Kellie Cummings", + "first": "Carissa", + "last": "Castillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eugenerifan/73.jpg", + "expanded": false, + "guid": "dbb02d06-2dc9-4b57-84cd-59d4e653047c", + "integer": 58, + "date": "Sun Jul 27 1986 08:30:17 GMT-0700 (PDT)", + "shortText": "incididunt labore aliquip", + "mediumText": "Excepteur quis proident aliquip consectetur.", + "longText": "Exercitation ea anim ex sit nisi excepteur aliqua eu cillum esse nulla deserunt ut. Cillum veniam laboris occaecat commodo est adipisicing proident. Ut deserunt enim irure officia irure deserunt ipsum labore magna. Do sint sint aliquip ullamco laboris commodo magna ea ut nostrud adipisicing et nostrud aliquip. Enim nostrud commodo do laborum fugiat incididunt quis dolore dolor voluptate tempor. Cupidatat deserunt est commodo amet cillum aliqua ullamco.\r\nEnim commodo labore id duis irure commodo eiusmod nostrud magna tempor veniam exercitation velit. Officia incididunt ut et ex anim. Esse ex cillum aliqua adipisicing et Lorem culpa elit. Commodo laborum ut in aute laboris esse exercitation eiusmod eu. Minim nulla laborum minim ad non fugiat consectetur sunt adipisicing occaecat Lorem consequat. Officia ex aliquip labore non do quis amet sit do tempor exercitation.\r\nQui do dolore officia et elit dolor magna sunt laboris nulla. Enim id deserunt ex amet non deserunt quis nisi quis pariatur commodo est excepteur cillum. Cillum commodo reprehenderit nostrud et adipisicing labore ad ex id. Adipisicing velit mollit aute eu non reprehenderit ad mollit commodo irure sit. Adipisicing cillum consequat dolor incididunt occaecat laborum et ipsum ipsum magna ipsum fugiat esse. Velit esse mollit ex nulla incididunt incididunt est sit pariatur minim fugiat.\r\nExercitation non ut id ad mollit in eu et fugiat ullamco sint ullamco consequat. Cupidatat mollit incididunt ea consectetur Lorem velit sint consectetur irure. Eiusmod sunt ipsum eu voluptate sunt. Laborum do nostrud amet commodo mollit aliqua commodo ex fugiat pariatur incididunt ea. Aute voluptate mollit culpa et cillum mollit proident ad ea proident labore. Qui aute labore pariatur ea.\r\nLaboris Lorem laborum reprehenderit sint duis adipisicing consectetur qui adipisicing cupidatat voluptate anim eu. Nostrud ea consequat officia Lorem sint enim sunt aute qui anim nulla. Est anim sit nisi magna anim. Non aliquip eu deserunt fugiat id irure voluptate labore nostrud. Qui qui ad nulla ea.\r\n", + "address": "4 Pierrepont Place", + "city": "Riviera", + "state": "Indiana", + "zip": 10834, + "country": "Nepal", + "email": "carissacastillo@scentric.com", + "phone": "(902) 528-2051", + "color": "rgb(116,122,170)" + }, + { + "index": 92, + "name": "Hooper Acosta", + "first": "Delacruz", + "last": "Hunt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imcoding/73.jpg", + "expanded": false, + "guid": "f3455179-b392-49d5-8f8e-0b570ff95363", + "integer": 63, + "date": "Wed Apr 18 1973 01:53:52 GMT-0800 (PST)", + "shortText": "aute consectetur", + "mediumText": "Non esse non cillum eiusmod. Velit consequat amet eiusmod do laborum est do. Id aliqua cupidatat tempor consectetur do consectetur.", + "longText": "In elit nisi dolore aliquip magna ex. Eu do in enim tempor duis adipisicing eiusmod magna ut velit velit do. Nostrud magna aliquip est exercitation qui elit sit.\r\nLabore Lorem minim id laborum proident in sit ea quis sit. Mollit excepteur voluptate sit qui. Ex in voluptate veniam magna dolor consectetur anim consectetur. Deserunt deserunt elit in id.\r\nAd incididunt aute labore commodo consectetur consectetur commodo magna irure. Duis adipisicing pariatur ea labore consequat ut pariatur labore laboris nulla occaecat. Irure aute id id eiusmod. Aute eiusmod Lorem eiusmod occaecat qui in veniam in laboris. Elit sit sit tempor tempor magna. Elit aliquip cupidatat commodo eiusmod consequat fugiat magna nisi fugiat irure aute dolore quis labore.\r\nOccaecat duis duis ad officia consectetur aute elit excepteur consectetur ullamco. Exercitation pariatur irure ad anim fugiat anim. Elit laborum velit aliquip et aliquip officia elit ad amet mollit nulla.\r\nFugiat minim minim anim labore culpa magna laborum veniam in reprehenderit id. Id sint pariatur excepteur commodo ullamco eu. Eiusmod magna commodo reprehenderit nostrud in culpa laboris occaecat aliqua. Sit pariatur nulla sit exercitation irure pariatur sit cillum occaecat exercitation. Aliqua dolore aliqua magna minim id ut eu veniam.\r\n", + "address": "3 Matthews Place", + "city": "Caron", + "state": "Tennessee", + "zip": 68234, + "country": "Falkland Islands (Malvinas)", + "email": "delacruzhunt@scentric.com", + "phone": "(928) 557-3052", + "color": "rgb(207,106,189)" + }, + { + "index": 93, + "name": "Leonor Rogers", + "first": "Claudette", + "last": "Walters", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/madhan4uu/73.jpg", + "expanded": false, + "guid": "d7ddd425-5e0b-407b-b795-4591ac988f7e", + "integer": 14, + "date": "Fri Sep 10 1982 05:35:18 GMT-0700 (PDT)", + "shortText": "nisi enim velit consequat", + "mediumText": "Velit ea anim fugiat ex esse officia.", + "longText": "Anim voluptate consequat et deserunt. Officia culpa quis consequat et occaecat adipisicing commodo ipsum culpa elit Lorem elit. Proident sunt sint id tempor. Pariatur nulla enim id ut aliqua commodo amet ex. Dolor ad tempor Lorem cupidatat cillum deserunt nisi.\r\nDo ad cillum consequat eu nulla irure eiusmod eu aute est sint tempor. Irure irure in culpa commodo esse occaecat fugiat minim sit est dolor. Do ex dolor non quis adipisicing amet incididunt non eiusmod nisi laborum.\r\nDeserunt anim consequat incididunt pariatur eiusmod. Aute nostrud id ipsum consequat laboris dolore. Aliquip in ullamco est incididunt anim esse magna ea labore in.\r\nAliquip ex nisi sit pariatur nostrud do dolor eiusmod consectetur ad quis consequat fugiat. Culpa enim cillum sint minim deserunt duis officia duis laborum mollit cillum ad aliqua. Sint consectetur proident duis velit ea adipisicing. Amet deserunt ut quis est ipsum velit Lorem tempor velit reprehenderit adipisicing consectetur occaecat sint.\r\nMagna nulla aute qui deserunt nostrud cillum magna fugiat occaecat Lorem ipsum culpa. Est anim aute do nisi dolor sint qui pariatur. Fugiat culpa reprehenderit officia excepteur elit amet excepteur enim tempor sint sit consequat. Consequat enim laboris officia nisi irure irure consequat elit. Dolor minim do velit sit deserunt cillum.\r\n", + "address": "3 Fulton Street", + "city": "Hegins", + "state": "Palau", + "zip": 78135, + "country": "Peru", + "email": "claudettewalters@scentric.com", + "phone": "(942) 474-3822", + "color": "rgb(90,63,99)" + }, + { + "index": 94, + "name": "Cote Guerra", + "first": "Trisha", + "last": "Chavez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tirsope/73.jpg", + "expanded": false, + "guid": "da6e4096-5de2-48f3-a83e-e7e504b7ef50", + "integer": 60, + "date": "Wed Feb 14 1990 21:07:18 GMT-0800 (PST)", + "shortText": "amet officia", + "mediumText": "Pariatur nulla nulla aliqua sunt nulla excepteur id amet consequat. Nostrud eu aliquip enim esse eu non exercitation do nulla labore adipisicing dolor. Est voluptate excepteur aliquip voluptate nulla fugiat ut amet tempor.", + "longText": "Ullamco quis exercitation sunt sunt do aute sit qui duis non. Irure dolore tempor velit velit et eu sint elit. Velit esse deserunt elit minim adipisicing sint est commodo sit aute velit excepteur dolore sunt. Occaecat adipisicing occaecat pariatur do enim culpa proident nostrud labore aute consectetur esse dolor ut. Irure pariatur minim aute labore mollit eu deserunt amet deserunt. Ex velit ad quis ullamco.\r\nOfficia nostrud excepteur nisi id esse cupidatat adipisicing. Veniam ea duis nisi exercitation labore non pariatur velit officia Lorem tempor. Qui ea culpa laborum cillum commodo. Enim eu sit adipisicing voluptate est ex incididunt eu deserunt. Sit irure dolor non culpa anim. Sint ex ullamco culpa est ipsum. Id nostrud id eiusmod ea consequat anim nulla qui aliquip sunt sunt Lorem.\r\n", + "address": "4 Montauk Court", + "city": "Ryderwood", + "state": "Virginia", + "zip": 72564, + "country": "Tonga", + "email": "trishachavez@scentric.com", + "phone": "(986) 580-3064", + "color": "rgb(252,141,100)" + }, + { + "index": 95, + "name": "Stewart Bradley", + "first": "Desiree", + "last": "Sullivan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lorenzosinisi/73.jpg", + "expanded": false, + "guid": "09ba747d-fcdd-47ec-b40f-149aad2803bd", + "integer": 14, + "date": "Mon Aug 18 2014 05:24:18 GMT-0700 (PDT)", + "shortText": "veniam officia exercitation", + "mediumText": "Sint dolor aliqua velit eu eiusmod id. Velit pariatur sit labore sit sit elit dolore fugiat veniam excepteur ex. Velit ex elit ullamco ipsum sunt magna aliqua cupidatat veniam Lorem mollit eu sit. Consequat Lorem Lorem sit aute.", + "longText": "Nulla aliquip id sunt ex reprehenderit sit et amet adipisicing pariatur sit non mollit minim. Sint nisi occaecat duis ut amet veniam mollit. Esse ipsum ea in anim. Elit est adipisicing velit cupidatat laboris in laboris eiusmod non aliquip minim. Eu commodo occaecat occaecat cupidatat cillum nulla esse mollit exercitation eu.\r\n", + "address": "4 Douglass Street", + "city": "Hiko", + "state": "Wyoming", + "zip": 58685, + "country": "Tunisia", + "email": "desireesullivan@scentric.com", + "phone": "(955) 561-2349", + "color": "rgb(67,224,233)" + }, + { + "index": 96, + "name": "Corinne Farley", + "first": "Guthrie", + "last": "May", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/celikovic/73.jpg", + "expanded": false, + "guid": "5fe813a0-75c4-4214-96b9-9b4d5fcea8bf", + "integer": 79, + "date": "Wed Aug 26 2009 12:40:36 GMT-0700 (PDT)", + "shortText": "eiusmod aliquip mollit aute", + "mediumText": "Ea irure ea pariatur laborum non commodo. Veniam est laboris ex occaecat laboris irure. Aliqua pariatur anim ut eu veniam do ex non veniam nostrud. Occaecat excepteur non est cillum commodo eu ullamco.", + "longText": "In anim esse ea excepteur est. Laboris qui ex ipsum cillum excepteur nisi. Non deserunt qui duis ut eiusmod ad laborum labore Lorem est cupidatat. Nulla eiusmod sint reprehenderit amet fugiat labore laboris.\r\nVoluptate anim minim cillum est aliquip. Occaecat eiusmod eu consectetur id id sit id aliquip minim. Id quis laboris duis dolore id pariatur officia irure ullamco cillum ullamco dolor. Ut pariatur excepteur eiusmod exercitation tempor.\r\nProident amet esse enim fugiat nostrud aute exercitation excepteur ut dolore incididunt. Eiusmod dolore irure ut tempor. Cupidatat id laboris aute nulla deserunt sint. Velit mollit ut eu commodo. Esse adipisicing veniam voluptate dolore laborum laboris qui aliquip fugiat ullamco ea exercitation voluptate. Enim veniam do aliquip aute laboris in elit magna anim. Consequat excepteur eu dolor officia eiusmod incididunt occaecat deserunt commodo nisi Lorem.\r\nMagna culpa dolore deserunt aliquip. Quis officia ut nulla et commodo officia ullamco. Cupidatat ea eiusmod nulla enim sit in.\r\nEst reprehenderit consectetur consectetur eu occaecat nulla nulla laboris est ad nulla exercitation. Amet nostrud nulla minim minim ea incididunt ea et. Exercitation qui qui mollit exercitation. Exercitation excepteur labore cillum laboris ut nulla excepteur pariatur ullamco ex ex consectetur consectetur. Lorem ex laborum in qui velit reprehenderit id pariatur esse enim. Do eu adipisicing culpa elit exercitation ea est occaecat. Et velit cupidatat excepteur sunt officia occaecat et cillum ut voluptate enim.\r\n", + "address": "3 Locust Street", + "city": "Wyano", + "state": "Colorado", + "zip": 24261, + "country": "Guadeloupe", + "email": "guthriemay@scentric.com", + "phone": "(952) 423-2212", + "color": "rgb(207,250,179)" + }, + { + "index": 97, + "name": "Heather Martinez", + "first": "Althea", + "last": "Quinn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_kshitish/73.jpg", + "expanded": false, + "guid": "d67d7b7a-2ab1-446e-a591-4f565e74fe3d", + "integer": 13, + "date": "Mon Mar 17 2003 07:02:53 GMT-0800 (PST)", + "shortText": "adipisicing magna", + "mediumText": "Reprehenderit exercitation ut in ex voluptate dolore.", + "longText": "Pariatur pariatur do ipsum exercitation magna. Irure irure officia voluptate amet fugiat sint est proident reprehenderit cupidatat est eu. Esse ea eiusmod nostrud ad quis laborum deserunt nisi. Deserunt ut fugiat aliqua minim. Proident fugiat aliqua nostrud adipisicing Lorem velit et ipsum fugiat fugiat aliquip cupidatat Lorem.\r\nEx quis non excepteur est cillum non aute consequat ipsum aliqua nostrud sunt nisi non. Est aliquip enim aute culpa. Esse enim pariatur id velit nostrud adipisicing voluptate pariatur et sint sunt.\r\nUt quis cillum dolor minim nulla fugiat enim irure officia. Reprehenderit voluptate sint veniam velit tempor deserunt eu adipisicing id anim fugiat. Nostrud dolore esse reprehenderit enim nulla duis exercitation.\r\nCillum proident est dolore sint qui sint laborum enim exercitation aute in pariatur. Ut non eiusmod excepteur exercitation aliquip incididunt cupidatat magna deserunt in est. Excepteur duis incididunt sunt commodo amet nulla ex adipisicing incididunt in exercitation amet et. Ullamco eu nulla ipsum magna voluptate incididunt aliqua id.\r\n", + "address": "4 Arkansas Drive", + "city": "Catherine", + "state": "Utah", + "zip": 68985, + "country": "Australia", + "email": "altheaquinn@scentric.com", + "phone": "(997) 529-2688", + "color": "rgb(175,88,98)" + }, + { + "index": 98, + "name": "Good Mathis", + "first": "Hester", + "last": "Santana", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/2fockus/73.jpg", + "expanded": false, + "guid": "8046ed24-325f-4486-9067-34ecfa37746c", + "integer": 67, + "date": "Sat Mar 19 1977 20:48:42 GMT-0800 (PST)", + "shortText": "commodo incididunt officia", + "mediumText": "Velit sint reprehenderit laboris occaecat in reprehenderit dolore adipisicing nisi pariatur enim aute. Cillum velit voluptate sit irure.", + "longText": "Irure labore incididunt nisi labore sint cillum cillum. Pariatur aute dolor duis ad eu nulla veniam enim voluptate. Laborum fugiat veniam occaecat adipisicing voluptate qui pariatur voluptate quis eu. Aliquip aute anim proident excepteur do aute consectetur ipsum exercitation est velit consequat laboris. Amet proident enim aute excepteur cillum. Do occaecat ullamco proident adipisicing ullamco id anim nostrud. Laborum ullamco occaecat aliqua eiusmod culpa quis nulla ad dolore ad ullamco.\r\nEsse ex officia qui qui aute. Ipsum sint irure nostrud nulla culpa cupidatat do. Aute ullamco occaecat aliquip in tempor minim ut nisi aliquip nostrud cillum Lorem. Excepteur dolor cupidatat eiusmod Lorem. Dolore eu ad sint ullamco voluptate.\r\nSit cupidatat id mollit occaecat in officia amet in magna enim sint. Officia deserunt proident quis in ut. Excepteur incididunt amet nulla labore eu incididunt adipisicing laboris nisi. Magna nisi proident deserunt sunt do deserunt eiusmod pariatur.\r\nDo elit quis occaecat anim aliquip aliquip excepteur. Enim laborum proident labore ad nulla duis magna tempor duis. Commodo veniam tempor minim cillum ex dolor.\r\nVelit adipisicing mollit pariatur in ipsum tempor id velit excepteur laborum amet laborum laborum. Excepteur eu exercitation veniam sit veniam incididunt sit. Elit commodo eu aute tempor aliquip esse non minim mollit. Consequat amet deserunt non enim. Nostrud anim Lorem aliquip cupidatat.\r\n", + "address": "3 Fiske Place", + "city": "Klagetoh", + "state": "Idaho", + "zip": 38305, + "country": "Dominican Republic", + "email": "hestersantana@scentric.com", + "phone": "(802) 512-3640", + "color": "rgb(253,247,138)" + }, + { + "index": 99, + "name": "Hurley Eaton", + "first": "Garner", + "last": "Kirk", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dnevozhai/73.jpg", + "expanded": false, + "guid": "312f254d-5789-4396-a389-10090b30c80a", + "integer": 80, + "date": "Sun Jun 01 2008 17:44:07 GMT-0700 (PDT)", + "shortText": "enim laborum", + "mediumText": "Reprehenderit labore magna est sunt dolore excepteur ea. Duis laboris eiusmod do laboris cupidatat proident in amet quis adipisicing est nisi.", + "longText": "Sunt mollit aliqua nisi irure sit. Minim sit amet duis nisi Lorem veniam. Deserunt anim est sint consequat pariatur elit eu magna incididunt duis aliquip. Do ipsum adipisicing eu quis ut nostrud fugiat ad in nostrud est sint enim. Incididunt exercitation commodo ipsum ut eu. Irure et adipisicing esse dolor eu. Ea consequat cillum eu occaecat in magna cillum anim culpa deserunt.\r\nConsectetur adipisicing velit minim et occaecat laborum minim fugiat eu laboris minim anim id do. Sint cupidatat pariatur sit quis quis elit pariatur. Deserunt proident enim Lorem est minim nisi et laborum nisi exercitation. Mollit qui consequat proident aliqua ad quis dolor. Irure nulla nisi ut Lorem ullamco sint et nulla dolore consectetur. Esse Lorem qui do pariatur mollit in velit amet labore.\r\nAliqua magna eiusmod ea velit sit voluptate in ea ad Lorem laborum aute cillum et. Veniam ea eiusmod dolor Lorem adipisicing deserunt. Do sunt dolore do fugiat et magna id aliquip nulla occaecat mollit.\r\nId veniam voluptate irure est ea irure nostrud ex. Est anim est dolor exercitation reprehenderit minim non est commodo ex est ut Lorem. Nulla aute nulla dolore amet deserunt elit tempor reprehenderit amet. Nulla et magna aliqua laborum ut minim ad in ex mollit dolor officia.\r\n", + "address": "2 Marconi Place", + "city": "Clarktown", + "state": "Arkansas", + "zip": 81655, + "country": "Zaire", + "email": "garnerkirk@scentric.com", + "phone": "(901) 504-3233", + "color": "rgb(141,220,214)" + }, + { + "index": 100, + "name": "Ruby Schroeder", + "first": "Julianne", + "last": "Hurst", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sebasribas/73.jpg", + "expanded": false, + "guid": "ae0e0ad1-423d-4e87-9d72-e7957011b3b1", + "integer": 51, + "date": "Tue Jun 14 1977 06:58:41 GMT-0700 (PDT)", + "shortText": "consectetur", + "mediumText": "Ex ea veniam ut velit aute dolore laborum ut. Ex proident elit cillum elit reprehenderit amet fugiat cillum cupidatat fugiat. Elit Lorem aute ad ad sit exercitation aute excepteur ex elit.", + "longText": "Eiusmod in irure exercitation aute aliquip qui sit amet ullamco cillum eiusmod enim. Ut aliquip occaecat nisi aliqua ut esse minim. Tempor deserunt dolore ea fugiat tempor cupidatat fugiat excepteur consectetur velit tempor eiusmod laborum. Adipisicing incididunt ex sit aliqua deserunt in culpa. Veniam ipsum enim duis enim ex proident do anim amet. Ipsum consequat ut labore non quis cupidatat adipisicing eiusmod amet.\r\nQui consectetur pariatur adipisicing aliquip nulla labore nulla in laborum excepteur eiusmod eu esse. Elit duis commodo ex laboris consectetur sunt in ullamco elit aliquip commodo consequat adipisicing. Labore eiusmod dolore ut voluptate proident. Officia fugiat culpa elit consectetur mollit sint ut. Duis magna cillum Lorem adipisicing amet nisi minim laboris nostrud fugiat eu nisi sunt.\r\nEa voluptate anim reprehenderit eu laboris ex ad non ut magna eu esse laborum. Eiusmod non dolor ex adipisicing sunt elit proident in officia pariatur eiusmod minim voluptate ex. Commodo excepteur enim sit dolor magna. Quis velit adipisicing pariatur ad ullamco ullamco eu fugiat consectetur. Est fugiat esse cupidatat velit ea aute laboris occaecat ullamco est velit. Aliqua adipisicing ex duis ipsum.\r\nLaboris mollit est officia in commodo consequat ullamco officia id aute non in ut. Excepteur ad magna sit dolore voluptate irure ut. Occaecat ea duis ipsum excepteur fugiat esse nulla incididunt fugiat adipisicing cupidatat labore. Voluptate eu consectetur tempor qui in quis in ad proident magna ex aliquip ad. Aute laboris consectetur proident ullamco voluptate nulla commodo tempor aliqua magna. Laborum eiusmod nulla occaecat quis elit aliquip aute id irure ut excepteur.\r\n", + "address": "3 Wyckoff Avenue", + "city": "Holcombe", + "state": "Delaware", + "zip": 49315, + "country": "China", + "email": "juliannehurst@scentric.com", + "phone": "(867) 576-3002", + "color": "rgb(191,56,212)" + }, + { + "index": 101, + "name": "Alana Wise", + "first": "Edith", + "last": "Suarez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cepreygolubev/73.jpg", + "expanded": false, + "guid": "19280eda-c661-4fde-88e3-e7e705ea0a83", + "integer": 59, + "date": "Wed Jun 25 2003 02:31:03 GMT-0700 (PDT)", + "shortText": "aute", + "mediumText": "Consectetur eu aute tempor mollit do aute nostrud adipisicing ad commodo id.", + "longText": "Incididunt excepteur cupidatat mollit ad tempor esse cupidatat velit ipsum non tempor est incididunt. Duis consequat dolore elit cupidatat mollit est. Exercitation et ex deserunt adipisicing tempor consectetur adipisicing ipsum deserunt amet enim tempor. Excepteur elit sit cupidatat cupidatat sit ea anim ullamco cupidatat nisi consectetur ut. Adipisicing amet duis occaecat excepteur adipisicing et exercitation enim est.\r\nCulpa nulla dolor ullamco occaecat dolor elit irure dolor velit anim id incididunt eiusmod ut. Deserunt dolore fugiat ipsum tempor ut dolore nostrud. Exercitation cillum culpa nostrud est. Quis qui sunt dolor id aliquip culpa anim nisi deserunt.\r\nLaborum eu minim aliqua excepteur ad. Sit tempor ullamco laborum excepteur pariatur deserunt cupidatat. Sint anim eiusmod sint elit. Incididunt consequat officia incididunt cillum. Reprehenderit anim reprehenderit esse officia et ea excepteur nisi magna. Lorem cupidatat in fugiat eu. Exercitation occaecat do eiusmod esse.\r\nAnim ullamco excepteur culpa deserunt enim est dolore duis ea anim exercitation. In et pariatur exercitation occaecat ad id Lorem ullamco consectetur labore ut laboris excepteur magna. Aute exercitation Lorem fugiat esse incididunt. Nulla nostrud ea ipsum eiusmod laboris nulla qui veniam aute officia eiusmod ad. Et anim ut dolor qui commodo occaecat nostrud non ex.\r\nCillum non et laborum cillum ex officia ullamco aliquip ut Lorem. Duis est sit sunt laboris ullamco deserunt dolor labore ut. Cupidatat elit do aute aliquip laborum tempor amet laboris occaecat id exercitation elit. Ullamco quis laboris voluptate amet duis elit incididunt mollit anim proident.\r\n", + "address": "4 Leonard Street", + "city": "Bluetown", + "state": "Federated States Of Micronesia", + "zip": 89344, + "country": "British Indian Ocean Territory", + "email": "edithsuarez@scentric.com", + "phone": "(920) 452-3377", + "color": "rgb(69,58,250)" + }, + { + "index": 102, + "name": "Kristen Wheeler", + "first": "Burke", + "last": "Barnes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamphilipjoyce/73.jpg", + "expanded": false, + "guid": "64341244-b22d-415d-8856-27b7c1b9e527", + "integer": 7, + "date": "Wed Jul 20 1994 02:28:58 GMT-0700 (PDT)", + "shortText": "duis dolore non minim est", + "mediumText": "Veniam amet sit nulla labore Lorem exercitation excepteur nostrud nulla velit proident laboris.", + "longText": "Ex incididunt do ad enim eu labore fugiat nulla enim elit. Cupidatat ipsum quis qui labore excepteur ullamco elit minim. Magna minim elit non mollit in consectetur cillum esse cillum ut esse aliquip anim. Reprehenderit ea irure eu consectetur nisi.\r\n", + "address": "2 Crooke Avenue", + "city": "Geyserville", + "state": "Guam", + "zip": 77246, + "country": "Libya", + "email": "burkebarnes@scentric.com", + "phone": "(843) 586-2743", + "color": "rgb(221,72,113)" + }, + { + "index": 103, + "name": "Clark Powell", + "first": "Hahn", + "last": "Lancaster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/russell_baylis/73.jpg", + "expanded": false, + "guid": "d83aada5-7279-4d3c-81fe-360aa4d342af", + "integer": 44, + "date": "Tue Apr 17 2007 17:02:41 GMT-0700 (PDT)", + "shortText": "officia excepteur fugiat", + "mediumText": "Commodo consequat esse amet deserunt duis magna. Cupidatat aliquip consectetur anim incididunt laboris. Reprehenderit Lorem enim cillum pariatur est sint aliqua commodo non tempor.", + "longText": "Nisi tempor irure nulla duis. Cillum aliquip commodo in minim sunt proident exercitation do dolore velit. Nulla sunt sit officia magna ex ea.\r\nEa consequat aute duis quis elit. Sint aute deserunt commodo reprehenderit aliqua consequat commodo minim ut quis incididunt reprehenderit. Nulla elit voluptate laboris laboris dolore labore tempor pariatur deserunt reprehenderit tempor non occaecat pariatur. Elit pariatur irure ex exercitation ut ex dolore dolore consequat consectetur magna. Lorem consectetur est reprehenderit pariatur dolore sit Lorem Lorem ad ea elit.\r\nAd occaecat est ullamco occaecat voluptate. Aute proident in est adipisicing. Anim ipsum est voluptate ipsum cillum eiusmod aliquip. Officia magna irure commodo ut pariatur est eu nostrud laboris excepteur adipisicing deserunt consectetur amet. Qui consequat cupidatat laborum non.\r\nDolore do cupidatat irure quis culpa aliquip elit laboris consequat qui magna dolore. Magna esse qui exercitation dolore tempor tempor ex irure veniam cupidatat commodo qui officia fugiat. Fugiat aliqua eiusmod deserunt esse elit nisi. Reprehenderit pariatur duis excepteur eiusmod esse. Velit nulla nisi reprehenderit Lorem minim ut tempor nulla aliqua in incididunt aute esse aliquip. Duis laborum quis non commodo officia commodo. Officia nostrud do qui velit occaecat aute ex adipisicing officia et excepteur velit irure officia.\r\n", + "address": "3 Polhemus Place", + "city": "Franklin", + "state": "Pennsylvania", + "zip": 30447, + "country": "Cook Islands", + "email": "hahnlancaster@scentric.com", + "phone": "(901) 537-3991", + "color": "rgb(225,104,190)" + }, + { + "index": 104, + "name": "Tamra Cox", + "first": "Acevedo", + "last": "Bell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kijanmaharjan/73.jpg", + "expanded": false, + "guid": "2d002e10-253b-41d7-bca7-add74579f9d5", + "integer": 0, + "date": "Thu Nov 04 1982 13:05:17 GMT-0800 (PST)", + "shortText": "ullamco in aliqua", + "mediumText": "Irure eiusmod ullamco occaecat deserunt. Ullamco nisi veniam nulla ea labore irure incididunt sit nulla ut commodo.", + "longText": "Culpa elit est velit laborum do eu cillum. Adipisicing sit incididunt ea exercitation anim irure laboris quis reprehenderit adipisicing exercitation adipisicing eu aliquip. Irure aliqua minim irure labore magna cillum fugiat sit occaecat sint. Eiusmod velit dolore est nisi do dolor id quis nisi sunt id anim ex proident. Laborum consectetur deserunt amet anim non commodo occaecat proident et.\r\nDo in magna deserunt dolor aute ad occaecat consectetur qui. Dolore in eiusmod id mollit tempor pariatur sunt reprehenderit incididunt ipsum aliquip dolor qui commodo. Eiusmod in mollit fugiat qui. Nulla nostrud officia aute minim. Officia id proident excepteur sunt amet occaecat nisi anim amet reprehenderit. Tempor duis mollit nostrud enim reprehenderit fugiat nostrud ea proident magna. Sint magna labore aliqua tempor officia do nisi ex in cillum nisi.\r\nNulla tempor in cillum et eiusmod ad qui dolor consequat do deserunt. Mollit ex anim consequat aliqua commodo. Adipisicing cillum ut nostrud ad aliquip. Ipsum occaecat reprehenderit ipsum in veniam tempor deserunt ut adipisicing dolore dolore cupidatat. Consequat velit officia quis labore mollit reprehenderit duis consectetur excepteur nisi tempor.\r\n", + "address": "4 Grand Street", + "city": "Iola", + "state": "New Hampshire", + "zip": 44737, + "country": "Iran", + "email": "acevedobell@scentric.com", + "phone": "(813) 503-2649", + "color": "rgb(84,124,140)" + }, + { + "index": 105, + "name": "Barr Higgins", + "first": "Tonia", + "last": "Walton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/73.jpg", + "expanded": false, + "guid": "b381e41b-6b9b-4f51-85f1-661eade44d9d", + "integer": 93, + "date": "Tue Dec 24 1985 18:32:45 GMT-0800 (PST)", + "shortText": "sunt nisi laborum", + "mediumText": "Aliqua esse in cillum nostrud exercitation duis cupidatat cillum non deserunt culpa.", + "longText": "Exercitation ad do aliqua nostrud magna consequat. Ex ea commodo fugiat labore ipsum officia minim do velit proident sit. Voluptate eiusmod consequat voluptate dolor consectetur eu sunt eiusmod veniam. Exercitation eiusmod fugiat reprehenderit laboris.\r\nMollit aliqua est laboris proident non esse culpa cupidatat laborum qui nulla deserunt occaecat elit. Lorem esse quis labore dolor dolore labore nostrud ea labore veniam tempor. Anim elit nostrud ut velit pariatur sint laborum velit. Et esse culpa voluptate dolor commodo aliquip est ut. Laboris ullamco enim exercitation ea velit excepteur enim veniam in mollit irure. Qui nisi sit ad consequat veniam proident proident reprehenderit ipsum dolore proident. Nostrud occaecat quis laboris magna labore ut tempor consectetur labore cupidatat ea irure pariatur.\r\nAd consectetur commodo do excepteur. Velit fugiat qui pariatur velit nostrud enim. Et in ea enim non exercitation aliqua anim commodo cillum ullamco in nulla nostrud. Eu ex enim ut enim magna duis aliquip ullamco enim. Aute anim ex incididunt cillum eiusmod minim ut nostrud excepteur dolore. Reprehenderit nisi nisi consequat consequat mollit dolor excepteur ipsum aute est tempor. Occaecat in aute ea Lorem ex consectetur.\r\nCupidatat nulla ullamco mollit id consequat. Dolore aute sit est voluptate cillum adipisicing laboris ex non adipisicing. Minim proident labore nisi eu proident irure et et. Dolor deserunt deserunt in et qui consectetur ullamco occaecat. Magna ut tempor fugiat velit. Magna elit id Lorem quis occaecat dolor irure amet nulla. Proident ex ullamco consectetur consequat consequat eiusmod dolor proident aliquip ut.\r\nExcepteur ea aliqua elit incididunt deserunt commodo nisi. Exercitation nostrud in officia anim ea non anim laborum ullamco incididunt. Do aliqua excepteur officia reprehenderit reprehenderit cillum. Duis nostrud veniam occaecat quis exercitation magna mollit est fugiat ullamco in consectetur culpa cillum. Minim consequat elit ipsum in occaecat sit dolor sint laborum.\r\n", + "address": "4 Banker Street", + "city": "Silkworth", + "state": "North Dakota", + "zip": 14286, + "country": "Aruba", + "email": "toniawalton@scentric.com", + "phone": "(889) 461-2741", + "color": "rgb(116,194,59)" + }, + { + "index": 106, + "name": "Hickman Copeland", + "first": "Ross", + "last": "Ratliff", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/noufalibrahim/73.jpg", + "expanded": false, + "guid": "2f265cef-ebfa-484a-b328-63fa19eed885", + "integer": 91, + "date": "Tue Mar 20 1979 12:59:39 GMT-0800 (PST)", + "shortText": "eiusmod", + "mediumText": "Culpa dolor sunt culpa magna.", + "longText": "Aute amet velit labore labore culpa. Minim eiusmod eiusmod eiusmod nostrud et quis in et culpa ex sit incididunt Lorem. Cupidatat adipisicing Lorem dolore consequat elit.\r\n", + "address": "2 Euclid Avenue", + "city": "Rosewood", + "state": "Northern Mariana Islands", + "zip": 23138, + "country": "Faroe Islands", + "email": "rossratliff@scentric.com", + "phone": "(917) 466-2566", + "color": "rgb(245,137,240)" + }, + { + "index": 107, + "name": "Cervantes Mckee", + "first": "Vasquez", + "last": "Knapp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/avclarkey/73.jpg", + "expanded": false, + "guid": "3658528d-3180-47bd-9c2e-d4f53947e409", + "integer": 27, + "date": "Sat Jan 23 1971 05:21:04 GMT-0800 (PST)", + "shortText": "eiusmod ullamco", + "mediumText": "Nulla tempor cupidatat consequat fugiat consequat irure non in. Ea eiusmod exercitation dolor labore laborum irure anim tempor exercitation.", + "longText": "Incididunt sit fugiat nulla ipsum. Veniam ex nostrud eu reprehenderit cillum. Fugiat nostrud esse eiusmod cupidatat consectetur ipsum sit duis consectetur cupidatat duis ullamco incididunt. Ea cupidatat esse sint adipisicing magna enim irure. Irure amet officia elit ullamco est cupidatat. Voluptate ut Lorem commodo occaecat nisi non id in ullamco occaecat est. Officia ea ea tempor irure commodo aute laborum et enim quis magna occaecat.\r\nAdipisicing ullamco aute duis labore duis est id Lorem ea commodo do nulla laboris. Et magna aliquip Lorem in in consectetur enim nulla do ad. Ea aute Lorem dolore eiusmod qui aliqua in cupidatat velit labore aliquip. Est esse velit sit consectetur anim nostrud ullamco commodo magna mollit in ut tempor. Lorem velit irure eiusmod duis amet et consectetur est quis non nulla incididunt et. Incididunt tempor ex minim amet reprehenderit. Anim nisi dolor ad tempor officia.\r\nEa ex esse amet excepteur tempor officia cupidatat eu cupidatat sit irure. Lorem minim quis ut non sit ullamco id tempor minim aliquip deserunt. Voluptate consectetur qui velit occaecat ullamco ea cupidatat tempor in anim ad magna. Ut velit dolore eiusmod reprehenderit incididunt irure anim laboris voluptate mollit incididunt minim ad duis.\r\n", + "address": "4 Crown Street", + "city": "Lowgap", + "state": "South Dakota", + "zip": 17680, + "country": "Zambia", + "email": "vasquezknapp@scentric.com", + "phone": "(889) 408-3991", + "color": "rgb(212,58,71)" + }, + { + "index": 108, + "name": "Juana Melendez", + "first": "Ford", + "last": "Greer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/arindam_/73.jpg", + "expanded": false, + "guid": "b9726558-94a5-4533-9213-cc6b11fa2b5d", + "integer": 94, + "date": "Mon Jul 17 1972 18:15:51 GMT-0700 (PDT)", + "shortText": "laboris velit esse", + "mediumText": "Aute ad non aute ipsum sint commodo cupidatat elit adipisicing fugiat.", + "longText": "Veniam ex consectetur id pariatur ipsum pariatur non officia sint. Exercitation quis eiusmod nisi officia aliquip. Laborum commodo occaecat ex ipsum aliqua. Et incididunt sunt deserunt Lorem eiusmod anim. Cillum consequat nulla ipsum eiusmod nulla velit pariatur aliqua. Reprehenderit est fugiat minim adipisicing ex esse adipisicing irure eu pariatur cupidatat.\r\nIn cupidatat elit reprehenderit deserunt sint mollit laborum consectetur enim anim. Consequat fugiat velit ut ipsum et duis consectetur. Aliqua velit nisi consequat mollit anim id quis cillum anim laboris exercitation adipisicing. Aliqua commodo cillum ut tempor incididunt sint ipsum incididunt nisi proident.\r\nEst qui incididunt dolore id. Culpa enim proident consectetur sunt. Ad laborum amet eiusmod mollit velit. Amet exercitation tempor nulla ullamco dolor fugiat non nostrud magna nisi veniam mollit laborum non.\r\nDuis ipsum voluptate ut laborum veniam. Commodo adipisicing sit nostrud mollit sint consequat ullamco sint amet ut enim. Anim pariatur magna reprehenderit elit fugiat culpa incididunt elit. Est irure tempor aliquip aliqua elit consequat pariatur est proident mollit tempor magna velit. Id nisi est cillum ut officia mollit deserunt nostrud ullamco.\r\nSit anim quis fugiat ullamco ipsum nulla proident sunt. Culpa est laborum veniam labore sit in mollit minim voluptate cupidatat. Elit qui sit amet qui eiusmod dolor. Irure sunt et minim culpa cillum. Minim consequat culpa ullamco excepteur duis nostrud consectetur proident dolor mollit veniam pariatur quis. Deserunt in reprehenderit eu velit ipsum excepteur pariatur deserunt officia fugiat qui exercitation magna dolor. Eiusmod cupidatat irure nisi dolor veniam aute ea quis nostrud eu esse excepteur aliquip.\r\n", + "address": "2 Crescent Street", + "city": "Valle", + "state": "Alaska", + "zip": 40517, + "country": "Albania", + "email": "fordgreer@scentric.com", + "phone": "(816) 454-3618", + "color": "rgb(249,251,66)" + }, + { + "index": 109, + "name": "Morin Franks", + "first": "Olive", + "last": "Bernard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmakardaras/73.jpg", + "expanded": false, + "guid": "9c1e0cc3-71ab-4f1f-a061-864215df9f71", + "integer": 74, + "date": "Tue Aug 17 1976 13:06:23 GMT-0700 (PDT)", + "shortText": "reprehenderit voluptate occaecat tempor", + "mediumText": "Excepteur proident officia commodo ad aute et exercitation aliqua. Consequat exercitation proident ut sit cupidatat nulla dolor occaecat sit ad fugiat. Lorem cupidatat labore tempor fugiat consequat labore. Laborum consectetur amet mollit ullamco deserunt amet cupidatat qui. Est nulla est nostrud duis proident culpa laborum ipsum mollit cupidatat proident irure nisi officia.", + "longText": "Nulla consectetur velit cupidatat dolor ex dolore pariatur ea occaecat eu quis ut non elit. Magna esse consequat eu sit laboris dolor ullamco elit dolor. Eiusmod laboris irure consequat cillum. Nisi incididunt dolor velit aliquip labore culpa voluptate proident laborum adipisicing veniam aute. Aliquip exercitation ad culpa excepteur nisi minim non quis excepteur commodo esse nostrud laborum. Enim anim do duis deserunt mollit esse laborum anim. Aliqua eiusmod sunt aliqua officia quis in voluptate deserunt magna labore enim sit laborum.\r\nVelit dolor aute est sit aliqua. Occaecat occaecat officia pariatur esse do aute aliqua. Magna nostrud consectetur amet consequat veniam magna duis non. Est eu elit pariatur minim ut sit laborum proident. Do adipisicing et est ex id dolore. Amet magna minim do dolor duis veniam ipsum ex commodo anim culpa sint.\r\n", + "address": "2 Banner Avenue", + "city": "Forbestown", + "state": "Louisiana", + "zip": 26490, + "country": "Panama", + "email": "olivebernard@scentric.com", + "phone": "(980) 446-2496", + "color": "rgb(250,59,84)" + }, + { + "index": 110, + "name": "Le Frank", + "first": "Ada", + "last": "Love", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/georgespillman/73.jpg", + "expanded": false, + "guid": "6d7f1953-73e2-4cf5-904a-467d37de4108", + "integer": 28, + "date": "Mon Aug 03 1970 01:48:44 GMT-0700 (PDT)", + "shortText": "do officia", + "mediumText": "Ad elit labore sit culpa reprehenderit non elit sunt. Officia occaecat aliquip aliqua minim eu. Lorem aute consequat sunt sint excepteur do laborum consequat do. Occaecat eu enim irure laborum occaecat elit duis. Occaecat aute ad non Lorem voluptate magna.", + "longText": "Dolore sint proident ea culpa proident ut eu ipsum pariatur culpa fugiat est nisi sunt. Voluptate ut excepteur aliquip enim adipisicing deserunt. Commodo irure irure id non officia elit do eiusmod. Voluptate ipsum dolor sint aliquip laboris fugiat cupidatat et ea proident nostrud cillum duis.\r\nAliqua eiusmod sit laboris non tempor proident ea. Ut excepteur tempor non nisi. Do id velit do non anim laborum ad est laborum consequat. Ea sunt velit do incididunt duis amet velit adipisicing exercitation anim. Duis eiusmod exercitation officia dolor aliqua officia fugiat ad fugiat dolor elit qui. Sunt reprehenderit est esse enim exercitation eiusmod et quis ea et dolore. Enim occaecat sunt sit do velit nulla cillum laboris.\r\nMinim cupidatat ex minim excepteur. Quis est enim officia proident voluptate tempor anim duis. Magna anim voluptate ullamco dolore dolore aute ipsum nulla ea est nulla exercitation eiusmod. Ex Lorem nulla et do consequat nulla ipsum enim ad amet excepteur ipsum incididunt veniam. Occaecat enim eu aliquip consectetur fugiat anim. Cillum pariatur quis ullamco minim nisi proident dolor occaecat ad ipsum commodo deserunt eu nostrud. Sunt reprehenderit et ipsum exercitation est veniam aute ut ex.\r\nAd aliquip ad et aliquip. Officia ex est qui nisi dolore velit sint. Et enim voluptate irure culpa eiusmod id incididunt minim voluptate ut eiusmod incididunt. Non occaecat cillum exercitation duis eiusmod id laboris veniam. Nisi id ut veniam excepteur.\r\n", + "address": "4 Rochester Avenue", + "city": "Chesapeake", + "state": "Missouri", + "zip": 58919, + "country": "Turks and Caicos Islands", + "email": "adalove@scentric.com", + "phone": "(895) 541-3397", + "color": "rgb(133,191,68)" + }, + { + "index": 111, + "name": "Joseph Hooper", + "first": "Sally", + "last": "Blackwell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fireupman/73.jpg", + "expanded": false, + "guid": "e86e14ac-2f06-4abd-93f2-552b79ec5e01", + "integer": 95, + "date": "Tue Jul 21 1987 11:15:23 GMT-0700 (PDT)", + "shortText": "anim duis", + "mediumText": "Amet ut occaecat do non nulla aute aliquip qui. Dolore sint sit ipsum ea minim reprehenderit irure quis magna elit exercitation mollit. Aute ullamco minim ut cupidatat incididunt aute occaecat aute ea consequat sint.", + "longText": "Officia commodo aute culpa sit ea in qui mollit laborum sunt aute eiusmod aliquip cillum. Velit commodo nisi qui consectetur eiusmod ad Lorem cupidatat irure adipisicing do adipisicing commodo. Laborum mollit cillum ad tempor. Anim proident culpa aliqua amet anim pariatur consequat aliquip anim cupidatat ut reprehenderit. Dolor reprehenderit magna enim dolore eu laborum consectetur do commodo proident. Duis voluptate dolor magna occaecat officia adipisicing duis voluptate adipisicing ex cupidatat. Ex aute adipisicing ullamco consectetur aute minim occaecat sit commodo Lorem duis.\r\nFugiat officia do do cillum ut adipisicing nisi nostrud culpa cupidatat. Magna velit ad excepteur et sunt sunt esse commodo velit consequat occaecat officia ea magna. Cillum culpa id aliqua in. Fugiat dolore elit do ea aliqua duis id eiusmod cillum amet ut. Dolor id magna id dolor aliqua veniam elit adipisicing qui nulla. Ex mollit consectetur adipisicing elit id eiusmod sunt deserunt veniam qui quis ut.\r\nProident exercitation aliqua occaecat anim tempor ullamco non laborum reprehenderit. Ullamco consectetur eiusmod ut quis cillum. Nulla officia in quis est sit consectetur eu ipsum sunt. Sunt cupidatat velit cillum non proident excepteur qui non aliquip.\r\nAd amet sit sint adipisicing dolore eu enim dolore velit sit deserunt. Esse labore non proident magna ut aliquip in id ex deserunt. Reprehenderit magna consequat irure ad ullamco pariatur magna consectetur pariatur magna voluptate non sunt.\r\nIpsum sint deserunt enim labore ea deserunt sint pariatur. Amet sit sint id minim esse quis magna fugiat dolore. Ullamco et magna ex dolor do commodo amet nostrud commodo adipisicing cillum. Dolor culpa mollit elit sit et enim ullamco fugiat proident occaecat.\r\n", + "address": "3 Congress Street", + "city": "Tedrow", + "state": "Kentucky", + "zip": 17527, + "country": "Christmas Island", + "email": "sallyblackwell@scentric.com", + "phone": "(883) 597-2036", + "color": "rgb(213,146,224)" + }, + { + "index": 112, + "name": "Shepherd Burt", + "first": "Pansy", + "last": "Young", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kylefrost/73.jpg", + "expanded": false, + "guid": "e82c95af-0ea1-4299-9f4e-131f39c1c537", + "integer": 49, + "date": "Sat May 24 2014 22:33:36 GMT-0700 (PDT)", + "shortText": "labore fugiat", + "mediumText": "Culpa eiusmod culpa nostrud voluptate eiusmod ea voluptate voluptate ex ut. Cillum consectetur voluptate tempor irure commodo id excepteur tempor laborum nisi. Proident eiusmod exercitation mollit sunt in est aliqua mollit non deserunt fugiat excepteur quis.", + "longText": "Sunt quis nisi cillum aute est reprehenderit non. Ullamco pariatur in est officia nisi laborum ad ut pariatur qui elit. Ipsum voluptate labore in et laboris amet quis esse occaecat dolore veniam cupidatat voluptate. In sint aute aliqua ea dolor Lorem quis sunt.\r\n", + "address": "2 Remsen Street", + "city": "Abrams", + "state": "American Samoa", + "zip": 37068, + "country": "Botswana", + "email": "pansyyoung@scentric.com", + "phone": "(938) 478-3164", + "color": "rgb(190,139,243)" + }, + { + "index": 113, + "name": "Brianna Peterson", + "first": "Carla", + "last": "Davidson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/quser/73.jpg", + "expanded": false, + "guid": "e7c8b790-5171-41b9-8926-16f6ba35a268", + "integer": 74, + "date": "Sun Aug 06 1989 02:58:01 GMT-0700 (PDT)", + "shortText": "sunt ex laboris cupidatat culpa", + "mediumText": "Ut duis eu quis nostrud irure excepteur quis. Cillum quis aute occaecat eu laborum non incididunt.", + "longText": "Tempor aute incididunt exercitation pariatur eu sunt magna excepteur. Do ex officia proident laborum ullamco cillum. In elit consequat anim velit commodo pariatur ad enim est nostrud anim proident amet nostrud. Proident duis incididunt ad deserunt nisi cupidatat irure eu cupidatat magna qui quis sunt.\r\nConsectetur occaecat sunt sint nostrud est dolor officia dolor occaecat ipsum labore consequat. Consequat eu ipsum voluptate et exercitation ex dolor commodo pariatur elit eu amet. In consectetur Lorem veniam est minim consectetur excepteur irure cillum. Ut Lorem incididunt laboris minim proident sit mollit tempor ad culpa amet amet. Quis duis velit ut dolor proident dolore proident ex sit adipisicing do.\r\nEsse elit occaecat pariatur nulla sint non elit aliquip est voluptate laboris. Consequat culpa fugiat ea eu. Et minim culpa voluptate amet. Sint qui cillum consequat quis velit et aliqua occaecat duis quis. Aute sunt aute in exercitation id exercitation cupidatat irure. Anim et minim cillum dolore irure enim eiusmod pariatur ad deserunt ea.\r\nIrure esse reprehenderit proident tempor non cupidatat incididunt laboris culpa eiusmod elit culpa velit non. Sit ullamco incididunt exercitation enim quis commodo id Lorem minim duis. Duis nulla sunt sit reprehenderit duis excepteur laborum in ut dolore consequat. Aliqua esse culpa nulla et amet ex fugiat sit non sunt. Elit nostrud commodo sunt veniam anim ut duis ullamco labore ex aliqua laboris.\r\n", + "address": "4 Oriental Court", + "city": "Valmy", + "state": "Minnesota", + "zip": 13895, + "country": "Algeria", + "email": "carladavidson@scentric.com", + "phone": "(995) 595-3974", + "color": "rgb(179,161,85)" + }, + { + "index": 114, + "name": "Erica Campbell", + "first": "Emilia", + "last": "Hernandez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maikelk/73.jpg", + "expanded": false, + "guid": "a14b1c62-e553-458d-ab78-cd9e278ac859", + "integer": 59, + "date": "Tue Aug 21 2012 17:43:47 GMT-0700 (PDT)", + "shortText": "ut id sit ea est", + "mediumText": "Aliquip occaecat voluptate ea dolor pariatur. Dolor amet velit adipisicing duis elit nisi aute incididunt veniam minim.", + "longText": "Id eu commodo in anim proident sit aliquip sit. Mollit dolor exercitation laborum veniam reprehenderit tempor reprehenderit. Culpa in cillum nisi occaecat elit aute duis est. Laborum quis laborum nostrud amet nulla quis exercitation non officia cupidatat culpa deserunt incididunt nulla. Exercitation exercitation ex velit ipsum excepteur esse dolor ipsum et anim non proident Lorem. Nostrud laboris consectetur et eiusmod sint. Amet adipisicing dolore Lorem deserunt ad cupidatat labore.\r\nNisi ipsum anim aliquip id sit proident reprehenderit aute. Esse duis incididunt minim nisi velit do incididunt anim nostrud. In mollit aliquip duis proident dolor. Sunt ipsum amet esse laborum.\r\nCupidatat anim enim do ut. Nostrud ipsum consectetur non ipsum officia. Aliqua commodo eiusmod eu labore laborum. Magna aliqua in est amet eu anim reprehenderit qui ullamco est anim sit et. Est deserunt tempor commodo occaecat dolore sint esse aliquip culpa sint cupidatat non cupidatat. Est reprehenderit irure esse fugiat ad pariatur fugiat. Labore non consectetur nisi aliquip adipisicing culpa incididunt ad consectetur consequat ipsum.\r\n", + "address": "2 Legion Street", + "city": "Cuylerville", + "state": "Hawaii", + "zip": 84971, + "country": "Switzerland", + "email": "emiliahernandez@scentric.com", + "phone": "(922) 599-3995", + "color": "rgb(101,247,162)" + }, + { + "index": 115, + "name": "Sheryl Waller", + "first": "Martina", + "last": "Hebert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ifarafonow/73.jpg", + "expanded": false, + "guid": "ab359e49-0653-4622-a683-fa6bb4a5e4eb", + "integer": 39, + "date": "Mon Nov 17 2008 06:44:36 GMT-0800 (PST)", + "shortText": "sunt", + "mediumText": "Nisi dolor ad enim nostrud id proident nisi elit cupidatat nisi nostrud laborum. Ea deserunt labore est in sunt id consectetur nisi.", + "longText": "Aliqua sunt enim Lorem amet enim. Nisi laboris elit veniam irure culpa nisi non aliquip. Anim dolor duis enim tempor culpa dolor reprehenderit elit. Non sunt veniam aliqua ea occaecat do pariatur occaecat ea. Exercitation nostrud cillum mollit ipsum laboris sunt est aute nostrud velit officia esse.\r\nLabore commodo ipsum proident est et sint sint deserunt. Proident qui elit eu duis et veniam excepteur eu ipsum ea consectetur consectetur fugiat sit. Aliqua aliqua laboris aute ut sit id nisi sunt reprehenderit qui deserunt. Labore laborum et ex enim dolore ullamco est excepteur dolore labore adipisicing. Commodo cupidatat non velit qui.\r\nQui exercitation esse ullamco nulla nisi labore ex ea voluptate eu consectetur et occaecat. Ullamco laborum esse labore et ullamco sunt proident eu esse proident excepteur. Qui incididunt occaecat minim elit irure ea aliquip in fugiat. Do cupidatat aliqua veniam cupidatat magna exercitation irure mollit fugiat consectetur. Sunt fugiat esse dolor mollit in fugiat reprehenderit qui tempor laborum Lorem incididunt. Exercitation do occaecat adipisicing velit aute enim enim occaecat nisi laboris quis ex minim eu. In incididunt consequat esse dolor officia eiusmod amet aliqua ad quis.\r\n", + "address": "3 Gelston Avenue", + "city": "Leeper", + "state": "Alabama", + "zip": 86800, + "country": "S. Georgia and S. Sandwich Isls.", + "email": "martinahebert@scentric.com", + "phone": "(814) 523-3612", + "color": "rgb(240,55,85)" + }, + { + "index": 116, + "name": "Frances Dalton", + "first": "Virgie", + "last": "Fuller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ananya159/73.jpg", + "expanded": false, + "guid": "1ca31b96-9723-4249-bb9a-7062701a66b0", + "integer": 81, + "date": "Tue Oct 01 1974 14:29:16 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Aliquip nisi proident id sint velit enim cillum reprehenderit ipsum nisi dolore laboris Lorem. Velit Lorem irure irure consectetur. Aliquip veniam culpa qui Lorem cupidatat non incididunt velit irure magna in do consequat do.", + "longText": "Nostrud adipisicing aute esse ipsum anim. Nisi pariatur excepteur est minim pariatur consectetur aliquip adipisicing. Adipisicing fugiat consequat proident deserunt exercitation exercitation irure sit qui deserunt. Dolor eu cillum eiusmod id incididunt consectetur nisi ullamco mollit labore. Aliqua ullamco proident adipisicing duis minim. Lorem ut fugiat cillum aliqua sit in mollit labore sunt reprehenderit.\r\nQui aliqua pariatur voluptate fugiat fugiat duis consequat occaecat laboris cillum sit. Sit officia fugiat esse ut eiusmod eu labore nostrud est incididunt fugiat. Voluptate velit laboris veniam sunt laborum ad nulla ad. Dolor deserunt ut ut culpa laboris qui elit est non cillum eu cillum anim laborum. Mollit consequat cillum id consequat sint voluptate pariatur nisi nostrud duis ipsum mollit.\r\nIncididunt dolor laborum adipisicing mollit voluptate ad labore ad do minim occaecat proident amet anim. Commodo anim pariatur dolor officia ipsum adipisicing irure excepteur irure eiusmod deserunt. Commodo veniam exercitation ex ad. Ut aliquip aliqua laboris ipsum quis duis. Amet in dolor minim veniam mollit dolore deserunt sit exercitation sint dolore consequat. Mollit anim qui dolor enim ea irure sint consectetur. Eiusmod eu exercitation incididunt Lorem dolore non cupidatat tempor do labore duis.\r\nMinim exercitation ut cupidatat est minim enim magna eiusmod aliquip ipsum incididunt in officia. Aliquip in fugiat dolor elit quis ad. Ipsum laboris sit non amet eu dolor aute velit ullamco eu proident. Consequat commodo consectetur Lorem esse duis esse exercitation adipisicing anim.\r\n", + "address": "2 Bokee Court", + "city": "Reinerton", + "state": "North Carolina", + "zip": 90734, + "country": "Brazil", + "email": "virgiefuller@scentric.com", + "phone": "(958) 511-3488", + "color": "rgb(151,135,52)" + }, + { + "index": 117, + "name": "Charity Hall", + "first": "Mitchell", + "last": "Williamson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/horaciobella/73.jpg", + "expanded": false, + "guid": "60b57acd-e17f-4c69-85e5-5df345c25c6f", + "integer": 22, + "date": "Wed Jan 19 2005 08:59:18 GMT-0800 (PST)", + "shortText": "eu nisi elit nostrud", + "mediumText": "Nisi id voluptate velit tempor voluptate laboris. Excepteur consectetur labore id ipsum anim proident ad adipisicing dolor. Magna aute excepteur veniam nulla laborum culpa et incididunt enim velit officia. Ipsum est qui minim consequat Lorem.", + "longText": "Enim consectetur quis tempor eu laboris veniam ea eu est. Ullamco commodo commodo dolor ad mollit ex in nulla. Ipsum dolor excepteur ut in sit est nulla ad nulla in tempor laboris ipsum laborum. Lorem incididunt fugiat eu laboris laborum eiusmod dolor tempor aliquip. Minim in do deserunt pariatur adipisicing id duis consectetur nostrud proident.\r\n", + "address": "4 Dover Street", + "city": "Fannett", + "state": "Connecticut", + "zip": 11138, + "country": "Anguilla", + "email": "mitchellwilliamson@scentric.com", + "phone": "(871) 435-3743", + "color": "rgb(243,134,198)" + }, + { + "index": 118, + "name": "Rodriquez Ferguson", + "first": "Shannon", + "last": "Morrow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thatdesigner/73.jpg", + "expanded": false, + "guid": "6c85f6cb-e2c6-46e0-a68a-2ebc38f0035b", + "integer": 50, + "date": "Sat Feb 10 1973 15:31:21 GMT-0800 (PST)", + "shortText": "incididunt aute aliquip laborum labore", + "mediumText": "Minim ipsum sint consequat cillum aute ipsum et ipsum sint cillum qui eiusmod.", + "longText": "Reprehenderit est consequat incididunt nostrud do eiusmod adipisicing. Nulla voluptate ullamco consectetur eu sit. Est dolore cupidatat amet culpa occaecat ullamco nisi non veniam do est ullamco aliqua. Qui irure nisi laboris labore duis nulla magna. Culpa velit dolor exercitation elit sint irure velit eu veniam exercitation Lorem. Pariatur ipsum veniam consectetur nulla laborum.\r\nAdipisicing eu amet duis nulla. Anim dolore magna eu culpa voluptate sunt aute proident. Elit veniam adipisicing commodo aliqua eiusmod velit mollit nisi quis veniam excepteur mollit laborum. Esse ipsum commodo cupidatat sint quis mollit veniam consequat do laborum nulla. Aliquip consequat proident et aliqua ea proident proident dolore laboris consequat ut reprehenderit quis duis. Enim cupidatat reprehenderit reprehenderit esse irure officia irure laboris. Consequat esse qui pariatur elit cillum culpa deserunt culpa veniam qui excepteur laborum.\r\n", + "address": "4 Newel Street", + "city": "Dubois", + "state": "South Carolina", + "zip": 52970, + "country": "Mayotte", + "email": "shannonmorrow@scentric.com", + "phone": "(926) 593-2505", + "color": "rgb(161,59,65)" + }, + { + "index": 119, + "name": "Lee Dejesus", + "first": "Yang", + "last": "Walter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/snaphappydad/73.jpg", + "expanded": false, + "guid": "bf814de3-e21d-41e7-9db1-2d541665fd2c", + "integer": 40, + "date": "Mon Feb 18 2002 15:18:34 GMT-0800 (PST)", + "shortText": "pariatur nisi", + "mediumText": "Esse dolore nulla aliqua id cupidatat ullamco commodo incididunt.", + "longText": "Ipsum cupidatat amet Lorem excepteur magna quis officia tempor enim voluptate consequat id ex. Ad labore aliqua exercitation nulla et esse nostrud pariatur. Nisi minim velit consequat dolore aliquip est labore sint.\r\nAnim non irure proident cillum eiusmod. Id anim non adipisicing consectetur qui duis. Sit culpa exercitation non nostrud.\r\nOccaecat aliquip elit anim ex nulla ut in. Aliqua ut cupidatat elit dolor id occaecat. Sit consectetur consequat eiusmod veniam tempor minim non voluptate labore ullamco esse velit proident.\r\n", + "address": "2 Krier Place", + "city": "Columbus", + "state": "Michigan", + "zip": 62839, + "country": "Northern Mariana Islands", + "email": "yangwalter@scentric.com", + "phone": "(821) 518-2276", + "color": "rgb(56,241,182)" + }, + { + "index": 120, + "name": "Wise Cannon", + "first": "Cobb", + "last": "Figueroa", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cristianovalim/73.jpg", + "expanded": false, + "guid": "e5754bf6-f162-4fd2-a3e9-e3834bad0fed", + "integer": 61, + "date": "Sun Nov 22 1970 00:54:52 GMT-0800 (PST)", + "shortText": "Lorem dolor pariatur proident", + "mediumText": "Dolor tempor veniam ad do et. Mollit enim et id veniam in irure mollit duis deserunt commodo.", + "longText": "Ex pariatur eiusmod cupidatat nisi elit ullamco Lorem. Reprehenderit minim velit laboris et incididunt tempor anim elit ad aute duis ullamco. Amet est magna consectetur in cillum duis. Sunt id Lorem laboris cupidatat aute. Cillum est ea mollit exercitation ullamco pariatur exercitation anim Lorem dolore exercitation velit ipsum.\r\nExcepteur excepteur est pariatur eiusmod quis consectetur qui aute nulla ex Lorem sunt irure. Tempor excepteur proident esse excepteur consectetur minim consequat non. Mollit nulla ea veniam excepteur eu velit.\r\n", + "address": "4 Pulaski Street", + "city": "Glenville", + "state": "Maine", + "zip": 69282, + "country": "Pitcairn", + "email": "cobbfigueroa@scentric.com", + "phone": "(901) 579-2803", + "color": "rgb(243,138,133)" + }, + { + "index": 121, + "name": "Albert Benjamin", + "first": "French", + "last": "Hays", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pmeissner/73.jpg", + "expanded": false, + "guid": "4bcb4883-f717-4bc7-b0ff-91b548b5ae5a", + "integer": 11, + "date": "Fri Jun 27 1980 15:54:19 GMT-0700 (PDT)", + "shortText": "Lorem do", + "mediumText": "Ipsum irure amet aliquip deserunt irure nisi duis fugiat et officia voluptate aliquip labore consectetur. Reprehenderit aute cupidatat tempor enim aliquip non qui consequat do qui proident id. Aliquip labore in ex consequat commodo qui adipisicing proident. Tempor veniam non laborum aute velit Lorem sunt. Fugiat anim nulla veniam anim pariatur nulla irure incididunt occaecat.", + "longText": "Enim irure eiusmod magna non tempor eu mollit nostrud anim elit. Fugiat eu officia aliqua dolore non tempor aute ipsum occaecat. Amet velit fugiat aliqua Lorem officia excepteur sunt nostrud magna est. In pariatur irure quis ea ut et esse nisi do mollit excepteur laborum minim. Nostrud sunt est duis est. In in enim Lorem tempor aliquip enim ea irure deserunt.\r\nCillum est magna fugiat dolor nostrud adipisicing mollit qui enim. Nostrud consequat amet reprehenderit commodo ut amet est aute nisi exercitation aute. Eiusmod enim reprehenderit ut ut exercitation irure proident minim commodo nostrud. Consequat ex magna aliquip cupidatat culpa excepteur non.\r\nVeniam esse esse sunt reprehenderit veniam commodo irure fugiat qui. Consequat qui dolor veniam ipsum laboris enim labore. Mollit cupidatat sit non esse voluptate in qui cupidatat qui eu. Duis incididunt ad mollit ad nisi culpa irure anim ullamco commodo tempor consectetur. Cillum pariatur labore do quis commodo non eu proident et.\r\nAmet cupidatat amet et culpa proident labore esse ipsum. Labore fugiat ea laboris irure mollit cupidatat minim exercitation occaecat velit ullamco quis. Labore esse cupidatat nulla amet et. Duis est cupidatat eu ea excepteur nulla cupidatat dolor enim ipsum sit nostrud laborum sit. Voluptate cupidatat cillum nulla reprehenderit laboris incididunt eu nostrud amet ad dolore do. Non ea eu cillum duis consectetur in. Anim consequat in adipisicing fugiat sit do anim anim aute veniam eu consectetur aliquip.\r\nMollit aliquip cillum adipisicing ipsum non laboris. Consequat mollit in incididunt mollit deserunt eiusmod nulla dolor ea fugiat. Proident reprehenderit nisi tempor nulla excepteur dolor excepteur voluptate laboris tempor consequat. Dolor et minim enim ut laboris. Ipsum ex veniam consequat cillum nisi amet nostrud. Mollit labore in consequat irure enim. Qui tempor aliquip esse enim commodo culpa mollit.\r\n", + "address": "4 Pooles Lane", + "city": "Bellfountain", + "state": "Kansas", + "zip": 98526, + "country": "Saint Vincent and The Grenadines", + "email": "frenchhays@scentric.com", + "phone": "(819) 408-2182", + "color": "rgb(238,191,114)" + }, + { + "index": 122, + "name": "Nona Salinas", + "first": "Lacey", + "last": "Donaldson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akbarbobojonov/73.jpg", + "expanded": false, + "guid": "bd1bbab7-51f1-45a4-a0c8-ad85a536c9ec", + "integer": 9, + "date": "Thu May 01 1986 06:09:47 GMT-0700 (PDT)", + "shortText": "proident ea qui culpa", + "mediumText": "Eiusmod labore in laboris eu pariatur amet. Et nulla aliqua consectetur nulla quis ad non. Aute ut sint reprehenderit et eu et sunt labore dolor.", + "longText": "Exercitation mollit commodo ad ipsum ipsum minim quis culpa cillum ut mollit labore commodo. Anim dolor eu in deserunt occaecat enim do proident mollit exercitation laborum consequat. Irure proident exercitation voluptate in. Magna officia sint occaecat pariatur irure elit cupidatat deserunt nulla ad cillum incididunt velit. Quis veniam est est id labore enim duis culpa deserunt aliquip mollit qui. Deserunt laboris proident incididunt esse velit minim sint ex excepteur. Cillum do sint commodo qui laborum occaecat dolore sint.\r\nDeserunt culpa pariatur dolore mollit dolor velit id labore incididunt eiusmod consectetur. Sunt eu duis ut eu sint sint non aliqua ullamco sunt est id irure eiusmod. Eiusmod ex cupidatat quis ut cillum elit. Lorem tempor proident elit adipisicing. Minim sunt minim esse do amet Lorem officia occaecat sit ut. In id ullamco ipsum ex sit adipisicing mollit irure non magna ad commodo proident aute. Mollit sunt mollit eiusmod voluptate consectetur magna ex ullamco.\r\n", + "address": "4 Freeman Street", + "city": "Wollochet", + "state": "Iowa", + "zip": 21774, + "country": "Iceland", + "email": "laceydonaldson@scentric.com", + "phone": "(977) 552-3200", + "color": "rgb(51,183,113)" + }, + { + "index": 123, + "name": "Karla Downs", + "first": "Cruz", + "last": "Colon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pjnes/73.jpg", + "expanded": false, + "guid": "2f9877c1-7121-400a-a476-36dfbedde48b", + "integer": 0, + "date": "Thu Feb 27 1992 08:28:41 GMT-0800 (PST)", + "shortText": "deserunt", + "mediumText": "Reprehenderit deserunt eiusmod sint laboris deserunt qui eiusmod ex aliqua et laborum duis magna deserunt. Officia tempor ullamco aute occaecat velit. Aliqua consectetur nulla eiusmod elit. Culpa enim reprehenderit labore incididunt id nostrud deserunt quis ad est irure laboris.", + "longText": "Ut qui adipisicing qui veniam irure fugiat. Cillum occaecat fugiat proident velit anim nostrud duis reprehenderit nostrud tempor aliquip veniam. Nostrud ipsum laboris eu enim id do. Adipisicing ea consequat enim et anim in fugiat amet ipsum.\r\nVoluptate tempor ut ut laborum et ad. Ea laboris duis ad pariatur commodo do et aute. Sit aliqua sint proident do consequat anim sit. Officia elit dolore exercitation elit anim ullamco excepteur deserunt quis quis proident esse fugiat voluptate. Culpa officia amet eu enim culpa sit et. Culpa incididunt adipisicing non eu in minim.\r\nDuis laborum laborum voluptate aliquip. Aliqua eu elit labore ipsum aliqua. Nulla reprehenderit aute labore aliqua est consectetur deserunt pariatur ut. Aute laboris voluptate ipsum nostrud enim proident amet ad.\r\nCulpa minim velit aliquip enim deserunt dolor. Commodo sit commodo enim adipisicing ea non aute consectetur proident eu do. Consequat elit irure minim dolor voluptate excepteur sunt eu et quis. Occaecat exercitation voluptate sunt ullamco reprehenderit ea amet magna. Cillum laborum commodo irure ad in sunt occaecat veniam non proident incididunt pariatur.\r\n", + "address": "3 Elm Place", + "city": "Richville", + "state": "Vermont", + "zip": 65904, + "country": "Andorra", + "email": "cruzcolon@scentric.com", + "phone": "(900) 475-3785", + "color": "rgb(165,150,188)" + }, + { + "index": 124, + "name": "Candace Gonzalez", + "first": "Debbie", + "last": "Moody", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/balintorosz/73.jpg", + "expanded": false, + "guid": "9d3734d9-4693-4ac0-9dba-85eb63a89032", + "integer": 1, + "date": "Fri May 06 2005 19:01:26 GMT-0700 (PDT)", + "shortText": "exercitation do mollit mollit proident", + "mediumText": "Ullamco ad quis laboris ea consectetur commodo anim ut irure. Sit id elit mollit eiusmod officia amet reprehenderit. Ea incididunt commodo officia qui eu ad exercitation occaecat ipsum ad aute laboris ea. Proident irure velit magna culpa proident qui amet.", + "longText": "Minim voluptate culpa mollit ad voluptate est mollit nisi cillum proident. Cillum ut aliqua esse ad esse qui magna anim mollit. Ipsum pariatur labore culpa velit ipsum mollit fugiat id velit in cillum sint. Voluptate aliquip irure reprehenderit incididunt ipsum magna duis proident commodo consequat. Eiusmod commodo labore ex commodo tempor veniam. Occaecat duis tempor cillum aute qui do officia excepteur et sunt eiusmod fugiat.\r\nConsectetur amet nulla sit commodo aute labore id commodo reprehenderit deserunt occaecat incididunt. Esse consectetur minim occaecat duis deserunt est magna aute aliqua veniam aute sunt nulla eu. Exercitation officia proident dolore ex aliqua officia laboris ullamco anim.\r\nReprehenderit exercitation veniam eu eu aute ullamco irure ex tempor. Irure tempor Lorem anim eu nulla proident nulla est sunt. Voluptate id dolor excepteur id ut quis duis.\r\nPariatur tempor aliquip consectetur reprehenderit qui dolore excepteur veniam. In aliqua aute veniam aliqua in officia aute nisi Lorem. Ea duis labore labore voluptate. Voluptate esse cillum excepteur reprehenderit.\r\n", + "address": "2 Duryea Court", + "city": "Bentonville", + "state": "Nebraska", + "zip": 43783, + "country": "Myanmar", + "email": "debbiemoody@scentric.com", + "phone": "(816) 429-3615", + "color": "rgb(209,130,75)" + }, + { + "index": 125, + "name": "Ayers Finley", + "first": "Janna", + "last": "Donovan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/martinhn/73.jpg", + "expanded": false, + "guid": "9910153e-54e3-4464-ab3b-2f87ff4a6574", + "integer": 29, + "date": "Wed Jun 03 1987 11:23:05 GMT-0700 (PDT)", + "shortText": "occaecat dolore sunt", + "mediumText": "Esse voluptate quis laborum voluptate ut labore tempor consequat sit. Adipisicing proident ex Lorem voluptate eu esse laborum ex laborum officia veniam aliquip enim id. Incididunt eu nisi proident pariatur ut non.", + "longText": "Incididunt do qui veniam Lorem quis. Aute culpa ut dolor incididunt deserunt consequat mollit non nulla dolore. Deserunt veniam velit tempor pariatur aliquip veniam. Duis aliquip nulla sunt ullamco esse aliqua Lorem esse aliquip veniam adipisicing. Cillum et do enim commodo aliqua ullamco exercitation exercitation. Mollit magna Lorem fugiat irure excepteur adipisicing id veniam. Sit tempor aute in minim dolore aliquip minim nisi magna.\r\nVelit aliqua ullamco ea amet culpa id. Magna velit voluptate culpa fugiat fugiat amet veniam ad labore eu in. Eu deserunt quis ipsum aliqua nulla pariatur commodo. Elit nostrud id irure eu reprehenderit est dolore sunt Lorem. Esse anim quis elit elit irure consectetur irure ut non ad ullamco magna et. Ex Lorem labore deserunt consequat consectetur officia veniam non commodo magna ut non eu in.\r\nVoluptate aliqua velit magna dolor in anim dolore ad quis. Ullamco magna officia labore ex adipisicing veniam magna adipisicing in id anim ea adipisicing mollit. Irure pariatur ea incididunt culpa ex veniam pariatur eiusmod duis ea. Ut exercitation duis aliqua quis elit reprehenderit magna veniam voluptate nostrud. Id proident nostrud consectetur occaecat nostrud nostrud nisi eu labore occaecat minim. Sint ut consequat ullamco dolor duis exercitation sint eiusmod nostrud et esse labore. Anim elit ipsum occaecat sint laborum esse.\r\nAd velit aliqua irure dolor aliquip eiusmod occaecat incididunt sunt dolore elit quis sunt. Sunt veniam quis eu anim et ut laborum. Nisi duis anim non sunt consequat labore duis sit minim velit dolor adipisicing pariatur. Qui fugiat elit non amet ad nostrud voluptate veniam proident.\r\nEnim qui non exercitation cupidatat pariatur cillum anim sunt aliqua sunt. Lorem ut excepteur consectetur ipsum dolore enim sint labore sunt. Anim dolore consectetur mollit ex consectetur ex enim eiusmod.\r\n", + "address": "2 Bank Street", + "city": "Martinsville", + "state": "Florida", + "zip": 62669, + "country": "Saint Lucia", + "email": "jannadonovan@scentric.com", + "phone": "(953) 514-3535", + "color": "rgb(140,207,218)" + }, + { + "index": 126, + "name": "Winifred Patel", + "first": "Mckenzie", + "last": "Saunders", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/73.jpg", + "expanded": false, + "guid": "0232aa09-2751-4a44-938d-2450be7353c5", + "integer": 47, + "date": "Tue May 04 2010 11:32:34 GMT-0700 (PDT)", + "shortText": "cillum culpa aliqua", + "mediumText": "Et ex ea sunt velit. Veniam amet incididunt labore consectetur incididunt do. Laborum nulla laboris commodo officia commodo fugiat voluptate aliqua ullamco occaecat adipisicing.", + "longText": "Exercitation ut commodo velit culpa veniam reprehenderit magna do amet fugiat dolor. Velit ad esse incididunt cillum eu aliquip aute in velit. Voluptate nulla veniam incididunt adipisicing commodo est aliqua irure id commodo commodo. Qui incididunt culpa culpa laborum exercitation sint eu excepteur dolore occaecat labore aute proident. Eiusmod est occaecat quis duis aliqua. Ad sit incididunt nostrud dolore velit mollit pariatur nostrud.\r\nTempor irure magna ex tempor occaecat voluptate voluptate velit eiusmod laboris enim minim quis. Id voluptate ex adipisicing eiusmod ut labore dolore qui eiusmod laborum exercitation. Irure labore laboris elit ea. Incididunt dolore ex sit id laboris eu dolor anim ullamco dolore laboris laboris ipsum. Est nulla excepteur proident enim labore. Pariatur aliquip voluptate qui amet commodo officia non.\r\nProident et minim excepteur laborum elit do laboris ipsum dolore eu nulla nulla. Id ad aliqua pariatur aliquip magna ea adipisicing occaecat. Exercitation quis Lorem consectetur eiusmod. Aliquip veniam consequat nostrud et id consectetur id consectetur eu ipsum elit incididunt. Aliquip do nostrud occaecat esse consectetur est irure nulla magna.\r\nEiusmod deserunt velit ut commodo commodo ea Lorem nisi voluptate voluptate non consequat sint sunt. Eiusmod nisi nulla minim non nisi sint excepteur ex cupidatat ipsum ex labore. Adipisicing dolore ut tempor exercitation cupidatat.\r\n", + "address": "2 Keap Street", + "city": "Blue", + "state": "New Jersey", + "zip": 62739, + "country": "Equatorial Guinea", + "email": "mckenziesaunders@scentric.com", + "phone": "(997) 545-3802", + "color": "rgb(62,238,78)" + }, + { + "index": 127, + "name": "Connie Conner", + "first": "Tracy", + "last": "York", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vovkasolovev/73.jpg", + "expanded": false, + "guid": "8996bac9-5e0b-418e-a12c-710a15bdb763", + "integer": 8, + "date": "Thu Oct 05 2000 01:32:28 GMT-0700 (PDT)", + "shortText": "nostrud id eiusmod aliqua", + "mediumText": "Irure est aliquip magna excepteur velit cillum dolore eu veniam occaecat ex. Consequat proident nulla anim culpa ullamco sint.", + "longText": "Ipsum labore enim aliquip sit id qui elit ut ex laboris. Tempor ea consequat eiusmod ullamco pariatur sit esse elit in nisi aliquip non. Velit incididunt ea reprehenderit anim anim.\r\n", + "address": "3 Seton Place", + "city": "Cloverdale", + "state": "Wisconsin", + "zip": 87279, + "country": "Tanzania", + "email": "tracyyork@scentric.com", + "phone": "(880) 459-2370", + "color": "rgb(219,127,211)" + }, + { + "index": 128, + "name": "Ladonna Sheppard", + "first": "Jennie", + "last": "Glenn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/urbanjahvier/73.jpg", + "expanded": false, + "guid": "5590b6a2-bb72-4d3e-8088-4af6a3a81dcb", + "integer": 4, + "date": "Mon Jun 04 1979 05:10:17 GMT-0700 (PDT)", + "shortText": "irure ea culpa", + "mediumText": "Est irure minim amet reprehenderit non minim et minim consequat cillum.", + "longText": "Minim laboris sint enim ea. Elit sunt esse pariatur officia voluptate deserunt cupidatat ex ad nisi dolor culpa duis. Velit nulla aute pariatur et voluptate cillum nostrud exercitation qui cillum elit occaecat. Laborum duis dolor cupidatat enim in elit occaecat quis non dolor culpa.\r\nIncididunt excepteur consequat consequat laborum. Cupidatat enim ad et qui pariatur proident ad voluptate minim quis dolore dolor veniam. Nisi sunt voluptate ut est aliqua. Irure Lorem ad non adipisicing aute quis officia dolore adipisicing quis ad minim.\r\n", + "address": "2 Bryant Street", + "city": "Harold", + "state": "Washington", + "zip": 92836, + "country": "Slovak Republic", + "email": "jennieglenn@scentric.com", + "phone": "(875) 496-3782", + "color": "rgb(60,201,252)" + }, + { + "index": 129, + "name": "Hancock Justice", + "first": "Jana", + "last": "Daugherty", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/betraydan/73.jpg", + "expanded": false, + "guid": "ac903149-dee1-4dbc-b0b4-01e15797af97", + "integer": 23, + "date": "Sun Dec 26 1976 01:33:58 GMT-0800 (PST)", + "shortText": "amet deserunt excepteur adipisicing", + "mediumText": "Mollit eu fugiat minim irure eu aliquip eiusmod do nisi elit minim anim commodo nisi. Tempor est exercitation consequat cillum nostrud consectetur ipsum qui. Proident voluptate fugiat labore minim nulla laborum sunt mollit dolore.", + "longText": "Commodo eiusmod nulla consequat Lorem ut ipsum esse cillum. Nostrud dolore proident proident ipsum sunt mollit esse amet. Et in adipisicing esse mollit consequat esse ipsum incididunt. Lorem est do id do qui non sit. Amet minim quis elit minim adipisicing et nisi nisi. Adipisicing aliqua voluptate amet velit amet excepteur id nulla excepteur laborum sit. Anim deserunt aute laboris duis deserunt aute quis veniam.\r\nAd elit fugiat id nisi nostrud esse aliquip. Ipsum esse labore laborum velit velit esse sit consequat non aliquip. Proident consequat est excepteur mollit.\r\nReprehenderit nulla sit adipisicing duis adipisicing qui amet incididunt non in. Est consectetur amet cillum minim enim commodo laborum ipsum occaecat voluptate ea excepteur. Duis mollit anim anim minim magna elit sunt.\r\nEx et quis excepteur deserunt ea occaecat in est cillum labore ad pariatur. Commodo ea anim ipsum qui laboris duis reprehenderit. Non commodo magna voluptate deserunt do. In officia excepteur exercitation qui. Cillum eu aute laboris culpa laborum eu eiusmod.\r\nLorem irure voluptate magna velit reprehenderit sint. Sint ea exercitation officia occaecat. Cillum veniam proident voluptate ullamco in nisi eu. Irure laboris voluptate veniam ea. Reprehenderit adipisicing incididunt enim aliquip ex. Dolore amet ullamco ullamco ad pariatur.\r\n", + "address": "3 Ocean Parkway", + "city": "Fairhaven", + "state": "Oregon", + "zip": 90433, + "country": "Iraq", + "email": "janadaugherty@scentric.com", + "phone": "(966) 582-2529", + "color": "rgb(210,84,143)" + }, + { + "index": 130, + "name": "Gilda Henry", + "first": "Graham", + "last": "Moore", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justme_timothyg/73.jpg", + "expanded": false, + "guid": "25728c02-6a0c-45e4-8ed5-f0b169379f13", + "integer": 39, + "date": "Thu Aug 02 2001 00:17:50 GMT-0700 (PDT)", + "shortText": "irure incididunt magna", + "mediumText": "Ea do ad culpa adipisicing culpa. Tempor ullamco laboris anim nisi exercitation ipsum deserunt voluptate incididunt sunt veniam.", + "longText": "Laborum ex ut culpa occaecat. Ex ad qui amet minim. Occaecat sunt labore id fugiat occaecat deserunt magna dolor proident. Proident eu qui ut incididunt id. Id reprehenderit labore dolore do exercitation. Commodo exercitation sint nulla ullamco. Occaecat mollit velit elit aliquip ad ex.\r\nIrure deserunt mollit deserunt id elit. Labore officia cillum consequat incididunt aliqua veniam fugiat mollit do proident irure exercitation. Exercitation duis irure sunt sit ad proident mollit elit dolore sunt. Ex est ut qui veniam ut laboris dolor deserunt ipsum Lorem ea exercitation eu. Quis labore nostrud sint proident occaecat enim quis dolor aliquip reprehenderit aute officia. Magna aute irure ullamco voluptate nisi ipsum labore.\r\nIrure sit aliquip quis eiusmod nisi occaecat amet cillum minim ex. Ipsum eiusmod ut nostrud eiusmod cillum est fugiat irure qui. Enim minim consequat ullamco minim. Cupidatat culpa mollit ut et.\r\n", + "address": "4 Stewart Street", + "city": "Rossmore", + "state": "Illinois", + "zip": 45849, + "country": "Congo", + "email": "grahammoore@scentric.com", + "phone": "(991) 514-3925", + "color": "rgb(199,144,145)" + }, + { + "index": 131, + "name": "Bates Clements", + "first": "Hatfield", + "last": "Hayden", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justinteractive/73.jpg", + "expanded": false, + "guid": "afe8d372-90a6-404f-85c7-16fd49fb9612", + "integer": 80, + "date": "Wed Feb 14 1990 23:57:58 GMT-0800 (PST)", + "shortText": "excepteur culpa voluptate consectetur", + "mediumText": "Aliqua sunt irure commodo veniam proident. Tempor qui tempor aliqua aute labore dolor consectetur magna duis proident eiusmod sit dolor officia. Eiusmod deserunt aliquip aute officia Lorem minim deserunt magna laboris ipsum et ad commodo esse.", + "longText": "Aute culpa mollit et nisi ut adipisicing et aliquip incididunt laboris dolor mollit. Deserunt elit in sit dolore ut enim eu. Lorem ut magna eu eiusmod commodo excepteur laborum mollit nostrud voluptate sit. Sunt deserunt occaecat sit ea nostrud excepteur commodo nulla qui dolor deserunt do laborum. Pariatur do qui culpa laborum velit cillum.\r\nLabore aute cillum consequat pariatur mollit eiusmod duis ex labore ut. Occaecat dolore irure excepteur mollit tempor tempor ut. Velit qui pariatur pariatur voluptate nostrud. Duis magna sint irure et labore ipsum deserunt non veniam.\r\nFugiat do sint ea ut aute consectetur tempor reprehenderit nulla nulla. Laborum cupidatat excepteur nulla dolor cupidatat duis laboris. Amet in ipsum proident deserunt consectetur in proident incididunt. Elit consectetur occaecat dolore duis aute pariatur.\r\n", + "address": "3 Bulwer Place", + "city": "Gilmore", + "state": "West Virginia", + "zip": 18380, + "country": "Cocos (Keeling Islands)", + "email": "hatfieldhayden@scentric.com", + "phone": "(907) 440-2113", + "color": "rgb(252,242,253)" + }, + { + "index": 132, + "name": "Bell Leonard", + "first": "Leticia", + "last": "Hickman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/psdesignuk/73.jpg", + "expanded": false, + "guid": "ed4df7d0-7592-4c76-b54b-edc925ddb79d", + "integer": 77, + "date": "Tue May 03 1983 09:44:10 GMT-0700 (PDT)", + "shortText": "enim consequat ad elit sit", + "mediumText": "Aute reprehenderit officia dolor sit ullamco consectetur nostrud. Sunt duis excepteur labore enim pariatur voluptate proident nulla dolore consequat ut. Commodo aliqua anim ut Lorem. Irure nostrud ad non eiusmod duis.", + "longText": "Reprehenderit esse laboris consequat aliqua nulla. Dolore do ipsum sunt incididunt. Incididunt ipsum labore eiusmod amet dolor minim sunt velit cupidatat. Sint laboris qui occaecat dolor duis ad mollit esse dolore minim. Et nostrud deserunt magna ad adipisicing nisi deserunt mollit tempor.\r\nDeserunt exercitation consequat labore veniam. Proident aliqua Lorem pariatur anim aliqua eu elit aliqua. Pariatur anim laboris reprehenderit eu nulla consequat eu tempor sint exercitation eiusmod sint excepteur voluptate. Sunt cillum ex ex occaecat aliquip ut labore voluptate cupidatat velit incididunt consectetur reprehenderit sunt.\r\nProident ex sunt eu velit magna quis quis ea nulla. Reprehenderit id eu ullamco deserunt aliqua pariatur do nisi eu anim. Enim exercitation aute culpa aute excepteur pariatur veniam. Esse labore labore anim cupidatat exercitation aliqua Lorem consequat fugiat tempor magna. Mollit ipsum irure proident adipisicing nisi eu mollit culpa aliquip id esse occaecat. Commodo amet esse nisi velit ipsum amet id cupidatat veniam. Id veniam fugiat anim fugiat nisi non in do labore esse labore est exercitation amet.\r\n", + "address": "4 Baughman Place", + "city": "Hessville", + "state": "Mississippi", + "zip": 48135, + "country": "Saint Kitts and Nevis", + "email": "leticiahickman@scentric.com", + "phone": "(986) 415-3367", + "color": "rgb(161,161,217)" + }, + { + "index": 133, + "name": "Logan Wyatt", + "first": "Bray", + "last": "Mathews", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teclaro/73.jpg", + "expanded": false, + "guid": "50c374de-c1b2-4bef-8dc9-9b47e6caf127", + "integer": 3, + "date": "Thu Jan 23 2014 19:45:54 GMT-0800 (PST)", + "shortText": "aliquip cupidatat sint ut", + "mediumText": "Esse elit anim consectetur reprehenderit ad excepteur eiusmod aute. Veniam in ullamco reprehenderit commodo consectetur tempor quis. Nisi enim tempor tempor est est amet esse mollit mollit sint officia et amet duis. Sint sit in sit et enim et eu aliquip nostrud proident.", + "longText": "Amet aliqua eiusmod enim occaecat tempor do adipisicing labore mollit culpa adipisicing dolor nisi id. Elit consequat mollit commodo minim labore excepteur nisi est consectetur. Ad ut laborum enim fugiat cillum eu labore.\r\nReprehenderit pariatur aliqua anim aliquip. Aliqua tempor labore Lorem nulla ut velit aliquip ea amet labore qui exercitation incididunt. Velit pariatur eu sunt mollit velit deserunt mollit ad veniam aute. Cupidatat laboris qui proident eu mollit do qui. Lorem id aliqua occaecat irure proident. Commodo dolor commodo laborum excepteur nisi consequat esse culpa aute laboris do in.\r\nLaborum ex excepteur incididunt sint ipsum. Aliquip cillum nulla sit labore Lorem ut do mollit Lorem. Reprehenderit commodo dolore sint mollit. Laboris et culpa sunt ut ipsum deserunt eiusmod exercitation dolore. Do Lorem deserunt voluptate reprehenderit ex deserunt labore nulla excepteur qui nisi voluptate. Amet ipsum excepteur amet qui nostrud adipisicing elit fugiat veniam nostrud deserunt id sunt laborum. Incididunt eu dolore dolore qui quis qui pariatur pariatur ad nostrud.\r\n", + "address": "2 Cherry Street", + "city": "Kieler", + "state": "Rhode Island", + "zip": 44229, + "country": "Spain", + "email": "braymathews@scentric.com", + "phone": "(945) 538-3851", + "color": "rgb(223,145,248)" + }, + { + "index": 134, + "name": "Elva Beard", + "first": "Riley", + "last": "Wallace", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eyronn/73.jpg", + "expanded": false, + "guid": "7c00ca0a-94ea-41ec-babd-533d61c3c1db", + "integer": 26, + "date": "Tue Sep 20 2005 17:05:43 GMT-0700 (PDT)", + "shortText": "incididunt", + "mediumText": "Tempor reprehenderit ullamco labore irure velit Lorem nulla excepteur sunt nostrud ea exercitation. Exercitation nisi reprehenderit consequat enim voluptate est aute qui dolor aliqua amet quis cupidatat. Elit non aliquip esse in officia enim tempor pariatur aliquip est. Reprehenderit ipsum ea voluptate commodo qui deserunt. Cupidatat nostrud magna eu nisi mollit voluptate sint qui.", + "longText": "Reprehenderit mollit eu est adipisicing amet quis id ipsum est nisi occaecat. Veniam aute aute adipisicing aliquip et ea dolor commodo cillum esse Lorem. Dolore cillum cillum ex consectetur nostrud velit elit voluptate adipisicing deserunt dolore consectetur. Amet proident aliquip enim pariatur occaecat in aliquip deserunt in occaecat qui mollit eu. Deserunt laboris dolor quis do.\r\nVelit ea voluptate culpa veniam mollit excepteur culpa laboris. Dolor est qui sint irure cillum proident labore nulla adipisicing cillum. Incididunt aliquip dolor est consectetur nulla ad aliqua esse sit elit. Eiusmod et fugiat dolore aliquip excepteur ullamco sunt sit enim do fugiat in excepteur cupidatat. Lorem nostrud irure velit quis consectetur.\r\nNulla amet do excepteur in esse reprehenderit nulla aliqua reprehenderit ipsum dolore Lorem sunt. Quis aliqua ex esse voluptate aliquip do incididunt proident exercitation commodo. Commodo enim mollit dolor laboris dolore ex fugiat sit commodo Lorem. Lorem sint mollit reprehenderit ipsum elit qui exercitation incididunt. Non excepteur non duis nulla sunt dolor in qui proident. Proident pariatur adipisicing eu sunt laboris voluptate cillum ut adipisicing. Labore ut esse consectetur in consequat velit cupidatat esse nisi.\r\nVelit Lorem ad sunt labore irure enim ut aliqua officia velit dolor. Sint tempor sunt et amet nostrud. Sint laboris eiusmod elit excepteur.\r\n", + "address": "4 Herkimer Court", + "city": "Jacumba", + "state": "Georgia", + "zip": 87900, + "country": "Guinea-Bissau", + "email": "rileywallace@scentric.com", + "phone": "(908) 527-2510", + "color": "rgb(150,183,57)" + }, + { + "index": 135, + "name": "Jeanne Walker", + "first": "Noemi", + "last": "Castaneda", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gulian/73.jpg", + "expanded": false, + "guid": "954a476d-62d8-4190-94a1-ba084f44049d", + "integer": 52, + "date": "Thu Jul 28 1977 23:23:02 GMT-0700 (PDT)", + "shortText": "duis", + "mediumText": "Aliqua nostrud excepteur est veniam cillum et aute ut. Sint ex nostrud incididunt deserunt duis. Velit laborum occaecat mollit culpa aliquip nisi aliquip ad. Laboris eu adipisicing nostrud aliquip elit consectetur ea nulla quis minim non proident laboris. Laboris exercitation laboris ut exercitation deserunt quis irure irure officia sunt sit cillum ad.", + "longText": "Ipsum occaecat veniam cupidatat enim tempor irure ea reprehenderit esse commodo non. Aliquip est sit ipsum ipsum officia aliquip mollit quis sint adipisicing nisi sint tempor esse. Occaecat fugiat minim tempor excepteur ut minim dolor non voluptate.\r\nAdipisicing sunt excepteur amet aliquip duis anim excepteur ipsum nostrud occaecat non aliquip nulla Lorem. Labore ut sint mollit anim aliquip elit. Incididunt excepteur et deserunt anim laborum voluptate quis nulla ut. Aliqua qui culpa et culpa magna consequat irure culpa Lorem veniam. Qui sit qui labore cillum sunt elit consectetur officia qui Lorem sint elit dolor veniam. Ex labore ullamco quis ut elit Lorem in excepteur officia dolore tempor aute irure. Sunt ut eu deserunt aliquip aliqua sint elit elit.\r\nDolore ex cupidatat cupidatat elit adipisicing exercitation mollit eu officia et ullamco incididunt dolor. Qui incididunt voluptate aliquip fugiat proident ea. Officia minim laboris tempor est aliqua ipsum velit aliqua et culpa voluptate quis. Sint amet commodo dolor ad excepteur veniam cillum amet ut officia commodo velit.\r\nIpsum exercitation laboris occaecat duis non nisi cupidatat ad incididunt voluptate et. Duis ea enim nostrud non reprehenderit laborum culpa sint. Ullamco dolor non in excepteur culpa amet. Consectetur occaecat eiusmod tempor ad tempor veniam dolore aliqua ad id. Exercitation in amet fugiat ea mollit ut in officia velit dolore nostrud est amet anim. Eu do dolore eu ut adipisicing qui aute aute occaecat labore esse.\r\nDo quis laborum minim aliqua non dolor cupidatat labore velit dolor eiusmod. Minim labore sint ipsum duis nisi. Nostrud duis deserunt consectetur magna laborum mollit ea laboris. Consectetur exercitation dolor eu exercitation reprehenderit non ipsum.\r\n", + "address": "4 Montague Street", + "city": "Why", + "state": "New Mexico", + "zip": 97706, + "country": "Cameroon", + "email": "noemicastaneda@scentric.com", + "phone": "(867) 475-2648", + "color": "rgb(130,190,155)" + }, + { + "index": 136, + "name": "Jasmine Talley", + "first": "Debra", + "last": "Dunn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/drebbits/73.jpg", + "expanded": false, + "guid": "d0121c9c-7074-450a-9234-7d97fd437785", + "integer": 91, + "date": "Mon Feb 01 1988 23:12:40 GMT-0800 (PST)", + "shortText": "non", + "mediumText": "Veniam in voluptate laboris exercitation labore velit enim occaecat eiusmod officia cupidatat ex non mollit. Irure occaecat adipisicing dolore labore officia aliquip in. Elit et consequat adipisicing aliquip irure qui sunt amet Lorem eiusmod fugiat tempor sint fugiat. Consectetur esse eu pariatur et cupidatat sint. Nulla enim Lorem exercitation eu id cillum sint qui est deserunt culpa.", + "longText": "Eiusmod aliquip pariatur minim commodo qui labore aliquip sint non officia consequat. Aliquip culpa anim amet id labore nulla enim cupidatat consectetur eiusmod. Dolor nulla pariatur sunt pariatur est labore excepteur velit dolore nisi.\r\nQuis amet fugiat occaecat anim. Elit aliqua non veniam commodo. Lorem enim ut laboris dolore ad esse est culpa aute aliqua aliqua. Elit deserunt ea cillum ad. Laboris ipsum cupidatat laborum veniam officia quis aute sit pariatur commodo reprehenderit in velit.\r\nEnim aliqua culpa do voluptate et deserunt velit est. Nisi elit voluptate ipsum officia mollit nulla anim labore magna laboris dolor proident. Ea excepteur laborum aute excepteur officia qui proident. Nisi ad ipsum et cupidatat sint cupidatat veniam eiusmod eu id eiusmod pariatur cupidatat. Mollit eiusmod culpa labore reprehenderit minim dolore et veniam non labore tempor sunt Lorem ex. Laborum officia Lorem duis enim magna exercitation ullamco elit ut veniam reprehenderit magna quis adipisicing. Dolor est amet commodo nulla deserunt Lorem reprehenderit consectetur.\r\n", + "address": "2 Woodpoint Road", + "city": "Shaft", + "state": "Arizona", + "zip": 57801, + "country": "Niger", + "email": "debradunn@scentric.com", + "phone": "(815) 574-3583", + "color": "rgb(79,212,186)" + }, + { + "index": 137, + "name": "Marquez Stark", + "first": "Gallegos", + "last": "Harris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alexhaniotis/73.jpg", + "expanded": false, + "guid": "2dc3bab6-4120-4941-8c99-3f350a894c8f", + "integer": 76, + "date": "Tue Jul 05 2005 22:08:38 GMT-0700 (PDT)", + "shortText": "id officia", + "mediumText": "Mollit dolor quis quis velit elit id ex esse sit cillum sit aliquip.", + "longText": "Est laboris reprehenderit nisi duis eu qui elit ipsum excepteur cillum officia. Qui dolor eiusmod nulla elit enim pariatur tempor. Sunt aliquip voluptate mollit magna nisi eu sit do adipisicing laboris. Officia fugiat id quis eu consequat nulla anim irure quis exercitation adipisicing deserunt elit.\r\nAnim minim nostrud reprehenderit aute labore irure voluptate. Laborum incididunt ipsum culpa nulla qui esse mollit veniam. Dolor commodo ad aliqua aliquip ea consequat occaecat culpa veniam consequat. Incididunt reprehenderit enim veniam deserunt laboris cillum sint occaecat labore eiusmod ullamco veniam. Dolor culpa culpa laboris id cillum. Exercitation qui id laboris minim fugiat ea do aute duis. Do velit laborum adipisicing ad amet consequat laboris Lorem pariatur.\r\nConsequat dolor amet cillum minim exercitation sit in velit fugiat id anim. Fugiat tempor laborum nostrud ea eiusmod esse laborum. Labore aliquip ullamco ipsum aliqua consectetur ipsum ad. Et voluptate incididunt id cillum labore fugiat aliquip veniam sunt sunt nisi adipisicing. Cillum nisi qui reprehenderit qui nostrud sunt.\r\n", + "address": "2 Franklin Street", + "city": "Orovada", + "state": "Texas", + "zip": 68862, + "country": "Malta", + "email": "gallegosharris@scentric.com", + "phone": "(994) 597-2534", + "color": "rgb(67,106,191)" + }, + { + "index": 138, + "name": "James Gregory", + "first": "Davis", + "last": "Burton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/twahlin/73.jpg", + "expanded": false, + "guid": "7ff8b299-328d-46dc-ab4f-b59c0d6e3ad8", + "integer": 32, + "date": "Sat Jan 08 1994 09:01:56 GMT-0800 (PST)", + "shortText": "tempor", + "mediumText": "Id nisi nulla non culpa laborum dolor adipisicing aute in. Cillum consectetur sit occaecat officia. Nulla Lorem aliqua nulla velit nisi dolore magna sint in sint incididunt sunt sit nostrud. Pariatur sunt labore Lorem est nulla minim culpa velit tempor elit ipsum in eiusmod. Ad fugiat anim incididunt sint consectetur.", + "longText": "Esse reprehenderit laborum commodo aute nostrud incididunt. Voluptate do consectetur excepteur minim laboris ea et ut cupidatat. Magna qui aute sint minim do nostrud laborum magna labore. Lorem sunt veniam ullamco cupidatat.\r\nEt ullamco aute ex cupidatat cillum laboris aliqua laborum irure. Laboris ex laboris dolore non Lorem. Reprehenderit excepteur occaecat laborum laboris voluptate exercitation eu est consectetur tempor est nisi. Cillum fugiat do deserunt non dolor eiusmod Lorem dolore voluptate. Nisi minim enim Lorem minim quis exercitation reprehenderit eu nulla qui aute.\r\nIrure anim eiusmod id adipisicing aliqua. Nulla minim laboris nulla esse do elit aliqua eiusmod aute cillum elit. Ex consequat laboris aliquip dolor dolore pariatur consequat ut reprehenderit.\r\nFugiat minim eiusmod tempor commodo amet deserunt consectetur elit aliquip ex labore laborum veniam eu. Cillum aliquip aliquip non culpa eiusmod elit non dolore. Eiusmod ullamco cillum dolor ea voluptate et adipisicing ut enim. Sunt duis ea fugiat aute qui reprehenderit ut. Ullamco minim cillum aliqua nulla amet excepteur reprehenderit ut reprehenderit. Duis eu aliqua ad dolore consectetur labore quis occaecat cillum qui sint commodo deserunt est. Duis sunt deserunt enim duis est anim commodo elit id ad magna occaecat in.\r\n", + "address": "4 Macdougal Street", + "city": "Limestone", + "state": "District Of Columbia", + "zip": 74514, + "country": "Antigua and Barbuda", + "email": "davisburton@scentric.com", + "phone": "(916) 551-3269", + "color": "rgb(215,141,197)" + }, + { + "index": 139, + "name": "Thomas Lowery", + "first": "Hutchinson", + "last": "Weeks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ntfblog/73.jpg", + "expanded": false, + "guid": "6ae3a7b3-9d8c-46bc-9d8c-af55345a1168", + "integer": 68, + "date": "Sat May 27 1978 05:40:06 GMT-0700 (PDT)", + "shortText": "irure sit", + "mediumText": "Officia proident tempor do et aliquip in cupidatat labore anim esse.", + "longText": "Labore elit laboris dolor fugiat ut sit minim aliquip adipisicing culpa nostrud. Id do adipisicing nisi adipisicing proident. Cupidatat tempor aliquip anim consequat fugiat eiusmod laborum adipisicing. Et sunt velit magna cupidatat commodo et consequat. Exercitation voluptate ex aliquip laboris. Aliqua qui voluptate anim deserunt reprehenderit.\r\nPariatur dolore pariatur laborum excepteur duis. Dolore consequat veniam fugiat sint cillum quis sit deserunt laborum eiusmod culpa id. Eiusmod incididunt magna cupidatat irure. Ex eu ad non non non consectetur sit non cillum sit anim cupidatat. Ea minim ut exercitation sint ullamco culpa cupidatat ipsum eu sit.\r\nEnim aliquip officia occaecat esse exercitation nulla esse. Commodo magna et sint sint consequat velit excepteur occaecat ex ea tempor proident. Officia laboris proident commodo eu laboris consectetur sunt pariatur aliqua pariatur. Fugiat reprehenderit reprehenderit cillum exercitation consequat duis ullamco in quis exercitation est est excepteur.\r\nEsse duis in elit cupidatat non cillum non aute sunt nulla mollit ipsum enim. Sit deserunt do nostrud quis dolor qui aliqua qui exercitation ex minim velit esse. Aliqua irure do ex eiusmod cupidatat non veniam est exercitation. Ea culpa eu Lorem id aute dolore.\r\n", + "address": "4 Hazel Court", + "city": "Lafferty", + "state": "Virgin Islands", + "zip": 50828, + "country": "Kazakhstan", + "email": "hutchinsonweeks@scentric.com", + "phone": "(930) 418-3265", + "color": "rgb(120,254,136)" + }, + { + "index": 140, + "name": "Adkins Hanson", + "first": "Gibson", + "last": "Chaney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/commoncentssss/73.jpg", + "expanded": false, + "guid": "9f6901ec-fedc-4d3c-963a-46d2245a15d6", + "integer": 63, + "date": "Thu Dec 30 1971 20:07:08 GMT-0800 (PST)", + "shortText": "elit tempor labore labore", + "mediumText": "Esse duis dolore officia voluptate velit culpa incididunt reprehenderit nisi. Eiusmod dolor ut non ea ut consequat dolor veniam aliqua ut cupidatat pariatur sunt.", + "longText": "Culpa tempor sint ullamco minim aute ad. Mollit laboris minim amet incididunt proident proident magna elit qui fugiat non velit irure. Nostrud incididunt non sunt ex veniam minim proident exercitation aliqua veniam laboris dolor est.\r\nPariatur aute adipisicing tempor occaecat. Laborum sit quis irure commodo sit. Incididunt do enim sit ad. Voluptate dolore fugiat ipsum id. Lorem Lorem laborum excepteur nostrud ut.\r\nCulpa tempor velit esse commodo eiusmod excepteur in aliqua. Quis culpa Lorem non et sunt elit. Incididunt ullamco ipsum duis laboris minim do mollit quis non minim laboris adipisicing sit Lorem. Culpa consectetur Lorem aute amet culpa deserunt fugiat. Deserunt amet officia cupidatat ea cupidatat nisi enim cupidatat reprehenderit dolore et reprehenderit nulla cupidatat. Velit ipsum ea ad exercitation eu sunt nisi nostrud ullamco nisi commodo aliqua.\r\nAdipisicing aute reprehenderit in enim do ipsum pariatur et cupidatat deserunt consectetur mollit sunt laboris. Exercitation voluptate dolor quis quis commodo. Laboris sunt consectetur veniam id fugiat magna ipsum ad cillum officia in sunt. Sunt ut magna culpa ad proident id sit in. Sint laborum commodo culpa deserunt et aliquip dolor laborum. Laboris adipisicing exercitation aliqua qui labore irure Lorem culpa aute minim Lorem aliquip. Sint nostrud et ut irure nisi non.\r\n", + "address": "4 Croton Loop", + "city": "Cresaptown", + "state": "Puerto Rico", + "zip": 63679, + "country": "Bahrain", + "email": "gibsonchaney@scentric.com", + "phone": "(973) 550-3569", + "color": "rgb(147,126,185)" + }, + { + "index": 141, + "name": "Catalina Rojas", + "first": "Angie", + "last": "Mcknight", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anissa_anwar/73.jpg", + "expanded": false, + "guid": "2a7b1f3c-602a-4977-b1d0-b2e1f3101dbd", + "integer": 61, + "date": "Sun Jan 31 1982 15:49:23 GMT-0800 (PST)", + "shortText": "in adipisicing reprehenderit cillum officia", + "mediumText": "Commodo voluptate est elit aliquip irure qui. Ullamco labore et non irure. Ea sunt excepteur ea in. Consequat deserunt sint id et aliquip officia et nisi esse amet reprehenderit quis. Ut enim quis et culpa.", + "longText": "Labore ullamco ea ipsum aute veniam adipisicing irure culpa adipisicing mollit. Qui aute velit labore veniam enim exercitation reprehenderit tempor nisi ullamco cillum tempor ea fugiat. Nulla incididunt dolore exercitation irure ut. Fugiat dolor duis ad deserunt in proident. Est elit nisi magna do culpa aliquip proident elit cupidatat. Adipisicing fugiat commodo ullamco eiusmod mollit veniam. Nisi cupidatat ullamco cillum velit qui Lorem sint ad non esse eu.\r\n", + "address": "4 Thomas Street", + "city": "Marenisco", + "state": "Maryland", + "zip": 83481, + "country": "India", + "email": "angiemcknight@scentric.com", + "phone": "(852) 571-3576", + "color": "rgb(180,187,55)" + }, + { + "index": 142, + "name": "Waller Rios", + "first": "Sherri", + "last": "Jones", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/btrig/73.jpg", + "expanded": false, + "guid": "33336c68-2dc7-4da4-83df-770c5d0ac6a1", + "integer": 23, + "date": "Thu Aug 06 2009 20:38:56 GMT-0700 (PDT)", + "shortText": "cillum ullamco deserunt", + "mediumText": "In voluptate sit consequat ex eu consectetur labore et qui in. Nostrud do enim ut non dolore cupidatat duis sint. Est laboris aute veniam mollit ea dolore occaecat pariatur. Fugiat adipisicing amet cupidatat cillum sit reprehenderit velit cillum ex anim velit tempor. Ullamco do aliquip est Lorem duis nulla ipsum.", + "longText": "Enim aliqua ut eu excepteur cupidatat nostrud dolore. Anim in ut est laboris. Id sunt ex labore commodo pariatur laborum sint labore fugiat nostrud.\r\nVelit commodo voluptate irure eu officia aute veniam et quis laboris. Nisi excepteur excepteur deserunt dolor. Sunt ex enim do eiusmod aliqua consequat aute cupidatat incididunt sint eiusmod ex ea Lorem. Fugiat nisi adipisicing ullamco anim enim quis eu fugiat.\r\nTempor aliqua consequat nisi deserunt cillum. Nulla eu fugiat nostrud aliquip ut consequat consectetur dolor labore duis ut deserunt eu. Mollit ut irure irure dolore ad occaecat cillum. Consectetur Lorem nostrud veniam fugiat. Qui mollit pariatur tempor consequat. Ut consequat veniam consequat exercitation non cillum ullamco sit velit Lorem qui aliqua anim.\r\nIrure ad minim consectetur mollit consectetur. Ex est laborum fugiat non. Aute consequat aliquip qui ex proident. Ad occaecat deserunt aliqua non sint consectetur voluptate in enim quis do mollit velit. Reprehenderit quis dolor laborum dolor mollit.\r\nIrure Lorem aliquip elit id minim sit. Exercitation laborum deserunt irure incididunt deserunt veniam ullamco dolor. Aliqua excepteur quis culpa labore in elit reprehenderit voluptate duis consectetur. Irure occaecat consequat commodo enim ex enim deserunt.\r\n", + "address": "2 Etna Street", + "city": "Gorham", + "state": "Massachusetts", + "zip": 76332, + "country": "Qatar", + "email": "sherrijones@scentric.com", + "phone": "(905) 514-2725", + "color": "rgb(167,172,139)" + }, + { + "index": 143, + "name": "Fulton Richmond", + "first": "Nannie", + "last": "Preston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ug_rick/73.jpg", + "expanded": false, + "guid": "d342e219-1ba1-46ae-aaea-371e1c50562a", + "integer": 14, + "date": "Thu Aug 06 1987 21:37:44 GMT-0700 (PDT)", + "shortText": "proident sunt tempor", + "mediumText": "Fugiat aliquip nisi eiusmod et. Adipisicing eiusmod quis magna aliquip ut ullamco nulla veniam dolor irure exercitation dolore. Lorem nostrud do non do cupidatat eiusmod ea ipsum aliqua pariatur aute Lorem voluptate.", + "longText": "Commodo adipisicing est ea do nostrud Lorem in adipisicing magna dolor pariatur consectetur. Esse adipisicing Lorem qui nostrud occaecat ipsum aute deserunt esse minim elit amet. Ad sint dolore minim consectetur enim. Cupidatat culpa amet mollit ut dolore aliqua laborum nulla voluptate voluptate eu sint voluptate Lorem. Irure et laboris tempor aute qui veniam id nulla sint nostrud eu officia ea commodo.\r\nAliquip et magna exercitation velit quis incididunt velit. Nostrud fugiat in nulla Lorem qui tempor nulla adipisicing anim eiusmod duis sunt ad ex. Nulla Lorem aliqua do esse commodo. Ea ullamco anim non magna reprehenderit id ad ut aliquip magna velit tempor est. Consequat laboris tempor cupidatat velit nulla ea reprehenderit aute excepteur commodo eu qui nisi amet. Commodo excepteur enim sint dolor tempor eu nulla elit non dolor.\r\nDo id incididunt aute consequat cillum. Voluptate sunt in ut id enim fugiat occaecat. Consectetur cillum sint tempor commodo duis veniam ad anim laboris deserunt consequat. Nisi duis aliqua consectetur ullamco nisi culpa ea aliqua.\r\n", + "address": "2 Lott Street", + "city": "Lydia", + "state": "Oklahoma", + "zip": 37848, + "country": "Vatican City State (Holy See)", + "email": "nanniepreston@scentric.com", + "phone": "(801) 531-2586", + "color": "rgb(58,230,86)" + }, + { + "index": 144, + "name": "Juanita Mcfadden", + "first": "Preston", + "last": "Koch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/blakestevenson/73.jpg", + "expanded": false, + "guid": "d10bde3c-7451-4455-bcab-d6a9467128b3", + "integer": 35, + "date": "Sat Dec 29 2007 19:47:26 GMT-0800 (PST)", + "shortText": "fugiat", + "mediumText": "Deserunt mollit proident mollit pariatur aliquip amet sit sunt ea aliquip non ad irure voluptate. Mollit eu veniam do veniam esse laboris velit dolor velit aliqua Lorem sint dolore cupidatat. Ea est irure incididunt deserunt officia Lorem culpa proident non do cillum.", + "longText": "Reprehenderit sint est consequat do. Qui irure ad voluptate proident nulla nulla quis nisi minim quis ullamco eiusmod sint. Nulla exercitation tempor incididunt qui. Adipisicing velit sit ad exercitation cillum esse exercitation sit laboris. Nostrud commodo aliquip esse quis in irure exercitation.\r\nEnim nisi in dolor cillum nulla ipsum. Qui velit cupidatat esse sit quis ullamco consequat deserunt irure exercitation. Culpa tempor ut ex id id aliqua ipsum cillum est proident ullamco nulla reprehenderit. Amet proident duis sunt proident consectetur non pariatur officia in. Voluptate enim anim eiusmod fugiat occaecat ut sunt sit nulla proident. Elit dolore consectetur velit occaecat.\r\n", + "address": "4 Jewel Street", + "city": "Washington", + "state": "Ohio", + "zip": 55293, + "country": "Malaysia", + "email": "prestonkoch@scentric.com", + "phone": "(824) 598-3313", + "color": "rgb(188,204,126)" + }, + { + "index": 145, + "name": "Hunter Morin", + "first": "Aguilar", + "last": "Willis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karalek/73.jpg", + "expanded": false, + "guid": "b6d849a7-e16f-4caf-8ddf-0232c5ccb47c", + "integer": 14, + "date": "Fri Oct 11 2013 10:09:38 GMT-0700 (PDT)", + "shortText": "mollit elit incididunt exercitation esse", + "mediumText": "Nisi tempor cupidatat do sint in nostrud nulla magna labore tempor amet. Qui ut anim adipisicing veniam veniam voluptate cupidatat culpa duis minim adipisicing veniam excepteur proident. Tempor eiusmod sint et nulla voluptate irure et quis sunt. Sit exercitation ex adipisicing consectetur sit veniam velit et laboris minim Lorem excepteur in.", + "longText": "Elit dolore dolore mollit deserunt fugiat Lorem ad nostrud occaecat magna. Sint deserunt sunt incididunt ad qui. Cupidatat nostrud ea sunt officia non sunt ea aliqua ipsum cillum adipisicing. Esse eiusmod minim magna culpa culpa.\r\n", + "address": "2 Cox Place", + "city": "Escondida", + "state": "Nevada", + "zip": 76788, + "country": "Belize", + "email": "aguilarwillis@scentric.com", + "phone": "(878) 446-2425", + "color": "rgb(137,240,219)" + }, + { + "index": 146, + "name": "Kathy Sutton", + "first": "Kendra", + "last": "Blevins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elusiveanmol/73.jpg", + "expanded": false, + "guid": "4ad8c3c8-a316-4762-a596-e9477c0fa2cd", + "integer": 31, + "date": "Thu Dec 09 2004 16:04:29 GMT-0800 (PST)", + "shortText": "nisi", + "mediumText": "Minim incididunt amet sint velit officia eiusmod cillum velit duis adipisicing magna laborum deserunt eiusmod.", + "longText": "Sunt culpa tempor deserunt ea ea labore. Occaecat consectetur anim anim ipsum dolor. Consectetur nulla commodo non velit reprehenderit cillum tempor aliquip aliqua consequat dolore.\r\nAnim minim ipsum velit consectetur sit incididunt magna cillum. Commodo deserunt consectetur esse aliqua ullamco dolor pariatur. Mollit sint voluptate aute dolor fugiat minim veniam anim ad aute. In aliquip anim ullamco dolore proident proident ipsum sunt sunt. Sint dolor pariatur aute excepteur sunt laborum magna qui.\r\nIn eu excepteur commodo eiusmod aliqua ad amet. Fugiat eu adipisicing et eu commodo nostrud elit consectetur incididunt deserunt. Non velit qui do pariatur. Lorem pariatur ullamco voluptate cillum do duis.\r\nEnim ut velit tempor nulla nostrud duis non ex amet. Fugiat cillum cillum dolore aliquip aliqua duis proident sit eu deserunt culpa esse ad. Laboris dolore nulla in ullamco ullamco ut ad. Veniam amet ea Lorem consequat officia ut consectetur ea Lorem duis cupidatat id. Irure non cupidatat ipsum do incididunt duis minim elit dolor deserunt velit. Deserunt laboris fugiat ea incididunt qui excepteur ad non irure incididunt aliquip fugiat occaecat non.\r\nElit proident exercitation quis in labore et sint ea cillum ex occaecat deserunt. Ex laboris fugiat non et excepteur. Labore non nisi exercitation do minim incididunt commodo culpa est dolor. Mollit minim proident ea id. Aliquip est nulla aliquip sint culpa eu amet magna exercitation reprehenderit culpa. Ex commodo aliqua mollit veniam fugiat officia sint duis ad sit.\r\n", + "address": "3 Prince Street", + "city": "Urbana", + "state": "Montana", + "zip": 58650, + "country": "Singapore", + "email": "kendrablevins@scentric.com", + "phone": "(956) 553-2050", + "color": "rgb(224,79,174)" + }, + { + "index": 147, + "name": "Noel Morrison", + "first": "Puckett", + "last": "Shannon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shoo7830/73.jpg", + "expanded": false, + "guid": "3257d65a-9945-47b8-8159-7e2304b15eef", + "integer": 32, + "date": "Wed Oct 31 1973 14:26:42 GMT-0800 (PST)", + "shortText": "sit enim nisi dolor occaecat", + "mediumText": "Deserunt deserunt excepteur aliquip proident aliquip sunt voluptate qui. Incididunt Lorem laboris dolore cillum incididunt. Qui magna excepteur ad id fugiat nostrud ea sunt mollit.", + "longText": "Eiusmod irure est incididunt cillum id sit enim quis. Eiusmod consequat deserunt proident fugiat velit ut pariatur mollit eiusmod tempor reprehenderit nisi. Nulla id ea occaecat culpa sit aute pariatur sit ullamco sint. Reprehenderit minim irure ut laborum irure nisi consectetur. Velit laborum aliquip eu ea quis veniam dolore nulla in mollit labore. Dolor velit est eiusmod est ullamco magna excepteur culpa deserunt aliqua culpa Lorem ea.\r\nTempor adipisicing sit elit ea commodo dolore dolore incididunt anim cillum nulla. In exercitation excepteur cupidatat nisi do. Id et aliqua incididunt officia pariatur dolor officia in eu ea. Eiusmod duis sint Lorem in officia velit sit qui labore aliqua fugiat quis magna ea. Laborum reprehenderit exercitation reprehenderit veniam anim nisi qui est. Ad velit incididunt ut labore consequat culpa nisi do voluptate aliquip.\r\nDo dolore occaecat amet aliquip excepteur aute nisi non. Cillum incididunt nostrud excepteur eiusmod consequat mollit voluptate dolor aliquip non. Veniam pariatur ad dolor commodo velit. Sunt dolore sunt dolore adipisicing pariatur sit nulla magna exercitation dolor proident amet dolore. Lorem adipisicing cillum laboris anim ex pariatur minim proident cillum deserunt incididunt est nostrud.\r\nEiusmod dolore eiusmod ad irure. Id nulla voluptate ad cillum duis aute veniam est mollit do. Dolore adipisicing cupidatat officia magna mollit incididunt ea. Ipsum commodo aute eu consequat ea sit. Pariatur cupidatat veniam voluptate est ex. Officia sint laboris voluptate anim laborum occaecat in ad. Consequat amet occaecat commodo deserunt duis.\r\nEnim minim dolor in anim enim. Sint ad adipisicing ullamco dolor cillum aute proident ea sint quis laboris sit. Dolor voluptate qui duis do ut labore magna incididunt occaecat tempor esse reprehenderit. Proident fugiat nulla tempor magna sit ut aliquip proident voluptate esse.\r\n", + "address": "2 Vanderbilt Avenue", + "city": "Nanafalia", + "state": "California", + "zip": 57562, + "country": "Trinidad and Tobago", + "email": "puckettshannon@scentric.com", + "phone": "(963) 414-2787", + "color": "rgb(74,128,154)" + }, + { + "index": 148, + "name": "Reeves Combs", + "first": "Trudy", + "last": "Newton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/oanacr/73.jpg", + "expanded": false, + "guid": "53ffc997-22cc-4acc-94b5-13907ae8737f", + "integer": 12, + "date": "Sun Feb 19 1984 10:56:10 GMT-0800 (PST)", + "shortText": "consequat quis ea laboris", + "mediumText": "Commodo minim culpa cillum proident dolor occaecat mollit.", + "longText": "Proident consectetur officia consectetur laborum eiusmod sunt. Et magna labore nostrud culpa ullamco cillum duis pariatur laboris irure. Anim laborum enim laboris velit pariatur cupidatat. Aliqua minim eu labore est ex excepteur ullamco laboris deserunt ex id tempor. Laboris dolor elit officia anim incididunt nostrud incididunt nostrud officia voluptate. Voluptate nostrud fugiat consectetur cillum adipisicing elit sint sit duis. Dolor labore do pariatur do officia ullamco.\r\nQui nulla occaecat dolore ad labore excepteur reprehenderit magna sint irure culpa est. In mollit cupidatat laborum duis ipsum mollit. Eiusmod excepteur aliquip do anim occaecat quis mollit id laborum Lorem consectetur commodo. Officia nisi Lorem veniam officia consectetur proident duis anim ullamco sunt enim nostrud. Laboris ad eu et esse sit nisi.\r\nNulla proident eu duis sunt nostrud minim laboris fugiat nisi pariatur occaecat. Et cupidatat mollit laborum ipsum sint ea amet enim aliqua. Exercitation eiusmod eu labore tempor mollit id commodo amet magna.\r\n", + "address": "3 Fayette Street", + "city": "Noxen", + "state": "Marshall Islands", + "zip": 85920, + "country": "Namibia", + "email": "trudynewton@scentric.com", + "phone": "(873) 577-2869", + "color": "rgb(219,169,181)" + }, + { + "index": 149, + "name": "Oconnor Chan", + "first": "Beasley", + "last": "Larson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elamyr/73.jpg", + "expanded": false, + "guid": "1f90bd42-2c77-42fe-aa6b-fa4cd66676e6", + "integer": 10, + "date": "Fri Dec 30 1983 09:19:48 GMT-0800 (PST)", + "shortText": "adipisicing magna dolore", + "mediumText": "Commodo fugiat enim est minim. Amet quis amet mollit ipsum. Ex laboris eiusmod ut cillum nostrud sit excepteur qui est aliquip irure.", + "longText": "Laborum aliquip ullamco id irure anim esse nisi pariatur incididunt enim tempor. Sit voluptate aliquip non duis commodo. Dolor pariatur sunt ex nulla occaecat commodo ad minim minim eiusmod laborum consectetur. Veniam aute pariatur excepteur deserunt veniam voluptate tempor magna laborum minim consectetur officia consectetur. Enim aliquip incididunt dolor qui labore.\r\nAdipisicing fugiat commodo eiusmod cillum reprehenderit amet anim id. Aute laboris irure culpa est officia eiusmod esse minim ut irure ut. Nulla eu tempor nulla est eiusmod exercitation deserunt est. Nisi commodo amet sunt laborum non dolore sint eiusmod adipisicing officia elit ea occaecat.\r\nAdipisicing do ex aliqua aute ex nisi veniam excepteur consequat proident Lorem. Occaecat sit nisi amet occaecat consectetur id cillum dolore ad do laborum fugiat eiusmod. Cillum officia mollit qui non ad occaecat ea. Aliqua do pariatur culpa ullamco aliquip nisi enim tempor tempor ad quis nisi. Elit ipsum nisi nostrud magna excepteur sunt nisi excepteur ipsum nulla proident. Adipisicing mollit anim dolore eu mollit amet tempor.\r\n", + "address": "3 Sedgwick Street", + "city": "Wyoming", + "state": "Indiana", + "zip": 32307, + "country": "Paraguay", + "email": "beasleylarson@scentric.com", + "phone": "(816) 493-2742", + "color": "rgb(72,189,192)" + }, + { + "index": 150, + "name": "Cherry Barrett", + "first": "Jodie", + "last": "Logan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hmenchaca2/73.jpg", + "expanded": false, + "guid": "cf368c96-a982-4646-9b54-5fac8d17760e", + "integer": 86, + "date": "Tue Jun 30 2009 10:25:53 GMT-0700 (PDT)", + "shortText": "minim aliqua deserunt officia reprehenderit", + "mediumText": "Sunt ea eu occaecat aliqua.", + "longText": "Do anim id incididunt enim eiusmod quis sit id anim laboris proident. Fugiat nostrud dolore ex sit excepteur aliqua ex laborum ipsum deserunt mollit in laboris excepteur. Voluptate fugiat aliquip cillum sint magna voluptate labore veniam commodo deserunt excepteur. Nisi laborum commodo magna laborum ullamco ullamco est incididunt. Fugiat ex do pariatur reprehenderit velit pariatur proident. Laborum nulla laborum fugiat minim ut est voluptate elit reprehenderit.\r\nVelit enim enim ex eiusmod quis quis. Est minim adipisicing eu labore et dolor. Occaecat non laborum sint officia aliquip. Sint voluptate est incididunt ullamco anim duis cillum nostrud consectetur consequat amet quis labore. Ullamco eu amet eu est esse. Pariatur commodo incididunt dolore commodo sint consequat qui consectetur ea eu et. Amet quis non fugiat sint nostrud magna eiusmod incididunt ullamco.\r\nConsequat Lorem id ea consectetur cupidatat veniam adipisicing quis est proident eu quis. Labore magna ut esse amet qui non commodo exercitation. Adipisicing ut fugiat dolor sit ex sint mollit aute occaecat officia ipsum ut. Dolore consectetur laboris sint ex consectetur. Labore proident Lorem sunt sunt amet. Laboris ad in consectetur laboris nostrud culpa veniam pariatur esse adipisicing.\r\nIrure qui nostrud magna elit nulla velit consequat magna aliqua. Esse in consectetur velit laborum nostrud Lorem quis. Ipsum consectetur adipisicing sint adipisicing labore sit Lorem elit veniam nisi excepteur fugiat.\r\nAliqua ut qui enim sit nulla nulla nulla labore aliqua Lorem Lorem do. Voluptate id non pariatur aliquip eiusmod sit in nisi excepteur aliquip nostrud ut. Non id sunt Lorem nostrud cillum ad incididunt. Et aliquip ipsum Lorem deserunt magna do ullamco pariatur exercitation ad id anim in. Anim fugiat nostrud eu commodo velit. Aute labore est anim duis et minim qui non voluptate velit incididunt.\r\n", + "address": "3 Kenilworth Place", + "city": "Foxworth", + "state": "Tennessee", + "zip": 15225, + "country": "Macau", + "email": "jodielogan@scentric.com", + "phone": "(804) 506-3585", + "color": "rgb(200,139,149)" + }, + { + "index": 151, + "name": "Pennington Mccormick", + "first": "Georgette", + "last": "Clay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dparrelli/73.jpg", + "expanded": false, + "guid": "c449450f-7ccb-4b65-9f9d-2b392e612960", + "integer": 15, + "date": "Tue Nov 10 1992 06:22:21 GMT-0800 (PST)", + "shortText": "adipisicing non officia", + "mediumText": "Dolore tempor qui cupidatat et velit ipsum ut officia.", + "longText": "Laboris nostrud cillum esse velit veniam non occaecat. Consequat pariatur reprehenderit qui culpa cupidatat fugiat ad amet irure non. Consequat magna laboris occaecat laborum est elit et magna voluptate cillum occaecat amet. Sit elit proident duis tempor nulla ullamco est qui nostrud. Duis non aliqua ea duis labore elit pariatur elit. Aliquip amet id ea aliqua.\r\nLorem Lorem exercitation eiusmod laboris culpa ipsum qui occaecat irure elit. Do occaecat reprehenderit pariatur non nisi magna nisi labore cupidatat anim proident quis ad ipsum. Non qui aute cupidatat irure dolor excepteur excepteur. Veniam eiusmod non nulla ex amet in minim non dolore excepteur anim. Ipsum non magna minim ea consequat officia et eu velit do. Aliqua veniam dolor officia incididunt occaecat. Ipsum est magna non fugiat mollit sunt consectetur veniam dolore id proident exercitation exercitation consectetur.\r\n", + "address": "2 Blake Avenue", + "city": "Haring", + "state": "Palau", + "zip": 47253, + "country": "Mauritania", + "email": "georgetteclay@scentric.com", + "phone": "(941) 573-3108", + "color": "rgb(166,137,160)" + }, + { + "index": 152, + "name": "Freda Coffey", + "first": "Rice", + "last": "Savage", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/okansurreel/73.jpg", + "expanded": false, + "guid": "0645d81f-1761-4eb4-b3ec-5c83f1d37a29", + "integer": 84, + "date": "Sun May 07 1978 23:30:05 GMT-0700 (PDT)", + "shortText": "deserunt voluptate officia consequat magna", + "mediumText": "Adipisicing esse tempor proident irure dolore eu sit.", + "longText": "Exercitation cupidatat voluptate exercitation quis nulla laborum. Tempor elit elit est commodo commodo ipsum elit quis minim ut cupidatat aliqua. Elit officia enim occaecat nisi fugiat nulla qui quis. Nisi cillum ullamco eu proident mollit velit.\r\n", + "address": "4 Ludlam Place", + "city": "Dotsero", + "state": "Virginia", + "zip": 28698, + "country": "Ghana", + "email": "ricesavage@scentric.com", + "phone": "(885) 508-3868", + "color": "rgb(209,117,128)" + }, + { + "index": 153, + "name": "Robin Merrill", + "first": "Harrington", + "last": "Simpson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lwilsonsmith/73.jpg", + "expanded": false, + "guid": "13382562-593b-4d3d-8633-025dec9ff8d2", + "integer": 71, + "date": "Sun Jul 15 1973 12:02:34 GMT-0700 (PDT)", + "shortText": "ad", + "mediumText": "Incididunt est minim non mollit amet est. Id nulla fugiat in pariatur nisi non aliqua deserunt cillum fugiat labore occaecat. Laborum Lorem laborum sit esse amet veniam. Occaecat exercitation anim consectetur nisi.", + "longText": "Anim nisi ex sint laboris incididunt id mollit sunt voluptate laboris qui sunt ad aliqua. Consectetur et esse aliqua in esse cupidatat pariatur ea nulla cillum ea. Exercitation commodo consectetur do quis aute officia est exercitation tempor nisi. Ut mollit Lorem anim cupidatat tempor aute consequat labore Lorem do enim reprehenderit.\r\nLorem magna tempor incididunt aliqua in magna Lorem. Fugiat qui minim est excepteur dolore laboris non consequat. Ullamco consequat eiusmod et sint aliquip et in anim.\r\nSunt incididunt nostrud nulla cillum veniam laborum proident exercitation occaecat incididunt nulla cillum. Labore exercitation in ea aliquip est anim cillum aliqua dolore aliqua adipisicing dolore. Ex et qui sint mollit nisi id aliqua nostrud nostrud eiusmod dolore ut proident qui.\r\nExcepteur cillum ea est eu ad eu exercitation commodo non amet in sint. Amet esse proident consequat elit consequat in laboris ea quis. Duis cillum do dolore sit culpa cillum irure enim tempor qui consectetur magna. Anim cillum esse cillum labore mollit reprehenderit. Sint consequat aliqua in id labore in adipisicing est non sit. Laborum esse voluptate proident excepteur occaecat.\r\n", + "address": "2 Duffield Street", + "city": "Soham", + "state": "Wyoming", + "zip": 36147, + "country": "Moldova", + "email": "harringtonsimpson@scentric.com", + "phone": "(920) 448-3636", + "color": "rgb(166,121,227)" + }, + { + "index": 154, + "name": "Petty Olsen", + "first": "Mcleod", + "last": "Oliver", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/klimmka/73.jpg", + "expanded": false, + "guid": "f4ae116d-6e1a-45dc-a540-636907772467", + "integer": 43, + "date": "Tue May 07 1991 17:32:07 GMT-0700 (PDT)", + "shortText": "proident laborum irure", + "mediumText": "Culpa laborum laboris adipisicing irure commodo.", + "longText": "Culpa incididunt dolore minim laboris eu fugiat occaecat esse cupidatat excepteur exercitation. Est quis Lorem mollit deserunt quis dolore sunt. In laboris ullamco nisi culpa velit deserunt nisi cupidatat irure adipisicing. Veniam in cupidatat irure reprehenderit mollit ut laboris esse consectetur. Ipsum dolore aliquip mollit nulla magna officia. Eiusmod est culpa eiusmod nostrud adipisicing reprehenderit proident adipisicing do velit nisi et ea do. Ut aute officia esse in ad magna voluptate magna tempor mollit labore consequat quis.\r\nUt ut cupidatat et velit magna aliquip nostrud aute nulla deserunt reprehenderit. Ex consequat labore mollit est officia sint esse labore. Consectetur nulla dolor cupidatat ad irure sint anim ea dolor ullamco ex. Amet pariatur ex reprehenderit amet sit minim eu ullamco enim commodo sunt occaecat cillum id.\r\nEnim elit nostrud exercitation qui. Laboris consequat enim cillum quis aliquip officia sint laborum nisi in reprehenderit aute velit. Duis nisi excepteur mollit nisi duis. Aliquip elit laboris anim fugiat minim. Adipisicing minim excepteur sunt ea irure velit qui voluptate commodo.\r\n", + "address": "4 Malta Street", + "city": "Irwin", + "state": "Colorado", + "zip": 85637, + "country": "Costa Rica", + "email": "mcleodoliver@scentric.com", + "phone": "(805) 533-2119", + "color": "rgb(190,184,203)" + }, + { + "index": 155, + "name": "Misty Hardy", + "first": "Barber", + "last": "Boone", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_kalibry/73.jpg", + "expanded": false, + "guid": "9c45bc8a-25cf-4c5b-8b71-30364fcf1924", + "integer": 43, + "date": "Sun Oct 16 1994 17:51:06 GMT-0700 (PDT)", + "shortText": "magna", + "mediumText": "Exercitation nulla aliquip deserunt dolore nisi.", + "longText": "Minim exercitation sint laborum nulla. Amet sunt aliquip veniam pariatur est ex qui proident mollit est. Fugiat do est elit mollit dolore enim labore aliquip tempor consectetur fugiat culpa et labore. Do anim enim incididunt sit excepteur dolore quis commodo ea reprehenderit sit eiusmod. Labore sint deserunt laborum esse deserunt voluptate sint consequat culpa duis proident. Excepteur enim ipsum minim enim enim elit nulla duis dolore reprehenderit amet enim. Sunt ea esse veniam nostrud aliquip Lorem sunt ex exercitation dolor officia ullamco.\r\nConsectetur proident magna sit est enim magna exercitation elit pariatur excepteur laborum id. Mollit nostrud est excepteur consequat aliqua ea irure. Deserunt velit dolore incididunt exercitation.\r\nLabore anim minim dolor excepteur officia est est in magna minim. Laboris pariatur aute elit esse esse ipsum eiusmod sit esse tempor voluptate irure quis adipisicing. Ea Lorem consectetur irure magna tempor ullamco eu esse magna sit Lorem mollit enim tempor. Do qui consequat dolore est sint aliquip ullamco reprehenderit ut et incididunt. Fugiat non est proident aute.\r\nSunt deserunt consequat anim aliqua aliquip minim ullamco in consectetur. Nisi fugiat cillum pariatur duis in magna pariatur eu nisi ea est esse sunt in. Occaecat proident tempor excepteur cillum.\r\nCupidatat laborum ex commodo excepteur deserunt quis nulla amet labore cupidatat. Enim ipsum id laborum duis anim nulla ex dolor eu officia incididunt aute laboris mollit. Dolore laboris do laborum magna amet minim ea eu eiusmod. Deserunt duis laboris nostrud qui.\r\n", + "address": "3 Clark Street", + "city": "Suitland", + "state": "Utah", + "zip": 21043, + "country": "El Salvador", + "email": "barberboone@scentric.com", + "phone": "(828) 457-2049", + "color": "rgb(233,144,205)" + }, + { + "index": 156, + "name": "Tessa Ward", + "first": "Janie", + "last": "Bailey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dhoot_amit/73.jpg", + "expanded": false, + "guid": "fa4f8583-7893-484e-a2fa-3daeb6c18ffc", + "integer": 38, + "date": "Thu Jun 19 1975 01:08:42 GMT-0700 (PDT)", + "shortText": "ex proident", + "mediumText": "Esse cupidatat duis non ullamco dolor aliquip aute tempor voluptate. Dolore cillum voluptate nulla eiusmod sint dolor minim consectetur.", + "longText": "Sunt occaecat officia aliqua nostrud incididunt est nisi laborum. Labore qui do sint dolore nisi qui sunt fugiat dolor Lorem adipisicing voluptate. Aliqua culpa dolor dolore nulla culpa labore duis sint ex.\r\n", + "address": "2 Wilson Street", + "city": "Rowe", + "state": "Idaho", + "zip": 55794, + "country": "Oman", + "email": "janiebailey@scentric.com", + "phone": "(949) 462-3512", + "color": "rgb(159,233,70)" + }, + { + "index": 157, + "name": "Wilda Booker", + "first": "Ramsey", + "last": "Kemp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/actionsmile/73.jpg", + "expanded": false, + "guid": "53cfead6-8964-4112-84a9-ab158fff3aef", + "integer": 66, + "date": "Sun Jun 03 2007 03:34:39 GMT-0700 (PDT)", + "shortText": "ex id", + "mediumText": "Esse veniam laborum enim exercitation nisi ut duis elit incididunt consequat. Amet anim non proident commodo. Voluptate ex irure ex occaecat veniam velit.", + "longText": "Nisi aliqua id ad et sunt esse ad sunt. Quis irure velit anim aute consequat dolore eu sunt est proident commodo magna irure. Minim ullamco ex duis sint nisi nulla occaecat quis. Dolor dolore est anim aute qui fugiat in veniam incididunt Lorem ad sint qui sit.\r\nOfficia est ullamco laborum duis eu reprehenderit do excepteur Lorem pariatur sit consectetur excepteur deserunt. Sit magna laborum nulla exercitation et ex laboris est incididunt minim. Ipsum cupidatat sint minim do commodo minim ea laboris ea occaecat ut exercitation qui anim. Reprehenderit voluptate sit voluptate occaecat commodo. Adipisicing nisi ipsum eiusmod exercitation non. Nostrud ad incididunt laboris fugiat veniam esse ex laboris enim.\r\nElit fugiat minim nostrud in proident ex nisi ea eiusmod sint adipisicing anim reprehenderit culpa. Exercitation anim do id ad. Nulla esse aliquip sint qui occaecat excepteur irure incididunt dolor. Aliquip commodo veniam laborum enim quis enim dolor laboris excepteur. Laborum consequat tempor reprehenderit elit velit magna pariatur officia nostrud tempor quis elit laboris pariatur. Id consequat reprehenderit in dolor aliquip enim officia occaecat et labore labore.\r\n", + "address": "2 Denton Place", + "city": "Hartsville/Hartley", + "state": "Arkansas", + "zip": 66806, + "country": "Belgium", + "email": "ramseykemp@scentric.com", + "phone": "(856) 582-2727", + "color": "rgb(83,54,244)" + }, + { + "index": 158, + "name": "Owens Bowman", + "first": "Tyson", + "last": "Bowers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/craftified/73.jpg", + "expanded": false, + "guid": "77abfb3a-ed05-4caf-bf96-82e827a650f0", + "integer": 14, + "date": "Wed Mar 28 1990 07:53:40 GMT-0800 (PST)", + "shortText": "qui ullamco pariatur incididunt", + "mediumText": "Laborum pariatur sit pariatur veniam aliqua sint exercitation esse.", + "longText": "Occaecat nostrud sint nisi reprehenderit. Irure est enim esse irure dolor eu pariatur aute ea dolor id nulla. Adipisicing culpa elit adipisicing velit elit cillum sint nisi et deserunt eu.\r\nAd anim fugiat amet commodo do anim ea adipisicing irure ad aliquip cupidatat deserunt. Nulla consequat ut sit consectetur ea non ut aliqua. Nulla nisi sit anim incididunt cillum laborum. Quis deserunt velit ullamco esse non do eu aliquip aliqua consequat quis. Occaecat in in et occaecat proident commodo aliqua mollit magna elit mollit adipisicing elit aute. Consectetur culpa exercitation cillum aliqua cillum proident pariatur enim ut ea amet. Voluptate adipisicing enim esse laborum elit duis consequat labore sunt officia adipisicing adipisicing.\r\nEt magna commodo aute duis ipsum et exercitation eiusmod quis do ipsum. Tempor adipisicing incididunt deserunt eu adipisicing id anim Lorem est. Elit proident esse sunt tempor eiusmod dolor Lorem irure mollit. Qui sit proident duis quis magna qui. Tempor id velit fugiat elit duis nostrud velit id amet velit minim deserunt laboris aute.\r\nAliqua voluptate minim elit consectetur laborum ex proident. Commodo minim tempor veniam duis veniam irure sint do aliqua ut reprehenderit velit ut sunt. Ea nostrud irure Lorem est officia ea esse ad. Ipsum fugiat voluptate irure consequat veniam quis commodo fugiat.\r\nPariatur commodo ex anim nostrud consectetur tempor. Ipsum minim Lorem nostrud elit voluptate ullamco eu labore ipsum Lorem. Excepteur magna ea tempor deserunt eu aliquip pariatur excepteur. Minim fugiat proident quis incididunt laboris. Est nisi esse consectetur pariatur.\r\n", + "address": "4 Canda Avenue", + "city": "Crayne", + "state": "Delaware", + "zip": 12406, + "country": "Kyrgyzstan", + "email": "tysonbowers@scentric.com", + "phone": "(951) 408-3515", + "color": "rgb(163,140,145)" + }, + { + "index": 159, + "name": "Violet Salazar", + "first": "Roy", + "last": "Rosa", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aleksitappura/73.jpg", + "expanded": false, + "guid": "dd706aa0-2c9a-4b30-8ada-4c21111ff80c", + "integer": 60, + "date": "Wed Jun 24 1998 10:59:00 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Amet aute amet occaecat enim cupidatat excepteur mollit et aute fugiat. In labore Lorem elit mollit aliquip est adipisicing excepteur ullamco. Velit reprehenderit magna et minim exercitation duis laborum ut consectetur minim. Enim duis adipisicing nostrud ea esse occaecat reprehenderit anim Lorem exercitation anim consequat sint non. Nisi duis occaecat excepteur consequat ullamco et nostrud laboris fugiat elit pariatur sit consequat mollit.", + "longText": "Est veniam irure excepteur aliquip excepteur aliqua fugiat. Labore aliquip anim fugiat est mollit dolor aute incididunt duis. Quis exercitation eiusmod laboris ullamco velit dolor deserunt cillum eiusmod ea. Excepteur velit ullamco reprehenderit fugiat laborum quis velit.\r\nCupidatat adipisicing irure cillum esse non ullamco incididunt amet adipisicing nisi. Consequat enim excepteur voluptate magna laborum incididunt in do incididunt duis. Minim qui Lorem velit incididunt cillum sunt quis aute nulla dolore pariatur labore ipsum. Amet in non amet et cillum duis exercitation aliqua et. Velit et voluptate excepteur amet anim deserunt mollit eu. Lorem commodo proident labore elit mollit cillum ad et et quis. Magna sint ut proident nisi duis.\r\nVoluptate ad dolor incididunt ex esse enim deserunt incididunt commodo esse irure laboris labore. Occaecat ad deserunt do et. Fugiat do sint nulla incididunt elit nulla est nulla et fugiat nulla nostrud in. Consectetur aute et nulla excepteur tempor do ut Lorem. Consequat magna qui adipisicing eiusmod irure amet laboris ea Lorem eu ut deserunt consectetur do.\r\nConsequat sunt incididunt sit voluptate proident minim anim. Aute est adipisicing occaecat officia cupidatat Lorem labore officia nulla culpa non elit ipsum. Commodo amet amet id enim cupidatat amet. Anim minim duis deserunt veniam sit sint sint ullamco magna.\r\n", + "address": "3 Royce Street", + "city": "Leroy", + "state": "Federated States Of Micronesia", + "zip": 13161, + "country": "Swaziland", + "email": "royrosa@scentric.com", + "phone": "(805) 581-2201", + "color": "rgb(150,213,255)" + }, + { + "index": 160, + "name": "Laurel Harvey", + "first": "Yvonne", + "last": "Foster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicollerich/73.jpg", + "expanded": false, + "guid": "1fb04afe-2620-4b3d-bf7d-c0ae6504d91a", + "integer": 27, + "date": "Sun May 20 1973 10:47:10 GMT-0700 (PDT)", + "shortText": "sit officia", + "mediumText": "Lorem laboris sit dolore nulla est enim eu eu. Enim fugiat officia elit cillum fugiat nostrud nostrud aute non aliquip laborum culpa amet fugiat. Elit esse laboris aliquip labore reprehenderit elit fugiat nostrud duis aliquip consequat.", + "longText": "Commodo elit amet sit irure id. Deserunt laboris commodo aute incididunt nisi esse occaecat irure non magna. Irure nisi nisi irure consequat dolore fugiat dolor reprehenderit veniam qui cupidatat ipsum. Cillum sint in ut quis ullamco eu ut laborum exercitation reprehenderit culpa. Consectetur dolor duis exercitation irure et eiusmod.\r\n", + "address": "3 Matthews Court", + "city": "Chesterfield", + "state": "Guam", + "zip": 42757, + "country": "Slovenia", + "email": "yvonnefoster@scentric.com", + "phone": "(981) 600-2987", + "color": "rgb(131,169,121)" + }, + { + "index": 161, + "name": "Mills Cruz", + "first": "Lydia", + "last": "Trevino", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrmartineau/73.jpg", + "expanded": false, + "guid": "cd0f0296-ec14-4221-a846-ca3bf425bbbc", + "integer": 86, + "date": "Sun Feb 10 2002 20:01:40 GMT-0800 (PST)", + "shortText": "est dolore pariatur", + "mediumText": "Duis non quis tempor enim non sunt mollit esse. Irure ipsum ea elit commodo aute dolore ad sint reprehenderit. Velit aute ad commodo sint nisi ipsum. Sunt ex nostrud laboris anim amet tempor exercitation laboris in commodo non excepteur. Ea duis cupidatat eu enim est veniam.", + "longText": "Amet anim eu fugiat amet. Non cillum veniam consectetur nulla proident eu minim enim irure et. Proident exercitation est laboris ullamco anim. Commodo consectetur nostrud labore irure.\r\nDolore sunt id mollit aliquip. Nulla ullamco sint eu et reprehenderit nulla nostrud officia sint. Culpa consequat qui nulla dolore aliquip ipsum aliqua occaecat. Et ea ad magna ipsum magna tempor. Aliquip laborum proident cillum ut aliquip irure minim ut ad nostrud aliquip. Id veniam duis aliqua fugiat aliquip amet tempor ut deserunt proident eu pariatur anim pariatur.\r\n", + "address": "3 Rutherford Place", + "city": "Jeff", + "state": "Pennsylvania", + "zip": 59522, + "country": "Mali", + "email": "lydiatrevino@scentric.com", + "phone": "(958) 545-3599", + "color": "rgb(58,191,253)" + }, + { + "index": 162, + "name": "Craft Gould", + "first": "Simon", + "last": "Durham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kuldarkalvik/73.jpg", + "expanded": false, + "guid": "fddbf917-d75d-4698-8f07-cad884331664", + "integer": 58, + "date": "Sat Apr 02 1983 08:39:43 GMT-0800 (PST)", + "shortText": "excepteur", + "mediumText": "Magna tempor do quis est pariatur culpa aliqua tempor ipsum. Laborum velit irure qui nostrud aute non amet est consectetur esse deserunt ad elit. Eiusmod velit proident culpa labore anim velit ex.", + "longText": "Ad tempor excepteur id incididunt. Elit culpa dolor ullamco exercitation non minim proident ex ipsum. Dolore veniam sit non Lorem aute ipsum enim deserunt nostrud est labore. Amet minim ut magna pariatur. Velit qui ipsum irure excepteur eiusmod sint. Irure sit dolor deserunt do proident ex aliquip anim enim. Ipsum nulla sunt ex magna sunt et enim exercitation.\r\n", + "address": "4 Love Lane", + "city": "Weedville", + "state": "New Hampshire", + "zip": 37752, + "country": "Cyprus", + "email": "simondurham@scentric.com", + "phone": "(934) 533-3438", + "color": "rgb(168,60,232)" + }, + { + "index": 163, + "name": "Michelle Thomas", + "first": "Gretchen", + "last": "Carson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erickmazer/73.jpg", + "expanded": false, + "guid": "f7385e18-ca3a-4a01-b518-4de10115efad", + "integer": 17, + "date": "Sun Mar 23 1980 04:08:07 GMT-0800 (PST)", + "shortText": "eiusmod officia ex", + "mediumText": "Officia ipsum in tempor amet fugiat sunt ex id ullamco anim pariatur. Sint eu ad consequat tempor mollit dolor est minim duis. Nulla esse amet dolore veniam exercitation aute velit laboris aute ex velit nostrud officia. Enim Lorem elit laboris culpa ut minim ut veniam enim aliqua dolor quis sunt consectetur.", + "longText": "Id esse dolor laborum magna reprehenderit ut culpa enim. Sit dolore aute culpa nisi. Nulla qui quis culpa nostrud duis sint proident mollit velit pariatur.\r\nIrure commodo consequat anim in sunt. Commodo nisi fugiat ullamco sunt excepteur cillum reprehenderit veniam dolor cillum proident exercitation pariatur. Adipisicing consectetur aliquip veniam nostrud ex qui duis amet non quis elit. Ad non consectetur pariatur occaecat occaecat tempor magna.\r\nCillum enim proident dolore dolore eiusmod consectetur consectetur eiusmod in dolor. Deserunt exercitation incididunt esse non excepteur laborum elit tempor deserunt et officia. Ut magna mollit occaecat anim irure nulla aliqua consequat minim. Officia qui mollit veniam do cillum non non. Enim fugiat nostrud fugiat velit exercitation ea. Sunt eu officia non laborum anim occaecat qui tempor eu consectetur ad ipsum dolor.\r\n", + "address": "2 Irwin Street", + "city": "Brandywine", + "state": "North Dakota", + "zip": 74057, + "country": "Georgia", + "email": "gretchencarson@scentric.com", + "phone": "(963) 572-3829", + "color": "rgb(206,131,97)" + }, + { + "index": 164, + "name": "Fowler Kirby", + "first": "Christi", + "last": "Rivas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guischmitt/73.jpg", + "expanded": false, + "guid": "1a236923-53b2-47df-88a0-9304e14dcc9c", + "integer": 4, + "date": "Tue Jul 06 1971 07:33:44 GMT-0700 (PDT)", + "shortText": "ut sunt incididunt ea", + "mediumText": "Enim ea excepteur nostrud id commodo do pariatur ipsum dolore excepteur incididunt. Id commodo id fugiat commodo incididunt sint laboris proident quis reprehenderit. Fugiat labore magna do in consequat cillum commodo sint laborum. Ex cillum sint dolor eiusmod dolore in voluptate voluptate ut reprehenderit.", + "longText": "Excepteur elit ad esse incididunt nulla in duis. Ut Lorem labore nulla aute ipsum occaecat esse voluptate enim in sit officia magna. Qui aliquip excepteur laborum esse nostrud et deserunt consectetur reprehenderit aliquip enim nulla. Eiusmod magna consequat sit officia aliquip laboris laborum aliquip non irure.\r\nIncididunt dolor officia exercitation sit sit tempor enim proident qui anim reprehenderit amet aliqua anim. Amet consectetur laboris occaecat labore aliquip veniam sunt do esse nostrud fugiat ex quis. Ex irure tempor laboris eiusmod qui id pariatur dolor tempor cillum et aute culpa aliqua.\r\n", + "address": "2 Clara Street", + "city": "Bladensburg", + "state": "Northern Mariana Islands", + "zip": 47563, + "country": "Djibouti", + "email": "christirivas@scentric.com", + "phone": "(934) 580-3784", + "color": "rgb(163,213,79)" + }, + { + "index": 165, + "name": "Coleen Alford", + "first": "Bobbie", + "last": "Wells", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mariosmaselli/73.jpg", + "expanded": false, + "guid": "a38427b2-d0ac-4dae-aae3-2c4504338bf7", + "integer": 72, + "date": "Fri Aug 23 1985 16:39:58 GMT-0700 (PDT)", + "shortText": "sit labore cupidatat nulla", + "mediumText": "Magna ullamco in nulla officia dolor in mollit labore proident nulla do officia dolor.", + "longText": "Enim mollit proident magna adipisicing laborum duis magna officia exercitation incididunt mollit. Id Lorem in nostrud sit ut est culpa. Nulla mollit cillum reprehenderit fugiat ipsum occaecat occaecat qui nostrud.\r\nExcepteur consectetur eu aliqua aliqua esse cupidatat do excepteur quis culpa officia culpa aute cupidatat. Lorem id officia irure cillum cupidatat duis duis enim officia duis nisi anim. Elit ipsum nulla aliqua magna dolore eiusmod veniam est laborum. Veniam laboris deserunt duis voluptate. Laborum est eu ullamco exercitation non commodo minim minim nostrud irure deserunt deserunt cupidatat.\r\n", + "address": "4 Lyme Avenue", + "city": "Orick", + "state": "South Dakota", + "zip": 76909, + "country": "Tokelau", + "email": "bobbiewells@scentric.com", + "phone": "(968) 545-3385", + "color": "rgb(144,250,135)" + }, + { + "index": 166, + "name": "Victoria Hull", + "first": "Velasquez", + "last": "Buck", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_ahmadyunus/73.jpg", + "expanded": false, + "guid": "f0102b51-dc32-496c-984f-1df5f9e71231", + "integer": 19, + "date": "Fri Jul 04 2003 19:23:27 GMT-0700 (PDT)", + "shortText": "occaecat reprehenderit nostrud cupidatat ullamco", + "mediumText": "Aute proident minim amet amet.", + "longText": "Dolor deserunt nulla ex occaecat. Pariatur consequat culpa ex nostrud. Pariatur laborum voluptate tempor do qui aliqua esse aliquip nisi aliquip aute. Deserunt sit ex cupidatat mollit mollit ipsum eiusmod.\r\nAliquip do ullamco pariatur elit. Qui aliqua pariatur excepteur minim aute anim consequat ipsum esse pariatur laboris eu dolore ea. Adipisicing velit cillum est deserunt ea magna laboris irure. Pariatur reprehenderit cupidatat aliqua laborum excepteur sunt eiusmod nulla. Consequat ex Lorem consequat eu laboris est cupidatat.\r\nCupidatat ea reprehenderit sint minim ipsum anim culpa Lorem enim elit proident quis cupidatat cillum. Elit est et cupidatat irure labore minim est. Dolor veniam consectetur commodo id in anim. Fugiat et qui ex aliquip magna fugiat excepteur id. Qui mollit non veniam excepteur. Lorem adipisicing anim ullamco excepteur officia proident ea.\r\n", + "address": "4 Vermont Street", + "city": "Klondike", + "state": "Alaska", + "zip": 29219, + "country": "San Marino", + "email": "velasquezbuck@scentric.com", + "phone": "(872) 448-3197", + "color": "rgb(113,227,172)" + }, + { + "index": 167, + "name": "Kimberly Allen", + "first": "Valencia", + "last": "Duran", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anggit_pradito/73.jpg", + "expanded": false, + "guid": "8bfa6dca-8fd4-4050-b184-2e523d1bdc9e", + "integer": 59, + "date": "Thu Nov 29 2012 14:27:53 GMT-0800 (PST)", + "shortText": "non adipisicing aliqua aliquip", + "mediumText": "Dolor dolor ea sit id elit aute dolore. Commodo amet ut fugiat tempor in aliquip.", + "longText": "Sunt fugiat duis nulla laborum excepteur. Cupidatat consequat consectetur Lorem elit velit mollit cillum dolore duis culpa. Commodo elit adipisicing ut tempor proident reprehenderit. Excepteur laboris occaecat labore dolor enim in. Elit et sunt minim deserunt ex adipisicing sit Lorem deserunt sit eu amet dolore eiusmod. Dolor ullamco elit sint quis ex sunt consequat id est mollit aliqua cupidatat magna dolore. Adipisicing laborum cupidatat id deserunt eu velit Lorem aliquip aliquip amet minim culpa nulla ex.\r\nLaboris ipsum Lorem tempor labore anim fugiat quis velit. Sint sunt incididunt anim cupidatat eiusmod ea aute exercitation tempor Lorem. Nulla amet eu voluptate eu in ut veniam dolor elit ullamco. Labore elit eu id tempor esse. Incididunt cupidatat cillum do non amet ullamco cillum nulla Lorem. Mollit fugiat ea et sit veniam nulla qui duis laboris non magna irure consectetur dolor. Id eu officia mollit est dolore voluptate anim ex.\r\nIrure ipsum commodo reprehenderit labore et nulla. Sunt et nulla id commodo quis laboris ipsum irure elit ad officia. Aute Lorem anim dolore non est occaecat in esse quis duis.\r\n", + "address": "2 Judge Street", + "city": "Bedias", + "state": "Louisiana", + "zip": 39058, + "country": "Vanuatu", + "email": "valenciaduran@scentric.com", + "phone": "(933) 441-3632", + "color": "rgb(160,71,158)" + }, + { + "index": 168, + "name": "Gill Meadows", + "first": "Diann", + "last": "Fox", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/saschamt/73.jpg", + "expanded": false, + "guid": "a9cbf409-9e60-457a-a048-b16302e1615a", + "integer": 88, + "date": "Sat Oct 13 2001 11:08:26 GMT-0700 (PDT)", + "shortText": "quis ea et amet sint", + "mediumText": "Dolor reprehenderit duis nulla ea cupidatat sit cupidatat Lorem fugiat. Cupidatat laborum fugiat eu do incididunt id adipisicing aute laborum minim occaecat. Culpa pariatur culpa dolor anim ullamco sit proident Lorem ex sunt fugiat mollit proident elit. Culpa mollit nulla aute fugiat qui ad ut incididunt veniam dolor officia irure esse.", + "longText": "Occaecat do proident enim et. Dolore minim mollit eiusmod exercitation exercitation eu laborum laboris laborum ipsum eiusmod. Reprehenderit pariatur sint dolor consequat.\r\nElit consectetur enim aute sit culpa. Nostrud irure do et voluptate nostrud. Officia et magna occaecat nisi excepteur sit veniam ipsum ipsum eiusmod culpa. Id sunt excepteur culpa et. Eu sunt aute aliquip excepteur labore incididunt laborum cupidatat. Eu deserunt occaecat culpa Lorem aliquip excepteur cillum et esse est.\r\nAdipisicing non est voluptate anim proident tempor. Pariatur est eiusmod magna id consectetur consectetur nostrud in est id exercitation commodo minim nostrud. Aute esse veniam tempor sint sunt. Ut elit exercitation laborum voluptate voluptate. Id eu proident nostrud laborum exercitation elit commodo non aliquip quis irure.\r\nAnim quis eu sit qui esse deserunt ut. Officia voluptate deserunt cupidatat sint nostrud anim. Ipsum ut eiusmod ullamco irure exercitation aliqua incididunt in nostrud. Eu fugiat nulla esse deserunt et laboris consequat. Ipsum occaecat quis irure exercitation magna duis elit reprehenderit ad sunt cillum est do. Id qui ipsum dolor laboris commodo voluptate exercitation commodo. Laborum veniam culpa minim culpa eiusmod nulla est commodo dolor minim irure minim cupidatat.\r\nEx eu duis sit velit. Laborum excepteur nisi voluptate sunt adipisicing irure pariatur incididunt ullamco proident ea labore. Culpa velit occaecat ea pariatur esse amet proident nostrud cillum velit qui elit ullamco commodo. Pariatur ad qui ad in qui in est laborum enim incididunt qui. Commodo excepteur commodo veniam est Lorem veniam velit quis veniam incididunt laborum esse in proident. Id aliquip aliquip exercitation labore dolore in laboris nostrud enim.\r\n", + "address": "3 Poplar Avenue", + "city": "Day", + "state": "Missouri", + "zip": 72123, + "country": "Somalia", + "email": "diannfox@scentric.com", + "phone": "(862) 462-3513", + "color": "rgb(115,148,158)" + }, + { + "index": 169, + "name": "Peggy Sandoval", + "first": "Kathleen", + "last": "Ryan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anasnakawa/73.jpg", + "expanded": false, + "guid": "5c6b1295-b453-4328-a4f4-e137d434c520", + "integer": 52, + "date": "Sat Feb 04 1978 00:31:29 GMT-0800 (PST)", + "shortText": "esse laborum duis fugiat dolore", + "mediumText": "Reprehenderit quis ut incididunt laborum sint non culpa tempor. Sint irure voluptate consectetur irure amet.", + "longText": "Ipsum mollit nostrud tempor amet nostrud aliqua ea eiusmod. Consequat exercitation consectetur mollit qui reprehenderit. Incididunt irure deserunt deserunt eu ullamco non proident et velit. Adipisicing ea ad dolore aliquip sint qui ut. Eiusmod laboris cupidatat dolore aliquip ullamco cillum exercitation.\r\nEsse non fugiat ex culpa. Veniam aliquip amet elit qui culpa commodo duis. Ad officia culpa ut adipisicing aliqua adipisicing consequat non mollit. Quis exercitation aute exercitation esse duis do. Velit consectetur ipsum magna incididunt proident fugiat laborum aliqua irure occaecat sit. Excepteur aliquip qui est nostrud deserunt velit ullamco aute ipsum enim mollit deserunt. Consectetur velit velit Lorem exercitation laboris irure mollit sunt voluptate ex cupidatat non occaecat culpa.\r\nConsequat occaecat magna aliqua reprehenderit velit excepteur incididunt. Incididunt est ea ea proident consectetur excepteur non minim minim pariatur adipisicing deserunt ipsum. Reprehenderit amet non quis esse reprehenderit. Enim et elit Lorem id sit in culpa eiusmod aliquip ipsum.\r\nSunt sit aliquip ullamco laborum voluptate officia laborum nisi commodo deserunt sint. Sit nostrud sit eu nisi dolor sit voluptate duis exercitation. Eiusmod mollit nulla labore ea labore et labore tempor ad magna in sunt.\r\n", + "address": "2 Lake Avenue", + "city": "Hamilton", + "state": "Kentucky", + "zip": 57827, + "country": "Maldives", + "email": "kathleenryan@scentric.com", + "phone": "(868) 529-3500", + "color": "rgb(213,148,139)" + }, + { + "index": 170, + "name": "Julia Palmer", + "first": "Harrell", + "last": "Galloway", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/just_watt/73.jpg", + "expanded": false, + "guid": "8de12a66-7b83-4add-91a8-87d6b817555b", + "integer": 3, + "date": "Sat Oct 15 1994 03:18:04 GMT-0700 (PDT)", + "shortText": "elit occaecat", + "mediumText": "Veniam sunt elit id ad amet ut. Quis in reprehenderit qui amet mollit exercitation sint esse anim. Reprehenderit anim ex sint adipisicing dolor dolore quis.", + "longText": "Exercitation consequat incididunt amet ad nisi anim ipsum aliqua velit do excepteur laborum eiusmod veniam. Mollit do est adipisicing ipsum Lorem elit consequat sunt aliquip aliquip nisi enim incididunt. Reprehenderit adipisicing ea in aliquip consectetur non nostrud aliquip irure aliqua irure irure. Ad officia adipisicing nisi laboris non esse officia cillum voluptate proident magna minim ad voluptate. Eu aute dolore sit elit proident est id in. Esse eiusmod reprehenderit consequat labore proident incididunt est ut.\r\nOfficia non voluptate non quis fugiat deserunt consequat ullamco dolor et enim eu. Ullamco eu reprehenderit tempor Lorem aliqua amet duis ullamco laborum. Exercitation ad aliqua tempor cillum excepteur adipisicing Lorem velit.\r\nMinim ipsum proident labore esse duis adipisicing eu cillum nostrud tempor. Esse commodo enim officia amet dolore esse. Incididunt tempor labore sit culpa aliqua est ut do anim.\r\nVoluptate in sint eu sint culpa do aliqua incididunt ullamco consequat duis. Est esse dolore excepteur aute Lorem consequat enim nulla in nisi ex proident dolore. Ad velit eiusmod esse do minim commodo duis occaecat aute eiusmod adipisicing qui non nostrud.\r\nDolor do sit culpa amet irure occaecat nisi aliquip est ad. Dolor ullamco officia anim amet occaecat elit minim. Anim exercitation elit ipsum magna sit ut sunt aliqua. Do quis occaecat culpa mollit aute qui. Irure officia dolor cillum veniam esse. Exercitation sint fugiat sint sint in aliquip commodo magna mollit minim irure deserunt.\r\n", + "address": "2 Guider Avenue", + "city": "Tonopah", + "state": "American Samoa", + "zip": 59756, + "country": "Israel", + "email": "harrellgalloway@scentric.com", + "phone": "(824) 588-3680", + "color": "rgb(122,79,220)" + }, + { + "index": 171, + "name": "Luann Gates", + "first": "Gwendolyn", + "last": "Weaver", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/caiifr/73.jpg", + "expanded": false, + "guid": "f87dd269-a351-4ca6-864e-d1262763c0ed", + "integer": 35, + "date": "Wed Feb 26 1992 22:47:04 GMT-0800 (PST)", + "shortText": "nulla esse do consequat", + "mediumText": "Veniam cupidatat ut tempor amet. Cillum amet irure aliquip non.", + "longText": "Incididunt amet adipisicing eiusmod ipsum sit et aute voluptate veniam nostrud. Ea ex ullamco sint minim. Proident minim quis aute nulla minim nisi sunt. Incididunt sit irure duis exercitation anim deserunt sunt Lorem ex enim incididunt. Non et sint amet minim culpa fugiat ut esse. Dolor do commodo minim incididunt laborum do magna cillum commodo mollit consectetur labore id exercitation.\r\nNon fugiat Lorem enim cillum duis voluptate. Exercitation aliqua irure consequat amet sint occaecat aliqua sunt ea tempor ut reprehenderit. Occaecat pariatur duis adipisicing consequat. Amet sunt qui veniam mollit officia ea magna.\r\nEnim esse amet cillum mollit fugiat laborum Lorem. Consectetur anim labore dolor velit magna magna nisi dolore deserunt ad eu eu ex velit. Pariatur magna esse ipsum veniam ipsum sint tempor magna consectetur dolor eiusmod nulla eiusmod. Eiusmod veniam et ex incididunt ea sunt quis dolor ex. Laborum deserunt elit ullamco quis amet adipisicing magna eiusmod ad nostrud amet culpa sint eiusmod. Id Lorem occaecat in velit ex cupidatat aliquip dolore reprehenderit laboris. Consequat nostrud magna non occaecat ut laboris aliqua amet anim.\r\nNisi veniam id anim minim elit elit veniam. Do id voluptate mollit duis adipisicing mollit officia do enim eu consectetur. Culpa duis ad tempor laborum proident sint commodo aliquip sunt occaecat eu culpa. Eu ullamco exercitation excepteur aute voluptate mollit ex.\r\n", + "address": "2 Claver Place", + "city": "Moraida", + "state": "Minnesota", + "zip": 14017, + "country": "Reunion", + "email": "gwendolynweaver@scentric.com", + "phone": "(926) 595-3032", + "color": "rgb(170,147,167)" + }, + { + "index": 172, + "name": "Tyler Gardner", + "first": "Collins", + "last": "Warner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/briandiazme/73.jpg", + "expanded": false, + "guid": "e9934a5e-c84e-4920-979e-2c6496359125", + "integer": 41, + "date": "Sat Jun 23 1990 16:08:31 GMT-0700 (PDT)", + "shortText": "esse velit commodo", + "mediumText": "Est consequat velit elit exercitation irure laboris commodo do cillum proident commodo. Laborum fugiat aute Lorem reprehenderit exercitation.", + "longText": "Sint enim est amet nulla anim consequat duis nostrud id excepteur ut. Dolor cillum sit do duis nostrud laborum. Id mollit enim id ad nostrud culpa reprehenderit mollit enim exercitation minim fugiat. Eiusmod esse aliqua aute aliquip ullamco aute est in in veniam cillum ipsum aute. Laboris tempor mollit non veniam officia velit ea. Laboris cillum fugiat id consectetur labore proident est. Fugiat mollit ullamco do fugiat nulla incididunt commodo nisi aliqua consectetur voluptate.\r\nIncididunt velit quis mollit laborum esse occaecat id. Aute ut tempor et commodo magna anim consequat reprehenderit tempor proident eu. Et deserunt aliquip est fugiat anim nostrud exercitation Lorem sint labore non nisi. Magna nostrud do culpa aliqua consequat proident in sunt consequat qui Lorem sunt magna culpa. Id velit in consequat pariatur irure cupidatat ipsum eiusmod Lorem fugiat et.\r\nEiusmod proident amet cupidatat ea et. Veniam minim consectetur dolor officia aliquip exercitation culpa. Sunt et tempor magna laboris sunt aliquip excepteur ea nostrud aliqua. Laboris pariatur commodo tempor in dolor aliqua fugiat elit deserunt tempor esse.\r\n", + "address": "2 Dearborn Court", + "city": "Avoca", + "state": "Hawaii", + "zip": 49354, + "country": "Taiwan", + "email": "collinswarner@scentric.com", + "phone": "(803) 510-3885", + "color": "rgb(192,229,65)" + }, + { + "index": 173, + "name": "Ruthie Mcintyre", + "first": "Rowena", + "last": "Sellers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/productpeopletv/73.jpg", + "expanded": false, + "guid": "e7f9037c-1145-4e46-a079-2b461a550ad8", + "integer": 21, + "date": "Mon Aug 25 2014 19:53:08 GMT-0700 (PDT)", + "shortText": "occaecat velit", + "mediumText": "Lorem ut adipisicing deserunt quis fugiat aute.", + "longText": "Exercitation quis exercitation magna dolor elit cillum sit sint. Officia consequat dolore ex proident exercitation labore qui aliquip. Exercitation adipisicing sit culpa ullamco laborum.\r\nIpsum veniam amet occaecat incididunt officia consectetur ullamco fugiat quis dolor incididunt. Ea deserunt id ipsum labore exercitation enim officia aliquip labore anim eiusmod. In sint dolore cupidatat sint fugiat culpa ipsum veniam sunt sit consequat nisi labore nulla.\r\n", + "address": "3 Varanda Place", + "city": "Drummond", + "state": "Alabama", + "zip": 57942, + "country": "Cuba", + "email": "rowenasellers@scentric.com", + "phone": "(969) 592-2871", + "color": "rgb(181,199,125)" + }, + { + "index": 174, + "name": "Nguyen Stewart", + "first": "Robert", + "last": "Russell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/darioalbini/73.jpg", + "expanded": false, + "guid": "28ef7fb5-18c4-4dd2-927c-3ddc4d9199c4", + "integer": 75, + "date": "Wed Sep 06 1972 12:28:29 GMT-0700 (PDT)", + "shortText": "in minim qui veniam nulla", + "mediumText": "Esse laboris aliquip ex est deserunt ut minim Lorem Lorem non proident minim. Est et ad Lorem laborum laboris nostrud tempor eu magna. Incididunt sint mollit ullamco sint sunt fugiat voluptate ut nostrud.", + "longText": "Irure est cillum duis pariatur et ut. In laborum Lorem velit ad anim voluptate sit amet laboris consectetur officia aliquip. Do ex proident id ullamco velit incididunt in proident ut duis amet sunt voluptate nisi. Et nostrud eiusmod laboris ipsum ad. Officia anim laborum commodo et excepteur quis consectetur et labore amet commodo ea consectetur esse. Laboris ea sit officia pariatur est enim irure consequat non consectetur commodo mollit reprehenderit incididunt.\r\n", + "address": "3 Pierrepont Street", + "city": "Ferney", + "state": "North Carolina", + "zip": 89796, + "country": "Turkey", + "email": "robertrussell@scentric.com", + "phone": "(833) 512-2279", + "color": "rgb(198,215,99)" + }, + { + "index": 175, + "name": "Acosta Herman", + "first": "Becker", + "last": "Le", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_pandajs/73.jpg", + "expanded": false, + "guid": "fc0ce1b2-66dd-4e0a-8a4d-192b563ab3af", + "integer": 17, + "date": "Mon Jul 25 2011 16:50:08 GMT-0700 (PDT)", + "shortText": "veniam officia ipsum ad do", + "mediumText": "Mollit do laborum aliquip elit occaecat qui do. Ullamco mollit velit pariatur amet exercitation.", + "longText": "Excepteur voluptate irure proident enim nulla eiusmod anim enim nisi id et incididunt velit. Id anim excepteur excepteur aliquip elit ex. Voluptate id veniam sunt occaecat consequat ad aliquip sunt aliquip esse aute tempor. Mollit cupidatat reprehenderit et eu excepteur sint amet elit ad veniam nostrud laboris. Voluptate sint amet anim cupidatat velit ut incididunt ex laborum ea. Et minim pariatur laboris nostrud cillum aute Lorem ipsum adipisicing dolore nulla magna. Incididunt incididunt occaecat consequat proident sint sit mollit qui nulla sint.\r\n", + "address": "2 Moore Place", + "city": "Cavalero", + "state": "Connecticut", + "zip": 55194, + "country": "Solomon Islands", + "email": "beckerle@scentric.com", + "phone": "(968) 520-2781", + "color": "rgb(220,63,86)" + }, + { + "index": 176, + "name": "Lucy England", + "first": "Wilma", + "last": "Spencer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wellnext/73.jpg", + "expanded": false, + "guid": "912d4bf7-1356-4736-9560-45d3c9f56f54", + "integer": 99, + "date": "Fri Jun 24 1977 07:55:22 GMT-0700 (PDT)", + "shortText": "qui exercitation reprehenderit", + "mediumText": "Ipsum voluptate ex cupidatat sunt sit fugiat amet quis irure ex. Esse esse deserunt magna non occaecat ullamco aliqua do laboris ad exercitation elit mollit enim. Enim irure commodo enim excepteur officia officia esse tempor fugiat nisi cillum. Reprehenderit nulla sunt exercitation est sunt laboris aliquip excepteur in eu anim.", + "longText": "In et labore id deserunt do non dolor reprehenderit nisi magna veniam veniam eiusmod. Deserunt Lorem non adipisicing non pariatur. Est cillum sint proident sint proident eu aliqua commodo. Pariatur qui laboris eiusmod amet mollit ullamco amet. Voluptate cillum quis aliquip elit ad et nulla sit et mollit irure voluptate. Et in ullamco in adipisicing deserunt. Tempor consectetur exercitation mollit incididunt et sunt minim.\r\n", + "address": "4 Milford Street", + "city": "Wacissa", + "state": "South Carolina", + "zip": 79777, + "country": "Malawi", + "email": "wilmaspencer@scentric.com", + "phone": "(850) 473-3863", + "color": "rgb(73,237,50)" + }, + { + "index": 177, + "name": "Selena Beach", + "first": "Florence", + "last": "Charles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/skylark64/73.jpg", + "expanded": false, + "guid": "ed115112-8db3-4cae-a08d-983100a10c85", + "integer": 88, + "date": "Wed Jun 19 1996 04:58:57 GMT-0700 (PDT)", + "shortText": "quis nulla", + "mediumText": "Duis dolor id et elit nostrud eiusmod labore eiusmod incididunt eu ex enim magna exercitation. Velit do elit pariatur proident.", + "longText": "Eiusmod qui voluptate do commodo exercitation ex proident laborum ullamco. Laboris ad officia dolore duis minim. In proident ullamco et duis qui ullamco exercitation. Exercitation est consectetur minim exercitation commodo sunt officia exercitation laboris. Laborum elit in incididunt quis et pariatur adipisicing.\r\nLorem esse ea sit nostrud adipisicing laborum nostrud tempor commodo adipisicing. Et officia dolore do ex sit in laborum officia occaecat laboris duis irure voluptate. Labore mollit reprehenderit ullamco ut velit voluptate. Amet adipisicing Lorem officia laboris enim nostrud velit non velit culpa et Lorem. Deserunt qui pariatur occaecat sit cillum cupidatat deserunt dolore ut anim labore in ut. Minim velit do dolor deserunt duis. Velit ad aliquip exercitation nulla voluptate dolore exercitation velit laborum.\r\n", + "address": "2 Chester Avenue", + "city": "Faxon", + "state": "Michigan", + "zip": 60214, + "country": "Samoa", + "email": "florencecharles@scentric.com", + "phone": "(854) 538-2605", + "color": "rgb(142,199,175)" + }, + { + "index": 178, + "name": "Leon Reilly", + "first": "Trevino", + "last": "Schneider", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lisekyle/73.jpg", + "expanded": false, + "guid": "f0c018ba-4648-46ab-bd0f-3d92f2370954", + "integer": 92, + "date": "Fri May 13 1983 05:44:49 GMT-0700 (PDT)", + "shortText": "sunt", + "mediumText": "Mollit velit id proident ex pariatur ea.", + "longText": "Enim ex tempor ad esse cupidatat officia aute. Ea duis Lorem culpa voluptate duis deserunt pariatur tempor Lorem aliqua nostrud et Lorem minim. Et consequat adipisicing esse labore. Sunt consequat cupidatat proident magna dolore. Labore irure magna est do sint et labore pariatur laboris tempor sint aute tempor. Quis nulla non qui eiusmod Lorem nulla.\r\nUllamco cillum magna exercitation reprehenderit cupidatat officia nostrud veniam laborum ad adipisicing. Sint laborum sit enim nostrud sint proident consectetur. Culpa reprehenderit ullamco est eiusmod qui non eiusmod elit deserunt nisi exercitation velit occaecat quis. Commodo est qui velit irure eiusmod officia.\r\nDolor Lorem officia qui sint duis nostrud esse qui magna qui. Duis ullamco irure labore ut mollit. Deserunt in laboris proident culpa sit eu.\r\nAnim minim excepteur id reprehenderit laboris adipisicing Lorem non. Aliqua anim anim cillum aliqua excepteur elit ut. Tempor aliqua qui esse nulla fugiat minim proident dolore ea officia culpa reprehenderit ullamco cupidatat.\r\n", + "address": "2 Barbey Street", + "city": "Spelter", + "state": "Maine", + "zip": 33752, + "country": "United Kingdom", + "email": "trevinoschneider@scentric.com", + "phone": "(919) 571-3870", + "color": "rgb(199,207,59)" + }, + { + "index": 179, + "name": "Margie Caldwell", + "first": "Drake", + "last": "Frost", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zumwalt/73.jpg", + "expanded": false, + "guid": "1c2ba2bb-24b8-4fa7-8755-0fd72201985e", + "integer": 26, + "date": "Thu Oct 27 1977 23:39:23 GMT-0700 (PDT)", + "shortText": "aliqua labore id excepteur", + "mediumText": "Sit in irure voluptate ex sint cillum sint duis cillum.", + "longText": "Reprehenderit eiusmod adipisicing officia consectetur ullamco. Aliqua reprehenderit esse do labore mollit mollit non tempor anim anim incididunt. Id reprehenderit amet laborum do.\r\nEa eu nisi do tempor exercitation exercitation aliquip cupidatat ut veniam esse aliqua nostrud ea. Laboris in laborum nostrud proident duis elit fugiat in labore. Cupidatat exercitation culpa elit sit do fugiat. Id eiusmod est ut deserunt tempor quis. Est sint sunt occaecat exercitation aliquip mollit minim aute non esse. Ex officia Lorem qui eu adipisicing occaecat do. Aute cupidatat incididunt velit ut cillum id proident labore id pariatur mollit fugiat.\r\nIncididunt deserunt cillum officia eiusmod enim elit laboris. Labore elit excepteur adipisicing eiusmod consectetur proident exercitation pariatur. Lorem labore excepteur cillum duis ea adipisicing fugiat adipisicing sit cupidatat. Culpa proident proident aute nostrud ad occaecat velit in. Labore non ad cillum adipisicing quis sit. Occaecat minim cupidatat reprehenderit veniam est incididunt sunt ut aliquip adipisicing.\r\nQui sunt exercitation aute sint pariatur. Id do do dolore sunt ad sit velit exercitation proident adipisicing proident ea qui. In quis excepteur incididunt in. Enim adipisicing laborum nulla nisi commodo incididunt non ipsum ex sint aliquip. Elit labore ex ullamco veniam id.\r\n", + "address": "4 Wortman Avenue", + "city": "Cetronia", + "state": "Kansas", + "zip": 73451, + "country": "French Guiana", + "email": "drakefrost@scentric.com", + "phone": "(993) 559-2273", + "color": "rgb(240,117,178)" + }, + { + "index": 180, + "name": "Floyd Whitehead", + "first": "Monique", + "last": "Barron", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_winslet/73.jpg", + "expanded": false, + "guid": "5505bea5-acce-4d67-b22e-850228beae52", + "integer": 30, + "date": "Wed Jul 15 2009 01:03:18 GMT-0700 (PDT)", + "shortText": "id eu", + "mediumText": "Quis et sit amet reprehenderit esse ex velit. Id Lorem ea irure consectetur deserunt excepteur. Consectetur reprehenderit qui eu pariatur proident do adipisicing consectetur nulla amet nulla ea laboris magna. Occaecat ut commodo non esse aliqua est velit amet deserunt sit enim adipisicing in. Mollit aliquip nostrud nisi esse.", + "longText": "In enim consectetur aliqua tempor do sint fugiat officia ea proident esse cillum. Lorem magna ipsum amet aute deserunt. Pariatur aliqua dolor veniam in. Consequat dolore et cillum ea mollit esse dolor. Ipsum aute officia pariatur id do fugiat nisi incididunt mollit labore voluptate deserunt duis.\r\nNulla in sit incididunt nisi ad laborum tempor ipsum irure aliquip aliquip id nostrud officia. Pariatur fugiat consequat excepteur aliqua enim. Sunt minim dolore elit esse nostrud. Laboris eiusmod officia incididunt Lorem ullamco non amet ut in veniam cupidatat. Id nisi cupidatat ea esse exercitation fugiat minim sit ex exercitation.\r\nExercitation non reprehenderit ipsum aliqua quis. Qui labore mollit voluptate aliqua nostrud ex id sit pariatur nostrud veniam in qui. In consequat ullamco commodo deserunt magna Lorem labore ullamco velit deserunt veniam cupidatat elit. Dolor fugiat ea in magna dolor occaecat aliquip cillum id. Ipsum amet veniam dolore incididunt nostrud cupidatat velit velit exercitation cupidatat ad enim do deserunt. Mollit officia sit anim elit. Veniam ipsum nulla culpa occaecat non mollit.\r\nAute ex quis est et laborum dolore duis velit. Dolor laborum Lorem occaecat consectetur eu deserunt cillum ea culpa culpa est enim culpa. Ut veniam do anim consectetur sit id. Officia fugiat ad dolor veniam eu deserunt eiusmod proident enim veniam nulla. Exercitation proident aute esse fugiat veniam cupidatat. Proident non incididunt duis eiusmod officia nulla elit eiusmod adipisicing est.\r\nIn qui aliqua nisi eiusmod proident exercitation ad in sit elit minim amet. Culpa est Lorem Lorem irure exercitation et dolore. Qui sit dolor velit do laborum voluptate excepteur qui nostrud.\r\n", + "address": "4 Pershing Loop", + "city": "Floriston", + "state": "Iowa", + "zip": 14548, + "country": "Latvia", + "email": "moniquebarron@scentric.com", + "phone": "(944) 573-3509", + "color": "rgb(215,200,175)" + }, + { + "index": 181, + "name": "Langley Kidd", + "first": "Lowe", + "last": "Luna", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kikillo/73.jpg", + "expanded": false, + "guid": "5934f42f-1f3e-41a3-8465-8453fbd97653", + "integer": 87, + "date": "Sat Jul 27 2002 15:35:16 GMT-0700 (PDT)", + "shortText": "ex laborum", + "mediumText": "Proident excepteur duis dolor nostrud aute in aliquip excepteur exercitation laboris fugiat consectetur amet.", + "longText": "Elit ea pariatur aliqua minim enim voluptate est voluptate dolore eiusmod mollit dolor voluptate nisi. Qui et ex fugiat irure velit voluptate. Deserunt sunt enim et dolor dolor occaecat magna est aliquip officia tempor minim et. Ex aliquip duis labore nisi amet deserunt et quis non elit consequat et fugiat.\r\nAd est irure veniam aliqua sint ad. Cillum quis ex tempor ex irure proident duis id pariatur ipsum irure. Id ea ad excepteur enim voluptate consectetur id. Non cupidatat do in tempor aute commodo in magna. Non irure minim Lorem sunt ex nulla cillum.\r\nEx commodo proident tempor incididunt velit velit mollit sint excepteur quis adipisicing nostrud laboris irure. Commodo proident nisi enim ipsum nostrud ullamco elit aliquip velit fugiat eiusmod. Ipsum do qui nostrud amet ullamco et adipisicing aliquip voluptate voluptate laborum. Laborum ex aute tempor esse velit ut.\r\nVeniam esse cillum ut cupidatat reprehenderit minim eu elit minim velit aute consequat tempor tempor. Nisi et aute ea elit veniam sit dolore proident minim. Ut tempor aute dolor aliquip. Do consequat tempor nulla tempor labore duis eu commodo aliquip commodo id fugiat tempor enim.\r\n", + "address": "3 Caton Place", + "city": "Stevens", + "state": "Vermont", + "zip": 87533, + "country": "Netherlands Antilles", + "email": "loweluna@scentric.com", + "phone": "(996) 562-3285", + "color": "rgb(206,231,90)" + }, + { + "index": 182, + "name": "Eunice Pace", + "first": "Margaret", + "last": "Mueller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hndragnwn/73.jpg", + "expanded": false, + "guid": "3f9b897f-6674-476f-9dd8-31c86f3401c7", + "integer": 98, + "date": "Mon Jan 19 1970 12:04:31 GMT-0800 (PST)", + "shortText": "exercitation eu ipsum ipsum cillum", + "mediumText": "Ullamco ullamco velit sit et elit et excepteur laboris reprehenderit.", + "longText": "Officia cupidatat consectetur tempor amet. Excepteur aute elit do eiusmod aute voluptate quis est voluptate occaecat ut pariatur. Aliqua incididunt cillum proident aute quis deserunt. Voluptate do magna nulla reprehenderit ea eiusmod minim aliquip do est laboris. Velit consequat ut veniam ut cillum dolore tempor nostrud eu. Non Lorem Lorem non nostrud minim commodo minim qui non. Velit aliqua duis occaecat dolor laborum sint est culpa nulla elit occaecat reprehenderit consectetur culpa.\r\nSunt non id labore Lorem do Lorem enim. Adipisicing deserunt excepteur est ipsum nulla deserunt in. Proident tempor dolore sint ullamco proident velit. Nisi Lorem enim ullamco elit culpa occaecat labore officia consequat enim. Eu consectetur ad anim incididunt sit excepteur exercitation cupidatat enim proident irure sunt non cupidatat. Id aute cupidatat irure pariatur laboris nostrud. Est enim commodo quis anim incididunt nostrud proident occaecat anim.\r\n", + "address": "4 Erasmus Street", + "city": "Watrous", + "state": "Nebraska", + "zip": 91145, + "country": "Colombia", + "email": "margaretmueller@scentric.com", + "phone": "(881) 442-3317", + "color": "rgb(248,53,68)" + }, + { + "index": 183, + "name": "Hess Ross", + "first": "Knowles", + "last": "Drake", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fc987/73.jpg", + "expanded": false, + "guid": "b34d191e-f646-4fd0-8e89-ed523ceb5127", + "integer": 73, + "date": "Tue Jul 11 2006 08:13:58 GMT-0700 (PDT)", + "shortText": "quis reprehenderit amet", + "mediumText": "Id ut laboris aliquip dolor aliqua incididunt cillum dolore qui aliqua. Tempor officia esse aliquip irure cillum ipsum esse ea ea. Aliqua pariatur laboris cillum do ad ea pariatur nostrud amet amet do.", + "longText": "Tempor mollit exercitation sit elit duis magna et veniam nisi ex. Sit amet veniam velit commodo ad proident duis exercitation consequat eiusmod officia pariatur. Tempor occaecat consequat aliquip cupidatat veniam ad qui enim pariatur.\r\nIpsum dolor occaecat in minim sint eu. Non duis anim quis pariatur qui adipisicing sunt laborum sunt cillum exercitation sit. Reprehenderit amet elit labore ad culpa excepteur. Cillum commodo eu dolore dolor ea velit id. Eu Lorem nostrud esse elit aliqua in deserunt elit exercitation sunt sunt aliquip eu amet. Cupidatat incididunt aliquip anim proident magna velit in veniam tempor.\r\nEx non ex irure exercitation sint ad commodo commodo. Exercitation eiusmod qui est labore non velit velit velit voluptate id. Nisi est velit ut do velit quis ipsum voluptate. In consequat esse tempor cillum fugiat ex. Ut est mollit consequat duis esse non magna incididunt eu laboris velit incididunt ullamco. Adipisicing enim sint amet velit do irure. Exercitation labore deserunt pariatur est exercitation veniam laborum ad.\r\n", + "address": "2 Indiana Place", + "city": "Lawrence", + "state": "Florida", + "zip": 64631, + "country": "Wallis and Futuna Islands", + "email": "knowlesdrake@scentric.com", + "phone": "(995) 490-2638", + "color": "rgb(50,148,194)" + }, + { + "index": 184, + "name": "Terri Mayo", + "first": "Rachael", + "last": "Sharp", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lettershoppe/73.jpg", + "expanded": false, + "guid": "c14b363a-8dae-4656-908d-6fe410ad32e5", + "integer": 98, + "date": "Sat Mar 10 1973 06:27:24 GMT-0800 (PST)", + "shortText": "occaecat consequat minim enim aute", + "mediumText": "Officia ex pariatur velit sint officia sunt deserunt nisi. Exercitation sit commodo sit quis dolor esse pariatur.", + "longText": "Eiusmod culpa voluptate eiusmod excepteur pariatur mollit enim irure ad commodo. Irure reprehenderit ea officia eu ullamco occaecat ad exercitation aute reprehenderit est adipisicing adipisicing est. Exercitation pariatur cillum exercitation laborum sint pariatur do mollit ipsum cillum exercitation. Non duis aliquip veniam occaecat fugiat cupidatat Lorem eu.\r\n", + "address": "3 Jamison Lane", + "city": "Hayden", + "state": "New Jersey", + "zip": 21158, + "country": "Bouvet Island", + "email": "rachaelsharp@scentric.com", + "phone": "(920) 458-2923", + "color": "rgb(224,219,109)" + }, + { + "index": 185, + "name": "Lorie Stephenson", + "first": "Vaughan", + "last": "Hardin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akashsharma39/73.jpg", + "expanded": false, + "guid": "3277febc-0447-4b3c-ac7a-f98c0a22432d", + "integer": 43, + "date": "Sat Mar 30 1974 11:23:57 GMT-0700 (PDT)", + "shortText": "qui pariatur voluptate eiusmod elit", + "mediumText": "Tempor mollit fugiat ex quis excepteur.", + "longText": "Elit eiusmod eu irure nostrud labore enim. Incididunt esse aliquip amet in nulla mollit amet nostrud est mollit. Eiusmod cupidatat et esse ea quis sunt ex. Ut duis fugiat laboris eiusmod excepteur. Occaecat do incididunt mollit officia. Enim ea sunt ad amet labore enim esse nulla occaecat eiusmod.\r\n", + "address": "2 Truxton Street", + "city": "Caroleen", + "state": "Wisconsin", + "zip": 98807, + "country": "Niue", + "email": "vaughanhardin@scentric.com", + "phone": "(954) 576-2820", + "color": "rgb(76,217,135)" + }, + { + "index": 186, + "name": "Jacqueline Estes", + "first": "Gale", + "last": "Hutchinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fgin69/73.jpg", + "expanded": false, + "guid": "07994b68-513f-4c9d-a92d-edfc3ade4825", + "integer": 17, + "date": "Sun Jul 16 2000 16:12:37 GMT-0700 (PDT)", + "shortText": "sunt laboris tempor ut do", + "mediumText": "Nulla consequat dolore enim velit excepteur. Qui ipsum elit occaecat ea in. Laborum irure ipsum consectetur ullamco quis consectetur enim. Dolore laboris nisi excepteur nostrud. Aliqua ipsum nostrud velit labore tempor nisi eu.", + "longText": "Adipisicing ipsum exercitation culpa consectetur voluptate aliqua proident fugiat ut laborum ex deserunt. Et ullamco non sint tempor do officia cillum ex quis enim dolor aliqua. Cupidatat id incididunt irure ad quis commodo ut laborum labore. Dolore cillum reprehenderit adipisicing nulla qui in ea cillum enim excepteur quis sit sint non. Duis reprehenderit consequat eu eiusmod id.\r\nQui velit aliquip fugiat reprehenderit eiusmod mollit ex commodo mollit anim occaecat excepteur duis. Eiusmod nisi et in ex laborum. Nulla officia nulla nostrud ullamco proident ut ipsum excepteur. Occaecat et quis est eu aliqua. Labore enim esse ullamco est laborum nulla incididunt fugiat cillum pariatur sit et. Sunt irure duis laborum id ea Lorem sint.\r\nExercitation anim duis ad minim eiusmod eiusmod dolor mollit enim qui laborum ad aliquip magna. Reprehenderit veniam exercitation minim incididunt excepteur exercitation tempor. Pariatur do esse consequat do. Voluptate do pariatur qui aliqua laboris aute consequat eu reprehenderit dolore. Laborum amet in veniam sit. Adipisicing sint labore officia deserunt nulla do cillum aliquip ipsum minim anim.\r\nDolore sit pariatur dolore proident est minim irure do qui laborum laboris. Sunt quis nisi consequat tempor est ullamco amet sunt dolor. Minim voluptate cupidatat eu pariatur aliquip esse minim voluptate commodo esse. Nulla non minim eu sunt nostrud aliquip. Elit ullamco do sunt mollit labore officia quis proident fugiat amet labore. Culpa elit nisi incididunt ipsum anim non. Cupidatat exercitation laboris pariatur reprehenderit culpa.\r\n", + "address": "3 Columbia Street", + "city": "Clayville", + "state": "Washington", + "zip": 55909, + "country": "Sweden", + "email": "galehutchinson@scentric.com", + "phone": "(853) 433-2272", + "color": "rgb(234,208,240)" + }, + { + "index": 187, + "name": "Linda Steele", + "first": "Weber", + "last": "Barlow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pdugan19/73.jpg", + "expanded": false, + "guid": "39847382-b9bd-4f9d-823a-9a8ff0b6a952", + "integer": 57, + "date": "Sun May 24 1992 04:47:58 GMT-0700 (PDT)", + "shortText": "aliqua ut", + "mediumText": "Ea excepteur consequat Lorem aute. Id nisi est ad ipsum enim. Consequat elit do mollit cillum. Ea voluptate tempor laborum sit. Culpa ex officia mollit et in ullamco.", + "longText": "Culpa deserunt velit enim amet excepteur. Labore anim laboris aliquip nisi amet ad. Irure duis cillum exercitation labore do deserunt ullamco nulla ea do mollit. Et ut dolor cillum laboris ex dolor.\r\n", + "address": "2 Bragg Court", + "city": "Rehrersburg", + "state": "Oregon", + "zip": 16492, + "country": "Bolivia", + "email": "weberbarlow@scentric.com", + "phone": "(816) 478-3071", + "color": "rgb(253,113,243)" + }, + { + "index": 188, + "name": "Humphrey Rocha", + "first": "Watson", + "last": "Martin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluehaus/73.jpg", + "expanded": false, + "guid": "bf36a00a-c264-4e8c-b2cf-37b558a6331d", + "integer": 56, + "date": "Wed Feb 18 1981 11:26:50 GMT-0800 (PST)", + "shortText": "ad sint", + "mediumText": "In ea ea aute est aute. Ex fugiat ullamco duis deserunt quis eiusmod non do quis enim officia ea consequat. Lorem cupidatat nisi officia irure veniam consectetur commodo cupidatat et laborum exercitation exercitation veniam proident. Enim minim non velit dolore esse aute ullamco officia cillum ea deserunt magna ut.", + "longText": "Aliqua laborum non officia aute deserunt deserunt voluptate sunt sint do do culpa. Adipisicing anim qui id elit consectetur ad veniam nostrud magna. Culpa dolor culpa irure minim elit occaecat eiusmod.\r\nDo dolore cillum incididunt reprehenderit laboris proident mollit occaecat laborum eu. Tempor aute aliqua aute Lorem velit sunt sint ad ad. Eu minim adipisicing duis nulla nulla et excepteur occaecat. Consectetur aliqua excepteur reprehenderit eu reprehenderit mollit veniam adipisicing ut culpa consectetur enim. Nisi consequat sit fugiat anim ut anim. Culpa et occaecat consectetur reprehenderit. Id sunt mollit labore ipsum eiusmod est adipisicing dolor esse.\r\n", + "address": "3 Main Street", + "city": "Chumuckla", + "state": "Illinois", + "zip": 25127, + "country": "Barbados", + "email": "watsonmartin@scentric.com", + "phone": "(870) 511-2367", + "color": "rgb(180,100,61)" + }, + { + "index": 189, + "name": "Carter Berry", + "first": "Copeland", + "last": "Fernandez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/angeloffonline/73.jpg", + "expanded": false, + "guid": "c95f429b-45ba-4d2e-9fb0-990a65f0f1ed", + "integer": 94, + "date": "Mon Sep 10 1973 19:09:26 GMT-0700 (PDT)", + "shortText": "nostrud elit", + "mediumText": "Sint ullamco ipsum commodo nisi duis exercitation reprehenderit minim id elit ipsum incididunt id minim.", + "longText": "Ea et officia cillum labore consectetur proident fugiat veniam. Adipisicing proident quis nulla duis consectetur culpa deserunt. Aliquip ea non incididunt nisi. Culpa irure adipisicing est aute excepteur sunt laboris minim officia. Minim dolor incididunt deserunt aliqua qui velit laborum. Sint eu sunt ut ea ut cillum tempor excepteur sit voluptate.\r\nLorem nostrud sit dolor dolor consectetur labore anim ad excepteur ipsum eu sunt consequat dolore. Velit irure officia esse mollit voluptate aliquip fugiat enim ipsum minim occaecat. Consectetur tempor irure sint quis irure anim. Nulla esse adipisicing nulla eiusmod dolor eu id dolor ipsum qui nostrud. In excepteur eiusmod ipsum commodo eu labore duis irure adipisicing in deserunt commodo.\r\nExcepteur ullamco ex est occaecat sit Lorem eu. Amet pariatur dolor reprehenderit irure dolor et culpa. Laboris cupidatat est esse veniam qui consectetur eu eu irure. Exercitation eiusmod ipsum ipsum non esse consectetur nostrud enim nostrud eu adipisicing culpa. Lorem aliquip duis tempor proident do aliqua cillum. Esse aliquip fugiat veniam aliquip magna pariatur.\r\n", + "address": "3 Cooke Court", + "city": "Brethren", + "state": "West Virginia", + "zip": 48527, + "country": "Haiti", + "email": "copelandfernandez@scentric.com", + "phone": "(916) 428-2390", + "color": "rgb(225,220,78)" + }, + { + "index": 190, + "name": "Mcgee Price", + "first": "Christian", + "last": "Brown", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/yalozhkin/73.jpg", + "expanded": false, + "guid": "25386af0-7fef-4915-afcb-e29e3996bfc1", + "integer": 99, + "date": "Fri Jun 10 1977 22:37:49 GMT-0700 (PDT)", + "shortText": "velit aliqua qui", + "mediumText": "Proident velit et consequat qui veniam et eiusmod officia sint laborum Lorem sit exercitation. Voluptate dolore qui excepteur eu tempor et irure ea id consectetur. Nostrud ullamco quis nulla laboris labore qui ullamco occaecat veniam. Ut excepteur tempor in non cillum deserunt dolor velit magna excepteur est ullamco. Officia quis adipisicing aliquip Lorem consectetur veniam labore non exercitation.", + "longText": "Anim officia fugiat aliquip deserunt enim culpa commodo. Amet mollit labore tempor adipisicing cupidatat aute sunt incididunt sit duis cupidatat fugiat nisi labore. Eiusmod non sunt commodo laborum ex cillum anim eu mollit. Duis in duis cillum commodo officia qui Lorem duis do exercitation amet occaecat.\r\nNisi culpa magna dolore ut tempor amet commodo. Nisi ut mollit et sint id aliquip Lorem quis ipsum non sunt. Ad adipisicing qui ad nulla cillum id culpa. Occaecat duis magna deserunt dolor adipisicing ex in Lorem dolor occaecat enim laboris cupidatat eiusmod.\r\nDo velit occaecat cupidatat labore ut qui et ipsum pariatur excepteur aliqua sunt ad. Ut eu eu consectetur ut laborum aute culpa. Consequat qui irure ad magna qui exercitation nostrud ex ullamco Lorem consequat. Esse sunt do sunt consectetur tempor.\r\n", + "address": "4 Withers Street", + "city": "Aberdeen", + "state": "Mississippi", + "zip": 14870, + "country": "Heard and McDonald Islands", + "email": "christianbrown@scentric.com", + "phone": "(981) 586-2200", + "color": "rgb(211,68,198)" + }, + { + "index": 191, + "name": "Browning Harrison", + "first": "Wanda", + "last": "Dorsey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/solid_color/73.jpg", + "expanded": false, + "guid": "18e2fdcf-33bc-447e-9d9e-95cd992f3b01", + "integer": 99, + "date": "Fri Apr 12 1996 19:22:55 GMT-0700 (PDT)", + "shortText": "nostrud", + "mediumText": "Minim velit ex mollit officia deserunt mollit.", + "longText": "In enim culpa ea quis occaecat Lorem voluptate voluptate. Ad occaecat dolore cillum exercitation laborum. Amet ex labore in sint dolor Lorem eiusmod elit voluptate magna. Dolore quis dolore ullamco velit. Occaecat incididunt ex laboris nulla sit amet sit. Proident nisi elit exercitation sunt incididunt ipsum ex laboris aliquip elit id fugiat id. Sint nulla irure labore mollit reprehenderit irure cupidatat exercitation.\r\nProident aliqua aliquip irure reprehenderit aliquip et nulla in ea do cillum. Anim esse culpa adipisicing do reprehenderit aliquip elit sunt fugiat velit aliqua excepteur. Irure nulla nulla elit esse qui magna qui adipisicing eu consectetur ea. Sint magna labore esse occaecat ad est. Voluptate ex sit anim ipsum consequat est aliquip quis. Quis eu anim officia reprehenderit dolore veniam labore.\r\nEiusmod quis cillum nisi officia. Consequat laborum amet enim deserunt occaecat cillum. Labore cupidatat eu sit officia ea.\r\nCillum mollit occaecat dolor labore dolore sint laborum irure commodo magna id officia. Ullamco minim reprehenderit nulla ea non commodo. Amet eu fugiat officia quis labore pariatur. Duis anim ad eiusmod magna ad voluptate dolore anim anim exercitation reprehenderit cillum labore. Nulla esse nisi ipsum cillum. Nulla incididunt consequat ut elit aute et Lorem ea enim do sint id proident. Voluptate et magna dolor deserunt sint laborum eu.\r\nAliquip laborum labore exercitation culpa duis sunt magna consequat excepteur. Sunt incididunt ad consectetur ullamco sit esse et fugiat mollit irure adipisicing. Ipsum enim enim sunt est. Ipsum officia incididunt dolore aute elit elit fugiat est commodo esse. Sunt minim et cillum excepteur deserunt. In id mollit quis et occaecat cupidatat irure velit dolor reprehenderit in commodo ad velit. Excepteur est et magna elit fugiat amet cupidatat ea anim.\r\n", + "address": "4 Irving Street", + "city": "Winesburg", + "state": "Rhode Island", + "zip": 33983, + "country": "United States", + "email": "wandadorsey@scentric.com", + "phone": "(857) 473-2997", + "color": "rgb(188,149,116)" + }, + { + "index": 192, + "name": "Beth Clark", + "first": "Stuart", + "last": "Potter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/panghal0/73.jpg", + "expanded": false, + "guid": "885c3d9f-8acb-4fa6-82d0-3b1f8066fa8e", + "integer": 90, + "date": "Fri Sep 25 1998 20:49:56 GMT-0700 (PDT)", + "shortText": "ipsum voluptate qui est", + "mediumText": "Elit proident mollit qui reprehenderit labore minim aliquip ut ea dolore aliquip qui. Commodo sint non minim pariatur veniam.", + "longText": "Aliqua deserunt officia pariatur fugiat dolore magna pariatur exercitation elit esse elit. Ad enim consectetur nisi est amet irure aliqua nulla labore consequat cillum. In cupidatat laborum deserunt aliqua veniam mollit veniam nulla ex.\r\nEiusmod sint nostrud duis ad minim magna sit consequat commodo nostrud do laborum mollit id. Consequat exercitation dolore mollit exercitation aute id. Veniam minim laboris Lorem enim aliqua nulla et. Aliquip dolor officia duis cupidatat enim ad velit ad. Fugiat irure Lorem sunt deserunt consectetur id cillum elit. Nulla officia commodo enim labore sit dolore ipsum ad sint nisi consectetur esse.\r\n", + "address": "4 Dewitt Avenue", + "city": "Somerset", + "state": "Georgia", + "zip": 62165, + "country": "Jamaica", + "email": "stuartpotter@scentric.com", + "phone": "(868) 542-3034", + "color": "rgb(93,172,196)" + }, + { + "index": 193, + "name": "Neal Mcgee", + "first": "Daisy", + "last": "Lucas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/renettarenula/73.jpg", + "expanded": false, + "guid": "a86f246d-1555-4d68-b633-713d56a7357a", + "integer": 66, + "date": "Wed Jan 22 1975 14:12:25 GMT-0800 (PST)", + "shortText": "aliquip quis", + "mediumText": "Pariatur nostrud irure dolor ad et. Commodo tempor mollit nisi consequat officia ex exercitation.", + "longText": "Velit deserunt ipsum Lorem id laboris et laborum in. Aute ea consequat elit magna sit ad voluptate nostrud dolor pariatur labore ipsum mollit consectetur. Fugiat velit ipsum et aute elit. Aliqua Lorem ullamco ad mollit ex. Sint cupidatat esse minim exercitation. Laborum ipsum quis ut commodo proident elit et et. Duis excepteur ut sit duis cupidatat mollit mollit.\r\nVeniam pariatur minim duis esse est mollit exercitation esse enim. Esse aliqua labore velit minim qui cillum excepteur qui occaecat excepteur quis Lorem sint. Culpa sint do commodo pariatur reprehenderit et adipisicing. Dolore Lorem minim in pariatur nulla incididunt magna amet qui. Excepteur velit adipisicing cupidatat aliquip cupidatat consectetur adipisicing consequat fugiat eiusmod consectetur consequat. Ea laborum occaecat voluptate do.\r\nCommodo minim adipisicing cupidatat labore velit. Commodo eu officia sunt ea sit exercitation nisi quis fugiat non Lorem duis. Culpa adipisicing mollit aliqua dolore aute mollit veniam non qui occaecat sunt.\r\n", + "address": "3 Cadman Plaza", + "city": "Kula", + "state": "New Mexico", + "zip": 50567, + "country": "Sao Tome and Principe", + "email": "daisylucas@scentric.com", + "phone": "(922) 417-2649", + "color": "rgb(242,147,241)" + }, + { + "index": 194, + "name": "Wall Vasquez", + "first": "Kara", + "last": "Avery", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kevin_granger/73.jpg", + "expanded": false, + "guid": "4ca5b46e-7470-4364-8a00-55922d238841", + "integer": 2, + "date": "Sun Oct 27 2002 02:24:06 GMT-0800 (PST)", + "shortText": "consequat ut", + "mediumText": "Culpa id occaecat pariatur eu id adipisicing est non adipisicing nisi et nostrud eu voluptate. Reprehenderit sit adipisicing eiusmod ex excepteur occaecat Lorem consectetur. Mollit exercitation ex adipisicing culpa non ullamco aute aliqua laborum anim deserunt id. Est magna do Lorem Lorem Lorem officia ullamco in eiusmod ut.", + "longText": "Nostrud eu elit voluptate consequat nisi. Dolor qui consequat minim ea sit eiusmod duis aliquip ex. Labore aliquip culpa quis velit id fugiat. Veniam exercitation exercitation aliquip magna eiusmod ad cupidatat sint ullamco consequat pariatur est consequat deserunt. Dolore qui nostrud velit labore magna proident enim in aliquip velit. Mollit ullamco sunt ut do do reprehenderit nostrud do.\r\nConsequat eiusmod adipisicing qui exercitation do minim consequat deserunt non elit sint. Elit dolore ullamco nostrud duis fugiat minim mollit Lorem. Occaecat incididunt officia do tempor dolor velit excepteur laborum. Occaecat cillum aliquip cupidatat anim. Laborum nostrud occaecat irure qui. Id tempor nulla enim irure cillum non culpa non ea enim ad tempor.\r\nQui qui laborum aliquip irure ipsum excepteur do tempor est pariatur nisi. Enim tempor et cupidatat tempor pariatur officia excepteur aliqua. Culpa incididunt laborum ea cupidatat culpa reprehenderit occaecat. Qui do dolor officia aliqua fugiat quis est ex irure. Proident dolor proident dolore proident amet duis labore sunt enim.\r\nSit incididunt deserunt veniam et velit. Eu voluptate esse dolor ullamco nisi sint reprehenderit. Excepteur pariatur est eiusmod eiusmod irure nostrud aliqua aliqua anim. Elit nisi aliqua incididunt tempor dolor commodo eiusmod sit sit ea nostrud eiusmod adipisicing ad. Et occaecat non enim proident nostrud voluptate reprehenderit veniam do exercitation pariatur ut quis. Minim labore ea deserunt deserunt eiusmod anim irure aliquip irure qui sit tempor ad.\r\nSunt sint nulla duis cupidatat. Culpa Lorem eu Lorem eu enim veniam voluptate irure nostrud est ullamco proident non. Aliqua tempor adipisicing proident aliquip cillum do esse laboris. Voluptate eu sint pariatur velit nisi dolore.\r\n", + "address": "2 Clinton Avenue", + "city": "Konterra", + "state": "Arizona", + "zip": 98633, + "country": "Belarus", + "email": "karaavery@scentric.com", + "phone": "(870) 572-3252", + "color": "rgb(192,119,159)" + }, + { + "index": 195, + "name": "Booker Mcgowan", + "first": "Olga", + "last": "Tucker", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maxsmeagol/73.jpg", + "expanded": false, + "guid": "06e837ae-b847-48ce-8b91-832435eb8867", + "integer": 72, + "date": "Sat May 02 2009 00:56:50 GMT-0700 (PDT)", + "shortText": "anim commodo exercitation", + "mediumText": "Elit id enim esse ad Lorem irure laboris in laborum dolore aliquip.", + "longText": "Deserunt eu aute cillum excepteur dolore do do enim fugiat veniam ad. Dolore dolor eu aliquip et. Culpa excepteur aliqua excepteur nisi id eiusmod Lorem eiusmod duis est proident dolor occaecat anim. Aliqua laboris in incididunt sint labore. Incididunt eiusmod quis nostrud occaecat fugiat do cupidatat eu ex reprehenderit nostrud ea proident. Ad reprehenderit consequat laborum eu elit qui occaecat. Quis non magna duis minim amet consequat sunt.\r\nEa consequat do ex qui laboris amet mollit amet nulla. Veniam in sit nisi ad pariatur nulla cillum et ea ad eiusmod. Tempor aliqua eu amet esse dolore nisi pariatur cillum in.\r\nLaborum in ipsum dolor fugiat. Nostrud consectetur nostrud proident aliqua veniam et esse. Occaecat culpa et adipisicing magna ea sint sit fugiat consectetur.\r\nUllamco amet pariatur ipsum duis incididunt laborum ad commodo. Voluptate laborum ea culpa esse nulla dolor reprehenderit duis ut laboris ullamco minim adipisicing aute. Commodo id ad dolor nulla non aliquip eiusmod sint tempor cillum enim.\r\n", + "address": "4 Monroe Place", + "city": "Waterloo", + "state": "Texas", + "zip": 94273, + "country": "Russian Federation", + "email": "olgatucker@scentric.com", + "phone": "(902) 400-3059", + "color": "rgb(136,215,127)" + }, + { + "index": 196, + "name": "Blankenship Henson", + "first": "Staci", + "last": "King", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jvhleb/73.jpg", + "expanded": false, + "guid": "c0bdad68-d176-4514-8d66-d4ae0ae03bdf", + "integer": 41, + "date": "Wed Jan 10 1990 09:56:54 GMT-0800 (PST)", + "shortText": "elit velit exercitation deserunt", + "mediumText": "Labore exercitation excepteur non incididunt. Et reprehenderit anim exercitation ipsum id eu eu irure magna et adipisicing occaecat quis.", + "longText": "Officia nulla cillum duis nostrud labore mollit eiusmod labore ut aliqua elit incididunt. Minim exercitation consequat non eiusmod sint magna voluptate incididunt ex consectetur labore sunt nulla anim. Commodo ipsum aute ipsum mollit veniam reprehenderit reprehenderit irure amet. Nisi voluptate esse consectetur cillum. In eu in duis culpa deserunt ea tempor elit. Nisi tempor fugiat pariatur irure.\r\nQuis ex sunt cupidatat anim aliqua aliquip tempor minim incididunt fugiat officia. Et sunt eiusmod eu culpa incididunt aute culpa. Excepteur Lorem ipsum dolore labore amet occaecat elit fugiat. Eiusmod velit aute occaecat sunt qui ad irure in do id consequat sunt amet cupidatat. Non dolor sunt elit velit excepteur anim deserunt ut occaecat culpa aute aute.\r\n", + "address": "2 Beach Place", + "city": "Slovan", + "state": "District Of Columbia", + "zip": 43413, + "country": "Croatia (Hrvatska)", + "email": "staciking@scentric.com", + "phone": "(964) 422-3068", + "color": "rgb(123,169,84)" + }, + { + "index": 197, + "name": "Essie Hoover", + "first": "Lourdes", + "last": "Mayer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nbirckel/73.jpg", + "expanded": false, + "guid": "d4eca4a8-9d42-4800-9776-b3f2f858b3e5", + "integer": 7, + "date": "Wed Jul 02 1986 21:56:11 GMT-0700 (PDT)", + "shortText": "incididunt nisi minim id officia", + "mediumText": "Ex sint esse labore sit cillum cupidatat cupidatat consequat dolor aliquip elit sunt fugiat quis.", + "longText": "Minim veniam dolor tempor cupidatat nostrud dolore quis sint Lorem duis eiusmod consectetur. Incididunt irure consequat ipsum id cillum culpa qui ad magna nisi. Consequat quis adipisicing dolor consequat reprehenderit incididunt ipsum enim laborum duis. Dolor sit do ex magna do culpa dolor anim incididunt tempor nisi ipsum ex voluptate. Quis exercitation dolore voluptate veniam amet nostrud dolore consequat nulla quis anim amet. Veniam ut do incididunt culpa eiusmod proident in sint nostrud voluptate.\r\nVeniam sint excepteur laboris duis nostrud. Eiusmod commodo mollit est ex incididunt fugiat labore proident. Ea enim commodo non tempor non aliquip culpa non laborum. Anim veniam sit sunt adipisicing adipisicing ea cillum duis incididunt excepteur ut ad non ad. Ex in nulla exercitation laborum Lorem ex deserunt commodo esse dolore nostrud.\r\nOccaecat reprehenderit Lorem culpa tempor dolor et dolore nulla nostrud eiusmod dolor magna voluptate aliquip. Dolore consectetur exercitation proident aliquip cupidatat veniam ea ad anim nostrud enim nulla labore. Incididunt duis deserunt laborum mollit veniam irure est ad enim commodo eiusmod.\r\nCulpa consequat duis deserunt magna laborum magna amet eiusmod. Ut ipsum id aute duis reprehenderit. Nulla nisi sint mollit amet ex esse laborum nulla ullamco cupidatat nostrud. Enim consequat aute tempor veniam adipisicing aliqua laborum irure duis mollit Lorem eu ipsum quis. Dolor culpa est et reprehenderit occaecat. Amet ex ad do mollit sint mollit non culpa nisi laborum qui aliquip sit. Laborum officia ullamco pariatur non sit esse est sint duis reprehenderit laborum aute qui.\r\nLabore dolor occaecat anim deserunt anim duis Lorem incididunt anim amet amet ut eu dolore. Consequat commodo laborum ipsum id magna non occaecat adipisicing et non. Deserunt cupidatat culpa in reprehenderit mollit aliqua aute amet.\r\n", + "address": "2 Merit Court", + "city": "Curtice", + "state": "Virgin Islands", + "zip": 27446, + "country": "Indonesia", + "email": "lourdesmayer@scentric.com", + "phone": "(844) 447-3638", + "color": "rgb(56,235,218)" + }, + { + "index": 198, + "name": "Bridget Wilcox", + "first": "Danielle", + "last": "Delacruz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/irida168/73.jpg", + "expanded": false, + "guid": "4072c5a4-5842-4c17-85c4-d9c472e32f5d", + "integer": 1, + "date": "Thu Mar 18 1993 10:26:24 GMT-0800 (PST)", + "shortText": "quis", + "mediumText": "Lorem in aliquip ullamco labore consequat elit nisi ex tempor. Enim exercitation cupidatat in laborum nulla.", + "longText": "Veniam ea qui pariatur laborum minim. Duis tempor commodo ad qui tempor est. Do enim incididunt Lorem elit proident ex nulla elit exercitation voluptate ex laborum ullamco deserunt. Ad voluptate mollit dolore sint exercitation anim laborum voluptate Lorem deserunt. Anim ullamco minim commodo non consequat est qui nostrud ullamco laboris mollit. Ipsum laborum anim ex labore laboris cillum cupidatat elit ex enim quis.\r\nAliquip anim ea fugiat aute nostrud occaecat culpa magna ut nisi ea tempor ex. Quis dolore aute cupidatat officia esse anim occaecat. Anim occaecat incididunt sit ea enim mollit consectetur aute anim. Voluptate sint et occaecat adipisicing eiusmod excepteur aliquip eu. Cillum enim et aliquip non cupidatat eu consequat voluptate culpa veniam esse. Commodo officia enim excepteur id cupidatat.\r\nSunt reprehenderit id voluptate deserunt irure veniam fugiat elit ipsum exercitation excepteur ut. Elit ut eu in Lorem reprehenderit reprehenderit aliqua duis dolor. Velit voluptate aute magna voluptate id do mollit enim nisi consequat veniam elit cupidatat et.\r\nEt sint adipisicing officia ipsum commodo do ea sunt anim. Laborum ullamco elit aute occaecat adipisicing exercitation labore nulla ipsum. Cupidatat sit eiusmod aliqua esse eu ullamco in. Laborum eiusmod excepteur ad magna exercitation occaecat amet ad sint ullamco aliquip excepteur. Nisi sit consequat laboris nulla consequat dolore fugiat. Lorem cupidatat adipisicing do esse nisi fugiat eu culpa fugiat ullamco quis elit in.\r\nMagna in cupidatat duis dolor quis cillum occaecat. Pariatur minim ipsum irure qui officia veniam incididunt adipisicing consectetur Lorem. Ex esse cillum ut sint minim. Esse ex excepteur id do culpa laboris nisi nisi non. Exercitation minim consectetur dolor aliqua culpa commodo dolor. Ut tempor sint mollit Lorem incididunt laborum laboris sit cupidatat ex esse. Enim amet sunt sit anim veniam fugiat ea mollit.\r\n", + "address": "4 Leonora Court", + "city": "Bradenville", + "state": "Puerto Rico", + "zip": 59719, + "country": "Nauru", + "email": "danielledelacruz@scentric.com", + "phone": "(952) 548-3787", + "color": "rgb(168,148,116)" + }, + { + "index": 199, + "name": "Mccarthy Fletcher", + "first": "Janis", + "last": "Fischer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kevin_py/73.jpg", + "expanded": false, + "guid": "010c3410-51e3-409d-ae76-1ef43f546c53", + "integer": 21, + "date": "Thu Feb 27 2014 18:02:21 GMT-0800 (PST)", + "shortText": "non ullamco exercitation voluptate", + "mediumText": "Ea velit ullamco ullamco excepteur culpa est in nisi cillum amet deserunt quis laborum. Tempor in duis cupidatat proident.", + "longText": "Labore reprehenderit deserunt sint reprehenderit officia et culpa sunt exercitation velit ipsum cupidatat veniam. Cupidatat ut elit cillum cupidatat qui sit tempor veniam consequat labore dolor minim. Ad duis laboris ad voluptate ea non velit elit excepteur sint elit consectetur non. Velit tempor officia quis cillum duis et culpa voluptate ipsum.\r\nMinim labore nostrud deserunt ipsum est qui aliqua Lorem ullamco non nostrud. Reprehenderit cillum consectetur ex aute est dolor laboris minim aliqua aliqua elit aliqua. Sint pariatur nostrud enim qui do exercitation occaecat mollit anim mollit.\r\nUllamco ea adipisicing duis est consectetur enim. Cillum esse et enim duis qui quis est elit. Occaecat sunt cupidatat voluptate consectetur anim ut non deserunt veniam ullamco laboris cupidatat incididunt pariatur. Id consequat nisi non aliquip voluptate esse. Cupidatat fugiat anim anim id quis aliquip sint nisi fugiat sit. Ipsum voluptate do officia quis culpa nulla et.\r\nEt commodo ea irure aliquip consectetur dolore. Eu nostrud non ad tempor commodo. Est tempor aliquip nisi mollit tempor excepteur. Enim consectetur cillum laborum do anim labore deserunt culpa exercitation commodo dolore commodo dolore nulla. Laboris ex officia officia incididunt fugiat reprehenderit officia proident laborum qui consectetur eiusmod et. Aute adipisicing eiusmod do cupidatat id commodo. Deserunt nostrud officia nulla exercitation nostrud occaecat tempor mollit duis.\r\n", + "address": "2 Colin Place", + "city": "Greensburg", + "state": "Maryland", + "zip": 26126, + "country": "Ireland", + "email": "janisfischer@scentric.com", + "phone": "(860) 405-3588", + "color": "rgb(113,69,223)" + }, + { + "index": 200, + "name": "Judy Whitley", + "first": "Webster", + "last": "Doyle", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ratbus/73.jpg", + "expanded": false, + "guid": "f4ccb739-8e28-42fd-b1a0-4051b77a60b3", + "integer": 57, + "date": "Tue Jan 29 2002 02:38:20 GMT-0800 (PST)", + "shortText": "cillum", + "mediumText": "Eiusmod nisi excepteur labore Lorem incididunt laborum cillum sit nisi id id sint minim. Proident reprehenderit excepteur cupidatat culpa dolor labore. Irure labore aute amet nostrud ad voluptate non.", + "longText": "Eiusmod do tempor aliquip adipisicing nisi sit amet sunt amet commodo aute pariatur occaecat. Labore incididunt qui incididunt duis non dolore eu voluptate. Veniam minim esse ipsum non do. Laboris non culpa adipisicing do dolore pariatur eiusmod aute incididunt mollit Lorem labore ad ad.\r\nEt fugiat ad deserunt exercitation pariatur. Elit eiusmod ut pariatur ut adipisicing officia proident Lorem nisi id dolore sit tempor occaecat. Et minim fugiat incididunt ad ullamco Lorem.\r\nElit ea cupidatat elit adipisicing magna ex culpa aliqua enim. Enim deserunt eiusmod dolore incididunt ex veniam dolor ipsum pariatur. Ipsum elit tempor eiusmod occaecat qui fugiat quis elit non nisi anim. Fugiat ut sit cillum ad dolore duis qui. Deserunt amet et sunt nulla duis nisi ea. In elit consectetur exercitation cupidatat sit nostrud reprehenderit adipisicing aliquip.\r\n", + "address": "3 Gerry Street", + "city": "Lookingglass", + "state": "Massachusetts", + "zip": 73514, + "country": "Luxembourg", + "email": "websterdoyle@scentric.com", + "phone": "(891) 436-2016", + "color": "rgb(129,172,59)" + }, + { + "index": 201, + "name": "Ware Harding", + "first": "Phyllis", + "last": "Holcomb", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sprayaga/73.jpg", + "expanded": false, + "guid": "87934fda-9cd1-4e95-9faa-53102d8ce1f2", + "integer": 3, + "date": "Fri May 19 1972 15:51:24 GMT-0700 (PDT)", + "shortText": "deserunt laboris excepteur pariatur nostrud", + "mediumText": "Tempor Lorem occaecat magna aute aliqua eu qui commodo.", + "longText": "Laboris deserunt anim excepteur magna et. Eu ullamco laborum enim id ut excepteur nulla est quis deserunt exercitation veniam irure. Sint officia anim cupidatat nostrud culpa aute ut. Amet id elit incididunt do excepteur. Qui aute voluptate tempor non ad fugiat commodo voluptate culpa eiusmod sit enim dolor. Minim est proident anim consequat adipisicing ea reprehenderit magna labore fugiat ea anim. Velit aute incididunt aute commodo aliquip veniam do fugiat ut anim.\r\nNulla aliquip aliqua est cupidatat ex laboris id velit ullamco labore qui. Commodo labore mollit esse laboris deserunt duis. Sunt velit ex excepteur cillum officia sint ad id commodo. Irure amet est laboris officia occaecat anim id ut irure sunt aute. Deserunt quis deserunt et ad mollit nulla. Velit eu Lorem deserunt ipsum sit aute amet exercitation aliquip nulla. Nulla sunt commodo adipisicing minim reprehenderit consequat minim elit qui do Lorem sit.\r\nIn et mollit minim proident eu qui anim magna Lorem consequat minim duis. Esse culpa eu commodo sit. Nostrud laborum magna id elit proident. Laboris commodo ipsum culpa laboris esse non enim id id mollit elit. Pariatur id in sunt et est tempor duis eu Lorem dolor tempor non veniam non. Ipsum officia aliquip anim id. Ex culpa aute et et consequat in qui.\r\nDeserunt nisi elit aliquip dolor culpa dolore mollit ullamco in cupidatat aliqua. Fugiat minim veniam labore ad minim in aliquip labore nulla quis pariatur. Est nisi pariatur duis culpa cupidatat labore in. Nisi tempor Lorem ea in laboris adipisicing do nisi consectetur laboris sunt culpa.\r\nDolore dolore veniam irure aute elit fugiat magna in. Irure enim fugiat ad ad aliqua exercitation proident duis officia dolor minim consequat reprehenderit. Occaecat ullamco esse cillum deserunt velit adipisicing laboris proident occaecat commodo occaecat tempor fugiat. Sint voluptate sunt anim sint do amet sint eiusmod ea enim Lorem. Aliqua consequat commodo sunt amet fugiat excepteur dolor dolor aliquip nostrud culpa. Fugiat elit adipisicing sit minim fugiat exercitation commodo anim duis. Ex voluptate excepteur occaecat nulla nostrud elit minim laborum fugiat.\r\n", + "address": "2 Brigham Street", + "city": "Chalfant", + "state": "Oklahoma", + "zip": 57590, + "country": "Afghanistan", + "email": "phyllisholcomb@scentric.com", + "phone": "(874) 534-3124", + "color": "rgb(210,230,76)" + }, + { + "index": 202, + "name": "Blanche Sears", + "first": "Peck", + "last": "Dean", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hai_ninh_nguyen/73.jpg", + "expanded": false, + "guid": "b362bf52-df9f-45bb-a64c-4f699bfd2cdb", + "integer": 64, + "date": "Thu May 23 2013 08:13:12 GMT-0700 (PDT)", + "shortText": "nisi tempor", + "mediumText": "Culpa id pariatur velit ut non adipisicing reprehenderit minim est pariatur excepteur nisi qui consectetur.", + "longText": "Voluptate minim deserunt reprehenderit anim ullamco. Consectetur laborum dolor ullamco laboris sunt elit nisi commodo esse sit. Voluptate dolor labore minim consectetur.\r\nQuis magna dolore incididunt deserunt qui dolor aute est culpa voluptate esse. Cillum quis exercitation dolore quis enim aliquip dolore dolor est adipisicing pariatur dolore deserunt. Consectetur sunt proident pariatur aute cupidatat voluptate fugiat pariatur sint.\r\nPariatur eiusmod consequat velit mollit ut reprehenderit irure. Voluptate nisi reprehenderit nisi adipisicing consectetur consequat in culpa laboris veniam laborum velit. Incididunt laboris cupidatat commodo sit commodo esse. Adipisicing proident cupidatat pariatur aute.\r\nEsse reprehenderit do id non occaecat dolore laborum dolore nostrud reprehenderit culpa voluptate voluptate nostrud. Laboris nostrud officia id consequat ullamco. Nisi est sunt ipsum excepteur nostrud dolore irure quis quis labore esse laboris. Adipisicing velit dolore ullamco voluptate reprehenderit ad duis reprehenderit. Commodo do laboris elit eu in nisi deserunt sint ipsum in duis sint excepteur. Culpa est est Lorem sint labore. Et qui ad anim ad.\r\nDo adipisicing amet cupidatat dolor dolore culpa incididunt culpa ad qui consequat ea reprehenderit proident. Irure qui ad adipisicing veniam irure nostrud esse id. Culpa do proident ex id eu Lorem veniam. Veniam commodo sit exercitation deserunt minim sint enim occaecat amet eu irure voluptate culpa eu. Deserunt ad laborum fugiat ex eu incididunt dolore adipisicing. Labore commodo aliquip deserunt aute eiusmod nisi. Est commodo duis excepteur nulla sunt laboris.\r\n", + "address": "4 Garden Place", + "city": "Ironton", + "state": "Ohio", + "zip": 89350, + "country": "St. Pierre and Miquelon", + "email": "peckdean@scentric.com", + "phone": "(994) 522-3068", + "color": "rgb(199,252,214)" + }, + { + "index": 203, + "name": "Conway Kelley", + "first": "Virginia", + "last": "Pollard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gaborenton/73.jpg", + "expanded": false, + "guid": "afd59da0-9b9b-4b60-9da3-0ef8fc1e6349", + "integer": 14, + "date": "Sun Jul 17 1988 07:37:09 GMT-0700 (PDT)", + "shortText": "Lorem pariatur velit duis tempor", + "mediumText": "Incididunt dolore sint proident irure. Cillum minim veniam dolor ipsum ut cupidatat non proident tempor deserunt. Incididunt exercitation ut proident dolor do adipisicing sit Lorem aliqua enim nulla nostrud. Consectetur duis veniam elit laboris eiusmod ullamco labore exercitation fugiat sint reprehenderit eu nostrud dolor. Occaecat id laboris est tempor deserunt anim in fugiat proident enim cupidatat elit officia fugiat.", + "longText": "Veniam enim ad adipisicing cupidatat velit cillum anim et exercitation esse aliquip sit sunt. Irure mollit est sint minim consectetur labore sunt. Deserunt veniam sunt ut sunt tempor minim ipsum Lorem cupidatat laborum. Proident ipsum veniam quis nisi in consectetur sint labore laboris quis adipisicing velit. Dolore laboris exercitation quis sit. Laboris voluptate non consectetur incididunt laborum veniam pariatur exercitation sint.\r\nSint aute mollit eiusmod ea id cupidatat ad in sunt Lorem proident eiusmod ad. Proident ex occaecat pariatur excepteur labore consectetur laboris. Ut pariatur in adipisicing sit ipsum minim. Ut est elit eiusmod fugiat deserunt mollit fugiat incididunt laboris. Aute officia amet cupidatat in.\r\nVelit id enim ut ea veniam laborum eu duis adipisicing fugiat amet ullamco irure. Dolor et ad culpa esse in. Ea pariatur adipisicing minim sunt consequat sunt minim anim aute qui quis.\r\n", + "address": "3 Monaco Place", + "city": "Lopezo", + "state": "Nevada", + "zip": 45051, + "country": "Montserrat", + "email": "virginiapollard@scentric.com", + "phone": "(911) 563-3668", + "color": "rgb(120,253,100)" + }, + { + "index": 204, + "name": "Little Griffin", + "first": "Murray", + "last": "David", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/uralozden/73.jpg", + "expanded": false, + "guid": "9028904c-ab1e-4968-b7c4-20453df8469b", + "integer": 84, + "date": "Sun Dec 20 1987 15:41:10 GMT-0800 (PST)", + "shortText": "adipisicing ea pariatur enim", + "mediumText": "Commodo nostrud et irure amet pariatur proident eiusmod. Proident mollit eu fugiat irure voluptate proident laboris cillum proident voluptate.", + "longText": "Nisi et consectetur aute in tempor. Occaecat ad sint incididunt ullamco reprehenderit dolore. Nisi adipisicing in velit sint aliquip. Deserunt ut pariatur aute et voluptate fugiat id esse do sunt deserunt aute in. Excepteur adipisicing excepteur irure tempor sit culpa culpa mollit. Fugiat est culpa nostrud pariatur labore et in esse ullamco cillum et amet consequat cillum. Sint laboris cillum ea labore occaecat sunt enim.\r\n", + "address": "2 Gallatin Place", + "city": "Topaz", + "state": "Montana", + "zip": 18846, + "country": "Norway", + "email": "murraydavid@scentric.com", + "phone": "(994) 477-3415", + "color": "rgb(185,246,198)" + }, + { + "index": 205, + "name": "Goff Benton", + "first": "Mclean", + "last": "Pennington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/attacks/73.jpg", + "expanded": false, + "guid": "70d6883d-2c03-4256-b2b8-d09f035e6d58", + "integer": 51, + "date": "Sun Feb 25 1979 17:08:08 GMT-0800 (PST)", + "shortText": "ipsum aute Lorem", + "mediumText": "Qui est officia sit nulla sunt reprehenderit incididunt aute.", + "longText": "Lorem eu proident exercitation do veniam. Sunt reprehenderit officia cupidatat est do ipsum sunt elit anim quis reprehenderit laborum quis non. Et aliqua excepteur culpa qui enim nulla id qui eiusmod dolor Lorem non mollit consectetur.\r\nLorem amet velit esse magna Lorem voluptate nostrud labore. Dolor Lorem cupidatat mollit laboris deserunt quis occaecat excepteur pariatur deserunt minim consectetur sint. Ad quis veniam dolore quis nostrud laboris ex anim quis eu nisi tempor. Consectetur voluptate id officia culpa anim enim eiusmod in amet amet. Velit anim deserunt officia eiusmod qui incididunt minim consequat ut sunt mollit. Ex enim aliquip enim quis enim irure sunt mollit laborum nisi.\r\nMagna sit ea deserunt excepteur aliqua esse nulla deserunt exercitation officia nulla id tempor cillum. Occaecat nulla sit tempor aute fugiat commodo. Laboris fugiat enim exercitation voluptate quis consequat consectetur aliquip fugiat voluptate ut occaecat reprehenderit irure. Esse sit laboris quis commodo ea in velit ad labore veniam. Aliquip dolor laborum commodo ad elit aliqua velit qui.\r\nElit exercitation culpa officia adipisicing amet in dolor eiusmod. Nostrud proident exercitation aliquip labore ad cupidatat velit incididunt. Officia ex veniam cillum deserunt id dolore excepteur pariatur mollit nulla laboris veniam veniam eu. Labore duis est ex reprehenderit fugiat commodo ut aute officia culpa irure amet id.\r\n", + "address": "4 Story Court", + "city": "Snowville", + "state": "California", + "zip": 33234, + "country": "Guam", + "email": "mcleanpennington@scentric.com", + "phone": "(882) 499-2242", + "color": "rgb(107,133,242)" + }, + { + "index": 206, + "name": "Hale Wilkinson", + "first": "Franks", + "last": "Howard", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mymyboy/73.jpg", + "expanded": false, + "guid": "974617cc-7395-4b74-aa1b-f5ea163bbb48", + "integer": 40, + "date": "Mon Jul 17 1972 11:03:48 GMT-0700 (PDT)", + "shortText": "dolor nulla culpa id", + "mediumText": "Veniam ipsum sit ea velit et magna exercitation exercitation occaecat voluptate aliqua. Deserunt nisi qui dolor mollit in anim labore. Dolore id quis occaecat aliqua pariatur cillum enim aliquip pariatur voluptate magna. Excepteur magna officia excepteur voluptate excepteur laboris.", + "longText": "Sit elit quis laborum do magna culpa Lorem magna incididunt. Consectetur non do non ea fugiat Lorem sint fugiat deserunt magna id ut aliquip. In Lorem ut voluptate magna consectetur exercitation cupidatat elit anim excepteur ipsum tempor amet. Velit commodo magna incididunt pariatur fugiat adipisicing cillum fugiat incididunt in sint velit ipsum. Sint non eiusmod quis minim anim. Irure reprehenderit adipisicing non nulla Lorem officia excepteur voluptate esse.\r\nOfficia dolore do aute culpa enim et quis laboris occaecat elit eiusmod mollit. Est non irure amet ad pariatur exercitation pariatur ad ex quis. Sunt ea minim id exercitation laborum dolore nulla et incididunt do. Aliqua amet Lorem eiusmod pariatur ipsum amet reprehenderit elit sit. Eu quis cillum voluptate magna ullamco.\r\nEa proident sit laborum commodo fugiat in elit amet. Non esse do exercitation culpa consectetur non magna voluptate velit ea culpa anim nulla. Eiusmod labore Lorem aute occaecat nulla fugiat.\r\nEst excepteur laborum ut amet Lorem ad veniam elit reprehenderit. Officia laboris id et consectetur sunt adipisicing nulla nostrud esse Lorem. Duis laboris veniam amet deserunt in deserunt laborum sit pariatur cillum nostrud.\r\n", + "address": "2 Hoyt Street", + "city": "Wolcott", + "state": "Marshall Islands", + "zip": 13071, + "country": "Gibraltar", + "email": "frankshoward@scentric.com", + "phone": "(893) 417-2654", + "color": "rgb(186,174,80)" + }, + { + "index": 207, + "name": "Betty Huff", + "first": "Mona", + "last": "Fulton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tristanlegros/73.jpg", + "expanded": false, + "guid": "c11ff2c4-c704-4729-88f9-b9932549a64a", + "integer": 26, + "date": "Thu Nov 04 1976 19:21:20 GMT-0800 (PST)", + "shortText": "sit nulla", + "mediumText": "Adipisicing minim nostrud magna amet tempor sunt duis officia cupidatat do incididunt dolore consectetur elit. Duis proident deserunt proident eu elit aliquip sint. Qui officia commodo voluptate deserunt amet ipsum magna dolore. Dolore labore eiusmod fugiat ad.", + "longText": "Aliquip in consequat nulla Lorem velit in cupidatat ut ut. Minim dolore cillum ut esse dolore ex. Eu occaecat officia tempor Lorem duis mollit magna Lorem eu deserunt aute et nisi reprehenderit. Eu magna qui enim officia nostrud proident officia sint elit ipsum quis duis velit Lorem.\r\n", + "address": "4 Ocean Avenue", + "city": "Finderne", + "state": "Indiana", + "zip": 46746, + "country": "Hungary", + "email": "monafulton@scentric.com", + "phone": "(946) 414-3557", + "color": "rgb(128,193,66)" + }, + { + "index": 208, + "name": "Emily Davis", + "first": "Sharon", + "last": "Green", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/allfordesign/73.jpg", + "expanded": false, + "guid": "e94e16a5-2c94-4436-8610-86a6f5f66355", + "integer": 99, + "date": "Mon Sep 28 2009 14:40:31 GMT-0700 (PDT)", + "shortText": "cillum dolor ex cupidatat deserunt", + "mediumText": "Cupidatat nulla anim reprehenderit laboris aute magna aliquip ea in sit. Reprehenderit reprehenderit amet id et ad ea. Deserunt veniam cillum dolor ullamco Lorem non cillum amet.", + "longText": "Quis voluptate ex cillum incididunt incididunt nisi. Dolor aliqua culpa dolor cillum eiusmod cillum tempor cillum. Est laboris esse exercitation nulla nisi anim et do cupidatat fugiat pariatur. Laborum duis eu fugiat anim duis.\r\nVeniam reprehenderit cupidatat ullamco Lorem ex officia mollit aliqua. Exercitation exercitation cillum irure officia deserunt velit laboris est irure irure minim veniam aliquip laborum. Ipsum ipsum sit ipsum ex veniam voluptate. Adipisicing do ex occaecat do. Laboris reprehenderit ad velit deserunt. Sint consectetur minim eiusmod excepteur eu cupidatat non mollit aliquip ad eu cupidatat.\r\nFugiat mollit ut ullamco veniam sint proident occaecat ad. Est exercitation laborum nisi laboris anim laborum magna. Labore ut adipisicing consectetur velit voluptate fugiat laborum adipisicing veniam reprehenderit. Adipisicing aliquip consectetur id occaecat labore exercitation ullamco.\r\nVoluptate reprehenderit occaecat eiusmod pariatur ipsum est eu. Id dolor laborum elit commodo duis et Lorem laboris. Sit officia do elit amet adipisicing. Exercitation commodo est do eu. In amet ad reprehenderit commodo.\r\nMinim nisi nostrud Lorem nostrud ea incididunt est in labore amet elit officia. Quis nostrud fugiat consequat culpa. Nisi ullamco irure sunt esse elit sunt nisi enim ullamco cupidatat dolore adipisicing. Ullamco sint laboris ullamco id magna qui et eiusmod laborum do enim minim amet aute. Ad fugiat elit velit amet officia nisi aliquip qui. Ut quis amet tempor ea ex id quis Lorem. Amet tempor incididunt esse sunt dolore non veniam esse nisi sint labore ut in.\r\n", + "address": "3 Colonial Court", + "city": "Trona", + "state": "Tennessee", + "zip": 67912, + "country": "Kenya", + "email": "sharongreen@scentric.com", + "phone": "(832) 403-3692", + "color": "rgb(208,118,108)" + }, + { + "index": 209, + "name": "Shelly Payne", + "first": "Doyle", + "last": "Vazquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/serk002/73.jpg", + "expanded": false, + "guid": "1fbca6f1-d8c8-48ca-94be-6bfb87526c7d", + "integer": 58, + "date": "Sat May 15 1993 07:23:07 GMT-0700 (PDT)", + "shortText": "do amet aliqua duis ea", + "mediumText": "Minim adipisicing sint aliquip in do mollit labore occaecat in. Est commodo et deserunt aute. Ut consectetur exercitation et voluptate qui quis ex.", + "longText": "Ea consequat exercitation incididunt non veniam occaecat amet occaecat occaecat ex ex ullamco incididunt. Enim consequat nisi sit pariatur aliqua elit ipsum elit aliqua incididunt et. Cupidatat occaecat velit nostrud id consequat cupidatat. Nulla anim ipsum enim ad incididunt nostrud nulla et esse incididunt elit. Culpa commodo ad non sint anim. Ad deserunt aute eiusmod officia fugiat proident minim nostrud commodo voluptate velit mollit duis.\r\nEiusmod veniam adipisicing exercitation proident do voluptate ut culpa consequat Lorem. Deserunt ea voluptate anim quis duis deserunt mollit minim sit minim reprehenderit amet. Nisi labore dolore reprehenderit minim laborum fugiat Lorem incididunt sint. Enim aliquip voluptate ea nulla consectetur sit reprehenderit sunt in officia aute id. Pariatur sint sint eiusmod ea do est sint.\r\n", + "address": "3 Auburn Place", + "city": "Blairstown", + "state": "Palau", + "zip": 22120, + "country": "Honduras", + "email": "doylevazquez@scentric.com", + "phone": "(946) 513-2799", + "color": "rgb(255,190,226)" + }, + { + "index": 210, + "name": "Angela Mcmahon", + "first": "Rosalyn", + "last": "Bridges", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/keremk/73.jpg", + "expanded": false, + "guid": "92811c3f-0e5f-4f04-9543-6d026e4b26c4", + "integer": 16, + "date": "Fri Jan 16 1998 10:02:55 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Lorem cupidatat dolor voluptate magna excepteur eiusmod est in.", + "longText": "Aliqua culpa aliqua aute labore nulla do pariatur consectetur sit sunt quis reprehenderit duis cupidatat. Pariatur eu voluptate cupidatat reprehenderit sit mollit proident ullamco proident ipsum nulla. Nulla qui ullamco sint eiusmod dolore. Minim esse et sit cupidatat dolore esse. Dolor reprehenderit aliquip magna commodo irure nulla culpa ipsum enim incididunt. Cillum velit minim incididunt qui velit nulla.\r\nConsectetur amet ex elit eu commodo sint enim. Proident et labore ipsum consequat pariatur irure. Fugiat non occaecat ipsum ullamco commodo. Nisi exercitation cupidatat nisi pariatur non culpa. Non do deserunt labore non amet excepteur ea sint. Pariatur quis ullamco laboris fugiat proident est irure magna commodo occaecat officia qui.\r\nPariatur et commodo officia ullamco do qui est nisi in. Laborum sint do minim aute aute dolore est consequat officia id. Nostrud velit ex ut eu dolore occaecat magna minim. Culpa amet sunt duis aliquip Lorem voluptate. Commodo occaecat reprehenderit nostrud magna ex proident incididunt est ut ad do.\r\n", + "address": "4 Fane Court", + "city": "Elrama", + "state": "Virginia", + "zip": 45107, + "country": "Eritrea", + "email": "rosalynbridges@scentric.com", + "phone": "(813) 440-3063", + "color": "rgb(184,249,205)" + }, + { + "index": 211, + "name": "Maryellen Ramos", + "first": "Rogers", + "last": "Silva", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/surjithctly/73.jpg", + "expanded": false, + "guid": "a833fdf1-9865-4e5c-91f8-8d1aaa2d2fba", + "integer": 75, + "date": "Sun Oct 24 2004 10:12:53 GMT-0700 (PDT)", + "shortText": "nisi duis", + "mediumText": "Magna elit fugiat occaecat incididunt elit tempor exercitation occaecat fugiat eiusmod incididunt dolore. Ad quis ea commodo reprehenderit sint sit esse quis quis. Minim esse anim aute eiusmod fugiat.", + "longText": "Voluptate id ullamco do aliqua ad deserunt commodo ex. Et aute excepteur elit adipisicing. Labore consequat consequat consequat qui aute non et ad deserunt. Ex adipisicing sunt sunt mollit do nulla eiusmod esse aute dolor. Elit veniam culpa labore proident cillum duis minim id sint sint eiusmod. Est deserunt in ut laboris fugiat ut sint consequat. Ullamco ex incididunt reprehenderit adipisicing occaecat.\r\nNisi officia excepteur enim aliquip aliqua occaecat aliqua mollit velit reprehenderit amet id cillum. Nulla fugiat ad id in velit consectetur sint id commodo pariatur velit reprehenderit est nisi. Reprehenderit exercitation voluptate ea cillum ea ut nisi deserunt laborum eiusmod ea. Voluptate velit consectetur aliquip aliquip Lorem consectetur dolore in qui laboris voluptate labore duis. In enim eiusmod minim minim non ea labore excepteur tempor officia ullamco.\r\nUt pariatur tempor aliquip eu quis cupidatat esse ad. Sint occaecat mollit eu consectetur dolore nostrud incididunt nostrud enim quis dolor elit adipisicing excepteur. Pariatur cupidatat consequat cillum deserunt sit eu in et veniam aliqua. Proident nostrud nostrud incididunt tempor ad nisi amet. Cupidatat ad ea mollit cupidatat est dolor eu laboris ex velit duis amet consectetur velit.\r\nCillum occaecat ex voluptate cupidatat est cillum qui. Et do incididunt nulla veniam sint eu consectetur et non minim officia excepteur velit. Anim labore mollit cillum sit nisi ex sunt mollit culpa enim ipsum sit laboris in. Quis ullamco et ullamco consequat mollit ex commodo laboris voluptate. Magna qui aute aliqua sit adipisicing id. Veniam mollit proident eu occaecat veniam sint sint laboris sit laborum.\r\n", + "address": "3 Brightwater Court", + "city": "Brandermill", + "state": "Wyoming", + "zip": 20996, + "country": "Tajikistan", + "email": "rogerssilva@scentric.com", + "phone": "(944) 540-3499", + "color": "rgb(88,243,243)" + }, + { + "index": 212, + "name": "Alvarado Abbott", + "first": "Jordan", + "last": "Hyde", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dimitris_d_/73.jpg", + "expanded": false, + "guid": "9b8ecabd-ca6e-4ee1-bd6a-08635f7312a6", + "integer": 97, + "date": "Fri Oct 21 1983 23:56:38 GMT-0700 (PDT)", + "shortText": "elit exercitation pariatur aliqua duis", + "mediumText": "Cupidatat consequat esse duis ex consequat consequat.", + "longText": "Anim aute nisi non adipisicing dolor incididunt non est esse culpa. Proident eiusmod et voluptate sint. Anim ex incididunt do ipsum dolor Lorem Lorem ut. Quis eiusmod esse anim aliqua ullamco. Non in ad qui excepteur minim adipisicing Lorem tempor elit. Nostrud cillum incididunt labore magna duis consectetur irure ut consectetur. Veniam eu officia qui sint pariatur culpa.\r\nSunt ea amet tempor minim labore consequat duis qui. Aliqua non nisi sint incididunt et veniam minim Lorem. Id fugiat consequat in labore velit proident est incididunt nisi non Lorem. Exercitation ipsum duis labore sunt officia proident labore labore ad. Sunt enim culpa adipisicing aute cillum. Officia in adipisicing tempor minim eiusmod dolor. Ea sunt ut elit cillum laboris nisi ipsum reprehenderit labore laborum culpa in.\r\nFugiat est eiusmod amet incididunt minim adipisicing voluptate. Ex eiusmod consequat consectetur occaecat laborum culpa in cupidatat voluptate ipsum reprehenderit elit consequat. Ut fugiat commodo qui aute consequat. Nostrud dolor duis magna minim do.\r\nId non fugiat pariatur pariatur Lorem nostrud irure. Tempor laboris voluptate velit magna. Ut ea ea sunt mollit aliqua. Ullamco dolore nostrud ex non non non culpa Lorem ullamco do do dolore quis. Id sunt magna laboris laboris enim. Sint aliquip elit ullamco ut nisi officia enim dolore nulla cupidatat duis. Cillum magna minim quis nulla nulla anim amet non nostrud sit nostrud exercitation magna ex.\r\n", + "address": "4 Bainbridge Street", + "city": "Chical", + "state": "Colorado", + "zip": 18544, + "country": "Brunei Darussalam", + "email": "jordanhyde@scentric.com", + "phone": "(822) 530-2413", + "color": "rgb(163,61,149)" + }, + { + "index": 213, + "name": "Caldwell Mckinney", + "first": "Melody", + "last": "Fisher", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bogdanroberta/73.jpg", + "expanded": false, + "guid": "7e4dcc0a-5507-4cee-948f-06e4315a2af8", + "integer": 41, + "date": "Wed May 03 1972 14:18:30 GMT-0700 (PDT)", + "shortText": "adipisicing", + "mediumText": "Aliqua laboris enim proident cillum ut id aute nulla ea.", + "longText": "Consequat excepteur non amet ipsum labore dolore consequat duis cillum. Enim occaecat nisi aute aliqua occaecat enim nulla. Eiusmod est adipisicing et in. Sint fugiat ullamco officia commodo minim ut velit voluptate non eiusmod. Est quis sunt nisi exercitation in nostrud laboris.\r\nIrure pariatur velit ad minim occaecat labore ad dolor eiusmod occaecat laboris. Et culpa voluptate minim aliquip. Sit commodo nostrud veniam in dolore magna officia eu ea nisi ex velit.\r\nQuis esse do anim ullamco deserunt consectetur cupidatat tempor cillum ex id. Aute velit non est amet officia laboris labore duis velit Lorem consectetur cupidatat tempor. Cupidatat eiusmod anim et elit ipsum esse minim. Irure eiusmod nisi duis velit id.\r\n", + "address": "2 Abbey Court", + "city": "Salvo", + "state": "Utah", + "zip": 63926, + "country": "Macedonia", + "email": "melodyfisher@scentric.com", + "phone": "(979) 487-2773", + "color": "rgb(71,205,213)" + }, + { + "index": 214, + "name": "Eloise Avila", + "first": "Gay", + "last": "Yang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shammellee/73.jpg", + "expanded": false, + "guid": "d615ea19-d16e-48f6-8ddb-02091a9fa272", + "integer": 25, + "date": "Tue Sep 03 1991 06:44:54 GMT-0700 (PDT)", + "shortText": "aliquip enim eu proident sunt", + "mediumText": "Ex deserunt reprehenderit qui ea adipisicing labore in ipsum.", + "longText": "Eiusmod anim ut occaecat veniam est quis labore consectetur elit. Sint minim nostrud non ad aliqua do. Dolor et ullamco aliqua cillum consectetur sunt. Tempor aliquip id labore anim voluptate aute cupidatat consequat. Et nostrud eu cillum sunt nisi excepteur laborum sint labore amet.\r\n", + "address": "3 Wogan Terrace", + "city": "Canby", + "state": "Idaho", + "zip": 49943, + "country": "French Polynesia", + "email": "gayyang@scentric.com", + "phone": "(951) 538-3316", + "color": "rgb(75,210,111)" + }, + { + "index": 215, + "name": "Christine Strong", + "first": "Sofia", + "last": "Alvarez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/donjain/73.jpg", + "expanded": false, + "guid": "7f27c6f9-a6f0-49b2-b6d4-0824fb02c1ba", + "integer": 2, + "date": "Fri Feb 27 1976 21:08:15 GMT-0800 (PST)", + "shortText": "incididunt mollit", + "mediumText": "Labore labore consectetur aliquip pariatur sit eu voluptate minim enim eu cillum proident.", + "longText": "Sint sit deserunt proident nulla culpa in reprehenderit veniam commodo consequat aliquip dolor. Eu mollit cillum et nulla nulla culpa voluptate proident irure mollit non ipsum nisi. Reprehenderit laboris eiusmod magna exercitation consectetur nulla sit do cupidatat est ad dolore culpa. Eiusmod commodo eiusmod dolore est ad reprehenderit occaecat irure. Adipisicing quis aliqua qui non labore consectetur ullamco aliquip.\r\nLorem fugiat excepteur do cupidatat labore elit tempor fugiat et. Commodo laborum nisi consectetur laboris culpa veniam ea minim fugiat dolor qui et pariatur occaecat. Culpa est ullamco in esse. Ut aliquip id dolore aute ullamco et velit veniam et est aute sunt. Sint Lorem consectetur elit occaecat ea enim proident sunt cupidatat cillum officia. Quis eu veniam deserunt occaecat aliqua est exercitation consequat ipsum officia sit Lorem aliqua.\r\nAmet mollit in ad sit. Adipisicing occaecat laboris qui enim ut aute deserunt proident. Ipsum labore laboris sunt nulla amet ad. Duis voluptate ut veniam est quis amet et occaecat.\r\nDuis pariatur voluptate ut veniam aliquip commodo ipsum commodo do. Pariatur deserunt laboris veniam duis ipsum dolore et duis laboris quis officia ad reprehenderit deserunt. Deserunt Lorem esse ad duis veniam ad proident dolore culpa enim commodo sunt est ex.\r\nExcepteur deserunt deserunt ea dolor nulla. Laborum irure elit ut fugiat deserunt amet nisi. Magna do elit est esse pariatur qui mollit proident esse. Id laborum amet fugiat ipsum tempor reprehenderit.\r\n", + "address": "3 Celeste Court", + "city": "Herbster", + "state": "Arkansas", + "zip": 97896, + "country": "Bahamas", + "email": "sofiaalvarez@scentric.com", + "phone": "(990) 470-3077", + "color": "rgb(250,51,175)" + }, + { + "index": 216, + "name": "Love Baldwin", + "first": "Rivers", + "last": "Rosales", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/21lab/73.jpg", + "expanded": false, + "guid": "b67fea0d-b75f-4344-8a9f-fe87e3c61b52", + "integer": 84, + "date": "Wed Jan 15 1975 15:08:56 GMT-0800 (PST)", + "shortText": "do elit sint excepteur", + "mediumText": "Veniam eiusmod sit duis fugiat mollit et dolore in ad nulla culpa. Proident labore eu dolore commodo sint deserunt dolore amet ullamco nulla eiusmod excepteur. Excepteur nisi duis consectetur qui. Exercitation laborum est aliquip deserunt.", + "longText": "Quis ea et cillum aliqua culpa commodo velit cupidatat ut ea. Nisi non qui esse labore veniam veniam sit. Excepteur aliquip sit anim minim incididunt consectetur consectetur laboris minim nisi labore in labore magna. Incididunt tempor eiusmod dolor elit et duis ex mollit.\r\nId excepteur do adipisicing laboris labore aliquip eu do enim incididunt esse nulla exercitation. Anim consequat culpa non incididunt dolore ad qui proident magna voluptate do occaecat fugiat occaecat. Velit pariatur amet ullamco quis sint.\r\n", + "address": "2 Ingraham Street", + "city": "Hendersonville", + "state": "Delaware", + "zip": 71466, + "country": "Palau", + "email": "riversrosales@scentric.com", + "phone": "(929) 466-3166", + "color": "rgb(255,204,95)" + }, + { + "index": 217, + "name": "Louisa Lang", + "first": "Jenna", + "last": "Roberson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionuss/73.jpg", + "expanded": false, + "guid": "1fb6ce5a-06bc-4d09-93bb-4da1b2003f10", + "integer": 47, + "date": "Wed Aug 26 1981 07:54:13 GMT-0700 (PDT)", + "shortText": "sint nostrud commodo exercitation", + "mediumText": "Nulla culpa incididunt et veniam nisi officia. Et non fugiat incididunt in fugiat ad ullamco dolor cillum duis irure officia veniam dolor. Pariatur qui veniam cillum sunt consequat eiusmod ipsum.", + "longText": "Quis consequat ea velit ea labore do dolore. Aute in dolore occaecat sint dolor labore. Sunt consectetur laborum qui nostrud dolore reprehenderit sint sunt eu reprehenderit. Ullamco proident labore occaecat nostrud. Sint velit in do ut duis laborum ut ullamco. Tempor sunt consectetur officia veniam. Et cillum occaecat mollit tempor proident sunt mollit.\r\nOccaecat incididunt esse occaecat et non culpa culpa aliqua ex. Aute cillum magna nostrud ea. Anim consequat aliquip enim veniam culpa velit ea irure quis id ipsum deserunt ad. Elit dolor proident laboris nostrud id pariatur aute ut deserunt. Mollit consequat occaecat eiusmod ad voluptate laboris duis. Quis nulla culpa occaecat ea ullamco voluptate cupidatat irure. Incididunt amet ipsum cupidatat sint officia reprehenderit consequat velit non reprehenderit commodo ut amet.\r\nAliqua commodo ipsum ex officia esse veniam elit ullamco. Laborum adipisicing Lorem sint nisi commodo sunt aute commodo cupidatat reprehenderit ut exercitation. Eu ea magna anim in fugiat mollit proident exercitation ullamco amet. Ex ullamco et nulla non deserunt ullamco occaecat officia enim. Officia ea ullamco cillum dolor et aliqua elit consectetur nulla ex dolor nostrud aute velit. Exercitation mollit consequat consectetur veniam pariatur ullamco sit sunt dolore sint deserunt ut esse. Sint ullamco voluptate est veniam ullamco sit.\r\n", + "address": "4 Miller Place", + "city": "Sims", + "state": "Federated States Of Micronesia", + "zip": 93413, + "country": "Tuvalu", + "email": "jennaroberson@scentric.com", + "phone": "(943) 474-3085", + "color": "rgb(143,132,181)" + }, + { + "index": 218, + "name": "Snyder Cortez", + "first": "Ronda", + "last": "Nielsen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bameyrick/73.jpg", + "expanded": false, + "guid": "633a4429-d43e-452c-9b6c-b53f2ee2e347", + "integer": 85, + "date": "Tue Jan 06 1981 00:45:11 GMT-0800 (PST)", + "shortText": "ullamco deserunt adipisicing sint esse", + "mediumText": "Nostrud mollit exercitation culpa ipsum adipisicing fugiat aliquip ex.", + "longText": "Cupidatat veniam officia quis fugiat proident eu. Lorem voluptate enim do aute ut veniam ut. Ullamco exercitation cupidatat ipsum culpa aliqua duis veniam ullamco proident in fugiat dolore ullamco. Quis in irure adipisicing occaecat.\r\nVeniam consectetur labore consectetur consequat enim irure sunt. Enim nulla pariatur aliquip aute proident aute deserunt fugiat nisi irure ipsum irure proident. Ad laboris do aute ullamco et reprehenderit velit commodo ipsum magna sunt duis.\r\nOfficia excepteur sunt ut tempor Lorem in mollit ipsum et tempor cupidatat veniam. Aliqua id dolore Lorem officia quis velit. Ut tempor elit fugiat incididunt quis ad eiusmod in.\r\nExercitation Lorem aliquip laboris laboris incididunt qui laboris adipisicing irure laboris qui non deserunt qui. Voluptate sit aliquip ullamco anim. Dolore nulla ea culpa fugiat adipisicing qui proident do elit proident fugiat magna dolore quis.\r\nExcepteur elit laboris proident adipisicing ipsum aute ipsum magna voluptate officia officia consequat amet ullamco. Amet nostrud elit do culpa consectetur occaecat sint culpa id labore sit qui pariatur. Sunt esse nisi in proident labore excepteur deserunt elit cupidatat non. Labore sunt commodo nisi eu incididunt qui cillum tempor anim voluptate. Adipisicing dolor consequat pariatur id enim laboris incididunt duis magna enim velit fugiat esse.\r\n", + "address": "3 Quentin Road", + "city": "Islandia", + "state": "Guam", + "zip": 18417, + "country": "Liechtenstein", + "email": "rondanielsen@scentric.com", + "phone": "(819) 547-2703", + "color": "rgb(69,55,248)" + }, + { + "index": 219, + "name": "Michael Nixon", + "first": "Paul", + "last": "Huber", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/p_cherkashin/73.jpg", + "expanded": false, + "guid": "77b470a6-85b9-4d08-9bda-af2cf7b97919", + "integer": 86, + "date": "Mon Aug 24 1987 23:29:34 GMT-0700 (PDT)", + "shortText": "et", + "mediumText": "Adipisicing dolore magna sunt duis quis cillum incididunt sit commodo minim nisi irure culpa.", + "longText": "Sit qui excepteur consequat veniam. Qui deserunt nostrud esse velit nulla culpa ex. Enim esse nostrud quis consectetur ea ex. Veniam reprehenderit deserunt dolore ipsum Lorem reprehenderit ipsum laborum adipisicing adipisicing qui.\r\n", + "address": "3 Baltic Street", + "city": "Marienthal", + "state": "Pennsylvania", + "zip": 77950, + "country": "Virgin Islands (US)", + "email": "paulhuber@scentric.com", + "phone": "(822) 531-2515", + "color": "rgb(213,114,213)" + }, + { + "index": 220, + "name": "Erna Collier", + "first": "Brady", + "last": "Haney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tube_man/73.jpg", + "expanded": false, + "guid": "2b70bd78-953b-4f78-b980-0443e7865502", + "integer": 89, + "date": "Thu Apr 09 1981 13:14:33 GMT-0800 (PST)", + "shortText": "labore consectetur qui", + "mediumText": "Eiusmod eiusmod sit consectetur dolor adipisicing adipisicing ipsum laborum. Nostrud est non sunt est Lorem aliquip non incididunt. Ad consequat incididunt labore adipisicing eiusmod magna ad pariatur quis.", + "longText": "Nostrud ullamco quis aliqua veniam officia est commodo anim commodo est exercitation. Dolor reprehenderit dolore occaecat anim cillum deserunt. Nostrud laboris esse quis voluptate magna esse. Et mollit mollit ad consectetur adipisicing do ullamco Lorem mollit cillum cillum pariatur ipsum duis. In exercitation esse nisi nostrud aliquip non velit magna incididunt anim. Dolor mollit eu quis laborum quis duis esse nisi exercitation duis duis quis adipisicing.\r\nFugiat nisi do reprehenderit dolor amet velit fugiat incididunt quis et aute eu cillum consequat. Occaecat laborum cupidatat occaecat voluptate proident irure anim proident sit in. In culpa ex pariatur deserunt sint in consectetur eiusmod. Aliqua cupidatat aute ullamco eiusmod fugiat.\r\nEx officia ut Lorem ex nisi pariatur incididunt qui. Fugiat pariatur ut tempor excepteur anim enim qui sint occaecat eiusmod veniam ad enim amet. Anim magna nulla magna pariatur. Mollit excepteur minim cillum irure nisi quis irure quis velit consectetur. Laboris sint aliquip minim aliqua incididunt eiusmod dolor amet. Velit sint cillum consectetur commodo culpa do exercitation amet laboris est laborum magna officia sit.\r\n", + "address": "3 Lawrence Street", + "city": "Summerset", + "state": "New Hampshire", + "zip": 76548, + "country": "Svalbard and Jan Mayen Islands", + "email": "bradyhaney@scentric.com", + "phone": "(933) 464-2281", + "color": "rgb(61,84,220)" + }, + { + "index": 221, + "name": "Serena Holden", + "first": "Dorsey", + "last": "James", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicolaseek/73.jpg", + "expanded": false, + "guid": "e34b73b6-5bae-4d6e-8d76-8b030ff4d104", + "integer": 49, + "date": "Mon May 27 1985 00:38:05 GMT-0700 (PDT)", + "shortText": "occaecat Lorem", + "mediumText": "Sunt minim duis et reprehenderit commodo aute dolore. Elit veniam occaecat adipisicing officia ex.", + "longText": "Consectetur ipsum quis in veniam ipsum voluptate velit deserunt minim aute. Consectetur in commodo aliquip voluptate anim. Culpa veniam enim in voluptate do nulla culpa deserunt. Mollit in sit exercitation dolore id eu duis nulla consectetur laborum sit ex eu et.\r\nLaborum id occaecat labore voluptate officia labore in id cillum occaecat. Nisi et amet elit excepteur irure adipisicing est cillum sit est velit cillum. Irure Lorem qui qui Lorem qui id. Est velit adipisicing voluptate Lorem consectetur ut exercitation occaecat amet adipisicing sit adipisicing. Cillum sint quis incididunt sint anim et. Adipisicing veniam pariatur id laboris amet est cillum. Eiusmod in mollit in velit culpa Lorem consequat ad mollit amet laboris qui.\r\nIn nisi exercitation irure pariatur consequat consequat labore ipsum anim commodo fugiat id. Aute est sit reprehenderit cupidatat cupidatat pariatur laborum nulla culpa minim sunt. Consectetur ipsum duis dolor velit labore nisi magna enim voluptate laborum exercitation et.\r\n", + "address": "3 Green Street", + "city": "Allensworth", + "state": "North Dakota", + "zip": 77281, + "country": "Ethiopia", + "email": "dorseyjames@scentric.com", + "phone": "(856) 447-3354", + "color": "rgb(81,131,93)" + }, + { + "index": 222, + "name": "Tabitha Alvarado", + "first": "Grant", + "last": "Bauer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/joshjoshmatson/73.jpg", + "expanded": false, + "guid": "f0707477-7ccf-4f35-b9d8-ecdcea4b5444", + "integer": 59, + "date": "Sat Mar 13 1971 23:17:16 GMT-0800 (PST)", + "shortText": "cupidatat exercitation pariatur commodo anim", + "mediumText": "Nisi nulla est ipsum laboris. Ut et ea pariatur aute. Fugiat dolore esse laborum sunt.", + "longText": "Cupidatat pariatur nostrud cillum fugiat sint culpa officia adipisicing ipsum occaecat. Sunt id tempor tempor consectetur sint eu esse ullamco deserunt proident Lorem sit. Exercitation et ex dolor exercitation elit labore aute veniam consectetur. Duis mollit ut eiusmod reprehenderit duis anim qui.\r\nIpsum anim veniam nostrud occaecat et proident qui cupidatat voluptate eu enim esse Lorem nulla. Nulla voluptate ex irure ex excepteur minim duis ut ipsum aliqua ullamco. Excepteur ipsum proident ea duis Lorem ad incididunt esse non officia amet excepteur exercitation. Sit amet sint velit velit officia fugiat. Laboris aliqua irure incididunt nulla aliqua exercitation labore nostrud incididunt. Labore eu amet magna deserunt.\r\nAliqua adipisicing et aute ut occaecat laboris nulla. Excepteur non Lorem fugiat incididunt officia minim sunt tempor dolore magna ullamco ad veniam enim. Sunt labore adipisicing consequat non proident excepteur ullamco cupidatat eiusmod nulla culpa elit aliquip minim. Fugiat qui sint Lorem velit ea.\r\n", + "address": "3 Oak Street", + "city": "Kapowsin", + "state": "Northern Mariana Islands", + "zip": 57454, + "country": "Togo", + "email": "grantbauer@scentric.com", + "phone": "(985) 414-2281", + "color": "rgb(61,94,134)" + }, + { + "index": 223, + "name": "Tami Berger", + "first": "Rocha", + "last": "Ayers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jacopobassan/73.jpg", + "expanded": false, + "guid": "e0993984-2847-4494-bcec-273869d52b83", + "integer": 68, + "date": "Sun Nov 14 1971 20:32:38 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Sit pariatur pariatur commodo magna fugiat aliquip proident qui. In tempor eu commodo id elit qui. Dolore do irure Lorem officia minim sit nostrud ad qui enim enim. Ut est nisi voluptate qui quis anim dolor sunt ad duis commodo. Fugiat nostrud minim pariatur do occaecat aliqua id proident veniam dolor nisi dolor.", + "longText": "Ad culpa eu proident mollit est duis eu ad et tempor dolore. Amet exercitation nostrud dolore nulla fugiat veniam dolor. Velit sit tempor aliquip ut officia. Excepteur commodo anim veniam esse amet tempor ipsum magna ut cillum eiusmod. Aute eiusmod in aliqua Lorem do aliqua ut id aliquip consectetur ut. Deserunt irure veniam voluptate eu esse in ea eiusmod.\r\nOfficia ipsum laboris proident mollit deserunt esse tempor laborum. Fugiat sit aliqua occaecat est dolore amet incididunt ullamco exercitation qui sit dolore ullamco. Dolore est cupidatat commodo veniam pariatur aliqua cillum cillum sunt et enim exercitation. Ut eu consequat culpa anim. Adipisicing enim et deserunt ullamco adipisicing dolor eu. Laboris velit labore labore consectetur ea pariatur quis.\r\nCulpa anim consectetur ad sint tempor aliquip. Ad magna cillum ut Lorem exercitation esse id labore sint nulla enim. Pariatur in reprehenderit consectetur mollit ullamco irure Lorem Lorem anim fugiat. Aliquip est elit sunt nisi labore. Voluptate reprehenderit excepteur ullamco tempor id ut excepteur laborum tempor. Proident dolore voluptate sunt ullamco qui sint culpa consectetur anim velit.\r\nPariatur consectetur excepteur anim elit do consectetur sint aute veniam duis quis. Ut ipsum mollit amet culpa laborum. Dolor nostrud commodo commodo deserunt dolore quis voluptate occaecat voluptate deserunt. Anim ipsum proident non eu eu ea nulla aliqua aliqua amet sit officia ut. Proident tempor ullamco elit cillum occaecat reprehenderit fugiat minim pariatur laborum anim ipsum. Velit Lorem Lorem do mollit occaecat ullamco adipisicing ut officia. Exercitation culpa magna duis proident magna velit culpa laboris eiusmod cupidatat sunt cillum.\r\n", + "address": "3 Benson Avenue", + "city": "Alfarata", + "state": "South Dakota", + "zip": 99292, + "country": "Zimbabwe", + "email": "rochaayers@scentric.com", + "phone": "(912) 557-3383", + "color": "rgb(237,77,56)" + }, + { + "index": 224, + "name": "Toni Hubbard", + "first": "Manuela", + "last": "Matthews", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benhalllondon/73.jpg", + "expanded": false, + "guid": "6a196cdc-9694-4c30-a010-23fe19d05ccf", + "integer": 64, + "date": "Wed Mar 30 1994 01:18:27 GMT-0800 (PST)", + "shortText": "amet laboris do pariatur", + "mediumText": "Quis quis ex anim ea officia anim aute. Duis nostrud adipisicing consectetur dolor aute laboris deserunt eu. Tempor reprehenderit occaecat dolor Lorem minim laboris adipisicing cupidatat veniam eu laborum amet qui. Do Lorem anim do cupidatat.", + "longText": "Sit cupidatat ullamco esse sit Lorem laboris. Nisi culpa excepteur aute ad consectetur. Ad mollit dolor incididunt nostrud elit laboris nostrud nulla officia. Exercitation cillum proident deserunt aute minim proident.\r\n", + "address": "2 Autumn Avenue", + "city": "Hebron", + "state": "Alaska", + "zip": 68123, + "country": "Azerbaijan", + "email": "manuelamatthews@scentric.com", + "phone": "(802) 454-3368", + "color": "rgb(190,58,156)" + }, + { + "index": 225, + "name": "Mcmillan Burris", + "first": "Tisha", + "last": "Reese", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/umurgdk/73.jpg", + "expanded": false, + "guid": "4c6aa7ad-4530-4d0d-a5d2-bc8d25596090", + "integer": 19, + "date": "Tue Mar 08 2005 12:31:16 GMT-0800 (PST)", + "shortText": "deserunt elit occaecat", + "mediumText": "Duis veniam voluptate sint nulla adipisicing ea eiusmod qui eiusmod sunt sunt amet labore.", + "longText": "Dolor sint nostrud velit sit deserunt dolore. Duis velit commodo do tempor enim. Ex non occaecat ea commodo sint id officia aute. Eu eiusmod irure cupidatat reprehenderit ea duis qui velit nulla quis duis. Adipisicing fugiat consequat officia quis commodo reprehenderit cillum consectetur consectetur ut. Labore elit elit proident et aute voluptate ex sit quis voluptate commodo voluptate cupidatat commodo. Nulla deserunt elit in non cillum fugiat laborum pariatur esse in.\r\nQui aliqua quis eu enim cillum occaecat labore. Qui cupidatat nisi cillum commodo. Lorem nisi eu sint esse excepteur do.\r\nIncididunt quis deserunt in dolor dolore in mollit commodo sint tempor. Ullamco pariatur magna ad amet voluptate mollit aliquip. Ad ad irure magna anim id esse exercitation ipsum velit fugiat voluptate culpa ipsum. Officia ullamco fugiat minim dolor aliqua nulla amet eu nulla commodo. Duis ea et sunt laborum.\r\nLabore excepteur non aliquip sunt ad anim. Consectetur ipsum officia amet consectetur est. Fugiat duis exercitation nulla aliqua esse tempor aliquip et sunt qui.\r\nDeserunt nostrud sunt elit enim id id pariatur proident enim duis. Duis aute cillum sunt id commodo sint aute ipsum Lorem sint magna commodo. Dolor cillum cupidatat laboris incididunt amet excepteur voluptate occaecat excepteur. Veniam et nulla non tempor.\r\n", + "address": "3 Graham Avenue", + "city": "Brenton", + "state": "Louisiana", + "zip": 80517, + "country": "French Southern Territories", + "email": "tishareese@scentric.com", + "phone": "(886) 572-2143", + "color": "rgb(148,208,184)" + }, + { + "index": 226, + "name": "Conrad Holder", + "first": "Rebecca", + "last": "Cole", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_vectorhugo/73.jpg", + "expanded": false, + "guid": "2db95cdc-541c-4e6c-bb8a-9afb329188a9", + "integer": 96, + "date": "Thu Sep 30 1971 17:22:25 GMT-0700 (PDT)", + "shortText": "cillum minim aute laboris", + "mediumText": "Anim ullamco labore do labore nisi id cillum.", + "longText": "Ipsum enim minim fugiat voluptate quis consequat eiusmod aliquip exercitation ad sit labore nostrud. Dolore qui enim irure dolore anim enim amet et cupidatat. Id nisi fugiat proident Lorem sunt sunt voluptate mollit mollit sit elit veniam sint Lorem. Consectetur pariatur commodo ullamco duis nostrud. Reprehenderit elit labore consectetur incididunt veniam quis adipisicing enim ea ut do enim.\r\nTempor in pariatur reprehenderit occaecat anim labore aliqua elit irure. Duis fugiat deserunt commodo occaecat pariatur sint. Dolore aliqua aute ut aliqua qui.\r\n", + "address": "2 Butler Place", + "city": "Grazierville", + "state": "Missouri", + "zip": 37800, + "country": "Finland", + "email": "rebeccacole@scentric.com", + "phone": "(863) 438-3293", + "color": "rgb(252,113,153)" + }, + { + "index": 227, + "name": "Finley Norman", + "first": "Kemp", + "last": "Ramsey", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/traicyer/73.jpg", + "expanded": false, + "guid": "8d123ac2-6255-4f83-a056-c073a8853e3c", + "integer": 94, + "date": "Mon Nov 19 1979 06:35:50 GMT-0800 (PST)", + "shortText": "dolor id consequat occaecat", + "mediumText": "Magna cupidatat incididunt non excepteur deserunt eiusmod reprehenderit aliquip aute et. Culpa mollit laboris qui et veniam reprehenderit do eu sit id.", + "longText": "Mollit minim culpa ipsum aute ullamco. Tempor esse dolor exercitation in enim culpa ipsum sint eu laborum. Ea enim laboris veniam non duis quis. Laboris tempor culpa aliquip eiusmod tempor est ea mollit anim aute voluptate ea. Adipisicing incididunt irure cillum nisi sunt enim duis. Fugiat nostrud officia enim ea.\r\nNisi ullamco Lorem minim deserunt cillum esse officia labore anim commodo incididunt. Eu veniam consectetur ea commodo esse deserunt Lorem ex voluptate ad ad fugiat quis. Velit magna mollit eiusmod fugiat nulla ipsum cupidatat anim non eu nisi. Sint esse est ullamco eiusmod dolore et velit mollit pariatur fugiat sunt ipsum occaecat. Proident quis magna in occaecat aliqua nisi exercitation ea in.\r\n", + "address": "4 Fay Court", + "city": "Libertytown", + "state": "Kentucky", + "zip": 74614, + "country": "United Arab Emirates", + "email": "kempramsey@scentric.com", + "phone": "(983) 496-2931", + "color": "rgb(56,255,141)" + }, + { + "index": 228, + "name": "Tara Campos", + "first": "Roach", + "last": "Dodson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brunodesign1206/73.jpg", + "expanded": false, + "guid": "777f0227-f8c4-47a4-b0d6-5b0b0703a74d", + "integer": 47, + "date": "Mon Aug 12 1974 17:16:53 GMT-0700 (PDT)", + "shortText": "aliquip nostrud", + "mediumText": "Culpa aute ut ea nisi excepteur reprehenderit consectetur veniam proident deserunt adipisicing excepteur tempor. Laboris adipisicing elit eu proident amet aliquip tempor elit in ut eiusmod proident ea. Aliquip sint quis sit nulla esse ut ullamco qui nostrud nisi sit. Velit cupidatat tempor sit esse. Anim ad officia dolore do mollit et excepteur cupidatat veniam.", + "longText": "Exercitation mollit et Lorem qui aliqua ex pariatur aliquip. Quis elit amet esse eiusmod labore. Excepteur sint sunt aute qui eiusmod ullamco commodo dolore duis ea eiusmod.\r\nConsequat irure minim mollit id amet pariatur qui. Exercitation aute nostrud veniam minim Lorem commodo velit. Nostrud sunt officia dolor aliquip veniam veniam cupidatat. Nisi ut nostrud occaecat cupidatat laborum amet ad reprehenderit voluptate nulla quis nostrud in. Mollit reprehenderit qui sit esse duis laboris sunt fugiat aute qui ex eiusmod non nisi. Dolore veniam ad anim veniam cillum nulla incididunt exercitation velit.\r\nNostrud tempor deserunt est minim aute anim dolore. Minim enim cillum voluptate officia tempor tempor excepteur duis non est elit velit do. Excepteur eiusmod cillum sunt deserunt reprehenderit labore eu aliquip commodo fugiat. Consequat minim exercitation eu fugiat occaecat aliquip elit elit dolore aliquip ea ea. Aliqua ex irure cillum labore ut mollit esse veniam sit.\r\nAliqua nisi non eu ad est enim reprehenderit culpa laborum. Mollit aute esse velit est labore quis irure. Nostrud tempor labore labore aliquip laboris excepteur ad. Lorem incididunt proident pariatur laboris do. Officia magna nostrud eiusmod velit commodo incididunt magna reprehenderit ullamco. Dolore culpa culpa cillum minim voluptate in.\r\n", + "address": "2 Agate Court", + "city": "Genoa", + "state": "American Samoa", + "zip": 48715, + "country": "Portugal", + "email": "roachdodson@scentric.com", + "phone": "(878) 581-2211", + "color": "rgb(224,94,95)" + }, + { + "index": 229, + "name": "Glass Navarro", + "first": "Potter", + "last": "Lowe", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/michalhron/73.jpg", + "expanded": false, + "guid": "181d7287-30f7-4285-bfa9-e21d28869bd0", + "integer": 86, + "date": "Wed Aug 11 1971 11:38:44 GMT-0700 (PDT)", + "shortText": "eu mollit sit", + "mediumText": "Aliquip nulla excepteur elit fugiat. Aliqua do enim eu dolor ipsum nostrud exercitation et veniam ad dolor. Culpa cillum labore aliquip sint do aliqua occaecat culpa ad officia eiusmod irure qui. Occaecat nostrud ad ullamco consequat.", + "longText": "Labore adipisicing pariatur nostrud in irure quis culpa culpa proident. Nulla et est exercitation id Lorem quis in. Culpa non veniam velit do dolore culpa commodo sunt consectetur ullamco laboris. Aliqua est fugiat reprehenderit occaecat qui. Et do Lorem veniam anim cillum do ullamco tempor elit amet.\r\nAliqua exercitation in aute excepteur aute elit nisi ex minim. Proident ex quis eiusmod cupidatat laboris esse consectetur dolor Lorem reprehenderit commodo labore nostrud consectetur. Ea duis tempor proident ad ea mollit adipisicing nisi exercitation voluptate irure ipsum irure velit. Tempor anim eiusmod sint aliquip cillum consectetur deserunt.\r\nAdipisicing laboris ex eiusmod elit ipsum cupidatat anim qui dolor fugiat quis nisi culpa. Sint consequat irure laborum in enim elit irure incididunt sit. Magna consequat quis deserunt ad mollit deserunt. Non id anim consectetur culpa ut do anim do sint veniam. Est amet ea minim minim labore Lorem.\r\n", + "address": "2 Allen Avenue", + "city": "Kilbourne", + "state": "Minnesota", + "zip": 75102, + "country": "Comoros", + "email": "potterlowe@scentric.com", + "phone": "(987) 576-3068", + "color": "rgb(171,255,82)" + }, + { + "index": 230, + "name": "Amparo Pope", + "first": "Maribel", + "last": "Burks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/itskylemacey/73.jpg", + "expanded": false, + "guid": "f12a9fbc-2a4f-4fa5-8a07-f9241aa3cab1", + "integer": 91, + "date": "Sat Jun 12 2010 19:41:10 GMT-0700 (PDT)", + "shortText": "qui laborum ipsum est", + "mediumText": "Reprehenderit esse occaecat et incididunt ut eu cillum exercitation ut veniam irure. Sunt eu ullamco enim exercitation amet pariatur adipisicing nulla cillum.", + "longText": "Ipsum aliqua eu anim cupidatat tempor cillum tempor in officia anim. Culpa tempor adipisicing qui elit culpa eiusmod aliquip commodo. Dolore commodo consequat mollit ex nostrud aute incididunt officia anim incididunt reprehenderit. Labore Lorem labore minim et consectetur quis laboris incididunt pariatur esse nostrud. Dolore aute mollit esse esse.\r\nIncididunt sunt cillum nisi ea. Fugiat culpa excepteur id est magna sit proident labore commodo. Nostrud cupidatat consectetur nisi ipsum reprehenderit minim sint Lorem consequat cillum eiusmod aliqua pariatur Lorem. Proident magna est sit elit est eiusmod aliquip occaecat ullamco ea officia occaecat ut esse. Sunt tempor cupidatat enim ad reprehenderit incididunt voluptate aute dolor occaecat pariatur dolor.\r\n", + "address": "2 Gerritsen Avenue", + "city": "Westerville", + "state": "Hawaii", + "zip": 56057, + "country": "Central African Republic", + "email": "maribelburks@scentric.com", + "phone": "(843) 435-2675", + "color": "rgb(79,131,175)" + }, + { + "index": 231, + "name": "Dillard Johns", + "first": "Viola", + "last": "Pruitt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mikaeljorhult/73.jpg", + "expanded": false, + "guid": "9b589ef4-79b4-4bc1-89ea-0b50bf8f5dad", + "integer": 74, + "date": "Thu Aug 21 1980 02:27:46 GMT-0700 (PDT)", + "shortText": "id nisi", + "mediumText": "Magna excepteur laboris enim magna quis ea sint. Velit ex nisi elit reprehenderit nostrud amet quis eu cillum exercitation. Ex elit adipisicing exercitation esse.", + "longText": "Sint nisi cillum ipsum laboris. Reprehenderit irure occaecat reprehenderit excepteur adipisicing exercitation incididunt sunt dolore. Deserunt elit reprehenderit tempor elit ex ea consequat eiusmod incididunt velit et consectetur officia quis. Id sunt enim quis ex nulla in ullamco voluptate anim esse nulla. Eu excepteur dolore deserunt consectetur esse et esse do cupidatat deserunt pariatur irure deserunt sunt.\r\nNon ut tempor Lorem fugiat cupidatat nostrud pariatur veniam fugiat sunt incididunt ut. Exercitation anim officia incididunt irure nulla sunt commodo eu non. Consectetur amet est laboris amet ipsum reprehenderit non exercitation non exercitation duis ut.\r\nEu laborum dolor amet sint deserunt mollit officia est. Velit minim id et deserunt ullamco sint elit tempor dolore consectetur. Cillum aute ut consequat aliqua laboris. Fugiat aute aliqua id ipsum laboris labore labore tempor mollit sunt sint. Sunt consectetur exercitation pariatur commodo occaecat voluptate velit dolore. Exercitation consectetur dolore reprehenderit aliqua eu consequat minim dolore ullamco nisi amet deserunt amet. Occaecat amet nulla incididunt ut cupidatat.\r\nPariatur irure sunt duis Lorem ad veniam ea duis. Anim irure amet commodo proident incididunt laborum elit in voluptate occaecat minim occaecat consequat. Dolore Lorem ex ipsum nulla deserunt dolore aute. Voluptate consectetur irure ea reprehenderit mollit eiusmod occaecat sunt ea adipisicing cupidatat. Proident laboris magna duis aliquip fugiat pariatur exercitation mollit laboris amet sint ea. Sit ex ex consequat sit.\r\nExcepteur amet in id pariatur ullamco excepteur excepteur proident in. Veniam non labore nostrud culpa excepteur sit enim ad duis non commodo nulla. Minim incididunt in ad reprehenderit. Culpa esse magna duis exercitation laboris. Adipisicing eiusmod consectetur culpa cupidatat nostrud sint veniam adipisicing.\r\n", + "address": "2 Grove Street", + "city": "Matthews", + "state": "Alabama", + "zip": 12918, + "country": "Gabon", + "email": "violapruitt@scentric.com", + "phone": "(908) 451-2708", + "color": "rgb(144,170,102)" + }, + { + "index": 232, + "name": "Jeanie Huffman", + "first": "Karyn", + "last": "Edwards", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ryoseptiian/73.jpg", + "expanded": false, + "guid": "7e4ee6b2-7816-43c3-9885-e74857955244", + "integer": 20, + "date": "Sat Apr 12 1975 06:27:04 GMT-0700 (PDT)", + "shortText": "ut sint consectetur", + "mediumText": "Cillum id mollit deserunt officia sint aliquip. Do duis reprehenderit voluptate cupidatat cupidatat Lorem quis fugiat incididunt ut occaecat mollit.", + "longText": "Fugiat sunt proident consequat culpa eiusmod consequat reprehenderit enim sunt. Sit ea ex ex qui labore in. Laborum sint occaecat proident eiusmod ex sit sint commodo officia aliqua culpa. Aliqua reprehenderit exercitation labore Lorem mollit fugiat.\r\nOfficia laborum reprehenderit amet laboris ex. Ullamco qui adipisicing ex laboris do minim proident veniam. Quis voluptate deserunt elit in culpa. Lorem id sint ut exercitation non qui.\r\nEu officia do irure veniam proident in veniam irure. Dolore sint do ad amet proident velit labore incididunt pariatur proident ea velit mollit adipisicing. Anim dolor in reprehenderit sunt ea nostrud est pariatur non do ad.\r\nConsequat amet reprehenderit cillum incididunt et ullamco consequat consequat proident irure. Est veniam tempor ea ad. Reprehenderit sunt tempor exercitation laborum labore anim ad duis consequat.\r\n", + "address": "2 Linden Boulevard", + "city": "Ripley", + "state": "North Carolina", + "zip": 45918, + "country": "Cambodia", + "email": "karynedwards@scentric.com", + "phone": "(877) 447-2061", + "color": "rgb(177,244,78)" + }, + { + "index": 233, + "name": "Alfreda Neal", + "first": "Dunlap", + "last": "Mcclure", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/olivierpineda/73.jpg", + "expanded": false, + "guid": "c5d9f660-404e-4dd8-a4e9-8ebd95a6d6eb", + "integer": 83, + "date": "Sun Dec 31 1978 03:35:38 GMT-0800 (PST)", + "shortText": "fugiat aliquip", + "mediumText": "Eu nulla fugiat dolor magna commodo veniam laboris sint minim Lorem pariatur do. Do elit esse magna voluptate aute nisi cillum. Voluptate culpa aliquip ea quis sunt cillum dolore cupidatat.", + "longText": "Lorem exercitation et mollit tempor Lorem consectetur irure anim. Irure officia elit tempor consequat irure non qui labore id consequat nisi cupidatat. Voluptate labore id adipisicing mollit consequat nulla mollit aute ut occaecat sint incididunt est irure. Tempor irure eiusmod commodo cillum. Officia quis reprehenderit quis elit mollit ea pariatur eu aliquip non aute. Incididunt amet consequat ad velit consequat dolore elit velit qui ea. In qui non adipisicing id anim eiusmod commodo qui Lorem deserunt culpa adipisicing.\r\n", + "address": "2 Bogart Street", + "city": "Shrewsbury", + "state": "Connecticut", + "zip": 80957, + "country": "New Zealand", + "email": "dunlapmcclure@scentric.com", + "phone": "(913) 592-3075", + "color": "rgb(208,154,61)" + }, + { + "index": 234, + "name": "Livingston Osborn", + "first": "Mathis", + "last": "Webster", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronalfred/73.jpg", + "expanded": false, + "guid": "c008efb7-14cd-4e64-96a7-2ea18524bdcd", + "integer": 54, + "date": "Sat Mar 01 1986 18:24:28 GMT-0800 (PST)", + "shortText": "ut eiusmod", + "mediumText": "Do mollit cupidatat nostrud esse ex velit esse adipisicing elit labore laboris enim anim. Magna dolore nulla cillum qui laborum et sint anim culpa non aute et. Tempor nisi eiusmod laboris ex aliquip commodo id. Eiusmod aliqua aliqua sunt non ipsum veniam aliqua consequat.", + "longText": "Elit do reprehenderit eiusmod minim quis cillum ad culpa. Cupidatat eu laborum amet duis consectetur culpa fugiat dolore aute. Lorem veniam exercitation cupidatat veniam et nulla. Veniam occaecat exercitation minim nisi dolor proident adipisicing sit non. Occaecat dolore ea minim in deserunt.\r\nSint aliqua magna Lorem nostrud nisi consequat mollit. Labore Lorem amet consectetur reprehenderit duis est ullamco velit eu officia ut labore esse id. Deserunt officia ea est enim nisi elit amet deserunt do labore duis anim. Aliquip non dolore cillum dolore dolor ex tempor velit aliqua enim.\r\nIncididunt consectetur commodo irure et ut adipisicing proident velit. Qui quis consequat id irure. Mollit amet proident irure incididunt deserunt magna.\r\nLaboris ut sint incididunt sit proident officia ex non. Consequat laborum Lorem aute voluptate est laborum quis Lorem nulla. Id velit est cillum elit adipisicing aliquip occaecat nulla nulla pariatur incididunt. In veniam occaecat occaecat ad amet culpa tempor. Non cupidatat pariatur officia et cillum adipisicing veniam elit sint. In cillum minim in occaecat adipisicing. Exercitation labore in ipsum veniam non veniam amet quis.\r\n", + "address": "4 Beverly Road", + "city": "Greer", + "state": "South Carolina", + "zip": 53490, + "country": "Lebanon", + "email": "mathiswebster@scentric.com", + "phone": "(862) 466-2481", + "color": "rgb(99,84,116)" + }, + { + "index": 235, + "name": "Stephenson Blanchard", + "first": "Kirkland", + "last": "Washington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrebay007/73.jpg", + "expanded": false, + "guid": "8dc10004-46f6-432d-ad1a-b1e2ed707ea2", + "integer": 48, + "date": "Mon Feb 20 2012 00:23:49 GMT-0800 (PST)", + "shortText": "officia", + "mediumText": "Incididunt cupidatat non esse ut adipisicing mollit aliquip ipsum eiusmod ullamco id aute nostrud veniam. Labore ipsum sunt duis elit labore dolor incididunt et consequat enim veniam. Ullamco quis nulla culpa ad labore laborum reprehenderit enim aliqua sit ad duis laboris. Proident non voluptate amet pariatur veniam laborum culpa sint anim mollit.", + "longText": "Nostrud mollit aliquip consectetur voluptate cillum. Qui labore aute adipisicing exercitation officia sint ipsum pariatur consectetur magna ad ad proident. Aute commodo esse veniam deserunt elit. Quis magna occaecat culpa eiusmod ipsum elit occaecat culpa. Excepteur laborum tempor ad consequat consectetur quis tempor anim. Mollit ex magna mollit ad voluptate excepteur.\r\nAmet incididunt veniam sunt deserunt non dolor. Tempor duis laboris laboris amet ullamco labore culpa sit id veniam aliquip adipisicing sunt nisi. Laboris et irure veniam pariatur quis anim officia ad. Ullamco labore anim ipsum labore ex velit nisi fugiat. Ea aliquip sunt fugiat eiusmod ex ullamco id reprehenderit pariatur nulla non sunt ad ullamco. Aliqua enim occaecat tempor ex eu magna eu nulla ex exercitation aute.\r\nQui excepteur dolore aute sunt. Laborum ea do reprehenderit adipisicing ullamco sunt nulla deserunt labore. Adipisicing eiusmod consequat in velit proident voluptate cillum. Ipsum eu adipisicing dolore aute dolor fugiat id deserunt aute veniam. Labore irure sunt non aliqua ut est cupidatat eiusmod ipsum occaecat veniam amet ex fugiat. Consequat voluptate et dolor sint cupidatat anim eiusmod enim veniam.\r\nIncididunt quis non quis ea exercitation. Cupidatat sint duis est commodo sit nulla aliqua ut amet quis fugiat. Amet aliquip aliqua duis minim aute fugiat. Quis veniam sunt ipsum voluptate. Laborum fugiat officia reprehenderit aliqua ad do quis consectetur laboris in consectetur amet anim proident. Deserunt veniam ut pariatur sunt magna aute sit pariatur. Cupidatat dolor mollit aliqua est occaecat dolore laboris sint.\r\n", + "address": "3 Humboldt Street", + "city": "Bath", + "state": "Michigan", + "zip": 99644, + "country": "Armenia", + "email": "kirklandwashington@scentric.com", + "phone": "(927) 536-3348", + "color": "rgb(161,139,176)" + }, + { + "index": 236, + "name": "Mary Bolton", + "first": "Shawn", + "last": "Bean", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thisisgordon/73.jpg", + "expanded": false, + "guid": "9a1ae6b3-19d6-49d3-ade8-41d80ef9a7f9", + "integer": 89, + "date": "Tue Jan 23 1973 17:15:25 GMT-0800 (PST)", + "shortText": "sunt eu amet proident tempor", + "mediumText": "Commodo elit commodo sit sit consectetur excepteur ipsum id exercitation officia amet. Enim amet occaecat reprehenderit ipsum cillum tempor.", + "longText": "Eiusmod quis enim excepteur ipsum magna mollit adipisicing proident deserunt velit ea consequat. Cillum cillum commodo sit ipsum enim ullamco elit consequat non. Ullamco adipisicing occaecat ullamco duis enim velit voluptate eiusmod quis ipsum sunt eu.\r\nEiusmod consectetur id ea ut velit ad eu. Cillum adipisicing id nostrud qui aliquip excepteur anim. Non nulla dolor proident culpa. Adipisicing ea laborum minim occaecat cupidatat sint. Id commodo ipsum laboris ullamco esse excepteur. Duis deserunt consequat proident irure sit ad fugiat.\r\nEx ipsum amet minim cillum ut mollit minim ullamco. Dolor nostrud non dolor est tempor ad ipsum. Minim pariatur ut reprehenderit Lorem.\r\nUllamco eu tempor id fugiat officia in eu incididunt ut elit culpa. Amet eiusmod tempor eiusmod sunt. Nostrud eiusmod eiusmod exercitation sit voluptate dolore. Sint magna officia et consectetur aute nostrud qui. Officia est non non laborum aliqua eu nisi magna do id. Do amet sit culpa pariatur do sunt et eiusmod veniam. Laborum voluptate est ad est eiusmod do commodo aliqua proident id incididunt.\r\n", + "address": "2 Rapelye Street", + "city": "Steinhatchee", + "state": "Maine", + "zip": 24857, + "country": "Cayman Islands", + "email": "shawnbean@scentric.com", + "phone": "(881) 597-2110", + "color": "rgb(52,77,146)" + }, + { + "index": 237, + "name": "Jaime Horn", + "first": "Nina", + "last": "Larsen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rainfalls/73.jpg", + "expanded": false, + "guid": "2d358e80-f8a9-4f14-879c-3e0d6dc7d398", + "integer": 6, + "date": "Tue Jan 10 2006 08:17:15 GMT-0800 (PST)", + "shortText": "do pariatur irure laborum qui", + "mediumText": "Magna aliquip cupidatat laborum fugiat. Et consequat est magna minim veniam mollit nulla ipsum dolore anim adipisicing enim in. Sit veniam sint velit tempor dolor laboris aute deserunt laboris incididunt aute.", + "longText": "Irure fugiat consectetur velit dolor commodo voluptate aliquip irure incididunt veniam. Cillum ipsum cupidatat qui velit consequat. Dolor laboris voluptate irure exercitation aute fugiat. Eu reprehenderit eu Lorem ex. Sint non exercitation mollit non officia nostrud non pariatur cupidatat sit enim dolor in.\r\nId qui pariatur labore commodo ex irure amet. Ex eiusmod esse consequat consequat. Irure culpa occaecat id nostrud id laborum Lorem nulla nostrud nostrud. Velit nulla voluptate cupidatat laboris do. Nisi amet anim fugiat irure esse anim exercitation non. Incididunt in id sit Lorem anim consectetur tempor ex do. Lorem pariatur do consectetur non consectetur velit magna sit eiusmod fugiat irure veniam eiusmod.\r\nMinim consequat ad nostrud sint occaecat et ea non ad et. Nostrud Lorem laborum esse amet ad dolore dolore fugiat commodo consectetur. Fugiat sint et incididunt nulla et est laborum esse ad aliqua. Quis est cupidatat sit ad reprehenderit eu commodo. Id occaecat adipisicing excepteur proident proident aliquip duis ea nostrud consectetur. Ex amet velit ad ipsum minim commodo cillum aliqua magna aliquip eiusmod nisi anim.\r\nIrure reprehenderit non aute laboris ipsum nostrud adipisicing amet voluptate. Eiusmod laborum veniam aliqua laboris consectetur do esse et mollit laborum esse. Quis excepteur officia sunt eu eiusmod enim laboris in aute. Minim nisi ipsum labore laborum. Officia eiusmod nostrud qui consectetur.\r\n", + "address": "3 Grimes Road", + "city": "Stagecoach", + "state": "Kansas", + "zip": 54299, + "country": "Italy", + "email": "ninalarsen@scentric.com", + "phone": "(833) 427-3141", + "color": "rgb(238,80,95)" + }, + { + "index": 238, + "name": "Ewing Prince", + "first": "Burch", + "last": "Hinton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eldelentes/73.jpg", + "expanded": false, + "guid": "c51adfad-516d-4572-a27b-d5029bf01030", + "integer": 70, + "date": "Sun Aug 28 2005 15:03:02 GMT-0700 (PDT)", + "shortText": "labore labore", + "mediumText": "Deserunt elit sint laborum occaecat qui mollit. In anim ad ea dolor enim nisi ut veniam. Adipisicing nisi dolore quis excepteur labore sit commodo officia qui irure elit. Ipsum commodo consectetur reprehenderit magna excepteur reprehenderit laborum culpa ullamco Lorem eu tempor eiusmod non.", + "longText": "Aliqua enim eu do veniam excepteur consequat non cillum elit consequat ipsum ea esse. Elit sit et nulla laboris ad consectetur minim ut tempor consequat do. Enim aute pariatur nostrud aliqua nulla amet adipisicing.\r\nCulpa nulla dolore exercitation dolore nulla officia. Consequat ut mollit eu cillum qui nisi consequat deserunt tempor ut fugiat. Commodo reprehenderit dolore mollit ut. Et irure consequat qui ad ipsum enim cillum in in. Aute exercitation in sunt exercitation consequat aliquip culpa ipsum deserunt esse cupidatat id.\r\nQuis deserunt quis deserunt reprehenderit sint do. Qui cillum ut minim officia amet ullamco eu nulla eu laborum ipsum excepteur. Enim aliqua occaecat commodo non anim pariatur sunt aute minim eiusmod nisi eu est. Minim esse duis nisi exercitation id dolor. Duis ullamco proident exercitation proident duis laborum irure enim ut amet.\r\n", + "address": "3 Downing Street", + "city": "Dyckesville", + "state": "Iowa", + "zip": 40075, + "country": "Lesotho", + "email": "burchhinton@scentric.com", + "phone": "(876) 448-2187", + "color": "rgb(251,248,74)" + }, + { + "index": 239, + "name": "Sharlene Bryan", + "first": "Celina", + "last": "Jimenez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/robinclediere/73.jpg", + "expanded": false, + "guid": "fc6767db-fb4a-4de3-bcc2-5a503cd8bbe6", + "integer": 40, + "date": "Mon Oct 02 1972 11:23:02 GMT-0700 (PDT)", + "shortText": "id", + "mediumText": "Exercitation exercitation exercitation proident adipisicing quis. Non aliquip dolore nostrud amet exercitation officia do elit duis nisi. Proident sit sunt magna pariatur commodo in culpa exercitation nostrud culpa adipisicing.", + "longText": "Officia adipisicing aliquip duis amet enim officia fugiat non aute exercitation. Elit ut cillum incididunt exercitation veniam id aliqua nulla voluptate reprehenderit sunt deserunt officia adipisicing. Sint ullamco eiusmod occaecat velit cupidatat ullamco pariatur ut duis fugiat. Non ullamco non aliqua cupidatat occaecat ipsum ea ut. Tempor enim ut voluptate laborum laborum reprehenderit cillum ea voluptate tempor magna ullamco enim amet. Dolor cupidatat sint do mollit.\r\n", + "address": "4 Putnam Avenue", + "city": "Fairfield", + "state": "Vermont", + "zip": 49521, + "country": "Mongolia", + "email": "celinajimenez@scentric.com", + "phone": "(853) 562-3172", + "color": "rgb(187,177,206)" + }, + { + "index": 240, + "name": "Anastasia Marquez", + "first": "Mcdonald", + "last": "Goff", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/73.jpg", + "expanded": false, + "guid": "356dd512-ac27-409d-a8ae-9a518b9f0d09", + "integer": 71, + "date": "Sun Aug 11 2013 06:10:11 GMT-0700 (PDT)", + "shortText": "eu esse tempor", + "mediumText": "Excepteur esse voluptate ut officia nulla excepteur minim enim. Dolore tempor dolore ex sunt pariatur irure.", + "longText": "Irure consequat qui labore nulla veniam. Adipisicing magna eiusmod quis anim et nostrud occaecat fugiat pariatur id esse commodo et ad. Sunt adipisicing tempor Lorem tempor eiusmod ut fugiat laboris voluptate sunt. Cillum ipsum voluptate duis veniam consequat nostrud pariatur commodo aute quis. Sit aute ex quis voluptate minim incididunt veniam. Excepteur nulla qui proident id est. Id aliquip excepteur proident culpa sunt enim non ad.\r\nNon nulla proident adipisicing non nulla adipisicing magna laboris ad duis occaecat duis velit. Sunt eiusmod nulla laboris quis adipisicing adipisicing excepteur. Ea ea labore magna labore consectetur eiusmod laboris qui dolore aliquip aliquip. Reprehenderit Lorem voluptate sunt tempor non reprehenderit officia duis quis tempor.\r\nEt laboris incididunt excepteur laborum ad eu aliqua commodo pariatur. Esse in fugiat elit voluptate ad excepteur magna cillum ipsum ipsum et non fugiat ipsum. Adipisicing ut ut ex in qui fugiat incididunt exercitation excepteur consequat adipisicing.\r\nExcepteur mollit amet enim dolore ad laborum esse exercitation. Aute deserunt ullamco culpa nostrud dolore sunt nisi laboris esse Lorem culpa irure. Irure consectetur nulla Lorem laborum enim ut ut incididunt id pariatur. Est eiusmod velit ad magna deserunt excepteur sunt ex tempor elit aliquip amet. Exercitation laborum sit commodo nostrud velit pariatur Lorem cupidatat exercitation.\r\nEiusmod ex mollit aute sint aliqua nulla ea irure eiusmod dolore proident aute officia voluptate. Ipsum consequat sunt ea aliquip ea enim sint irure Lorem. Incididunt enim consequat mollit amet et occaecat qui est cupidatat ad. Cupidatat voluptate consequat cupidatat et amet in. Cupidatat id laboris duis nostrud et reprehenderit fugiat. Sit laborum non duis et.\r\n", + "address": "3 Corbin Place", + "city": "Nadine", + "state": "Nebraska", + "zip": 41484, + "country": "Germany", + "email": "mcdonaldgoff@scentric.com", + "phone": "(891) 532-3564", + "color": "rgb(165,152,170)" + }, + { + "index": 241, + "name": "Faith Hayes", + "first": "Lessie", + "last": "Garza", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hsinyo23/73.jpg", + "expanded": false, + "guid": "97574a4a-fc23-4e79-add5-5296baa4336a", + "integer": 36, + "date": "Mon Oct 29 1984 10:50:51 GMT-0800 (PST)", + "shortText": "enim consequat velit occaecat", + "mediumText": "Exercitation aute eu cupidatat labore laboris ut incididunt voluptate quis sint sit. Enim id incididunt officia aliqua adipisicing ipsum. Et duis laboris tempor velit fugiat.", + "longText": "Magna do nisi exercitation qui. Amet nostrud magna magna deserunt Lorem consectetur consectetur. Laborum exercitation magna occaecat ex commodo. Proident reprehenderit Lorem et fugiat deserunt eiusmod proident pariatur aute sint dolor. Nisi deserunt labore mollit labore eiusmod. Culpa ad aute deserunt occaecat fugiat. Ad qui labore exercitation do sint aliquip culpa ex nulla enim laboris voluptate ad.\r\nLaborum proident sit laborum excepteur. Eiusmod id in dolore sunt pariatur laboris esse. Consectetur in officia non ea aute id occaecat adipisicing nulla velit. Qui reprehenderit cupidatat quis quis elit aute tempor amet incididunt incididunt qui pariatur.\r\nConsequat veniam labore laborum cillum nostrud. Aute sit enim tempor occaecat magna ea reprehenderit consectetur sint consectetur cillum. Qui proident eiusmod quis quis duis. Ex ex laboris elit culpa laborum laboris dolore nisi id ipsum pariatur quis cupidatat. Velit id fugiat Lorem veniam. Elit pariatur culpa incididunt eiusmod anim ullamco dolore. Magna deserunt cillum non cupidatat nulla exercitation ullamco ipsum adipisicing consequat pariatur.\r\n", + "address": "2 Billings Place", + "city": "Fowlerville", + "state": "Florida", + "zip": 63875, + "country": "Thailand", + "email": "lessiegarza@scentric.com", + "phone": "(853) 436-2778", + "color": "rgb(129,67,86)" + }, + { + "index": 242, + "name": "Berg Ray", + "first": "Greer", + "last": "Turner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/axel/73.jpg", + "expanded": false, + "guid": "0fbc2172-5658-40d0-babd-9610530bf605", + "integer": 78, + "date": "Thu Apr 29 2004 02:33:23 GMT-0700 (PDT)", + "shortText": "reprehenderit labore quis voluptate magna", + "mediumText": "Veniam et magna fugiat ut ex pariatur deserunt non. Ullamco dolor esse esse ut laboris reprehenderit eiusmod amet enim. Proident sit cupidatat est consequat ex excepteur fugiat cupidatat aliquip. Veniam non sit dolor ea proident consequat elit nulla elit incididunt labore ullamco. Ut proident incididunt laboris esse.", + "longText": "Dolor tempor duis veniam excepteur nulla nostrud. Officia consectetur est adipisicing do duis quis laborum. Tempor proident proident qui consequat eu. Voluptate magna adipisicing non nulla non dolor cupidatat fugiat irure. Pariatur Lorem culpa ex sunt cupidatat. Non incididunt cupidatat mollit esse Lorem. Est et laborum enim et laborum officia non amet aliquip deserunt.\r\nMinim cupidatat eiusmod cupidatat ad amet incididunt deserunt duis velit excepteur ipsum culpa qui. Tempor eiusmod incididunt voluptate dolore id dolor dolor. Eu enim deserunt eu laborum sunt excepteur excepteur aliquip exercitation occaecat nulla magna. Est officia proident irure quis consectetur. Ut magna veniam aliquip laborum fugiat ex ea ut sint laboris sint. Quis exercitation sit nostrud proident sint et do cillum sunt duis excepteur anim aute non.\r\n", + "address": "2 Schermerhorn Street", + "city": "Century", + "state": "New Jersey", + "zip": 72260, + "country": "Seychelles", + "email": "greerturner@scentric.com", + "phone": "(962) 538-2574", + "color": "rgb(215,92,57)" + }, + { + "index": 243, + "name": "Gates Bush", + "first": "Cohen", + "last": "Sweet", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/traneblow/73.jpg", + "expanded": false, + "guid": "6dd5c482-2b39-4e90-9158-ad1ef6027185", + "integer": 69, + "date": "Tue Nov 02 1982 15:17:04 GMT-0800 (PST)", + "shortText": "anim culpa culpa", + "mediumText": "Commodo et fugiat adipisicing voluptate est. Occaecat laborum ad reprehenderit in nulla dolore. Quis aute excepteur fugiat aute laboris. Ex sint consectetur dolore magna exercitation velit reprehenderit labore irure proident aliquip cupidatat aute. Ad eiusmod anim id magna elit aliqua.", + "longText": "Proident amet commodo elit sunt aliqua et irure officia. Eu quis pariatur dolore mollit esse cupidatat ut do. Officia laborum laboris quis ullamco minim adipisicing proident ullamco occaecat elit amet. Ad magna ea est dolore. Nulla irure nostrud et commodo veniam ad veniam culpa culpa adipisicing velit qui enim nostrud. Nostrud labore labore proident voluptate do quis deserunt aute ad minim velit amet ad cillum.\r\nIncididunt in fugiat incididunt tempor reprehenderit commodo ipsum aute labore laboris duis. Deserunt fugiat fugiat ipsum minim dolore ex excepteur sit cillum duis sint velit aute est. Adipisicing occaecat ut esse ullamco sint enim eu magna tempor laboris. Pariatur aute nisi id dolore mollit do occaecat ad. Consequat proident eiusmod tempor veniam incididunt commodo culpa eiusmod minim enim duis aliquip. Dolore irure eiusmod laboris nostrud ipsum laborum Lorem. Amet proident enim exercitation id duis dolor officia sunt.\r\nIn ea fugiat pariatur mollit proident fugiat do labore id Lorem aute. Nostrud sit duis minim duis laborum laboris adipisicing cillum veniam adipisicing commodo exercitation ex in. Aliqua enim velit consequat do tempor enim laborum dolore sit. Non quis irure laborum sunt cupidatat exercitation culpa reprehenderit id excepteur ullamco magna dolor aute. Nostrud nisi amet pariatur esse dolor elit aliquip dolore esse do dolor officia laboris officia. Anim voluptate sint quis sit veniam non aliqua ipsum proident qui nostrud mollit. Consectetur sunt duis ex tempor laborum eiusmod velit commodo aute laborum.\r\nAliqua commodo commodo non do occaecat esse culpa minim fugiat in labore consequat reprehenderit proident. Laboris pariatur proident ut et veniam cillum Lorem consequat qui eiusmod. Enim veniam nisi enim aliquip exercitation cillum fugiat.\r\nProident dolor ipsum aliqua amet sit do labore aute commodo. Laboris fugiat id laboris occaecat. Qui dolor id aliqua elit ex non adipisicing culpa tempor duis et laboris officia. Eu dolore pariatur est voluptate incididunt ea proident duis non incididunt minim et nulla ex. Exercitation excepteur incididunt fugiat id anim deserunt consequat nisi veniam laboris officia consectetur fugiat. Eu excepteur esse anim reprehenderit dolor enim reprehenderit aliqua consectetur cillum quis. Nisi sint quis incididunt commodo duis sit deserunt dolor laborum dolore labore ex commodo cillum.\r\n", + "address": "4 Hunterfly Place", + "city": "Osage", + "state": "Wisconsin", + "zip": 10229, + "country": "Chad", + "email": "cohensweet@scentric.com", + "phone": "(961) 506-3669", + "color": "rgb(223,99,51)" + }, + { + "index": 244, + "name": "Rosella Sharpe", + "first": "Hilary", + "last": "Jacobs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thimo_cz/73.jpg", + "expanded": false, + "guid": "b8a9b448-8f16-4879-88a7-b438a45e7dcc", + "integer": 36, + "date": "Mon Feb 09 1998 12:55:02 GMT-0800 (PST)", + "shortText": "labore consectetur", + "mediumText": "Ullamco deserunt sunt consectetur irure adipisicing nostrud incididunt incididunt cillum. Amet aute dolor labore pariatur aliquip reprehenderit sunt.", + "longText": "Nisi ad esse nulla reprehenderit elit. Occaecat amet qui consectetur quis occaecat reprehenderit ea ad ex fugiat nulla. Voluptate et velit ullamco aliquip adipisicing qui pariatur deserunt deserunt minim. Amet elit ullamco ea adipisicing aute enim non culpa quis officia exercitation pariatur.\r\nMollit qui ut nulla elit. Consectetur qui mollit adipisicing aute ad irure culpa reprehenderit proident labore. Lorem aliquip consequat tempor laborum duis id dolore aliqua. Ullamco culpa culpa adipisicing duis labore irure proident qui elit proident dolor dolor sit. Nisi nisi velit dolore ipsum Lorem cillum aute occaecat excepteur labore enim exercitation mollit non.\r\nCillum consectetur deserunt duis nulla pariatur laborum adipisicing. Nisi magna duis irure aute irure proident tempor aliquip quis sunt amet. Veniam excepteur laborum culpa nostrud id et consequat ut aliqua velit. In quis enim sunt minim esse est proident elit consequat. Ipsum id ad pariatur officia pariatur cupidatat qui sunt. Irure ut officia magna mollit et quis labore amet esse deserunt tempor Lorem duis. Duis exercitation officia ea est ipsum sunt.\r\nEiusmod Lorem officia velit elit cupidatat aliqua occaecat non aute ut nulla do pariatur. Mollit enim ad officia eiusmod sint qui ex non incididunt. Eiusmod irure voluptate aliquip nisi dolore adipisicing incididunt Lorem aute minim ea labore aute. Occaecat fugiat esse velit sit cupidatat non occaecat ex laborum qui magna enim. Laboris eu nisi nostrud incididunt est. Id dolore in adipisicing non et velit exercitation Lorem elit excepteur deserunt.\r\n", + "address": "2 Emerald Street", + "city": "Basye", + "state": "Washington", + "zip": 84048, + "country": "Uruguay", + "email": "hilaryjacobs@scentric.com", + "phone": "(850) 481-3931", + "color": "rgb(175,197,147)" + }, + { + "index": 245, + "name": "Ballard Mason", + "first": "Nell", + "last": "Harper", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/majksner/73.jpg", + "expanded": false, + "guid": "4367e70e-505b-4a00-b33c-8ad5dbef5274", + "integer": 22, + "date": "Tue Feb 21 1995 19:57:05 GMT-0800 (PST)", + "shortText": "labore incididunt", + "mediumText": "Sit culpa ipsum eu nulla quis id in nostrud tempor officia tempor voluptate enim. Anim ut ullamco reprehenderit eu. Enim veniam do labore eiusmod enim elit dolor.", + "longText": "Duis do esse cillum ea esse ad. Quis incididunt nulla commodo eiusmod. Magna ipsum reprehenderit sit dolor non esse culpa anim aliquip. Esse adipisicing nostrud pariatur consectetur aliqua reprehenderit ad. Cupidatat incididunt cupidatat sit proident consequat enim duis consequat mollit elit deserunt qui. Deserunt dolor do nisi quis laboris dolor irure esse excepteur. Ex consequat incididunt id et in esse officia laboris nostrud.\r\nDolor labore nulla nisi ex sit nisi qui sit aliqua dolore elit dolore incididunt. Laboris qui do duis ipsum pariatur nulla magna. Elit reprehenderit veniam reprehenderit laboris proident amet mollit sunt minim et deserunt sint nulla minim. Nisi sunt eu aute ea ut pariatur est magna voluptate tempor anim. Do id laboris Lorem magna commodo voluptate nostrud magna cupidatat proident irure nostrud laboris sunt.\r\nQui occaecat excepteur ea magna quis enim magna consectetur nostrud consequat non veniam tempor nostrud. Mollit et ex aute aute consectetur veniam aute ut sunt culpa eu. Ullamco amet voluptate adipisicing nulla consectetur in. Minim excepteur enim aliquip nisi velit duis ea. Consectetur minim fugiat nostrud reprehenderit minim et proident id pariatur Lorem proident ipsum eiusmod. Ea nulla enim ullamco aute do. Laborum consequat sint ipsum consectetur.\r\nIrure ullamco dolore aute occaecat excepteur proident dolor. Nulla ut sunt adipisicing dolor elit duis sit laboris commodo do est. Do cillum est voluptate tempor mollit officia cupidatat ad pariatur elit officia ullamco. Eu esse aute officia est duis commodo aliquip ipsum officia cupidatat do magna Lorem. Cillum incididunt adipisicing minim aliquip ea esse adipisicing laborum proident deserunt. Deserunt Lorem excepteur enim id nisi pariatur tempor eiusmod proident nisi.\r\n", + "address": "2 Boynton Place", + "city": "Gerber", + "state": "Oregon", + "zip": 35064, + "country": "Burkina Faso", + "email": "nellharper@scentric.com", + "phone": "(978) 583-3962", + "color": "rgb(114,234,175)" + }, + { + "index": 246, + "name": "Alexis Kramer", + "first": "Koch", + "last": "Carpenter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/angelcreative/73.jpg", + "expanded": false, + "guid": "27db3441-a52c-4633-9e2e-c1b68bbab9ab", + "integer": 18, + "date": "Wed May 05 2010 06:16:29 GMT-0700 (PDT)", + "shortText": "amet fugiat ut", + "mediumText": "Ad cupidatat amet ullamco ullamco officia cillum sit id duis non non. Eiusmod pariatur ea ipsum et exercitation enim minim eu nostrud voluptate. Reprehenderit nostrud nisi aliquip elit ea culpa laborum irure aliqua deserunt labore ea. Minim occaecat id quis consectetur irure nostrud exercitation laborum. Nostrud est nostrud anim reprehenderit enim dolore irure laborum enim est deserunt incididunt laboris magna.", + "longText": "Magna ex exercitation dolor ex et sit enim fugiat ad sint velit officia sunt. Sint officia dolor fugiat minim id amet dolore commodo reprehenderit aute veniam. Eu non do irure proident consequat velit pariatur amet voluptate dolor exercitation. Deserunt sunt sunt sunt eiusmod qui culpa irure anim dolor aute consequat adipisicing. Enim velit est esse ea laboris Lorem do.\r\nLabore est aliqua exercitation minim et. Proident occaecat eu aliquip minim sit mollit Lorem. Lorem aute consectetur incididunt ullamco ut et labore laboris labore. Exercitation aute ullamco velit duis.\r\nUt velit tempor proident ut. Laboris cillum enim ut aliqua amet minim et do cupidatat elit commodo veniam aliquip culpa. Duis minim consectetur proident excepteur aliquip sint quis ex sunt laboris veniam deserunt commodo aute. Commodo ipsum laborum quis exercitation nostrud aute ad laboris. Anim sint sit et minim amet officia. Pariatur labore exercitation proident veniam duis sit exercitation cupidatat cillum Lorem ea duis non.\r\nEa veniam ad voluptate labore dolore esse in. Occaecat et est sint sint tempor non culpa veniam proident elit eiusmod proident adipisicing. Proident cupidatat et nulla amet nulla.\r\nEx est duis consequat proident est. Adipisicing enim elit labore eu in ipsum qui consectetur do veniam labore. Nostrud ullamco mollit cillum Lorem labore labore mollit non amet voluptate ullamco magna. Ex id quis eiusmod eiusmod Lorem est. Velit Lorem velit pariatur fugiat irure ad est cillum cupidatat tempor sit exercitation. Lorem ea cillum aliqua nisi veniam nostrud excepteur. Magna cillum aliquip anim irure dolor.\r\n", + "address": "2 Hudson Avenue", + "city": "Hiseville", + "state": "Illinois", + "zip": 75977, + "country": "Greenland", + "email": "kochcarpenter@scentric.com", + "phone": "(912) 523-3269", + "color": "rgb(254,230,133)" + }, + { + "index": 247, + "name": "Larson Mcguire", + "first": "Earnestine", + "last": "Curry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcus3de/73.jpg", + "expanded": false, + "guid": "0e87dcfe-dfe9-4c49-9da7-37fac49566fb", + "integer": 69, + "date": "Wed Apr 27 1977 14:45:51 GMT-0700 (PDT)", + "shortText": "aute quis minim laborum", + "mediumText": "Fugiat deserunt ea do sint pariatur anim.", + "longText": "Ex ullamco ut irure quis dolore aliqua ex reprehenderit culpa non do. Amet mollit dolore esse anim velit. Dolore et laborum excepteur voluptate deserunt voluptate occaecat officia consequat veniam ad aliquip. Nisi commodo in Lorem consequat ut irure fugiat quis deserunt dolore.\r\nEiusmod tempor in reprehenderit ut ut do in labore minim consectetur laboris sunt ullamco. Eu ut fugiat enim magna elit proident. Velit laborum ipsum pariatur laborum elit pariatur quis.\r\n", + "address": "3 Blake Court", + "city": "Riceville", + "state": "West Virginia", + "zip": 44569, + "country": "Fiji", + "email": "earnestinecurry@scentric.com", + "phone": "(947) 457-2441", + "color": "rgb(192,84,251)" + }, + { + "index": 248, + "name": "Elisa Gilbert", + "first": "Opal", + "last": "Rush", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lizpradal/73.jpg", + "expanded": false, + "guid": "af31a9db-6478-45f9-b053-48ea4d2c7ad2", + "integer": 12, + "date": "Sun Aug 17 1986 13:15:07 GMT-0700 (PDT)", + "shortText": "et nulla incididunt in in", + "mediumText": "Occaecat cupidatat proident cupidatat officia exercitation veniam exercitation nisi.", + "longText": "Ex enim magna pariatur eiusmod aliqua ad id sit in culpa adipisicing sint ut anim. Ex duis consequat non voluptate exercitation qui nostrud dolore quis ipsum esse. Exercitation nisi tempor ut labore fugiat incididunt cupidatat non sunt esse. Anim mollit nisi ut veniam amet voluptate labore eiusmod adipisicing fugiat ullamco aute amet duis. Ea fugiat dolore ipsum dolore ex velit laborum aliquip eu mollit minim. Eu non dolor adipisicing sint elit labore eiusmod et aliqua.\r\nIpsum cupidatat laborum consequat excepteur quis fugiat ex veniam sint tempor ullamco sit ut aliquip. Magna ex exercitation duis proident anim ipsum esse commodo in dolor irure. Ullamco occaecat culpa elit aliquip do.\r\n", + "address": "2 Belmont Avenue", + "city": "Manitou", + "state": "Mississippi", + "zip": 31901, + "country": "Viet Nam", + "email": "opalrush@scentric.com", + "phone": "(944) 429-3751", + "color": "rgb(73,188,227)" + }, + { + "index": 249, + "name": "Richardson Pena", + "first": "Lauri", + "last": "Macias", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mironcatalin/73.jpg", + "expanded": false, + "guid": "d2190b02-e2b9-47da-9a5d-43ab822a4242", + "integer": 1, + "date": "Sat Apr 25 1981 19:27:16 GMT-0800 (PST)", + "shortText": "dolor culpa", + "mediumText": "Veniam excepteur elit esse ex mollit. Aliquip adipisicing consectetur occaecat aliquip consectetur nisi ut est ipsum tempor cillum eiusmod excepteur.", + "longText": "Sint labore cillum sit elit consequat est sunt voluptate. Irure velit enim anim elit ea culpa ut consequat aute magna dolore. Sit reprehenderit elit eiusmod in enim. Sint elit officia laborum qui do eiusmod voluptate sunt et consequat. Duis laboris consequat culpa excepteur sunt qui irure est cupidatat eiusmod dolor mollit. Eiusmod est irure quis ut ad aliqua consectetur fugiat consectetur.\r\nDeserunt voluptate laboris occaecat pariatur elit. Ad eiusmod pariatur incididunt cillum irure duis labore labore. Nostrud nostrud minim aliquip nostrud eiusmod sunt ipsum reprehenderit labore enim ea tempor. Nostrud laboris mollit enim eu labore deserunt.\r\nOfficia non reprehenderit laborum quis cupidatat sit. Consectetur dolore est non tempor Lorem sint eu ea cupidatat occaecat dolor. Culpa sunt aliquip id dolore mollit aliquip esse qui culpa in amet sit incididunt. Ullamco est laborum aliqua incididunt. Aliquip id mollit minim proident sit.\r\nCulpa nostrud culpa deserunt culpa Lorem laborum minim sit sit. Ullamco qui do sunt est duis. Voluptate magna deserunt ipsum esse laborum dolor cillum. Magna cillum laborum sit veniam.\r\nQuis enim deserunt et mollit adipisicing. Eu sunt in esse adipisicing eu consequat magna dolore commodo labore culpa elit. Consequat elit fugiat ullamco in non dolor. Eu irure adipisicing laborum nisi commodo ipsum consequat officia ipsum in dolore laboris culpa.\r\n", + "address": "2 Atkins Avenue", + "city": "Bynum", + "state": "Rhode Island", + "zip": 45405, + "country": "France, Metropolitan", + "email": "laurimacias@scentric.com", + "phone": "(889) 487-2711", + "color": "rgb(140,77,221)" + }, + { + "index": 250, + "name": "James Christensen", + "first": "Atkinson", + "last": "White", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/michaelbowden3/73.jpg", + "expanded": false, + "guid": "5b8652f2-a3c4-4f58-b4ae-df90d92002f2", + "integer": 99, + "date": "Tue Jan 30 1979 23:03:56 GMT-0800 (PST)", + "shortText": "veniam mollit ad nisi", + "mediumText": "Labore veniam anim aliqua duis deserunt dolor aliquip. Excepteur est non labore eiusmod id duis. Exercitation occaecat occaecat excepteur sit sint sit nisi labore ex tempor consequat duis.", + "longText": "Excepteur laborum velit eu irure dolor magna sit proident. Sint minim cillum commodo pariatur anim reprehenderit laborum occaecat reprehenderit pariatur ullamco. Cupidatat consectetur est incididunt enim exercitation.\r\nDeserunt tempor aliqua velit laboris qui dolore nulla culpa. Minim exercitation ut minim laborum anim aliquip minim eu dolore veniam. Ut anim do elit fugiat fugiat ad dolor ea sit velit qui dolor. Excepteur voluptate ea anim ullamco labore tempor aliqua sunt cillum occaecat cupidatat irure tempor. Consectetur fugiat elit ullamco nisi reprehenderit exercitation. Ipsum adipisicing ullamco laboris pariatur consectetur eu amet reprehenderit. Veniam aliqua sit aute pariatur sit.\r\nAdipisicing esse ad non laboris irure dolore Lorem adipisicing. Voluptate pariatur sit et eiusmod. Est do aute elit ipsum. Non velit irure magna amet sunt ex.\r\nVeniam sint labore velit ad eu velit deserunt occaecat elit exercitation dolor. Aute proident sit nisi incididunt laborum consectetur ea minim nisi anim mollit do ipsum. Consectetur ullamco nulla eu elit non ex pariatur magna labore. Nisi reprehenderit Lorem quis commodo sit elit sunt eu occaecat ad velit excepteur irure. Exercitation reprehenderit aute consectetur velit dolore incididunt elit quis anim dolore aliqua laboris ex.\r\nDo ut in mollit sunt irure id enim cillum nulla elit cupidatat. Duis nulla enim mollit in in incididunt est anim occaecat commodo ea magna. Tempor enim excepteur nostrud nostrud non nostrud non esse. In id incididunt labore pariatur veniam ipsum Lorem.\r\n", + "address": "4 Kay Court", + "city": "Veyo", + "state": "Georgia", + "zip": 60806, + "country": "Uganda", + "email": "atkinsonwhite@scentric.com", + "phone": "(912) 432-3782", + "color": "rgb(177,214,156)" + }, + { + "index": 251, + "name": "Berry Greene", + "first": "Carey", + "last": "Hawkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bermonpainter/73.jpg", + "expanded": false, + "guid": "6f4e5523-3a13-4b9c-98c4-99a1f8a24e7e", + "integer": 50, + "date": "Tue Sep 23 1980 15:29:12 GMT-0700 (PDT)", + "shortText": "id pariatur eu ut dolor", + "mediumText": "Mollit aute aliquip veniam irure do enim commodo excepteur culpa occaecat commodo eiusmod in reprehenderit. Non reprehenderit sint officia aliqua. Nostrud fugiat minim pariatur dolore in minim ea ut cillum do pariatur mollit proident.", + "longText": "Ad amet sunt ea aliqua incididunt ea non tempor cillum et et tempor. Esse ullamco consectetur tempor fugiat fugiat fugiat. Ex elit consequat nisi quis ut anim cillum sit ipsum esse. Tempor ex adipisicing ea culpa aute do ipsum et. Ipsum eu fugiat velit dolore exercitation sunt Lorem minim dolore quis ut nulla fugiat. Ut consectetur commodo aute nulla reprehenderit voluptate dolor fugiat ullamco.\r\nQui excepteur fugiat incididunt Lorem exercitation dolore dolore magna qui. Eiusmod non adipisicing sit et nisi occaecat pariatur sint elit esse et aute laborum pariatur. Commodo sit ut esse irure incididunt non veniam labore occaecat commodo aliquip.\r\nCommodo incididunt ex deserunt exercitation reprehenderit. Exercitation consequat amet cillum incididunt enim aute nostrud. Sit esse reprehenderit nulla Lorem magna in.\r\nTempor fugiat ipsum sint excepteur enim magna fugiat irure fugiat ad nulla anim minim. Exercitation et veniam exercitation aute nulla do quis reprehenderit sint nostrud duis Lorem qui enim. Cillum pariatur aliqua et ex irure exercitation elit id minim nostrud in. Eiusmod do fugiat veniam cupidatat deserunt amet velit enim adipisicing.\r\nCupidatat est et labore fugiat eu elit consectetur et culpa voluptate. Exercitation dolor excepteur veniam eiusmod ullamco laboris et deserunt velit proident aliquip. Adipisicing Lorem do amet sunt enim. Pariatur labore qui aliquip elit excepteur culpa nulla velit ea laborum consequat commodo ipsum proident. Est est reprehenderit incididunt sint officia ex quis dolor enim et veniam.\r\n", + "address": "2 Tillary Street", + "city": "Fivepointville", + "state": "New Mexico", + "zip": 85127, + "country": "Antarctica", + "email": "careyhawkins@scentric.com", + "phone": "(868) 519-2817", + "color": "rgb(74,226,202)" + }, + { + "index": 252, + "name": "Melva Frederick", + "first": "Haley", + "last": "Morris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/parasenak/73.jpg", + "expanded": false, + "guid": "0280cd72-ee64-4c9c-aa16-67f76f572d10", + "integer": 13, + "date": "Thu Aug 27 1992 14:36:33 GMT-0700 (PDT)", + "shortText": "magna incididunt duis adipisicing consequat", + "mediumText": "Ea exercitation voluptate mollit consequat voluptate eu minim. Quis aute ullamco labore reprehenderit non elit laboris aute sunt mollit mollit sunt. Do velit ad enim nulla reprehenderit laboris mollit.", + "longText": "Ullamco eu cupidatat eiusmod aute. Ex non aute ea fugiat duis qui velit. Culpa est duis consequat pariatur ad dolor exercitation. Elit nostrud cillum officia esse incididunt. Excepteur et in ex nulla eiusmod anim aliqua qui Lorem do amet. Anim voluptate sint culpa aute esse exercitation ex proident ullamco elit deserunt duis. Qui culpa tempor exercitation anim ipsum.\r\nReprehenderit cupidatat est pariatur adipisicing ad laboris cillum aute laboris adipisicing exercitation fugiat. Nisi reprehenderit fugiat nulla et proident ut enim excepteur commodo. Laboris laborum quis fugiat consequat et do. Minim adipisicing reprehenderit tempor laborum voluptate occaecat incididunt in aliqua ipsum reprehenderit est duis deserunt. Mollit cillum cupidatat Lorem incididunt duis laborum aute incididunt do. Nisi ea amet excepteur sit aliqua nulla. Sunt fugiat consequat commodo nostrud deserunt sunt nostrud ad esse dolor.\r\n", + "address": "2 Anthony Street", + "city": "Vivian", + "state": "Arizona", + "zip": 87173, + "country": "Kiribati", + "email": "haleymorris@scentric.com", + "phone": "(914) 569-3745", + "color": "rgb(77,218,207)" + }, + { + "index": 253, + "name": "Moses Leach", + "first": "Margret", + "last": "Baird", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/duyvk/73.jpg", + "expanded": false, + "guid": "2da52347-1212-4146-ad5b-1d770195f05c", + "integer": 57, + "date": "Sat May 31 1980 05:14:11 GMT-0700 (PDT)", + "shortText": "veniam voluptate minim elit amet", + "mediumText": "Voluptate in elit laborum commodo quis do proident pariatur aliqua velit exercitation cupidatat consequat. Sint quis ex aliqua velit commodo non cillum amet magna velit laborum amet reprehenderit ipsum.", + "longText": "Mollit nostrud cillum duis do ipsum duis cillum sint veniam ipsum. Qui ad ex ad id do labore enim proident est aute. Lorem quis pariatur pariatur id dolore id. Nulla esse ullamco eu enim eu Lorem et adipisicing est nisi eiusmod proident. Nostrud deserunt duis qui ad ad. Adipisicing esse aute amet consectetur aliquip incididunt laboris id est quis.\r\nEsse sint cillum commodo deserunt elit anim excepteur elit nostrud exercitation consequat ad. Aliqua consequat ea minim sunt dolor nulla elit sunt. Ut id do culpa amet adipisicing aliqua ipsum. Reprehenderit velit ad aliquip ullamco mollit elit ea. Deserunt quis labore aliquip culpa id cupidatat irure duis aliqua nostrud tempor.\r\n", + "address": "2 Orange Street", + "city": "Rosine", + "state": "Texas", + "zip": 86725, + "country": "Ecuador", + "email": "margretbaird@scentric.com", + "phone": "(991) 577-2455", + "color": "rgb(212,247,87)" + }, + { + "index": 254, + "name": "Mindy Mendoza", + "first": "Valdez", + "last": "Mack", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/abdullindenis/73.jpg", + "expanded": false, + "guid": "c19cb89a-c62c-4a3b-a815-dc686df99a69", + "integer": 97, + "date": "Sun Sep 28 2008 12:27:09 GMT-0700 (PDT)", + "shortText": "aliqua laborum", + "mediumText": "Ea commodo et minim id consectetur ipsum ad sit dolor. Laborum laborum in irure ex cillum sunt officia. Ullamco quis cupidatat labore occaecat amet elit consequat aute aliquip esse.", + "longText": "Cillum eu mollit ex Lorem est duis sint incididunt est ullamco. Pariatur amet sit sunt et sint officia dolor elit aliqua laboris officia. Sunt duis non sint ea ut adipisicing ut Lorem ut velit do ad culpa mollit. Irure magna elit dolore do officia mollit commodo id aute. Culpa nostrud esse officia exercitation.\r\nAliqua aliqua aute reprehenderit aute cupidatat veniam. Aliquip sint veniam deserunt amet. Quis adipisicing tempor id officia non. Laborum tempor cupidatat reprehenderit ut reprehenderit quis proident veniam ipsum. Mollit voluptate officia exercitation proident enim nisi eiusmod veniam do id sint eu.\r\n", + "address": "3 Woodside Avenue", + "city": "Skyland", + "state": "District Of Columbia", + "zip": 24057, + "country": "Bulgaria", + "email": "valdezmack@scentric.com", + "phone": "(831) 594-3993", + "color": "rgb(223,79,247)" + }, + { + "index": 255, + "name": "Charles Sosa", + "first": "Ashley", + "last": "Adams", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/umutahmet29/73.jpg", + "expanded": false, + "guid": "26a576e9-cccf-480d-8ed3-bb6f7da211ef", + "integer": 89, + "date": "Thu Apr 03 1975 03:38:57 GMT-0700 (PDT)", + "shortText": "anim adipisicing", + "mediumText": "Do minim excepteur aliquip id sit non laboris sint reprehenderit. Consectetur eu pariatur et commodo velit Lorem labore consequat quis reprehenderit commodo nisi. Adipisicing deserunt consectetur non reprehenderit deserunt elit esse elit culpa sunt.", + "longText": "Et ea anim tempor labore magna tempor est deserunt eu ullamco ipsum elit. Dolore nulla ipsum do exercitation. Sit fugiat pariatur ullamco sit tempor amet reprehenderit consectetur magna.\r\nCommodo do exercitation amet deserunt eu ea mollit. Sint labore sint occaecat reprehenderit cillum sint qui pariatur et deserunt adipisicing. Mollit excepteur qui minim culpa tempor ea. Qui esse labore dolore occaecat. Cillum duis dolor id cupidatat veniam non pariatur voluptate deserunt laboris. Quis proident occaecat veniam nulla occaecat proident occaecat ullamco. Aliqua laborum aliqua enim mollit quis.\r\n", + "address": "3 Kensington Street", + "city": "Dana", + "state": "Virgin Islands", + "zip": 96003, + "country": "American Samoa", + "email": "ashleyadams@scentric.com", + "phone": "(903) 572-3575", + "color": "rgb(125,107,131)" + }, + { + "index": 256, + "name": "Turner Franco", + "first": "Norman", + "last": "George", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pinceladasdaweb/73.jpg", + "expanded": false, + "guid": "ab082048-531a-4b8d-8801-29979233e2c1", + "integer": 41, + "date": "Sun Nov 19 1989 19:54:28 GMT-0800 (PST)", + "shortText": "consequat mollit qui aute laboris", + "mediumText": "Sint in reprehenderit commodo ex cillum ipsum est Lorem dolore amet. Eu consequat nisi nostrud est velit et ex cupidatat quis sint duis do. Irure eiusmod amet esse occaecat proident occaecat sit laborum incididunt adipisicing amet enim. Ut ex ut sunt eu eu eiusmod duis do dolor occaecat commodo deserunt exercitation.", + "longText": "Aliqua sit tempor et consequat irure elit incididunt et id sint ex ad ipsum aliquip. Aliqua fugiat sint sint reprehenderit proident pariatur nostrud. Excepteur in do non minim sunt exercitation magna et sint quis aliqua eiusmod Lorem. Nostrud exercitation proident in velit aliqua dolore nisi irure veniam quis adipisicing et excepteur. Duis dolore dolor non et reprehenderit cillum commodo. Deserunt officia labore nostrud anim id fugiat anim ex voluptate dolore esse do commodo sit.\r\nEsse ut sunt commodo sint exercitation consequat ex ea exercitation reprehenderit. Nulla in laboris qui eiusmod adipisicing ex occaecat qui qui culpa aliquip magna quis. Fugiat reprehenderit exercitation ipsum reprehenderit et Lorem cillum. Lorem et dolor minim est et et.\r\nNisi ullamco ea minim ad nulla deserunt eu aute culpa ipsum ut voluptate. Ea cupidatat eiusmod est cillum amet velit aliqua esse sunt cupidatat eu aliqua reprehenderit. Voluptate voluptate proident duis ipsum minim qui. Id ex esse excepteur reprehenderit. Eiusmod adipisicing minim quis laboris aute nostrud irure officia velit fugiat. Ad minim tempor enim commodo exercitation elit cillum proident nulla cupidatat aliqua.\r\nLaboris amet aliqua nisi ut sint ex minim ullamco voluptate in. Sunt consequat ea proident occaecat aliquip est quis officia. Cillum Lorem laboris nostrud aliquip nulla laborum dolore quis aliqua nulla. Anim sint eiusmod ea in Lorem magna aliquip cillum velit.\r\nCommodo sunt nostrud deserunt id mollit do aliqua ullamco incididunt et et sunt sunt ad. Reprehenderit consequat consectetur aliquip non in. Eiusmod dolore id labore voluptate do aute ut et amet tempor tempor. Do irure laborum reprehenderit elit eiusmod cupidatat id sunt. Nisi cupidatat cillum eu sint duis et proident aliquip commodo id minim ullamco. Magna laborum exercitation elit minim dolore irure eu velit commodo Lorem.\r\n", + "address": "2 Fanchon Place", + "city": "Siglerville", + "state": "Puerto Rico", + "zip": 95024, + "country": "Angola", + "email": "normangeorge@scentric.com", + "phone": "(909) 404-3929", + "color": "rgb(236,187,197)" + }, + { + "index": 257, + "name": "Mandy Mann", + "first": "Mccoy", + "last": "Daniels", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chris_gooley/73.jpg", + "expanded": false, + "guid": "119c0379-dc8c-4fdf-a4ca-4dd7e8367fcd", + "integer": 8, + "date": "Sat Jul 18 1970 18:24:18 GMT-0700 (PDT)", + "shortText": "pariatur nulla", + "mediumText": "Sint mollit amet elit consectetur culpa. Exercitation minim laboris culpa reprehenderit est ut deserunt in est eiusmod nostrud nostrud esse. Labore laboris incididunt sit voluptate id ut. In incididunt mollit reprehenderit ea dolor commodo anim aliquip.", + "longText": "In cupidatat enim aliquip velit nisi. Elit deserunt ad excepteur deserunt consectetur nisi proident ea exercitation laboris tempor sunt. Lorem sint incididunt proident mollit est et.\r\n", + "address": "2 Lamont Court", + "city": "Rew", + "state": "Maryland", + "zip": 15110, + "country": "Bhutan", + "email": "mccoydaniels@scentric.com", + "phone": "(912) 520-2618", + "color": "rgb(135,249,131)" + }, + { + "index": 258, + "name": "Arlene Dominguez", + "first": "Felecia", + "last": "Hines", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jodyferry/73.jpg", + "expanded": false, + "guid": "280bf6b0-99d1-4792-acc8-8dde2e0f0deb", + "integer": 34, + "date": "Sat Feb 15 1992 18:16:30 GMT-0800 (PST)", + "shortText": "do non", + "mediumText": "Qui velit nulla adipisicing mollit. Officia adipisicing laboris veniam dolor enim eu laboris eu nulla tempor. Id id velit magna anim sint tempor. Voluptate nostrud anim elit laborum ut labore anim reprehenderit. Dolore ipsum do proident quis nostrud fugiat.", + "longText": "Quis veniam reprehenderit nulla quis aute deserunt cillum mollit commodo voluptate consectetur. Officia nostrud nulla tempor nulla. Dolor ipsum eu magna cillum amet velit enim amet voluptate id Lorem velit qui.\r\nProident ex amet voluptate cupidatat laborum. Laboris sint reprehenderit in minim exercitation dolor cupidatat ut proident. Aute consectetur id sunt aute pariatur velit excepteur reprehenderit adipisicing pariatur labore ea nulla mollit. Anim nulla aliqua quis minim exercitation amet sunt nulla commodo est nostrud non tempor veniam. Mollit aliquip officia consequat ex minim voluptate cillum esse. Eu sint adipisicing proident eiusmod adipisicing non. Ut excepteur mollit cupidatat anim elit sint aute magna ullamco Lorem duis dolor ullamco occaecat.\r\nDeserunt esse reprehenderit ullamco cillum velit mollit. Duis aliquip aliquip id incididunt officia magna nisi deserunt laboris magna. Enim exercitation mollit do elit voluptate minim. Sint aute incididunt Lorem nulla.\r\nConsectetur consequat nostrud et voluptate est sint ullamco adipisicing laboris. Do cillum velit enim quis reprehenderit tempor. Enim commodo duis deserunt ex et in. Voluptate Lorem qui amet anim nulla enim. Nisi voluptate do ad ea minim laborum ullamco aute amet velit officia ad et. Consequat dolore pariatur nostrud nisi ut et consequat fugiat. Occaecat aute ea officia incididunt.\r\nConsequat mollit laborum reprehenderit sit minim sunt et. Elit mollit magna in mollit cupidatat enim magna exercitation elit pariatur quis. Amet cupidatat in reprehenderit elit consectetur cillum ea aute ad exercitation quis. Velit enim officia do pariatur ex eiusmod.\r\n", + "address": "3 Howard Alley", + "city": "Corinne", + "state": "Massachusetts", + "zip": 62986, + "country": "Dominica", + "email": "feleciahines@scentric.com", + "phone": "(800) 422-3688", + "color": "rgb(143,174,64)" + }, + { + "index": 259, + "name": "Hollie Boyer", + "first": "Steele", + "last": "Schwartz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/reetajayendra/73.jpg", + "expanded": false, + "guid": "45ab7abb-8d65-4596-9843-554f49ed1ab3", + "integer": 87, + "date": "Sun Jun 06 1971 17:15:13 GMT-0700 (PDT)", + "shortText": "veniam exercitation do est laborum", + "mediumText": "Irure sunt voluptate esse minim dolor adipisicing fugiat occaecat in cupidatat do laborum. Sunt consequat nulla pariatur sit labore velit cillum cillum quis id laboris ipsum.", + "longText": "Adipisicing culpa excepteur excepteur labore. Duis esse occaecat pariatur velit qui fugiat occaecat magna et in duis. Pariatur consectetur dolore culpa esse anim cillum sint ad non adipisicing labore duis. Nisi eiusmod laboris adipisicing ea veniam cupidatat duis ad ut incididunt deserunt cupidatat. Incididunt aliqua cillum mollit dolor amet laboris dolor. Ea laborum qui Lorem duis ipsum deserunt dolore velit adipisicing minim veniam nostrud et. Irure officia Lorem labore irure ullamco.\r\nAdipisicing ullamco exercitation labore in ut. Sunt ex aliquip voluptate dolor qui ipsum est cillum magna. Dolore magna proident officia exercitation. Velit occaecat laborum laboris veniam excepteur nisi duis aliquip dolore. Consequat pariatur elit pariatur eiusmod. Minim occaecat aliquip exercitation sunt nisi dolor elit. Anim esse fugiat commodo minim.\r\nLorem incididunt aute exercitation enim qui aute. Dolore minim do proident laborum sit nulla ullamco excepteur quis sit consectetur dolore nisi. Voluptate Lorem aliqua enim aliqua mollit tempor et laborum ut aute dolor enim. Ipsum laborum anim deserunt aliquip occaecat nisi fugiat esse non cupidatat excepteur ut. Laboris velit Lorem quis aute nostrud elit dolor ullamco eiusmod exercitation. Exercitation eu ullamco cillum Lorem Lorem irure aliqua cillum anim. Adipisicing enim dolore id non enim reprehenderit voluptate velit voluptate Lorem officia.\r\n", + "address": "3 Thames Street", + "city": "Denio", + "state": "Oklahoma", + "zip": 28577, + "country": "Egypt", + "email": "steeleschwartz@scentric.com", + "phone": "(951) 401-2034", + "color": "rgb(203,161,146)" + }, + { + "index": 260, + "name": "Maxwell Levine", + "first": "Rutledge", + "last": "Vang", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/namankreative/73.jpg", + "expanded": false, + "guid": "ae81b7e2-6532-41e4-b7a5-0336231f8d86", + "integer": 22, + "date": "Tue Feb 28 1989 01:26:44 GMT-0800 (PST)", + "shortText": "id sunt eiusmod", + "mediumText": "Sunt nulla aliquip ex ullamco magna mollit laborum ea cillum. Ea ad voluptate excepteur dolor tempor nulla pariatur pariatur.", + "longText": "Dolor quis magna dolor id irure laborum cillum irure. Minim ea ipsum ipsum aute officia. Commodo adipisicing aliqua voluptate eiusmod ipsum incididunt quis dolor culpa velit. Id quis duis tempor ipsum cillum do velit adipisicing do excepteur culpa magna laboris. Voluptate enim do id laborum veniam. Excepteur do adipisicing eiusmod ea laboris laborum. Nostrud sunt fugiat ut velit ex magna nisi non magna sint pariatur eiusmod minim.\r\nElit dolore nulla ipsum ullamco deserunt deserunt amet incididunt. Reprehenderit eiusmod adipisicing commodo duis eu id ad esse dolor consequat cupidatat elit. Aliquip eu fugiat consequat non sit nisi quis est id. Proident amet culpa sunt irure nostrud do ad aliqua sunt. Ut amet eiusmod ea eu aute cupidatat minim laboris qui consequat deserunt consectetur quis reprehenderit. Occaecat id proident in amet adipisicing elit tempor esse veniam elit.\r\nAdipisicing qui fugiat nostrud et magna do eu commodo minim excepteur non qui. Magna do do fugiat sint irure elit tempor deserunt. Ullamco aliqua ullamco nostrud qui incididunt cupidatat. Nisi reprehenderit in cupidatat velit et tempor. Lorem ut Lorem elit quis deserunt ut. Aliquip do Lorem eu ipsum amet eu laborum pariatur aliquip minim. Id id eu exercitation consequat.\r\n", + "address": "4 Scholes Street", + "city": "Rodanthe", + "state": "Ohio", + "zip": 39404, + "country": "Chile", + "email": "rutledgevang@scentric.com", + "phone": "(827) 440-2145", + "color": "rgb(207,158,249)" + }, + { + "index": 261, + "name": "Jimenez Mullins", + "first": "Hines", + "last": "Cooley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/paulfarino/73.jpg", + "expanded": false, + "guid": "c3fd3b86-c437-427d-9f1d-0dd5cc03af2a", + "integer": 31, + "date": "Thu Jul 22 1999 00:58:27 GMT-0700 (PDT)", + "shortText": "nisi", + "mediumText": "Eiusmod enim irure cupidatat consectetur aliquip ut labore fugiat exercitation Lorem et irure.", + "longText": "Reprehenderit duis cupidatat duis commodo enim pariatur ut ea ex elit ut adipisicing consectetur. Fugiat fugiat veniam sit esse laborum commodo laboris ipsum magna pariatur. Ipsum laborum proident mollit exercitation labore. Laborum voluptate pariatur eiusmod ad excepteur minim tempor non adipisicing consectetur proident amet.\r\nAute occaecat excepteur voluptate reprehenderit ea. Officia consequat proident et quis aliqua. Dolor et et cupidatat sit consectetur. Aute sit cillum excepteur reprehenderit enim sint voluptate occaecat.\r\n", + "address": "2 Clay Street", + "city": "Lisco", + "state": "Nevada", + "zip": 95904, + "country": "Norfolk Island", + "email": "hinescooley@scentric.com", + "phone": "(871) 552-3958", + "color": "rgb(236,51,80)" + }, + { + "index": 262, + "name": "Lesley Ashley", + "first": "Williamson", + "last": "Glass", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/overcloacked/73.jpg", + "expanded": false, + "guid": "a3928300-14e0-42c0-9f8b-600a529a789b", + "integer": 17, + "date": "Wed May 25 2005 15:38:13 GMT-0700 (PDT)", + "shortText": "labore esse pariatur nulla excepteur", + "mediumText": "Eiusmod elit eiusmod deserunt enim irure Lorem sint culpa ea. Esse proident in dolor sit qui pariatur Lorem. Culpa consequat minim ullamco sit culpa voluptate occaecat consequat. Ex ex non voluptate excepteur irure ut consectetur tempor.", + "longText": "Ullamco ex id nostrud esse. Exercitation adipisicing eu est ipsum commodo. Aute aliqua exercitation eiusmod ex nulla. Enim cillum nisi tempor id. Irure proident ipsum commodo reprehenderit tempor eu ut officia labore tempor sit tempor.\r\nFugiat ut sit tempor ut aliquip ea irure. Ullamco irure nulla reprehenderit id amet fugiat. Anim Lorem ullamco ea elit esse nisi id elit occaecat. Elit voluptate aute dolore anim aliquip veniam laborum. Duis esse aliquip aute pariatur fugiat veniam velit anim irure ipsum laboris. Duis nostrud occaecat ipsum eu non mollit. Fugiat exercitation sunt ullamco sunt mollit.\r\nLabore eiusmod mollit voluptate sunt duis id enim excepteur eiusmod elit quis voluptate enim aliqua. Minim nostrud excepteur voluptate ipsum id aliqua esse pariatur consequat. Dolore aliqua Lorem veniam deserunt pariatur tempor do nisi veniam nulla voluptate. Ut velit consectetur deserunt eiusmod cupidatat. Non culpa pariatur enim eu et ut irure labore. Ut nisi aute voluptate excepteur sint culpa ad id adipisicing ut enim.\r\nQui do consectetur laborum laborum ipsum eu ex do fugiat duis est irure sunt sunt. Ullamco in velit minim veniam ea do veniam anim adipisicing in sunt occaecat in aliquip. Aliquip nisi elit fugiat cupidatat enim mollit ex mollit. Aute laborum consequat anim deserunt. Cillum est sint dolor irure laboris ad eiusmod. Lorem aliquip in est et deserunt nostrud est consequat duis ad minim. Magna qui est ullamco sit cillum cupidatat eu amet mollit commodo esse.\r\n", + "address": "4 Village Court", + "city": "Southmont", + "state": "Montana", + "zip": 63679, + "country": "Japan", + "email": "williamsonglass@scentric.com", + "phone": "(915) 505-2620", + "color": "rgb(119,251,208)" + }, + { + "index": 263, + "name": "Robertson Mcintosh", + "first": "Constance", + "last": "Sexton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maysundays/73.jpg", + "expanded": false, + "guid": "0dd239a2-9d56-4eec-a3e1-94411aacdc3f", + "integer": 71, + "date": "Sat Aug 01 1970 03:44:02 GMT-0700 (PDT)", + "shortText": "excepteur ut labore", + "mediumText": "Incididunt proident mollit elit velit sit in ipsum dolor duis ex labore aliqua culpa. Cupidatat amet ea proident ad duis. Id occaecat aliquip quis fugiat dolor aliqua consectetur.", + "longText": "Sunt ullamco culpa quis cillum mollit. Exercitation amet magna magna velit pariatur aliquip laborum ad est cupidatat. Nostrud elit irure ullamco occaecat id. Anim elit laborum ad pariatur occaecat minim tempor ullamco. Deserunt exercitation elit commodo sint reprehenderit sit proident ut labore. Eu eu officia nulla labore aliquip ut ex.\r\nVeniam non tempor laborum ea dolor nostrud laboris cupidatat deserunt sit est. Reprehenderit aliquip sint nostrud eu pariatur laborum ea. Aute id laboris esse in in amet excepteur ea laborum. Cupidatat commodo minim nostrud in aute in aute culpa eiusmod.\r\nAmet dolore commodo aute commodo commodo non voluptate officia elit amet est sint sit. Nulla est occaecat elit magna elit esse mollit cillum anim exercitation. Adipisicing non occaecat nisi irure duis aliquip occaecat culpa consectetur ex mollit aute nostrud. Et mollit nisi ad culpa dolor tempor nisi Lorem culpa aliqua. Sunt ut minim dolore voluptate sit. Minim enim ex elit excepteur voluptate.\r\nProident proident esse commodo qui laboris. Enim laboris cillum fugiat exercitation elit. Nostrud ea labore sit culpa. Reprehenderit amet minim mollit ea nulla duis duis veniam est tempor enim ut proident. Tempor consectetur culpa occaecat exercitation id ea nulla ea. Duis culpa ea labore sint culpa consectetur eu proident esse.\r\nLaborum nulla excepteur commodo sint irure veniam nisi. Duis ex ad anim et anim voluptate commodo eiusmod ea magna ut do magna ut. Mollit anim nulla ullamco et aute excepteur qui aute. Exercitation aliquip proident labore tempor consequat aute officia esse ut dolor eu mollit. Veniam occaecat amet velit in irure Lorem excepteur aliquip sunt sit. Dolor nulla sit ad anim officia cillum minim ipsum ad dolor qui sint. Incididunt velit qui ea fugiat.\r\n", + "address": "3 Driggs Avenue", + "city": "Goldfield", + "state": "California", + "zip": 10392, + "country": "Saudi Arabia", + "email": "constancesexton@scentric.com", + "phone": "(923) 433-2666", + "color": "rgb(246,200,148)" + }, + { + "index": 264, + "name": "Audra Ortega", + "first": "Anne", + "last": "Crawford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_iamnyasha/73.jpg", + "expanded": false, + "guid": "a1000f3b-0edd-4f94-8864-4f0567d089ef", + "integer": 74, + "date": "Thu Oct 19 1978 15:43:40 GMT-0700 (PDT)", + "shortText": "et voluptate", + "mediumText": "Quis nulla minim do deserunt commodo laborum laboris veniam sint pariatur voluptate ullamco eu. Laboris adipisicing ex dolore voluptate ea occaecat duis enim nulla eiusmod.", + "longText": "Voluptate velit duis reprehenderit est tempor dolor dolor deserunt ullamco. Sit proident eiusmod consectetur occaecat dolore in laborum in aliqua id sint. Aute aliqua eu est aliqua officia aliqua minim do sint ullamco voluptate tempor velit ex. Adipisicing mollit velit non cillum exercitation sunt sunt ipsum ex irure laboris ut. Fugiat aliquip aliquip ad deserunt minim minim nisi dolore ea et. Dolore magna fugiat commodo veniam commodo do deserunt. Irure sint reprehenderit nulla sunt est nostrud id do excepteur mollit nostrud ea.\r\nId pariatur nisi eu deserunt nisi minim in deserunt deserunt ex. Adipisicing excepteur officia sint exercitation mollit deserunt non velit ex fugiat laboris id. Sit eiusmod excepteur occaecat id dolore laborum fugiat ea. Commodo velit non incididunt enim aliquip magna irure. Nulla aute ipsum veniam fugiat duis cupidatat et exercitation laboris Lorem culpa. Do reprehenderit ullamco occaecat id veniam sunt non nulla excepteur exercitation.\r\n", + "address": "2 Wallabout Street", + "city": "Waikele", + "state": "Marshall Islands", + "zip": 86465, + "country": "Micronesia", + "email": "annecrawford@scentric.com", + "phone": "(986) 502-2226", + "color": "rgb(235,169,166)" + }, + { + "index": 265, + "name": "Francis Carver", + "first": "Gallagher", + "last": "Britt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/culttm/73.jpg", + "expanded": false, + "guid": "0556fe07-8214-442d-9f9c-08231097de52", + "integer": 6, + "date": "Sun Nov 28 2010 03:23:33 GMT-0800 (PST)", + "shortText": "sint ex in aliquip excepteur", + "mediumText": "Laboris anim ad nulla tempor dolor quis tempor ipsum incididunt eiusmod aute. Ea irure ea laboris irure do et aliquip dolor exercitation excepteur. Exercitation sunt dolor excepteur sunt id quis velit esse non dolore ut nostrud officia.", + "longText": "Ad ipsum minim tempor velit Lorem irure cupidatat. Minim laborum laboris esse sunt voluptate amet amet nostrud sint esse. Irure incididunt et reprehenderit magna. Mollit esse non Lorem excepteur ad. In labore ad minim id commodo tempor non irure nisi.\r\nLaboris ut veniam cillum eiusmod ad ut reprehenderit. Ad pariatur ad ea culpa. Ad est irure enim ex Lorem nulla irure do adipisicing nulla non aute. Fugiat irure quis veniam consequat ea ullamco reprehenderit ipsum.\r\nTempor cillum culpa in sint enim sit irure consequat Lorem labore deserunt. Magna magna est sunt magna mollit laboris minim irure incididunt deserunt. Est pariatur adipisicing reprehenderit mollit ea aute dolor deserunt aute ut proident eiusmod.\r\nIrure in adipisicing culpa pariatur qui aliquip amet id. Veniam deserunt labore mollit in quis. Quis nostrud dolor ullamco ut reprehenderit nisi.\r\nCillum veniam laboris ut nulla commodo est nulla reprehenderit cupidatat. Voluptate adipisicing aute magna dolore consequat dolor enim veniam Lorem incididunt pariatur amet. Qui anim pariatur et voluptate labore incididunt. Amet duis velit eu in proident ipsum culpa et nulla eu Lorem aliquip ut. Lorem fugiat aute veniam Lorem ea sit. Nisi pariatur qui excepteur ad ullamco ea non culpa non incididunt sint ex. Et nulla velit elit adipisicing sit non irure et.\r\n", + "address": "2 Oakland Place", + "city": "Brookfield", + "state": "Indiana", + "zip": 53481, + "country": "Liberia", + "email": "gallagherbritt@scentric.com", + "phone": "(835) 444-3138", + "color": "rgb(204,219,96)" + }, + { + "index": 266, + "name": "Fischer Simmons", + "first": "Gertrude", + "last": "Stephens", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pollobrav0/73.jpg", + "expanded": false, + "guid": "829192ff-f636-4781-b023-9f3085717193", + "integer": 31, + "date": "Thu Nov 01 2007 09:01:49 GMT-0700 (PDT)", + "shortText": "et cupidatat ad", + "mediumText": "Ad esse officia proident adipisicing sunt excepteur. Culpa ad sint dolor aute aute est. Proident aliqua fugiat officia mollit. Minim sunt consequat irure ut tempor laborum dolor cupidatat est aliqua consequat et.", + "longText": "Officia non fugiat tempor ad enim dolor. In irure commodo culpa ut Lorem aliqua laborum. Qui in cupidatat consequat eiusmod Lorem occaecat consectetur fugiat quis sit pariatur proident. Lorem sint reprehenderit pariatur eiusmod veniam reprehenderit incididunt. Cupidatat reprehenderit in sit consectetur sint. Et excepteur sit do aliquip ea veniam eu reprehenderit deserunt non sunt magna mollit anim.\r\nAmet cupidatat culpa dolore elit minim adipisicing veniam laboris. Reprehenderit exercitation et et velit qui ea nostrud. Exercitation esse nostrud cupidatat dolor dolor fugiat cupidatat eu magna commodo velit ex.\r\nMagna sint voluptate veniam in occaecat aliquip duis nisi. Aliqua elit veniam ea nostrud nisi id cillum esse ullamco eiusmod reprehenderit culpa. Lorem velit id culpa aliquip voluptate dolore nulla officia dolore mollit in aliquip velit elit.\r\n", + "address": "4 Stoddard Place", + "city": "Whitmer", + "state": "Tennessee", + "zip": 27389, + "country": "Korea (South)", + "email": "gertrudestephens@scentric.com", + "phone": "(940) 497-2705", + "color": "rgb(171,153,217)" + }, + { + "index": 267, + "name": "Boyd Blake", + "first": "Delaney", + "last": "Anderson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlosblanco_eu/73.jpg", + "expanded": false, + "guid": "031a10d0-2fe9-4ef3-af8e-f7b7c611cb73", + "integer": 33, + "date": "Mon Aug 10 1970 14:35:08 GMT-0700 (PDT)", + "shortText": "adipisicing fugiat qui dolore aute", + "mediumText": "Sit sunt pariatur incididunt est aute consectetur quis laboris nisi cillum deserunt in dolore. Sit fugiat labore enim consequat amet elit aliquip adipisicing. In excepteur laboris irure dolor laborum esse id. Minim nulla adipisicing in eiusmod enim dolor pariatur mollit velit amet proident mollit sunt.", + "longText": "Nisi laboris culpa in sit veniam anim nisi pariatur pariatur adipisicing non occaecat reprehenderit ut. Laborum nulla occaecat laboris qui aliqua laborum excepteur excepteur commodo. Fugiat anim proident proident exercitation esse nulla aute. Adipisicing in laborum fugiat eu tempor ullamco qui qui Lorem cupidatat sint ipsum aliqua. Labore commodo amet consequat officia incididunt cillum proident deserunt sint excepteur. Enim nostrud occaecat ipsum sint adipisicing quis sunt pariatur et sunt eu. Veniam nulla cupidatat officia culpa.\r\n", + "address": "3 Branton Street", + "city": "Ada", + "state": "Palau", + "zip": 48926, + "country": "Pakistan", + "email": "delaneyanderson@scentric.com", + "phone": "(879) 508-2698", + "color": "rgb(181,108,214)" + }, + { + "index": 268, + "name": "Foreman Jennings", + "first": "Nieves", + "last": "Browning", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/giakodes/73.jpg", + "expanded": false, + "guid": "f3328487-a346-46cd-986a-180b1336ce46", + "integer": 34, + "date": "Thu Aug 18 1977 11:28:15 GMT-0700 (PDT)", + "shortText": "culpa laborum nostrud proident qui", + "mediumText": "Tempor sunt anim occaecat in irure occaecat enim cupidatat voluptate ex laboris enim. Exercitation fugiat ad eu culpa est pariatur ea laboris aliquip laboris exercitation proident consectetur. Enim officia laboris elit quis. Occaecat fugiat tempor ea labore exercitation irure sint elit sint elit reprehenderit. Cupidatat anim sit eu nulla exercitation Lorem ipsum veniam.", + "longText": "Esse aute reprehenderit enim officia culpa. Reprehenderit duis mollit voluptate exercitation officia Lorem laborum laborum irure pariatur. Exercitation ex laboris magna excepteur qui labore culpa. Ut esse incididunt aliqua incididunt dolor deserunt esse. Et magna magna quis ipsum cupidatat voluptate incididunt aute sint consectetur officia.\r\nConsequat elit nostrud laborum veniam. Pariatur id consectetur duis et id adipisicing velit et ipsum pariatur proident nostrud reprehenderit. Culpa ad amet eiusmod quis reprehenderit aute eiusmod.\r\nPariatur nulla veniam amet sit fugiat ipsum velit fugiat consequat eu irure est labore. Ut veniam excepteur excepteur nisi fugiat. Ipsum enim excepteur pariatur est laboris deserunt aliqua velit fugiat. Irure ut duis laboris culpa quis ad deserunt sunt fugiat adipisicing. Aute est consectetur ad minim deserunt do.\r\n", + "address": "3 Berriman Street", + "city": "Chaparrito", + "state": "Virginia", + "zip": 46246, + "country": "Guyana", + "email": "nievesbrowning@scentric.com", + "phone": "(876) 426-2122", + "color": "rgb(247,203,76)" + }, + { + "index": 269, + "name": "Corine Woodard", + "first": "Santana", + "last": "Everett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/komplexb/73.jpg", + "expanded": false, + "guid": "92e47eb5-8a17-4884-9c8b-2789bc456ed9", + "integer": 84, + "date": "Tue Dec 26 1978 20:05:16 GMT-0800 (PST)", + "shortText": "Lorem aute", + "mediumText": "Qui irure duis reprehenderit duis. Ut consectetur mollit sint sint occaecat id nulla sint aute consectetur anim laborum aliquip commodo.", + "longText": "Ea officia culpa cupidatat enim fugiat mollit in quis excepteur culpa. Tempor et nulla irure nostrud qui adipisicing nulla consequat dolor veniam. Ex qui et duis anim irure laboris.\r\nDo commodo aute ipsum ullamco. Velit pariatur est sit laboris reprehenderit nisi voluptate consequat voluptate laborum sunt dolor velit. Occaecat cillum ex ad anim sint. Voluptate cupidatat magna labore veniam. Cupidatat ea nostrud est ipsum in. Deserunt sint adipisicing incididunt sint labore duis minim velit tempor. Lorem sint anim sunt sunt ipsum esse ea reprehenderit elit dolore aute sint.\r\nMagna commodo cupidatat nisi aute. Qui consequat culpa enim elit minim exercitation qui amet in cillum officia. Amet amet nulla aute elit sit irure pariatur proident est sint labore.\r\nProident dolore ut mollit enim veniam aliqua minim ex voluptate Lorem ullamco amet enim. Officia laborum enim sit aute incididunt nisi nulla magna Lorem officia aute mollit. Ullamco commodo incididunt excepteur sunt. Tempor veniam commodo minim dolore eu dolore est deserunt veniam ullamco.\r\nMagna dolor voluptate sint dolor tempor anim dolore quis aute magna reprehenderit ad. Incididunt fugiat aliqua culpa ullamco quis duis pariatur ullamco consequat voluptate enim velit. Duis aute qui qui voluptate elit ut amet elit anim. Excepteur esse proident laborum occaecat.\r\n", + "address": "4 Melrose Street", + "city": "Chelsea", + "state": "Wyoming", + "zip": 81598, + "country": "Poland", + "email": "santanaeverett@scentric.com", + "phone": "(993) 537-2899", + "color": "rgb(144,158,112)" + }, + { + "index": 270, + "name": "Maria Stokes", + "first": "Chambers", + "last": "Riggs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/migl40d/73.jpg", + "expanded": false, + "guid": "cacd37bf-31ec-400b-bc9e-7ecb3a35d9be", + "integer": 9, + "date": "Thu Feb 06 2003 08:01:13 GMT-0800 (PST)", + "shortText": "veniam magna enim ullamco", + "mediumText": "Eiusmod culpa laboris est consequat in proident eiusmod occaecat consequat sit et mollit. Dolor aliquip anim ex laboris id non occaecat nisi amet eu anim ipsum proident eiusmod. Consequat esse Lorem quis aliquip duis quis minim quis duis. Occaecat commodo nulla minim ipsum do velit laborum consectetur id.", + "longText": "Dolor anim velit labore duis sunt nostrud duis sint ex irure. Voluptate laboris ipsum deserunt nisi voluptate dolor magna. Voluptate veniam amet reprehenderit laborum amet incididunt elit voluptate minim pariatur incididunt aute. Nulla excepteur eiusmod ad amet magna velit eu ea sit do Lorem ex nulla qui. Officia labore ut sint nostrud quis consectetur labore. Et quis voluptate non duis adipisicing quis sunt veniam incididunt velit consectetur.\r\nAdipisicing sit non consequat qui consequat commodo pariatur tempor consectetur. Adipisicing dolore aliquip ipsum nulla in incididunt mollit nulla. Pariatur non cillum do voluptate aliqua non aliquip esse qui voluptate aliquip magna esse. Dolor aliquip esse deserunt velit adipisicing adipisicing. Veniam in dolore do mollit ad exercitation commodo veniam eu. Magna non nulla proident occaecat.\r\nOccaecat magna magna ex culpa. Aliquip commodo laboris amet anim cillum elit officia esse id. Dolor mollit adipisicing velit excepteur anim commodo aute proident sunt. Irure reprehenderit ullamco amet id minim commodo tempor aute exercitation laboris amet incididunt et. Nostrud laborum mollit aliquip non eiusmod sint exercitation eiusmod labore cillum duis enim aute occaecat. Amet aute ea eiusmod dolore. Magna sit veniam nisi ullamco culpa.\r\n", + "address": "4 Jamaica Avenue", + "city": "Lupton", + "state": "Colorado", + "zip": 55948, + "country": "Canada", + "email": "chambersriggs@scentric.com", + "phone": "(825) 422-3231", + "color": "rgb(211,239,230)" + }, + { + "index": 271, + "name": "Montoya Battle", + "first": "Susanne", + "last": "Stein", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erwinhines/73.jpg", + "expanded": false, + "guid": "386137ac-8367-4191-bca0-0385b64defbc", + "integer": 1, + "date": "Tue Feb 18 1986 07:03:21 GMT-0800 (PST)", + "shortText": "aliqua amet", + "mediumText": "Enim aliqua minim ipsum amet incididunt labore nulla labore enim. Esse eu ea occaecat consectetur labore exercitation do ut consequat est dolor Lorem. Do dolor nostrud nostrud labore.", + "longText": "Officia qui tempor cupidatat nostrud sunt cillum qui commodo pariatur non. Aliqua consectetur commodo ad consequat in est nisi. Cupidatat in eiusmod deserunt veniam. Sunt incididunt enim ex sunt aliqua excepteur non quis deserunt magna eiusmod anim. Enim ex proident laborum excepteur ea anim sint. Consectetur anim esse et id ut incididunt sunt officia consectetur sunt anim do ea ipsum. Magna Lorem ullamco ad eu amet deserunt consectetur.\r\nEa consectetur aute laborum commodo irure excepteur ipsum cupidatat reprehenderit duis. Deserunt exercitation labore quis adipisicing amet reprehenderit ad minim esse eu esse. Qui adipisicing aliquip sunt laborum duis occaecat.\r\nPariatur eiusmod nostrud nostrud excepteur non ex anim non do voluptate. Nulla ut deserunt deserunt in aliqua duis laborum ex. Eiusmod eiusmod nostrud esse eiusmod deserunt ullamco adipisicing aute non nulla. Eiusmod eiusmod consequat proident culpa ullamco laborum.\r\nDo non veniam aliquip officia. Amet dolor excepteur qui exercitation voluptate laboris culpa laboris Lorem ullamco fugiat mollit exercitation excepteur. Esse occaecat magna reprehenderit in eiusmod magna fugiat sit occaecat consectetur velit consequat veniam aliquip. Excepteur aliquip ipsum duis sunt enim aliqua elit exercitation eu in cillum deserunt. Qui fugiat exercitation eu elit minim officia minim ex enim adipisicing incididunt ut.\r\n", + "address": "3 Porter Avenue", + "city": "Bentley", + "state": "Utah", + "zip": 67531, + "country": "US Minor Outlying Islands", + "email": "susannestein@scentric.com", + "phone": "(972) 556-2548", + "color": "rgb(176,88,163)" + }, + { + "index": 272, + "name": "Antoinette Cooper", + "first": "Stout", + "last": "Ferrell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chelseabeachem/73.jpg", + "expanded": false, + "guid": "b2443100-77a3-48fc-825f-671f2f386da1", + "integer": 35, + "date": "Tue Sep 09 2008 23:36:55 GMT-0700 (PDT)", + "shortText": "tempor mollit", + "mediumText": "Eiusmod aliqua irure velit nostrud dolor nostrud.", + "longText": "Amet voluptate dolor sunt culpa eiusmod ipsum Lorem officia eiusmod est nulla. Ut minim veniam veniam sunt excepteur. Fugiat ut amet deserunt ex voluptate ex. Aute deserunt adipisicing ipsum eiusmod eiusmod duis eiusmod laborum voluptate ut commodo.\r\n", + "address": "2 Cortelyou Road", + "city": "Websterville", + "state": "Idaho", + "zip": 50360, + "country": "East Timor", + "email": "stoutferrell@scentric.com", + "phone": "(884) 588-3785", + "color": "rgb(207,67,59)" + }, + { + "index": 273, + "name": "Chavez Rhodes", + "first": "Jennifer", + "last": "Solomon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bouyghajden/73.jpg", + "expanded": false, + "guid": "cf0294a4-b641-4b2a-94ce-7db7921d670c", + "integer": 62, + "date": "Fri Oct 04 1996 10:43:24 GMT-0700 (PDT)", + "shortText": "nostrud id eiusmod", + "mediumText": "Qui dolore nisi ut eu ea duis elit ipsum aliquip aliqua. Sunt cupidatat ut reprehenderit sit nulla laborum consectetur fugiat magna elit esse nulla.", + "longText": "Sit irure nulla excepteur ad velit excepteur exercitation enim eu fugiat deserunt duis. Amet veniam adipisicing aliquip tempor irure. Mollit non culpa amet tempor magna sint esse ad proident. Duis cupidatat nostrud esse veniam pariatur voluptate cupidatat dolor ullamco occaecat magna aliquip sunt esse.\r\nNostrud deserunt proident velit tempor esse exercitation ex ipsum velit proident aute ullamco amet velit. Occaecat veniam sit ipsum do dolore nisi aute occaecat. Amet pariatur occaecat aliqua sint velit aliquip non consequat eiusmod occaecat qui aliquip enim exercitation. Id labore duis quis voluptate nulla aute occaecat. Sunt amet dolore ad minim laborum sit officia amet eu dolore Lorem quis adipisicing esse. Non quis consequat anim nostrud id in in. Sit et esse nostrud quis eu aute excepteur qui.\r\nIrure non sint sint Lorem occaecat quis aliquip exercitation adipisicing amet tempor Lorem sint consequat. Commodo tempor consectetur commodo labore et veniam sunt. Cupidatat commodo anim reprehenderit qui culpa aliqua aliquip enim dolor.\r\nDolore do nisi est exercitation nisi irure et et Lorem sint ullamco non enim duis. Sint nostrud ipsum veniam anim et dolor id amet id fugiat consequat non. Sunt laboris culpa ut deserunt ut ut irure fugiat dolore eiusmod fugiat quis.\r\nDeserunt qui veniam nostrud in nostrud adipisicing sunt veniam consequat consectetur duis esse magna ipsum. Deserunt anim dolore ullamco aute fugiat mollit adipisicing sit exercitation Lorem. Incididunt Lorem duis qui enim adipisicing sint anim. Ex velit ullamco commodo pariatur amet. Sit et voluptate occaecat mollit fugiat pariatur id elit.\r\n", + "address": "3 Ruby Street", + "city": "Goochland", + "state": "Arkansas", + "zip": 63056, + "country": "Denmark", + "email": "jennifersolomon@scentric.com", + "phone": "(852) 542-2938", + "color": "rgb(234,125,93)" + }, + { + "index": 274, + "name": "Sanchez Summers", + "first": "Osborne", + "last": "Buckley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butusai/73.jpg", + "expanded": false, + "guid": "6afd5e1c-3a29-4134-b7a5-7196eb7798a4", + "integer": 76, + "date": "Sat Oct 07 1995 23:24:37 GMT-0700 (PDT)", + "shortText": "enim do voluptate quis sit", + "mediumText": "Quis amet id irure elit eu ad duis id veniam. Qui in mollit in consectetur reprehenderit ex est. Id non tempor minim aliqua commodo dolore do mollit Lorem eu non amet est.", + "longText": "Eiusmod non velit eiusmod adipisicing ut velit est adipisicing in. Eiusmod dolore et non dolore esse velit id anim proident nisi commodo. Amet fugiat magna cupidatat est esse duis et.\r\n", + "address": "3 Seigel Street", + "city": "Thatcher", + "state": "Delaware", + "zip": 98441, + "country": "Yemen", + "email": "osbornebuckley@scentric.com", + "phone": "(930) 530-3501", + "color": "rgb(53,175,123)" + }, + { + "index": 275, + "name": "Melinda Herrera", + "first": "Paula", + "last": "Clemons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ainsleywagon/73.jpg", + "expanded": false, + "guid": "1d0ee711-59d7-4c1f-9420-3fab9a5b62f6", + "integer": 0, + "date": "Sun Aug 23 1970 02:12:34 GMT-0700 (PDT)", + "shortText": "proident laborum dolor magna laboris", + "mediumText": "Minim duis magna cillum dolore excepteur eiusmod eiusmod officia est laboris veniam. Officia amet occaecat esse non dolor. Esse quis labore ad occaecat adipisicing consequat nisi in et sunt excepteur aute consequat.", + "longText": "Mollit magna nulla exercitation commodo excepteur amet. Duis fugiat Lorem mollit adipisicing anim adipisicing adipisicing anim fugiat nulla anim. Eu adipisicing irure Lorem qui enim nisi velit exercitation duis. Aliquip ea labore commodo et nostrud. Aute sit consequat reprehenderit nulla aliquip ipsum esse esse qui exercitation pariatur cupidatat quis cillum. Do esse in ad id est id laboris incididunt.\r\nQui non quis ipsum qui fugiat pariatur. Dolore incididunt sunt eiusmod laboris nisi nulla. Qui fugiat irure consequat culpa ad non do labore commodo ut est velit nostrud. Cillum dolor aliquip elit est enim tempor consectetur. Id nostrud duis et irure nostrud do enim laboris fugiat fugiat eu eiusmod nisi.\r\nCommodo pariatur in officia cupidatat consequat eiusmod ad Lorem dolore enim aliquip elit. Ex in commodo enim sunt eiusmod. Labore consequat culpa quis voluptate aliqua. Fugiat reprehenderit cupidatat esse eiusmod duis consequat. Quis est veniam reprehenderit consectetur cupidatat aliquip in amet dolor.\r\nMagna est esse excepteur sint enim Lorem nisi deserunt pariatur non. Dolor enim officia dolore deserunt consequat quis ea adipisicing cillum aliqua anim laboris irure. In do consectetur est culpa. Sunt occaecat voluptate pariatur dolor id velit magna do veniam duis excepteur ut ad voluptate. Ut excepteur laboris ea ut.\r\nEu eiusmod excepteur reprehenderit duis ipsum commodo ullamco cillum officia incididunt esse eu nulla reprehenderit. Aliquip elit consequat dolor labore. Laborum proident ullamco excepteur dolor esse occaecat et aliqua. Commodo ad exercitation minim ad occaecat ullamco. Veniam id dolor aliquip cupidatat. Voluptate voluptate aliqua nulla aliquip adipisicing fugiat aute laboris quis amet officia magna Lorem labore.\r\n", + "address": "3 Beadel Street", + "city": "Thornport", + "state": "Federated States Of Micronesia", + "zip": 81284, + "country": "Laos", + "email": "paulaclemons@scentric.com", + "phone": "(807) 420-2457", + "color": "rgb(173,67,66)" + }, + { + "index": 276, + "name": "Mara Ortiz", + "first": "Pace", + "last": "Hunter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/chadbercea/73.jpg", + "expanded": false, + "guid": "65b9988b-b552-44e7-8e59-7a490e0aa83b", + "integer": 45, + "date": "Wed Oct 25 2006 06:16:29 GMT-0700 (PDT)", + "shortText": "dolor ipsum", + "mediumText": "Dolore laborum non magna voluptate cillum irure ipsum ad eu aute. Proident mollit nostrud laboris ad sunt laboris aliquip quis aute duis id mollit. Commodo qui anim adipisicing anim. Eu deserunt dolor Lorem elit quis laboris nulla enim.", + "longText": "Sunt adipisicing ea dolore ea id veniam eiusmod consequat cupidatat nulla ullamco magna mollit. Excepteur qui do aliquip consequat incididunt fugiat nostrud pariatur eiusmod nostrud quis reprehenderit officia adipisicing. Consequat mollit esse eiusmod culpa qui in officia irure in enim veniam.\r\n", + "address": "2 Broome Street", + "city": "Hobucken", + "state": "Guam", + "zip": 15780, + "country": "Sierra Leone", + "email": "pacehunter@scentric.com", + "phone": "(929) 573-3129", + "color": "rgb(228,124,211)" + }, + { + "index": 277, + "name": "Hannah Mercado", + "first": "Velazquez", + "last": "Snider", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/devinhalladay/73.jpg", + "expanded": false, + "guid": "13ecf233-dc36-43ed-8b27-00fa6f367502", + "integer": 53, + "date": "Tue Dec 26 1995 12:29:11 GMT-0800 (PST)", + "shortText": "nulla cillum dolore amet", + "mediumText": "Sunt cillum deserunt ipsum est ea occaecat deserunt ex cillum ut magna do laboris minim.", + "longText": "Nostrud non aute culpa eu consectetur nisi incididunt deserunt deserunt laborum duis ad consequat. Ad tempor mollit duis deserunt anim voluptate reprehenderit proident non dolore anim dolor. Reprehenderit excepteur mollit culpa Lorem dolore. Exercitation incididunt id non esse magna qui nostrud ad.\r\n", + "address": "2 Thatford Avenue", + "city": "Rosburg", + "state": "Pennsylvania", + "zip": 18264, + "country": "Nigeria", + "email": "velazquezsnider@scentric.com", + "phone": "(948) 461-3658", + "color": "rgb(146,114,59)" + }, + { + "index": 278, + "name": "King Murray", + "first": "Lawrence", + "last": "Floyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mateaodviteza/73.jpg", + "expanded": false, + "guid": "48e5fed4-514a-4e9e-8842-57a2e92a654c", + "integer": 33, + "date": "Fri Aug 10 2012 11:19:30 GMT-0700 (PDT)", + "shortText": "consequat", + "mediumText": "Proident nisi exercitation amet reprehenderit cupidatat ad exercitation eu ad nostrud ex sunt.", + "longText": "Elit anim consequat minim officia reprehenderit ex voluptate incididunt Lorem. Incididunt qui incididunt Lorem do pariatur. Id aute anim elit amet labore non eiusmod sint culpa sunt ullamco irure. Adipisicing officia ea ad aliqua. Proident officia occaecat velit est amet pariatur duis esse cillum quis. Et mollit culpa ipsum ad do adipisicing sint amet.\r\nCulpa aliqua do sunt veniam laboris adipisicing pariatur mollit anim. Fugiat cupidatat labore eu eu do ea. Voluptate quis dolore ex quis culpa. Nostrud ea enim elit reprehenderit. Sint veniam commodo officia et quis laboris labore culpa quis ullamco ullamco. Labore occaecat nulla et incididunt consectetur.\r\nSit sit commodo amet cupidatat velit velit qui sint culpa magna magna proident. Adipisicing deserunt anim ullamco eiusmod aliqua laboris aliquip incididunt. Ipsum nisi velit nulla ex elit sit nostrud qui. Magna irure laboris quis Lorem enim culpa. Enim velit enim culpa nisi adipisicing officia voluptate cupidatat qui et. Sit deserunt incididunt ullamco deserunt non aliquip ut laborum Lorem dolor ullamco.\r\nAute esse dolore nisi ut sit fugiat dolore aute aliqua. Aliqua est voluptate enim dolor ullamco quis nisi qui esse nisi tempor do. Do deserunt veniam aliquip qui veniam ex nostrud incididunt culpa in magna non.\r\n", + "address": "3 Hunts Lane", + "city": "Ola", + "state": "New Hampshire", + "zip": 33769, + "country": "Netherlands", + "email": "lawrencefloyd@scentric.com", + "phone": "(813) 569-3499", + "color": "rgb(116,205,80)" + }, + { + "index": 279, + "name": "Camille Massey", + "first": "Short", + "last": "Hensley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vickyshits/73.jpg", + "expanded": false, + "guid": "08757590-e154-4bf1-b5a4-3a8763c63417", + "integer": 8, + "date": "Tue Dec 26 1989 15:35:16 GMT-0800 (PST)", + "shortText": "officia", + "mediumText": "Sint excepteur adipisicing veniam consectetur incididunt nostrud duis nulla velit laborum. Eu incididunt qui duis deserunt veniam. Culpa mollit nostrud magna dolor reprehenderit esse in consequat irure ad.", + "longText": "Occaecat magna ex ex qui exercitation adipisicing ea aliqua laboris est est adipisicing Lorem dolore. Sunt cillum labore ea amet eiusmod sunt qui. Duis deserunt do irure sit quis voluptate eu duis eiusmod. Ad incididunt anim fugiat esse ipsum aliquip ut cillum tempor eiusmod.\r\nEt Lorem amet cillum ipsum laboris sit deserunt esse duis sit dolore dolor commodo. Labore nulla cillum ad minim proident reprehenderit eu in duis consectetur amet. Aliquip velit nisi culpa ipsum qui sint ut elit id pariatur Lorem anim labore.\r\n", + "address": "2 Greene Avenue", + "city": "Dragoon", + "state": "North Dakota", + "zip": 18599, + "country": "Morocco", + "email": "shorthensley@scentric.com", + "phone": "(959) 437-3887", + "color": "rgb(61,124,231)" + }, + { + "index": 280, + "name": "Etta Nicholson", + "first": "Sadie", + "last": "Johnson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kamal_chaneman/73.jpg", + "expanded": false, + "guid": "445d79d7-84ef-49ef-aaac-2e47925151d7", + "integer": 36, + "date": "Wed Jan 05 2011 12:47:59 GMT-0800 (PST)", + "shortText": "aliquip quis incididunt esse commodo", + "mediumText": "Aliquip ut reprehenderit laboris veniam ad laboris excepteur. Et ut qui fugiat consequat qui aliquip aute incididunt magna non.", + "longText": "Sint anim magna Lorem incididunt tempor esse voluptate commodo qui velit velit aliqua adipisicing. Officia enim excepteur proident non nostrud est quis non quis anim ut irure nulla. Culpa officia velit et magna non sunt culpa laboris nulla enim. Et dolor laborum amet quis occaecat irure. Labore proident ea nulla aute anim do.\r\n", + "address": "4 Chestnut Avenue", + "city": "Boling", + "state": "Northern Mariana Islands", + "zip": 79666, + "country": "Czech Republic", + "email": "sadiejohnson@scentric.com", + "phone": "(929) 469-3200", + "color": "rgb(61,210,234)" + }, + { + "index": 281, + "name": "Roxanne Munoz", + "first": "Marguerite", + "last": "Rodriguez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_yardenoon/73.jpg", + "expanded": false, + "guid": "b7b8e91a-c476-45fb-b728-78461ff01383", + "integer": 59, + "date": "Tue Nov 11 1997 21:52:13 GMT-0800 (PST)", + "shortText": "amet adipisicing dolore Lorem consequat", + "mediumText": "Laborum fugiat anim pariatur minim fugiat sit pariatur exercitation proident. Incididunt ea duis nisi et. Do eu consectetur cillum veniam laboris consequat sunt labore exercitation laborum ipsum do duis sint. Pariatur id tempor cupidatat cillum ad eiusmod. Aliqua dolore enim magna officia tempor consequat Lorem excepteur culpa excepteur.", + "longText": "Occaecat ullamco nisi occaecat consequat consectetur aute in amet. Duis exercitation et ea aliqua elit ipsum ea ipsum laboris aliqua Lorem labore minim pariatur. Amet aliqua nostrud officia ex commodo mollit ex mollit consectetur esse elit sint. Est pariatur irure occaecat aute labore cillum nisi id.\r\nFugiat cupidatat veniam in adipisicing sint sunt cillum consequat in. Quis excepteur ad mollit occaecat et anim voluptate cupidatat. Sunt sit nisi amet excepteur voluptate. Cupidatat do ea fugiat sint minim elit nostrud. Culpa dolore in fugiat pariatur excepteur minim ad incididunt Lorem anim consequat consectetur. Duis est nulla sit eu nulla culpa proident et nostrud nostrud quis laborum dolore. Aute tempor et culpa amet.\r\n", + "address": "3 Box Street", + "city": "Caledonia", + "state": "South Dakota", + "zip": 29414, + "country": "Cape Verde", + "email": "margueriterodriguez@scentric.com", + "phone": "(975) 555-3617", + "color": "rgb(217,168,93)" + }, + { + "index": 282, + "name": "Chandler Mclean", + "first": "Olsen", + "last": "Rollins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/daniloc/73.jpg", + "expanded": false, + "guid": "18eb19e2-f53c-42f3-b3c0-f92ba5058e72", + "integer": 86, + "date": "Mon Nov 05 2012 21:48:32 GMT-0800 (PST)", + "shortText": "sunt", + "mediumText": "Sit magna labore veniam eu dolor.", + "longText": "Laboris pariatur qui esse proident aute in in quis aliquip tempor est Lorem elit nulla. Irure est id cillum in dolore qui mollit ullamco occaecat aute cupidatat culpa. Voluptate est nostrud eu laborum veniam eiusmod culpa eiusmod minim voluptate. Cupidatat cillum eiusmod aute nostrud exercitation est do anim in. Aliquip elit ullamco voluptate incididunt. In minim laboris nostrud nisi est officia proident consequat consequat velit enim ut eiusmod.\r\nSunt ex sunt ipsum dolor proident mollit cillum. In proident eiusmod nostrud cillum occaecat excepteur enim incididunt pariatur incididunt velit deserunt. Ullamco voluptate quis Lorem id qui sit occaecat qui deserunt qui aute eiusmod.\r\nCupidatat eiusmod eiusmod non officia nisi aliquip nulla eiusmod deserunt voluptate qui voluptate magna ad. Duis sit pariatur sint ea enim do esse cillum sit proident sunt. Aliqua deserunt deserunt adipisicing laboris sint voluptate occaecat culpa ipsum ut aute. Nulla amet est et aliquip commodo nostrud in ut laborum qui ullamco id aliqua. Consectetur magna aute aliquip sunt anim occaecat id ex consectetur ipsum. Eiusmod occaecat culpa laborum fugiat. Minim in sunt occaecat eu ex velit sit eiusmod ad reprehenderit.\r\nMinim nulla commodo qui velit proident. Nisi reprehenderit ullamco in in non eu. Enim exercitation voluptate consequat duis non officia quis irure consequat eu anim. Minim Lorem irure eu pariatur aute in Lorem deserunt esse elit officia excepteur. Est eiusmod tempor incididunt consectetur ullamco elit aliquip eu sunt elit eu sint aliquip. Irure adipisicing veniam aliqua incididunt officia esse veniam veniam officia.\r\nOfficia velit nostrud eiusmod ex elit nostrud non veniam commodo exercitation amet. Enim non mollit cupidatat magna aute anim tempor. Consequat ea nostrud esse laboris minim commodo culpa laborum aliqua adipisicing cupidatat sit. Ullamco enim fugiat tempor minim officia ipsum duis et sunt sint.\r\n", + "address": "4 Neptune Court", + "city": "Fillmore", + "state": "Alaska", + "zip": 62131, + "country": "Madagascar", + "email": "olsenrollins@scentric.com", + "phone": "(936) 437-3569", + "color": "rgb(163,129,119)" + }, + { + "index": 283, + "name": "Clements Wynn", + "first": "Dollie", + "last": "Rowland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jamesmbickerton/73.jpg", + "expanded": false, + "guid": "ecf696fd-aa3b-4bed-bdb1-b3b9a18f13f5", + "integer": 24, + "date": "Fri Jan 11 1974 07:17:27 GMT-0700 (PDT)", + "shortText": "consequat voluptate", + "mediumText": "Ut ullamco labore elit exercitation pariatur consequat quis proident. Tempor aute ex consectetur ut eu qui incididunt aliqua anim duis sit. Elit consequat nisi fugiat elit sit nisi eu laborum excepteur nulla proident ex. Eiusmod qui culpa quis velit elit consequat nulla.", + "longText": "Occaecat aliqua sunt velit deserunt mollit fugiat excepteur adipisicing pariatur non amet enim ad. Consectetur aliqua do sint cupidatat nostrud ipsum anim laborum nulla aliquip sit. Labore mollit amet Lorem quis. Ex cillum minim sit eu duis. Nulla sint esse nostrud nisi mollit irure commodo aute esse esse aliquip sunt ut. Ipsum et nulla cupidatat tempor consequat do occaecat ut.\r\nConsequat tempor et qui exercitation non in commodo. Aute minim nostrud laboris dolore reprehenderit. Adipisicing proident esse laborum cillum tempor veniam incididunt minim est adipisicing. Dolor nisi nisi dolore amet ea ipsum mollit amet.\r\n", + "address": "3 Minna Street", + "city": "Gratton", + "state": "Louisiana", + "zip": 90178, + "country": "Austria", + "email": "dollierowland@scentric.com", + "phone": "(992) 594-3916", + "color": "rgb(197,160,174)" + }, + { + "index": 284, + "name": "Cotton Newman", + "first": "Mccullough", + "last": "Oneil", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ddang33/73.jpg", + "expanded": false, + "guid": "da4451a9-1961-4257-87c6-19aa0c2780d9", + "integer": 24, + "date": "Fri Oct 26 1990 18:43:21 GMT-0700 (PDT)", + "shortText": "id nulla", + "mediumText": "In reprehenderit velit non aute ad mollit aliqua ullamco nostrud adipisicing dolore incididunt. Mollit et consequat eiusmod in laborum nulla in irure qui. Ex consequat est in laboris. Sunt ipsum eu eiusmod quis dolor nostrud sunt consectetur in ea ex commodo. Do enim occaecat labore et occaecat mollit consequat.", + "longText": "Nulla sunt aliqua ea laborum fugiat dolor reprehenderit nisi nulla pariatur minim. Duis aliquip in incididunt sunt sit nulla sunt cillum ut anim elit. Commodo excepteur dolore nisi labore exercitation commodo Lorem veniam anim nisi velit dolor aute.\r\nNulla labore laborum Lorem eu elit consequat eiusmod dolore irure ex. Occaecat enim ea nisi duis aliqua commodo sint sint enim consequat exercitation amet. Cupidatat Lorem culpa quis qui dolore. Proident non eu sint eiusmod id ullamco nisi nisi.\r\nAdipisicing nisi labore aliqua irure occaecat consectetur aute ut mollit ad excepteur. Magna et non laboris velit ipsum. Id et cillum aute nulla consectetur esse est quis culpa consequat. Veniam enim dolore dolore consequat pariatur aute elit consequat. Ipsum ullamco consectetur cillum dolor qui incididunt quis occaecat est proident eiusmod Lorem. Proident excepteur et mollit ipsum culpa duis ut fugiat tempor in ea.\r\n", + "address": "3 Troutman Street", + "city": "Roland", + "state": "Missouri", + "zip": 86860, + "country": "Venezuela", + "email": "mcculloughoneil@scentric.com", + "phone": "(823) 420-3250", + "color": "rgb(251,198,94)" + }, + { + "index": 285, + "name": "Gentry Ellis", + "first": "Bessie", + "last": "Mccarty", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/captnphilip/73.jpg", + "expanded": false, + "guid": "0c5c5f6a-c138-49a9-91a2-37523afe47ad", + "integer": 89, + "date": "Fri Jun 03 1983 21:40:24 GMT-0700 (PDT)", + "shortText": "in sint", + "mediumText": "Ullamco ex Lorem dolor cillum sint duis quis consequat consequat. Do ad proident ad deserunt do incididunt tempor qui anim tempor ullamco incididunt eiusmod Lorem. Et ex adipisicing esse sit velit excepteur reprehenderit proident enim. Magna exercitation ullamco commodo culpa fugiat laborum ipsum est ullamco occaecat nisi.", + "longText": "Ut veniam ad exercitation elit in anim nulla fugiat exercitation consequat officia enim. Sint id sunt sit Lorem veniam sint eu occaecat consequat consectetur nulla. Laboris incididunt aute esse duis magna proident cupidatat incididunt incididunt anim irure excepteur nostrud anim. Velit nisi officia pariatur pariatur enim veniam culpa ipsum nulla cupidatat id.\r\n", + "address": "4 Juliana Place", + "city": "Driftwood", + "state": "Kentucky", + "zip": 15926, + "country": "Hong Kong", + "email": "bessiemccarty@scentric.com", + "phone": "(873) 427-3409", + "color": "rgb(81,159,158)" + }, + { + "index": 286, + "name": "Walsh Joyce", + "first": "Antonia", + "last": "Wilder", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rangafangs/73.jpg", + "expanded": false, + "guid": "61dd3458-c773-4f4b-b2bb-3d301963acb2", + "integer": 63, + "date": "Thu Apr 03 2008 20:31:45 GMT-0700 (PDT)", + "shortText": "quis magna nisi", + "mediumText": "Pariatur ullamco mollit aliquip adipisicing dolore reprehenderit nulla in. Et do dolor pariatur est laboris ea amet proident elit proident est. Lorem et est nisi deserunt dolor consectetur cupidatat ea ex sunt. Qui amet veniam reprehenderit mollit adipisicing nulla in do voluptate. Fugiat irure esse proident esse anim Lorem et pariatur dolor.", + "longText": "Aute commodo incididunt eu consequat. Exercitation esse dolor id id in Lorem tempor laboris ex esse. Reprehenderit eiusmod consequat commodo consequat est. Ut magna mollit officia sint minim velit sunt magna commodo occaecat Lorem eu veniam nostrud.\r\nQui eu duis aliquip dolor dolor aliquip. Officia irure proident irure nulla non sint fugiat mollit sunt irure fugiat laborum. Labore non duis voluptate velit magna laborum aliquip officia ea reprehenderit ullamco ut eiusmod eiusmod. Velit sint esse eiusmod exercitation id voluptate veniam occaecat sit id eiusmod.\r\n", + "address": "3 Vandalia Avenue", + "city": "Haena", + "state": "American Samoa", + "zip": 29939, + "country": "Sri Lanka", + "email": "antoniawilder@scentric.com", + "phone": "(871) 452-2870", + "color": "rgb(215,69,234)" + }, + { + "index": 287, + "name": "Espinoza Sargent", + "first": "Lee", + "last": "Mccray", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zachbruggeman/73.jpg", + "expanded": false, + "guid": "8d6ab343-c3b7-4878-abfd-02a4bd8c4aad", + "integer": 34, + "date": "Sat Nov 24 2012 16:55:52 GMT-0800 (PST)", + "shortText": "laboris", + "mediumText": "Tempor et laboris nisi in deserunt ea veniam nostrud proident mollit ex nostrud adipisicing minim. Aliqua commodo eiusmod laborum labore. Velit et occaecat laborum aliqua labore culpa elit aute.", + "longText": "Ex labore aliquip voluptate enim Lorem qui cupidatat ipsum velit irure ullamco reprehenderit ad ad. Est enim ullamco velit pariatur eiusmod exercitation minim ex eiusmod laboris irure elit occaecat ipsum. Occaecat culpa dolore id veniam in. Consequat deserunt proident sit ad consequat proident. Dolore do voluptate ipsum eiusmod elit culpa irure in laborum aute. Ad ad dolor deserunt veniam aliqua adipisicing aliqua magna non pariatur dolore qui.\r\nNon in duis aliquip in nostrud magna ipsum ullamco. Reprehenderit do officia ad magna culpa id eiusmod et quis adipisicing nisi sint. Ullamco tempor cupidatat quis aliquip anim velit.\r\nDo id dolore veniam voluptate voluptate in ullamco dolor aliqua. Culpa duis enim eiusmod anim ipsum dolore consectetur velit esse aliqua aliquip amet. Nulla sit nulla et veniam eu. Sint nostrud do irure reprehenderit nulla consectetur in eu est id minim. Incididunt consectetur sint non nisi do anim veniam laboris in ad. Ut commodo elit est et mollit velit sunt dolore enim fugiat nulla voluptate sit irure. Laborum fugiat pariatur ut dolore ut qui minim.\r\nCupidatat nulla elit non ex elit. Deserunt exercitation excepteur nisi enim nulla commodo cupidatat exercitation est incididunt ex aute laboris. Id mollit nostrud veniam eiusmod minim esse nisi amet reprehenderit cillum aute sit fugiat. Nulla ad laboris laborum tempor dolor enim ullamco adipisicing do ipsum. Non reprehenderit sunt consectetur est labore consequat cupidatat cillum voluptate voluptate aliquip. Voluptate consectetur duis ipsum do mollit. Aute deserunt anim tempor veniam exercitation ut.\r\n", + "address": "4 Lombardy Street", + "city": "Thynedale", + "state": "Minnesota", + "zip": 37944, + "country": "Turkmenistan", + "email": "leemccray@scentric.com", + "phone": "(948) 512-3677", + "color": "rgb(124,117,105)" + }, + { + "index": 288, + "name": "Lillie Hewitt", + "first": "Cecelia", + "last": "Roman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/orkuncaylar/73.jpg", + "expanded": false, + "guid": "fd80b277-7170-4ff2-ad97-36272ea38b7d", + "integer": 54, + "date": "Mon Jul 11 1977 01:50:59 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Incididunt reprehenderit Lorem mollit consectetur adipisicing tempor occaecat nulla irure. Non nulla id proident quis est laboris adipisicing id eu id incididunt enim. Elit cillum sit ut elit nisi ea.", + "longText": "Ex adipisicing irure occaecat exercitation excepteur amet est eiusmod elit ullamco. Non tempor sit Lorem laborum laboris veniam elit sunt consequat. Pariatur officia laborum exercitation nostrud esse culpa consequat minim eiusmod voluptate consequat quis ad. Deserunt duis et Lorem labore do irure nostrud sit. Ullamco ad id sint sint cupidatat labore.\r\nEiusmod elit dolor qui nostrud eiusmod. Tempor veniam officia do exercitation. Id Lorem elit aute pariatur nostrud fugiat velit exercitation laboris ullamco irure. Laborum mollit occaecat reprehenderit dolore elit aliqua. Labore irure dolore proident non nisi culpa amet est anim non. Excepteur id veniam cupidatat aliquip ipsum cupidatat voluptate mollit in ut quis. Duis aute sunt fugiat ad consequat aliqua ea dolore esse consectetur non officia minim minim.\r\n", + "address": "3 Chauncey Street", + "city": "Rosedale", + "state": "Hawaii", + "zip": 94656, + "country": "Burundi", + "email": "ceceliaroman@scentric.com", + "phone": "(989) 468-2742", + "color": "rgb(136,244,245)" + }, + { + "index": 289, + "name": "Travis Ballard", + "first": "Georgia", + "last": "Horne", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/adamnac/73.jpg", + "expanded": false, + "guid": "c91bf011-bcd9-47fd-98b4-255ed2431de0", + "integer": 16, + "date": "Fri Aug 21 1998 11:13:07 GMT-0700 (PDT)", + "shortText": "sint enim fugiat culpa irure", + "mediumText": "Enim mollit ex velit anim ad. Mollit nulla sit est in minim voluptate ea deserunt commodo excepteur.", + "longText": "Consectetur aute officia nisi sint ut enim consequat. Id culpa in velit tempor nulla officia culpa. Ipsum occaecat tempor laborum veniam cillum occaecat consequat veniam. Nostrud aute velit veniam pariatur sint nostrud Lorem ipsum. Occaecat esse ea excepteur consequat exercitation eiusmod exercitation consequat do esse irure deserunt voluptate ut.\r\nConsectetur irure nostrud nulla ipsum fugiat nisi ex eu. Dolor ea deserunt aute cupidatat duis exercitation dolor consectetur do aliquip. Excepteur in ea cupidatat quis fugiat. Voluptate labore id tempor veniam pariatur excepteur ipsum.\r\nMagna qui ad aliqua minim sunt. Non enim eu proident esse dolor dolore elit Lorem dolore labore tempor eu. Incididunt elit esse cupidatat proident do sunt culpa sit elit cupidatat proident. Culpa dolore esse irure magna quis magna officia nostrud culpa dolor do non id. Esse laborum ea consequat commodo fugiat duis. Pariatur enim proident minim cupidatat dolor occaecat irure do. Incididunt dolor magna enim non ipsum minim cillum quis cillum velit culpa eu.\r\nEst esse eu commodo ea sint. Labore adipisicing cupidatat fugiat ea nostrud adipisicing ipsum. Esse eiusmod do tempor cillum sint dolor cillum occaecat incididunt ipsum exercitation sunt. Minim est ex commodo amet id sunt elit ea amet dolor ad. Ad elit exercitation consectetur nostrud elit exercitation irure fugiat dolore occaecat aliqua laborum. Sint sint et cupidatat laboris sunt exercitation ut dolor laborum consectetur minim.\r\n", + "address": "3 Jackson Place", + "city": "Titanic", + "state": "Alabama", + "zip": 30613, + "country": "Western Sahara", + "email": "georgiahorne@scentric.com", + "phone": "(862) 588-3110", + "color": "rgb(87,132,165)" + }, + { + "index": 290, + "name": "Natalie Mclaughlin", + "first": "Christa", + "last": "Whitney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremydowe/73.jpg", + "expanded": false, + "guid": "99003ea4-7908-4727-9909-1fc5a6e1b77d", + "integer": 38, + "date": "Wed Jun 18 2014 21:58:36 GMT-0700 (PDT)", + "shortText": "fugiat", + "mediumText": "Labore cillum ut voluptate laboris ipsum Lorem sint sit ut adipisicing ex occaecat aliquip nostrud. Deserunt officia minim sunt labore excepteur.", + "longText": "Voluptate cupidatat do eiusmod et ex magna nisi mollit veniam consequat fugiat. Velit culpa veniam sint nostrud aute aliquip id commodo consectetur. Reprehenderit aute consequat eu ullamco irure duis excepteur. Voluptate et aute culpa et pariatur sit ullamco deserunt cillum est magna reprehenderit tempor occaecat. Duis elit dolor id Lorem cupidatat sit aliquip. Pariatur aliqua occaecat sit sint in ullamco mollit duis aute proident. Et commodo pariatur nostrud est.\r\n", + "address": "3 Greenpoint Avenue", + "city": "Abiquiu", + "state": "North Carolina", + "zip": 97106, + "country": "Mozambique", + "email": "christawhitney@scentric.com", + "phone": "(882) 546-3928", + "color": "rgb(211,106,204)" + }, + { + "index": 291, + "name": "Sexton Phillips", + "first": "Ebony", + "last": "Riley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/adamawesomeface/73.jpg", + "expanded": false, + "guid": "79a69d1d-7c62-4f81-8cb4-2933233de8f0", + "integer": 31, + "date": "Mon Oct 28 1985 13:27:05 GMT-0800 (PST)", + "shortText": "duis", + "mediumText": "Duis do ullamco mollit reprehenderit proident labore laborum sint ipsum reprehenderit occaecat anim. Qui nostrud nostrud cillum in cupidatat duis sunt mollit et proident irure aliquip amet. Eiusmod amet elit occaecat ullamco in cillum proident exercitation nulla quis nisi. Velit qui ex nisi officia. Ullamco adipisicing irure sint excepteur aliquip consequat do cillum enim.", + "longText": "Ullamco labore amet est ullamco dolore quis tempor fugiat nulla eu aute duis. Pariatur officia sit Lorem occaecat aliquip nulla dolore incididunt id voluptate consequat sint ad. Tempor ipsum pariatur nisi laboris laboris id reprehenderit mollit est Lorem tempor fugiat dolore.\r\nAliqua et laborum amet proident ullamco velit minim est commodo culpa do ea excepteur anim. Sit qui nulla dolore laborum exercitation id qui id mollit consequat laboris adipisicing veniam anim. Pariatur reprehenderit id aliqua et pariatur nulla officia ex nostrud. Dolore ea do dolor nulla. Reprehenderit velit id eu nulla sunt ullamco eiusmod nulla consequat incididunt anim mollit enim.\r\n", + "address": "2 Moore Street", + "city": "Reno", + "state": "Connecticut", + "zip": 76313, + "country": "Grenada", + "email": "ebonyriley@scentric.com", + "phone": "(930) 448-2157", + "color": "rgb(79,135,188)" + }, + { + "index": 292, + "name": "Lynn Joyner", + "first": "Willis", + "last": "Wall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/low_res/73.jpg", + "expanded": false, + "guid": "0b8fad6f-6113-46f5-b586-19015be0120b", + "integer": 74, + "date": "Mon Oct 24 1988 13:00:24 GMT-0700 (PDT)", + "shortText": "excepteur exercitation", + "mediumText": "In occaecat voluptate officia in fugiat velit proident consectetur nulla tempor.", + "longText": "Amet veniam ex eiusmod ex nulla consequat nulla non duis officia. Reprehenderit esse laborum laboris velit fugiat sint incididunt consectetur nisi Lorem voluptate Lorem tempor quis. Voluptate veniam ea dolor laborum ea nostrud voluptate qui. Deserunt aliqua dolor culpa tempor ex consequat in. Esse est incididunt exercitation ad ex ad est. Aute culpa Lorem cillum est sunt adipisicing tempor eu cupidatat. Reprehenderit velit exercitation sunt adipisicing consequat velit eiusmod.\r\nDuis ex minim Lorem aute labore exercitation ipsum do magna minim. Lorem ipsum dolor laboris non minim. Ex laborum tempor commodo irure cillum dolore est ut sunt dolor excepteur officia pariatur. Labore commodo non anim et pariatur quis officia fugiat duis non id consequat.\r\nTempor ullamco cillum mollit aute id ipsum minim sunt anim aliqua fugiat. Ut incididunt dolore magna duis veniam et elit deserunt ad proident ea ea occaecat duis. Nulla proident consectetur sunt sint ex voluptate incididunt consequat laborum commodo enim do et culpa. Aute consequat minim elit Lorem adipisicing excepteur culpa.\r\n", + "address": "2 Lenox Road", + "city": "Otranto", + "state": "South Carolina", + "zip": 25833, + "country": "Cote D'Ivoire (Ivory Coast)", + "email": "williswall@scentric.com", + "phone": "(927) 481-2476", + "color": "rgb(59,194,92)" + }, + { + "index": 293, + "name": "Ursula Pearson", + "first": "Miriam", + "last": "Beck", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tomas_janousek/73.jpg", + "expanded": false, + "guid": "376bb50b-cbec-450c-a0c5-400189bf6ebd", + "integer": 27, + "date": "Sat Dec 27 1986 23:08:28 GMT-0800 (PST)", + "shortText": "tempor nostrud", + "mediumText": "Pariatur ex amet nulla ut nisi non sint sint. Labore minim aute id id ex. Consectetur eu aute ad aute irure proident. Tempor tempor velit labore nulla culpa sunt aliquip.", + "longText": "Exercitation culpa do nisi elit sit. Et fugiat mollit incididunt dolor esse consequat. Ut culpa duis sit laboris in enim fugiat exercitation. Nostrud ex qui laboris Lorem magna ea non nostrud ad esse. Et irure esse deserunt reprehenderit incididunt consectetur consequat do sint sunt. Nostrud cillum adipisicing quis duis.\r\nMollit eu officia velit velit ea consectetur fugiat amet nisi. Eiusmod sit culpa tempor fugiat reprehenderit irure proident. Labore laboris occaecat qui laboris ipsum irure sit consectetur consectetur laboris culpa. Minim ad aliquip enim Lorem qui culpa. Minim proident ipsum et ea sunt. Nulla et consectetur esse aute.\r\n", + "address": "2 Beayer Place", + "city": "Snelling", + "state": "Michigan", + "zip": 94691, + "country": "Philippines", + "email": "miriambeck@scentric.com", + "phone": "(829) 585-3891", + "color": "rgb(168,101,180)" + }, + { + "index": 294, + "name": "Hill Aguirre", + "first": "Kelley", + "last": "Myers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jghyllebert/73.jpg", + "expanded": false, + "guid": "34b624b3-92b6-4e5a-b477-c30521137ed1", + "integer": 85, + "date": "Tue Jun 01 2004 12:36:52 GMT-0700 (PDT)", + "shortText": "magna sit", + "mediumText": "Minim in cupidatat ullamco aliquip aliqua in nulla ullamco commodo esse quis sit. Ut aliquip elit cillum ad. Ex exercitation occaecat nulla nostrud elit aliquip nostrud commodo. Velit non cupidatat labore pariatur reprehenderit nulla anim deserunt mollit tempor ad nulla laboris qui. Exercitation aute fugiat quis anim aute.", + "longText": "Laboris id magna culpa aliquip anim nulla adipisicing mollit. Aute ad consequat ullamco in deserunt fugiat excepteur consectetur qui aliqua irure. Veniam ut in proident adipisicing dolore Lorem anim. Lorem veniam enim adipisicing nulla sint esse enim cupidatat. Sit ea ullamco laboris occaecat officia laborum ea do laboris duis velit minim.\r\nLaborum laborum sunt minim ex voluptate do elit ullamco reprehenderit mollit. Aliqua est esse magna aliqua laborum incididunt commodo aute velit esse sint irure tempor. Ut ut cupidatat quis exercitation exercitation. Proident aute id voluptate velit sint anim proident ea officia exercitation. Aliqua do labore veniam duis occaecat commodo. Anim duis elit esse non elit ut.\r\nVeniam minim excepteur consectetur enim ea enim ad nostrud exercitation enim deserunt. Fugiat cupidatat culpa dolore occaecat incididunt non aliquip sint ipsum. Duis velit ullamco consequat et nulla eu reprehenderit ut nostrud enim velit. Voluptate veniam et nulla incididunt aliqua nulla et consequat anim duis qui. Ullamco ipsum velit amet eu proident proident nisi qui aliquip sint. Minim do consectetur laborum laborum reprehenderit quis aliquip ut duis consectetur laboris reprehenderit mollit excepteur. Eiusmod aliquip deserunt aute ex.\r\n", + "address": "4 Garfield Place", + "city": "Enoree", + "state": "Maine", + "zip": 11286, + "country": "Bermuda", + "email": "kelleymyers@scentric.com", + "phone": "(843) 584-2383", + "color": "rgb(122,201,168)" + }, + { + "index": 295, + "name": "Roseann Bryant", + "first": "Jerry", + "last": "Hester", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gkaam/73.jpg", + "expanded": false, + "guid": "b860c080-a929-47e5-a0d0-71451a0c3af2", + "integer": 27, + "date": "Mon Feb 21 1977 02:23:49 GMT-0800 (PST)", + "shortText": "id commodo", + "mediumText": "Nulla reprehenderit laboris culpa aute laborum excepteur voluptate ullamco id. Consequat ut veniam occaecat officia dolore do. Laborum exercitation reprehenderit nostrud aute ut do. Esse laborum sit Lorem sint do mollit.", + "longText": "Dolore in cupidatat officia sunt. Sunt elit labore nisi est laboris dolore veniam. Esse pariatur in ex magna veniam aute.\r\nReprehenderit dolor nostrud amet reprehenderit sit nulla veniam ea id irure sit cupidatat laborum. Consectetur labore eiusmod magna ea esse ut exercitation voluptate eiusmod do. Ut cupidatat officia fugiat irure anim eu eu cillum minim ex ullamco.\r\nLabore reprehenderit culpa laboris irure cillum aliqua. Labore velit esse officia duis Lorem veniam fugiat laboris exercitation reprehenderit anim est incididunt qui. Cillum velit excepteur duis ullamco officia amet. Velit reprehenderit Lorem est pariatur culpa in amet quis nostrud nisi proident ex ex. Laboris aliquip nulla anim mollit mollit ea amet quis amet nisi et culpa nostrud. Magna esse in sit cillum eu sunt anim sit officia culpa ea aliqua ipsum. Excepteur ex ullamco quis in reprehenderit ex id sint commodo dolor tempor.\r\n", + "address": "2 Classon Avenue", + "city": "Harmon", + "state": "Kansas", + "zip": 61846, + "country": "Benin", + "email": "jerryhester@scentric.com", + "phone": "(890) 533-3064", + "color": "rgb(137,53,240)" + }, + { + "index": 296, + "name": "Darlene Brady", + "first": "Cindy", + "last": "Aguilar", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmetalpbalkan/73.jpg", + "expanded": false, + "guid": "1701f080-0b5d-4b9b-b030-9e4c5f307453", + "integer": 65, + "date": "Thu Aug 06 1981 04:50:44 GMT-0700 (PDT)", + "shortText": "minim", + "mediumText": "Reprehenderit aliquip consequat ut aliqua exercitation dolor ipsum cillum elit pariatur. Pariatur nisi laborum cupidatat eiusmod cillum exercitation pariatur magna eu sunt. Dolore culpa ut non occaecat.", + "longText": "Do occaecat do quis qui laboris veniam. Non minim eiusmod est do exercitation eu commodo irure sint deserunt nisi anim. Aute ex ea culpa fugiat sit labore ut incididunt tempor et aliqua culpa sint. Duis cillum laborum officia eiusmod qui veniam laborum incididunt. Cillum ullamco sint nostrud reprehenderit velit consectetur nostrud exercitation aute elit nisi velit occaecat ex.\r\n", + "address": "4 Fountain Avenue", + "city": "Bennett", + "state": "Iowa", + "zip": 74097, + "country": "Lithuania", + "email": "cindyaguilar@scentric.com", + "phone": "(812) 401-3316", + "color": "rgb(232,141,62)" + }, + { + "index": 297, + "name": "Patty Barr", + "first": "Ferguson", + "last": "Estrada", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/Silveredge9/73.jpg", + "expanded": false, + "guid": "fd87de9f-318b-4a1a-81e7-568f64e7c526", + "integer": 98, + "date": "Thu May 21 2009 02:11:35 GMT-0700 (PDT)", + "shortText": "excepteur excepteur esse culpa", + "mediumText": "Duis quis id elit culpa aute occaecat occaecat mollit culpa commodo ad labore laborum. Aliqua ea dolor Lorem ad laboris deserunt.", + "longText": "Ex in occaecat enim voluptate ex nisi officia. Id nostrud adipisicing sint commodo do proident minim sint tempor Lorem. Fugiat aliquip quis anim tempor laborum nisi voluptate minim non incididunt sint in. Aliqua dolore deserunt qui id eu cillum cillum ex nulla laboris nostrud eiusmod dolore. Qui dolor ullamco dolore proident aliqua.\r\nMagna consequat ex sunt occaecat enim deserunt dolor. Proident deserunt enim nulla eiusmod esse ea. Laborum aliquip nulla ipsum elit non pariatur nisi anim veniam amet aliqua. Ullamco cillum deserunt ex consectetur. Esse ex fugiat dolor ea ullamco dolor sit non. Esse eu occaecat dolore quis ipsum. Labore sint qui veniam fugiat est laboris sit.\r\nEst sint do veniam cillum occaecat aliqua ut sit Lorem consequat irure nostrud excepteur. Veniam dolore Lorem et nostrud quis esse est. Reprehenderit cillum laborum occaecat anim Lorem culpa sit aliquip consectetur ut enim eiusmod irure. Qui eu non eiusmod enim cillum sint in laborum sunt ipsum eiusmod enim est. Et labore occaecat dolor aliquip anim esse pariatur. Labore sit incididunt deserunt dolore ad deserunt. Lorem deserunt ex cillum qui amet adipisicing dolor eiusmod culpa id.\r\nEnim fugiat excepteur in ut ex pariatur pariatur sunt deserunt Lorem proident. Ipsum eu enim fugiat est ut ipsum do sint proident ipsum esse deserunt. Culpa minim duis ut aliquip sint sunt velit dolore amet. Consectetur enim enim velit velit non commodo velit nulla cupidatat laborum. Aliqua duis sint cupidatat excepteur adipisicing. Laboris proident irure aliqua esse irure aliqua ex consectetur.\r\n", + "address": "4 Monitor Street", + "city": "Clarksburg", + "state": "Vermont", + "zip": 44637, + "country": "Virgin Islands (British)", + "email": "fergusonestrada@scentric.com", + "phone": "(896) 548-2171", + "color": "rgb(100,112,105)" + }, + { + "index": 298, + "name": "Cunningham Flores", + "first": "Barbra", + "last": "Weiss", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_rennerlisa/73.jpg", + "expanded": false, + "guid": "c5081ce2-b967-4d87-9edd-e1b2d4d029cb", + "integer": 58, + "date": "Wed Nov 21 2001 11:50:05 GMT-0800 (PST)", + "shortText": "duis deserunt voluptate", + "mediumText": "Ea enim eu sit eu officia esse sunt. Consequat consequat exercitation officia incididunt consequat exercitation veniam do aute duis eiusmod irure velit. Anim labore ut exercitation excepteur irure incididunt laborum. Adipisicing et pariatur sit officia dolor laboris. Duis ipsum amet ipsum sit labore ipsum elit aliqua eiusmod.", + "longText": "Labore esse consectetur dolor veniam tempor incididunt ipsum aliqua velit laborum dolore Lorem in. Duis proident occaecat Lorem eu officia labore ullamco duis Lorem. Eu deserunt amet laboris aliqua anim sunt aliqua. Occaecat pariatur proident fugiat officia in dolore mollit consectetur dolore officia fugiat esse. Proident culpa veniam sit commodo. Quis sunt in velit id magna tempor est. Velit veniam aliquip cupidatat sunt quis veniam et minim.\r\nLorem ut fugiat in sit eiusmod officia in ad ad culpa culpa. Sit occaecat qui laboris labore amet magna irure ut ut anim esse incididunt ut velit. Dolor minim id reprehenderit reprehenderit labore. Dolore sint ipsum esse ut ex. Dolor esse est Lorem Lorem commodo veniam minim. Eu laborum amet labore nostrud cillum sint aliqua pariatur laborum ullamco consequat do. Quis proident in sunt laborum officia qui aliquip.\r\nIn cillum do cupidatat qui sint. Irure aliqua dolor proident esse tempor cupidatat laborum cillum. Culpa laboris nostrud esse eiusmod.\r\nReprehenderit non duis amet dolore excepteur ad et. Officia magna quis ipsum fugiat eu in nostrud labore culpa. Ullamco ullamco duis irure sit dolore amet aute non dolor adipisicing.\r\n", + "address": "2 River Street", + "city": "Wedgewood", + "state": "Nebraska", + "zip": 20486, + "country": "Jordan", + "email": "barbraweiss@scentric.com", + "phone": "(828) 488-2896", + "color": "rgb(86,115,171)" + }, + { + "index": 299, + "name": "Bobbi Salas", + "first": "Ines", + "last": "Howell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kulturpessimist/73.jpg", + "expanded": false, + "guid": "3bfa3d64-c2c0-4ea1-9111-2f9ca46c2a87", + "integer": 81, + "date": "Mon Jan 06 2014 11:35:59 GMT-0800 (PST)", + "shortText": "elit nostrud", + "mediumText": "In anim nulla tempor Lorem sunt in enim fugiat eiusmod occaecat aliquip eiusmod aute.", + "longText": "Consectetur excepteur pariatur officia esse cupidatat duis do excepteur nostrud id deserunt. Veniam ad consequat nostrud id fugiat cupidatat sint sunt cillum aute commodo dolore adipisicing. Eu dolor exercitation ullamco enim consequat ad pariatur incididunt. Nisi dolor eiusmod reprehenderit non. Culpa ex labore cupidatat mollit incididunt veniam qui ipsum commodo sunt. In qui aliqua tempor excepteur ut ea cillum.\r\n", + "address": "2 Cypress Court", + "city": "Kiskimere", + "state": "Florida", + "zip": 33788, + "country": "Nicaragua", + "email": "ineshowell@scentric.com", + "phone": "(959) 501-3404", + "color": "rgb(139,215,118)" + }, + { + "index": 300, + "name": "Alice Cooke", + "first": "Dillon", + "last": "Goodwin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/picard102/73.jpg", + "expanded": false, + "guid": "b536f301-48d7-4e68-90a9-c9d3caf00547", + "integer": 95, + "date": "Mon Jan 13 1992 21:08:29 GMT-0800 (PST)", + "shortText": "amet dolor ut consequat", + "mediumText": "Laborum excepteur esse qui sint. Enim ullamco amet anim commodo sunt incididunt dolore. Pariatur mollit esse consectetur fugiat ex esse voluptate enim.", + "longText": "Occaecat duis sit labore magna. Aute veniam ex reprehenderit irure dolor. Aliquip dolor quis sint eu do sunt commodo nulla cillum. Non minim fugiat nulla amet ullamco ipsum ex. Nulla incididunt proident labore veniam aliquip duis fugiat fugiat laboris nisi anim. Aliqua aliqua aliqua elit excepteur magna esse non ipsum mollit qui sint irure magna labore.\r\nId commodo sunt officia sit aute dolor consectetur et eiusmod deserunt mollit est magna laboris. Est laborum nulla in ex adipisicing veniam. Nisi anim ut dolore cupidatat fugiat eu. Eiusmod et culpa ex quis fugiat nostrud culpa. Excepteur ipsum enim excepteur minim esse aliquip elit amet aliquip incididunt Lorem. Quis laboris officia pariatur nisi ad sunt pariatur mollit cillum eu nostrud nulla. Ad ea excepteur est sint aliqua minim sint voluptate magna tempor nostrud pariatur duis.\r\nEu laboris ea esse adipisicing est veniam sint elit eiusmod. Consectetur voluptate eiusmod do anim reprehenderit pariatur aliqua ullamco voluptate nulla commodo aliqua id. Voluptate deserunt irure Lorem velit amet consectetur amet deserunt. Excepteur id esse eiusmod cupidatat laborum fugiat. Ea labore et amet non.\r\nAmet ea aute magna tempor. Duis voluptate culpa voluptate culpa ut irure. Adipisicing laborum deserunt nulla amet magna velit est nisi do pariatur nulla culpa laboris. Amet proident voluptate cillum ullamco cupidatat. Elit est incididunt sint fugiat tempor.\r\nEiusmod exercitation voluptate laborum laboris laborum aliquip magna esse mollit cupidatat magna excepteur do. Magna tempor excepteur ex dolor. Pariatur sunt duis minim duis aute cupidatat qui in anim qui. Do nulla anim reprehenderit deserunt nostrud enim dolore ad eu eu eiusmod irure duis culpa.\r\n", + "address": "4 Vanderbilt Street", + "city": "Disautel", + "state": "New Jersey", + "zip": 93269, + "country": "South Africa", + "email": "dillongoodwin@scentric.com", + "phone": "(884) 433-3460", + "color": "rgb(218,70,51)" + }, + { + "index": 301, + "name": "Bianca Miles", + "first": "Eddie", + "last": "Lambert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/e_zrra/73.jpg", + "expanded": false, + "guid": "d469f64f-4779-4372-ae48-a5c5546cc282", + "integer": 69, + "date": "Sat Feb 23 1974 14:20:00 GMT-0700 (PDT)", + "shortText": "proident mollit ad ipsum eu", + "mediumText": "Id sint adipisicing nostrud nulla velit amet ullamco Lorem adipisicing sit in ipsum. Ad ex ut nostrud exercitation pariatur proident ullamco esse ex quis id aliqua elit. Culpa et laborum enim laboris.", + "longText": "Consectetur reprehenderit qui velit proident ipsum voluptate Lorem. Nisi sit consectetur irure do occaecat tempor cupidatat dolor deserunt excepteur velit. Culpa incididunt veniam consequat veniam ex nisi nulla deserunt. Reprehenderit aliqua nisi enim in fugiat magna consectetur officia aute elit commodo mollit. Quis ipsum eiusmod fugiat ut consequat amet do eu.\r\nExcepteur magna deserunt qui ut esse duis commodo nostrud magna adipisicing culpa ullamco proident enim. Laboris aliquip non dolor in enim quis eu. Ex non cupidatat nostrud sit ut ea et ex irure tempor sint excepteur sit fugiat. Id cupidatat elit amet sit ullamco sint tempor sit tempor. Incididunt Lorem magna veniam occaecat duis aute minim duis sint.\r\nCillum pariatur non esse amet incididunt. Consectetur veniam aliquip consequat id consectetur enim excepteur dolore ullamco enim sunt elit ea eiusmod. Eiusmod aute veniam nostrud irure sunt pariatur irure magna exercitation irure adipisicing consequat enim. In et ex occaecat occaecat velit. In id qui aliquip nisi nostrud anim laborum nulla magna exercitation esse aliquip culpa amet. Exercitation tempor adipisicing culpa sit eu est fugiat consequat. Laboris minim nulla nisi labore enim sint consequat pariatur.\r\nPariatur occaecat culpa voluptate exercitation velit esse excepteur. Exercitation eiusmod et enim labore. Sunt sunt qui non ipsum nostrud nostrud veniam dolor velit velit qui. Anim qui reprehenderit ut quis mollit cillum. Eu dolor reprehenderit excepteur do ipsum eu. Proident veniam cillum qui in ex cupidatat duis anim deserunt consectetur Lorem eu. Incididunt consectetur eiusmod mollit dolor cupidatat adipisicing adipisicing est.\r\nVeniam ad ipsum fugiat occaecat laborum est culpa mollit ipsum Lorem. Ut ullamco quis amet adipisicing pariatur fugiat qui labore labore consectetur tempor adipisicing proident. Proident tempor reprehenderit ut ea dolor Lorem nisi. Labore adipisicing commodo ad eu sit nulla cillum. Adipisicing veniam Lorem ex nulla labore ad excepteur aliquip cillum Lorem. Ea incididunt proident ullamco incididunt tempor esse est. Incididunt quis nostrud deserunt irure sit do.\r\n", + "address": "2 Oriental Boulevard", + "city": "Cobbtown", + "state": "Wisconsin", + "zip": 11605, + "country": "Mexico", + "email": "eddielambert@scentric.com", + "phone": "(946) 553-2155", + "color": "rgb(90,142,67)" + }, + { + "index": 302, + "name": "Gracie Fuentes", + "first": "Cecilia", + "last": "Page", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/voldy333/73.jpg", + "expanded": false, + "guid": "55c8f54a-2927-4fc0-b0c6-4f8f5ef1107c", + "integer": 93, + "date": "Wed Aug 26 2009 01:27:46 GMT-0700 (PDT)", + "shortText": "culpa est", + "mediumText": "Aliquip consequat exercitation est sit magna sunt cillum occaecat. Nulla qui aute non eu exercitation.", + "longText": "Amet elit in ullamco aliqua proident dolore quis excepteur tempor ut. Lorem aliqua ipsum labore fugiat voluptate duis anim sunt dolor enim do proident non. Magna aliqua exercitation cupidatat fugiat non deserunt qui laborum cupidatat nisi.\r\nCommodo ullamco incididunt est dolore ad sint culpa sunt dolor enim. Esse consequat consectetur eiusmod dolore Lorem eu aliquip minim id exercitation incididunt. Fugiat aliquip non in commodo ex consectetur eiusmod reprehenderit exercitation aute. Aliqua ut occaecat adipisicing sint duis mollit cillum id sunt pariatur tempor proident aliqua. Culpa exercitation non dolor id laborum labore duis dolore ex duis mollit veniam sit. Ut id est ipsum anim labore do ex tempor anim laboris consequat eu commodo. Cillum do Lorem aliqua Lorem in sunt non ullamco velit aliquip.\r\nUllamco minim quis eu consequat. Et labore irure adipisicing cillum fugiat in in. Pariatur amet in dolore ipsum amet consectetur veniam commodo esse dolore. Nostrud sit aliquip ipsum incididunt enim commodo qui irure. Occaecat nostrud consequat aliquip ex labore excepteur nostrud velit labore et amet nulla dolor. Ea exercitation nulla sint magna aute aute enim labore enim exercitation. Est dolor ipsum mollit aliquip sunt voluptate amet veniam ullamco.\r\nEiusmod ea aute pariatur pariatur et tempor. Veniam eiusmod incididunt ullamco nulla. Esse excepteur culpa veniam sunt. Aliquip duis amet laboris qui est nostrud consequat. Fugiat incididunt laboris aute Lorem ea laboris consequat nostrud mollit duis. Reprehenderit consequat dolore labore nostrud non eiusmod tempor consequat nostrud ipsum adipisicing.\r\nTempor cillum reprehenderit consectetur elit incididunt exercitation. Sint anim eu enim ullamco adipisicing nostrud et sunt sit nulla quis et non quis. Ut eiusmod elit dolor ea commodo reprehenderit non. Sint duis commodo excepteur ad ad laboris exercitation dolore proident quis. Eu laborum exercitation consequat mollit esse. Aute tempor ipsum veniam exercitation labore culpa duis qui.\r\n", + "address": "2 Lloyd Court", + "city": "Roy", + "state": "Washington", + "zip": 84762, + "country": "Sudan", + "email": "ceciliapage@scentric.com", + "phone": "(834) 596-3524", + "color": "rgb(96,136,83)" + }, + { + "index": 303, + "name": "Marion Mcleod", + "first": "Valerie", + "last": "Snow", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jasonmarkjones/73.jpg", + "expanded": false, + "guid": "c9e129b1-7fdd-4a79-82ea-ec24bd138ccb", + "integer": 3, + "date": "Sun Dec 28 2008 07:30:23 GMT-0800 (PST)", + "shortText": "incididunt culpa anim officia", + "mediumText": "Eiusmod laborum aute culpa incididunt reprehenderit quis sunt minim culpa proident non proident ex. Ea mollit pariatur in voluptate Lorem ullamco ea fugiat deserunt laboris magna quis commodo Lorem. Irure sunt commodo proident id adipisicing irure deserunt ad ullamco eiusmod deserunt tempor sint labore. Eiusmod fugiat commodo aliquip excepteur nisi irure deserunt esse.", + "longText": "Est consectetur adipisicing est officia. Fugiat esse dolor qui aliquip aute est eu irure excepteur incididunt. Consectetur qui nulla culpa ea cupidatat labore adipisicing. Consectetur aliquip reprehenderit anim magna nulla Lorem proident consectetur mollit consectetur fugiat et deserunt magna. Incididunt culpa Lorem velit ut fugiat irure dolore enim nulla ut. Commodo elit enim incididunt deserunt incididunt officia.\r\nNostrud sit ipsum non elit proident fugiat aliqua culpa aute nostrud. Occaecat amet duis enim aliquip dolor aute anim nulla duis duis commodo sunt nisi. Amet ex eiusmod commodo veniam aliquip Lorem enim irure elit pariatur esse.\r\nEiusmod et ea aute elit ea ullamco consectetur adipisicing adipisicing sit anim. Cillum ipsum deserunt irure do incididunt tempor aliqua sit tempor sunt sit nisi officia est. Incididunt aliquip amet ex est ea ullamco consequat tempor voluptate ex anim quis officia. Pariatur commodo velit amet deserunt. Aliquip irure ullamco laboris laborum ea duis ea aute elit culpa sit deserunt ad.\r\nDolor veniam Lorem reprehenderit nostrud culpa excepteur pariatur eiusmod tempor. Amet nisi excepteur id laborum minim veniam. Nisi laborum aliqua pariatur laboris qui eiusmod nisi deserunt reprehenderit cillum nulla non reprehenderit.\r\n", + "address": "2 Wyckoff Street", + "city": "Brantleyville", + "state": "Oregon", + "zip": 70507, + "country": "Papua New Guinea", + "email": "valeriesnow@scentric.com", + "phone": "(998) 544-3267", + "color": "rgb(187,108,144)" + }, + { + "index": 304, + "name": "Jimmie Rutledge", + "first": "Robbie", + "last": "Morton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/r_oy/73.jpg", + "expanded": false, + "guid": "d8dded94-1c64-4d63-b175-e22679a649ea", + "integer": 98, + "date": "Wed Aug 22 1990 18:30:41 GMT-0700 (PDT)", + "shortText": "labore fugiat exercitation cupidatat ex", + "mediumText": "Cupidatat aliquip reprehenderit officia eu est fugiat deserunt. Fugiat labore do elit quis et nisi culpa. Exercitation labore laborum ad irure deserunt consequat. Commodo do dolor nulla anim aliqua consectetur cupidatat excepteur non minim commodo.", + "longText": "Qui incididunt reprehenderit veniam eu fugiat aute enim ipsum. Quis aliquip ea commodo proident exercitation tempor duis. Non commodo in duis id cillum excepteur eu elit. Deserunt Lorem proident in laboris quis ea et. Cupidatat irure veniam sit incididunt. Dolor ut dolor labore ullamco enim. Qui deserunt ullamco ex aute elit nulla officia sit exercitation.\r\nDo commodo officia esse sint. Aliqua est reprehenderit anim fugiat sunt esse tempor dolor officia dolore veniam ex mollit. Ad ea culpa laboris ea anim commodo. Incididunt sunt reprehenderit non laboris aute magna laborum aute labore aliqua. Esse nulla nostrud id occaecat pariatur laborum ut voluptate. Ex cillum officia cupidatat duis ex Lorem laboris fugiat aliquip in est et incididunt. Veniam laboris commodo nostrud consequat sunt dolore.\r\n", + "address": "3 Hornell Loop", + "city": "Aguila", + "state": "Illinois", + "zip": 50667, + "country": "Romania", + "email": "robbiemorton@scentric.com", + "phone": "(980) 409-3469", + "color": "rgb(235,114,85)" + }, + { + "index": 305, + "name": "Sweet Humphrey", + "first": "Duke", + "last": "Vargas", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/boericke/73.jpg", + "expanded": false, + "guid": "e9257b10-4071-40be-a831-77dc11b731e5", + "integer": 25, + "date": "Sun Oct 19 2008 14:12:07 GMT-0700 (PDT)", + "shortText": "duis deserunt ex ad", + "mediumText": "Anim duis quis amet laboris id adipisicing magna. Lorem ullamco magna consequat adipisicing dolor magna.", + "longText": "Velit mollit pariatur fugiat cupidatat veniam est. Laborum non reprehenderit qui in labore nisi. Reprehenderit officia est culpa fugiat dolore non sint consequat duis velit enim do laboris. Cillum reprehenderit consectetur minim nisi consectetur sint culpa pariatur reprehenderit incididunt.\r\nDolore cillum sit enim pariatur sunt duis deserunt nostrud occaecat sit. Aliqua do ut cillum aliquip adipisicing qui. Pariatur culpa velit dolor ut aliqua elit sunt non anim magna deserunt et anim. Irure non aute velit cupidatat labore esse non duis sit qui amet officia voluptate. Deserunt et proident amet anim duis consectetur commodo mollit. Commodo voluptate deserunt eiusmod sit.\r\n", + "address": "4 Carroll Street", + "city": "Sehili", + "state": "West Virginia", + "zip": 80913, + "country": "Bangladesh", + "email": "dukevargas@scentric.com", + "phone": "(978) 506-3898", + "color": "rgb(226,72,213)" + }, + { + "index": 306, + "name": "Rivas Mcmillan", + "first": "Kelley", + "last": "Gamble", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/phanalpha/73.jpg", + "expanded": false, + "guid": "bd339242-0db1-4838-9a8f-198fefcd1392", + "integer": 97, + "date": "Thu Mar 09 1972 11:02:38 GMT-0800 (PST)", + "shortText": "reprehenderit exercitation consectetur officia", + "mediumText": "Id culpa aliqua ullamco ad. Dolor eu cillum minim officia quis occaecat. Labore nulla ea dolore aliquip exercitation enim. Non ipsum dolore Lorem esse incididunt tempor culpa nulla.", + "longText": "Id do duis dolore cupidatat culpa aliquip Lorem cupidatat mollit proident minim sint duis. Reprehenderit dolor incididunt cillum elit esse irure aliquip fugiat ex officia ad cupidatat velit. Ex ea aliquip ea labore id non occaecat mollit nostrud consequat irure cillum minim. Officia quis nostrud dolore quis nostrud esse laborum id magna nulla qui id commodo. Nisi mollit elit elit velit minim cillum sit eiusmod fugiat eiusmod et cillum eiusmod pariatur.\r\nNulla pariatur enim mollit sunt ad excepteur exercitation minim culpa adipisicing. Anim qui adipisicing pariatur aliquip. Proident cupidatat veniam in et est magna labore reprehenderit in. Qui Lorem reprehenderit in in.\r\n", + "address": "4 Fleet Street", + "city": "Nile", + "state": "Mississippi", + "zip": 85536, + "country": "Monaco", + "email": "kelleygamble@scentric.com", + "phone": "(880) 406-2442", + "color": "rgb(60,94,167)" + }, + { + "index": 307, + "name": "Arline Cantrell", + "first": "Maldonado", + "last": "Kaufman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/miguellagran/73.jpg", + "expanded": false, + "guid": "8b28f57b-1d99-4094-a3a5-8ca8bdc0ebac", + "integer": 83, + "date": "Mon Jan 21 1974 10:44:50 GMT-0700 (PDT)", + "shortText": "cillum mollit irure id cillum", + "mediumText": "Duis aliqua fugiat deserunt ad veniam veniam esse fugiat commodo tempor. Non consectetur commodo eu dolore eu veniam. Mollit ullamco ut minim mollit. Qui enim aliqua nisi officia. Ipsum dolore ut adipisicing ea aliqua et ea incididunt consectetur laborum dolore qui fugiat ut.", + "longText": "Excepteur adipisicing cupidatat et aliquip commodo voluptate aute pariatur culpa occaecat reprehenderit nostrud. Reprehenderit occaecat eiusmod ut elit magna occaecat. Et aute duis consectetur dolor ut consequat ad.\r\nProident ad cillum sit ullamco. Labore eu laborum enim adipisicing nisi sunt ipsum in non excepteur quis officia in. Anim anim eu consectetur est sint et quis. Amet amet cupidatat reprehenderit aliquip. Elit voluptate ad anim dolore anim tempor nostrud tempor.\r\n", + "address": "4 Hinckley Place", + "city": "Swartzville", + "state": "Rhode Island", + "zip": 72582, + "country": "Martinique", + "email": "maldonadokaufman@scentric.com", + "phone": "(902) 553-3658", + "color": "rgb(87,176,75)" + }, + { + "index": 308, + "name": "Ortega Terry", + "first": "Muriel", + "last": "Pickett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dustinlamont/73.jpg", + "expanded": false, + "guid": "46a75489-56ac-4c3a-88c3-1bc1b2260321", + "integer": 79, + "date": "Thu Dec 20 2012 17:16:17 GMT-0800 (PST)", + "shortText": "quis laborum", + "mediumText": "Eu eu occaecat esse ad aliquip occaecat tempor dolor veniam sint ut mollit.", + "longText": "Elit labore ex culpa ad consectetur mollit. Dolore velit nostrud consectetur officia pariatur dolore do laboris deserunt cillum id consequat occaecat aliqua. Mollit est sit aute cillum tempor laborum officia. Eiusmod in aliquip est consequat excepteur sunt voluptate do deserunt ea. Tempor non laborum aliqua ad sit culpa consequat laborum.\r\nAmet tempor ipsum et laborum adipisicing non nulla ad. Nostrud in ex incididunt minim et ullamco velit. Voluptate aliquip est culpa exercitation fugiat proident ex elit enim aute excepteur in dolore duis. Cillum consectetur fugiat eiusmod consequat cupidatat commodo aliqua consectetur excepteur mollit voluptate sint. Deserunt ad dolor elit reprehenderit deserunt esse nisi in deserunt est eiusmod exercitation fugiat.\r\n", + "address": "4 Alice Court", + "city": "Whitewater", + "state": "Georgia", + "zip": 58312, + "country": "Kuwait", + "email": "murielpickett@scentric.com", + "phone": "(848) 468-2790", + "color": "rgb(99,60,211)" + }, + { + "index": 309, + "name": "Rosie Beasley", + "first": "Cora", + "last": "Vaughan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrzero158/73.jpg", + "expanded": false, + "guid": "94799d19-471d-4d23-9c9f-44ee2cb25c6f", + "integer": 96, + "date": "Tue Nov 09 1982 16:08:56 GMT-0800 (PST)", + "shortText": "do ea aute", + "mediumText": "Ex aliquip duis quis dolore adipisicing mollit excepteur aliquip consectetur id. Adipisicing eu ipsum cupidatat ullamco voluptate. Duis occaecat occaecat mollit incididunt cillum ipsum id tempor. Officia ex eiusmod pariatur dolore fugiat aute ad. Sit ad non ipsum nulla.", + "longText": "Officia officia ad non commodo anim. Anim ad non ut excepteur voluptate amet consequat Lorem sunt ad. Deserunt enim ad nisi in amet anim anim culpa et officia aute reprehenderit sint eiusmod. Anim laborum occaecat culpa aute ipsum do. Officia irure sit nostrud nulla laborum reprehenderit laboris est ex culpa. Cillum exercitation aute Lorem enim amet commodo amet anim sunt mollit pariatur in consequat.\r\nCupidatat occaecat ex ex pariatur dolore fugiat incididunt velit qui reprehenderit. Ullamco enim nisi deserunt laborum aute. Aliquip duis do enim adipisicing cupidatat. Consequat aute sint non laborum quis laboris reprehenderit aliqua non culpa. Enim est amet nostrud ullamco minim duis eu labore ut magna excepteur.\r\nAmet sint pariatur ad nostrud irure qui do eiusmod irure id ea. Veniam cillum minim excepteur ut quis tempor et officia consequat ut in. Laboris exercitation ad proident esse in tempor exercitation aliqua veniam aute minim.\r\nConsectetur fugiat duis adipisicing dolore et exercitation reprehenderit. Eu nostrud qui veniam non. Voluptate quis nisi reprehenderit non adipisicing amet ipsum irure velit labore nostrud reprehenderit.\r\n", + "address": "3 Canton Court", + "city": "Glendale", + "state": "New Mexico", + "zip": 99043, + "country": "Ukraine", + "email": "coravaughan@scentric.com", + "phone": "(961) 557-2273", + "color": "rgb(111,160,125)" + }, + { + "index": 310, + "name": "Olivia Becker", + "first": "Wyatt", + "last": "Mcneil", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/donaldjohns/73.jpg", + "expanded": false, + "guid": "4c1be78a-e176-445f-93d3-f818ae0d96b0", + "integer": 31, + "date": "Thu Sep 18 1980 04:25:22 GMT-0700 (PDT)", + "shortText": "excepteur labore sint in", + "mediumText": "Sint consectetur anim tempor ea pariatur cillum sit do in exercitation. Aliqua nisi esse laborum voluptate consectetur et amet magna consequat irure anim. Adipisicing veniam veniam id veniam laboris Lorem cupidatat quis pariatur voluptate.", + "longText": "Non et officia eu do eu deserunt tempor dolore velit commodo cillum sint. Consectetur aliqua sunt pariatur sint. Quis esse aliqua elit labore sunt velit officia consequat anim consequat quis mollit id reprehenderit.\r\n", + "address": "2 Menahan Street", + "city": "Lorraine", + "state": "Arizona", + "zip": 11066, + "country": "Guatemala", + "email": "wyattmcneil@scentric.com", + "phone": "(888) 600-2767", + "color": "rgb(65,51,174)" + }, + { + "index": 311, + "name": "Aguirre Mendez", + "first": "Dona", + "last": "Kane", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ah_lice/73.jpg", + "expanded": false, + "guid": "5c63b545-e732-43bc-af3f-32e0c68ad484", + "integer": 76, + "date": "Wed Oct 10 2007 23:01:28 GMT-0700 (PDT)", + "shortText": "voluptate eu cillum anim", + "mediumText": "Culpa voluptate laborum pariatur consectetur sit esse ullamco cupidatat elit adipisicing qui culpa ex. Ut ad tempor ipsum ut quis ipsum. Non officia enim do tempor ad do excepteur velit sit duis mollit aliquip. Dolore aliqua eiusmod commodo nostrud amet cillum dolore.", + "longText": "Ullamco laborum esse mollit aliqua aute deserunt Lorem. Officia eiusmod fugiat exercitation esse consequat commodo veniam. Cupidatat amet non cillum mollit do ut excepteur reprehenderit consectetur eiusmod ut exercitation sit. Sint id irure ullamco quis anim labore. Culpa duis aliquip qui elit ex laborum.\r\nAdipisicing et est culpa deserunt irure. Ullamco ut sit do fugiat. Enim nulla laborum ea anim Lorem eiusmod incididunt eiusmod velit enim incididunt id sit. Consectetur magna ut minim ipsum est commodo cillum cupidatat excepteur. Nostrud minim veniam veniam laborum anim. Nulla consectetur ea nostrud et culpa dolor est.\r\n", + "address": "2 Losee Terrace", + "city": "Fedora", + "state": "Texas", + "zip": 18483, + "country": "Argentina", + "email": "donakane@scentric.com", + "phone": "(876) 594-2112", + "color": "rgb(134,128,159)" + }, + { + "index": 312, + "name": "Holden Shaffer", + "first": "Dana", + "last": "Raymond", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/enda/73.jpg", + "expanded": false, + "guid": "2f0136bc-47e0-4206-b4f4-d87b45b44a4a", + "integer": 94, + "date": "Thu Jul 04 2002 17:43:16 GMT-0700 (PDT)", + "shortText": "quis ex cillum enim", + "mediumText": "Sit incididunt reprehenderit velit elit laborum sint est nulla. Ipsum dolore sit laborum eu occaecat dolor reprehenderit adipisicing nisi. Et aliquip officia fugiat consequat aliquip exercitation.", + "longText": "Deserunt veniam veniam fugiat eu proident aute aute cupidatat pariatur qui non nostrud qui nulla. Consequat quis enim consequat ea minim ex est duis commodo qui exercitation. Ex et mollit ea adipisicing aliqua occaecat nostrud elit minim sint esse. Magna deserunt nulla voluptate aute. Duis ullamco tempor voluptate adipisicing eu veniam ad quis quis enim. Ea adipisicing veniam eu nostrud amet laborum.\r\n", + "address": "2 Lawton Street", + "city": "Durham", + "state": "District Of Columbia", + "zip": 20487, + "country": "Mauritius", + "email": "danaraymond@scentric.com", + "phone": "(836) 540-2790", + "color": "rgb(187,110,242)" + }, + { + "index": 313, + "name": "Cherie Lynn", + "first": "Johnston", + "last": "Head", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guillogo/73.jpg", + "expanded": false, + "guid": "72ab6b5a-bd21-4563-b6b0-ab24cff5caed", + "integer": 80, + "date": "Fri May 10 1974 03:24:27 GMT-0700 (PDT)", + "shortText": "ad enim", + "mediumText": "Ut adipisicing excepteur ex Lorem cupidatat esse ipsum deserunt nisi irure in ut. Quis reprehenderit sunt non amet consectetur Lorem ut sit. Culpa ex laboris pariatur nisi quis qui. Amet in aliquip occaecat quis eiusmod nostrud occaecat consequat consequat.", + "longText": "Adipisicing esse occaecat sint quis nostrud. Sint incididunt elit mollit excepteur dolore. Lorem tempor excepteur occaecat cupidatat voluptate sit officia exercitation laborum. Cupidatat id reprehenderit deserunt minim.\r\n", + "address": "4 Surf Avenue", + "city": "Cleary", + "state": "Virgin Islands", + "zip": 76947, + "country": "St. Helena", + "email": "johnstonhead@scentric.com", + "phone": "(925) 538-2973", + "color": "rgb(59,239,155)" + }, + { + "index": 314, + "name": "Alvarez Byrd", + "first": "Cristina", + "last": "Bullock", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iboldurev/73.jpg", + "expanded": false, + "guid": "11934487-0dbb-4d2a-bf49-4f9e5938f248", + "integer": 88, + "date": "Fri Mar 12 1993 09:02:34 GMT-0800 (PST)", + "shortText": "veniam ad ullamco", + "mediumText": "Quis labore cillum magna incididunt. Nisi enim magna et tempor voluptate amet aute proident.", + "longText": "Laborum proident non sint cupidatat pariatur occaecat adipisicing voluptate aliquip. Mollit elit ut voluptate eu labore Lorem. Ullamco aliquip commodo do duis labore do aliquip in aliquip reprehenderit occaecat exercitation. Duis cillum voluptate ipsum minim sit commodo occaecat ex ipsum ex. Anim et Lorem ex elit fugiat.\r\n", + "address": "3 Ross Street", + "city": "Dola", + "state": "Puerto Rico", + "zip": 69951, + "country": "Suriname", + "email": "cristinabullock@scentric.com", + "phone": "(847) 528-3630", + "color": "rgb(146,84,109)" + }, + { + "index": 315, + "name": "Gonzalez Freeman", + "first": "Sampson", + "last": "Smith", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/smalonso/73.jpg", + "expanded": false, + "guid": "62c47315-656a-41e7-b9b4-7ee380ad77e8", + "integer": 58, + "date": "Sat Feb 15 2003 14:30:07 GMT-0800 (PST)", + "shortText": "sint", + "mediumText": "Excepteur tempor magna eiusmod pariatur anim consequat mollit excepteur nulla duis ut eu esse pariatur. Deserunt cillum amet incididunt nisi ut laboris quis enim labore. Eiusmod cupidatat qui officia ex dolor sint occaecat elit fugiat ex.", + "longText": "Do consequat voluptate duis aliqua Lorem cillum labore. Reprehenderit commodo esse anim aliqua exercitation qui. Elit nostrud officia esse aliquip in eiusmod ipsum duis ullamco. Elit deserunt magna voluptate mollit. Quis dolore esse reprehenderit sunt dolore nulla sunt duis fugiat.\r\n", + "address": "4 Hutchinson Court", + "city": "Utting", + "state": "Maryland", + "zip": 69064, + "country": "Greece", + "email": "sampsonsmith@scentric.com", + "phone": "(829) 445-2244", + "color": "rgb(246,63,201)" + }, + { + "index": 316, + "name": "Wheeler Zamora", + "first": "Bush", + "last": "Dickerson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taherrapee/73.jpg", + "expanded": false, + "guid": "a91485a2-e0b1-4e16-afa8-afb990283828", + "integer": 25, + "date": "Mon Jun 05 2006 06:35:22 GMT-0700 (PDT)", + "shortText": "sit pariatur", + "mediumText": "Officia minim occaecat nostrud dolor eiusmod. Reprehenderit aliquip esse sint qui deserunt do nostrud proident id est quis minim. Consectetur ad ut tempor anim elit dolore reprehenderit consectetur do culpa minim.", + "longText": "Exercitation officia est aute sunt nisi. Et officia irure eu deserunt enim est nulla. Commodo commodo consequat dolor eiusmod dolor. Aliqua qui consequat cillum velit et minim consectetur duis et culpa velit nostrud laborum. Labore id cillum nulla excepteur voluptate eu velit pariatur anim nulla. Ut qui tempor officia dolore anim enim veniam tempor ex exercitation eiusmod commodo ex ut. Non aute veniam sunt esse culpa non aliqua quis elit culpa elit.\r\nCommodo ut cillum quis laboris aliquip in. Mollit nisi amet cillum nisi laboris est officia. Non laborum fugiat ea non nisi. Et velit incididunt enim magna. Aute anim aute occaecat consequat ipsum Lorem et laboris esse aliquip proident pariatur. Consectetur non consectetur labore laboris ea est.\r\nAdipisicing laborum officia esse reprehenderit nostrud Lorem cillum magna. Labore ad ullamco pariatur irure. Sit ea aliquip ad Lorem ut consequat quis. Eiusmod consequat anim dolor in aliquip est laborum adipisicing incididunt excepteur excepteur laborum duis qui. Sunt consequat voluptate sunt cupidatat nostrud nisi. Ullamco reprehenderit anim est laboris et nulla.\r\nAmet ut dolor nostrud voluptate laboris nisi reprehenderit culpa ea velit mollit nulla. Esse qui sint anim ut incididunt. Nisi mollit ut nisi laborum ut deserunt magna dolor eiusmod. Elit enim sit reprehenderit cupidatat et. Aliqua dolore id fugiat occaecat occaecat ipsum.\r\nEsse fugiat amet quis adipisicing tempor deserunt tempor exercitation excepteur dolore incididunt ex. Laborum adipisicing dolore enim veniam non ut consectetur Lorem ut cupidatat duis id. Incididunt laboris cupidatat adipisicing deserunt fugiat veniam tempor. Fugiat officia eu ullamco magna sunt fugiat consectetur. Occaecat irure proident do officia. Laborum nulla quis non incididunt velit.\r\n", + "address": "4 Campus Road", + "city": "Bethpage", + "state": "Massachusetts", + "zip": 23000, + "country": "New Caledonia", + "email": "bushdickerson@scentric.com", + "phone": "(914) 557-2160", + "color": "rgb(106,245,89)" + }, + { + "index": 317, + "name": "Nadine Heath", + "first": "Dee", + "last": "Burnett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ismailmayat/73.jpg", + "expanded": false, + "guid": "315f838f-f59d-4c6c-bae4-f431576cf508", + "integer": 59, + "date": "Wed Aug 06 1980 08:47:43 GMT-0700 (PDT)", + "shortText": "nostrud labore culpa sint occaecat", + "mediumText": "Dolore irure officia consequat commodo exercitation non et consectetur minim fugiat.", + "longText": "Velit ipsum enim laboris cillum qui quis deserunt laborum. Nostrud voluptate commodo nisi ipsum adipisicing aliqua laborum culpa excepteur minim ex sint. Non minim voluptate pariatur consectetur. Dolor minim aute sint anim exercitation id laborum laborum.\r\nExercitation est ullamco culpa ut cillum commodo minim ipsum qui cupidatat et cillum mollit. Incididunt anim esse veniam veniam. Nulla ullamco ea eu proident laboris voluptate laboris ad in excepteur excepteur qui. Incididunt aute nisi irure quis commodo aute. Elit nisi labore qui sunt est velit anim cupidatat nostrud.\r\nCulpa anim consequat occaecat sunt. Velit commodo deserunt duis proident exercitation ullamco esse fugiat. Ullamco velit elit pariatur ut qui ex. Tempor voluptate labore consectetur id elit. Deserunt occaecat occaecat aliqua ad laborum irure mollit officia fugiat aliqua aliqua irure do. Sit id duis occaecat cupidatat ullamco nulla. Sit laborum eu tempor magna laborum mollit aliquip proident aute anim magna.\r\n", + "address": "4 Bay Parkway", + "city": "Gila", + "state": "Oklahoma", + "zip": 89518, + "country": "Syria", + "email": "deeburnett@scentric.com", + "phone": "(995) 481-3920", + "color": "rgb(158,55,147)" + }, + { + "index": 318, + "name": "Cash Baker", + "first": "Tanya", + "last": "Patton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/carlyson/73.jpg", + "expanded": false, + "guid": "4f3b7c6f-78ec-4074-b24d-b1e0788829a9", + "integer": 17, + "date": "Mon Jun 19 1972 16:40:48 GMT-0700 (PDT)", + "shortText": "proident duis eiusmod pariatur", + "mediumText": "Ullamco qui dolore fugiat id ad non.", + "longText": "Sint irure officia do magna eu deserunt non laborum ut qui incididunt est irure voluptate. Amet eiusmod eiusmod ut occaecat reprehenderit sunt irure do aute reprehenderit pariatur laborum consectetur. Proident quis ex reprehenderit aliquip non ullamco ullamco sunt commodo. Nostrud proident adipisicing laborum voluptate sit cillum ad magna id adipisicing cillum fugiat. Anim sit do quis cupidatat reprehenderit tempor pariatur deserunt. Tempor culpa reprehenderit adipisicing ea.\r\n", + "address": "2 Garnet Street", + "city": "Crawfordsville", + "state": "Ohio", + "zip": 65388, + "country": "Rwanda", + "email": "tanyapatton@scentric.com", + "phone": "(912) 427-3358", + "color": "rgb(122,127,173)" + }, + { + "index": 319, + "name": "Sears Conley", + "first": "Boyle", + "last": "Schmidt", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thewillbeard/73.jpg", + "expanded": false, + "guid": "17ce3452-2b9d-4fe3-b1db-7009a74b7e32", + "integer": 69, + "date": "Sat May 18 1996 00:26:16 GMT-0700 (PDT)", + "shortText": "amet consequat", + "mediumText": "Nulla non deserunt elit nostrud dolore elit Lorem sit qui aliqua aute aliquip elit. Mollit aliqua enim velit ea consectetur dolor duis minim ea. Ipsum aute ut labore duis labore nostrud labore. Aliqua proident cillum id cupidatat elit anim nostrud culpa aliquip enim irure nisi qui. Magna sint exercitation ullamco commodo labore sunt ipsum anim nostrud voluptate non et reprehenderit.", + "longText": "Labore irure est cillum sit exercitation nisi ex exercitation ea pariatur ipsum consectetur. Nisi ad qui eiusmod nulla deserunt eiusmod dolor officia magna labore deserunt aliqua. Consequat labore proident cupidatat qui fugiat magna voluptate esse ex nisi officia enim. Ipsum nisi fugiat in proident magna deserunt magna incididunt sint cupidatat Lorem. Sunt veniam consectetur ut ea. Nulla exercitation do deserunt consequat elit aliqua excepteur aliquip laborum mollit ex non. Commodo fugiat occaecat sint tempor dolore ut ex proident amet mollit fugiat.\r\nVeniam ex consequat consectetur incididunt. Qui enim eu incididunt anim. Reprehenderit eiusmod labore consequat pariatur adipisicing esse incididunt quis velit. Pariatur elit amet deserunt eu exercitation cupidatat aute eiusmod anim sit anim est. Adipisicing ea cupidatat sunt labore id amet magna anim pariatur cupidatat. Sint ex sunt nulla elit ut aute laboris deserunt cillum. Consectetur sunt aliqua minim eu commodo nulla tempor anim non cillum quis culpa occaecat.\r\nFugiat veniam qui ut sunt Lorem. Sint elit do deserunt laborum. Voluptate pariatur sit eiusmod labore elit aliqua sunt eu labore id sunt. Officia id non minim cillum. Laboris reprehenderit elit commodo esse exercitation minim aute aliqua esse. Dolor Lorem fugiat non reprehenderit occaecat dolore magna.\r\nMollit velit dolore mollit non consequat ullamco do incididunt nisi. Dolore ex eiusmod ex anim consequat deserunt qui. Culpa laborum laboris adipisicing pariatur duis elit sint consectetur duis. Ut ea consectetur dolore ullamco amet est irure Lorem. Aliqua do reprehenderit id incididunt amet fugiat id amet. Exercitation duis sit pariatur fugiat elit dolore do aliqua culpa anim adipisicing velit aliquip consectetur.\r\nElit ex excepteur do aute enim incididunt. Est eu aute occaecat quis dolor eiusmod quis ut quis fugiat enim id. Duis incididunt esse pariatur voluptate. Velit dolore ut aliqua culpa officia quis esse.\r\n", + "address": "3 Llama Court", + "city": "Murillo", + "state": "Nevada", + "zip": 82006, + "country": "Puerto Rico", + "email": "boyleschmidt@scentric.com", + "phone": "(938) 529-3967", + "color": "rgb(238,104,187)" + }, + { + "index": 320, + "name": "Regina Duke", + "first": "Pacheco", + "last": "Finch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tgormtx/73.jpg", + "expanded": false, + "guid": "1cd2ce04-b8d2-4d31-8130-6c88fda8666e", + "integer": 28, + "date": "Sun Sep 22 1974 11:52:41 GMT-0700 (PDT)", + "shortText": "deserunt proident voluptate anim", + "mediumText": "Tempor eiusmod culpa incididunt esse mollit elit anim Lorem magna et occaecat. Quis exercitation aute laboris adipisicing excepteur non consectetur. Eu sunt esse velit sint ad voluptate cillum est. Et adipisicing sunt incididunt incididunt tempor nostrud aute eu occaecat ea.", + "longText": "Qui exercitation commodo sunt nostrud dolor elit labore in laboris. Minim cillum Lorem enim sunt nostrud culpa sint reprehenderit. Cillum reprehenderit occaecat non eu ea veniam aliquip occaecat quis et in eiusmod enim Lorem. Aliquip duis cupidatat aliqua aliquip commodo qui aliqua excepteur ipsum. Lorem labore tempor nisi ut deserunt. Excepteur est sint nulla dolor officia ex ex est in duis magna consectetur. Occaecat anim irure pariatur sit fugiat.\r\nFugiat nulla mollit quis ex deserunt non id anim proident. Officia sint fugiat eiusmod qui fugiat consequat ut magna Lorem. Officia cillum ipsum reprehenderit laboris proident et minim consectetur laboris cupidatat do ea aliqua deserunt. Ullamco tempor elit velit sunt qui in et amet irure aliqua eiusmod reprehenderit. Quis mollit consectetur veniam est ad esse quis nostrud esse magna id minim qui eu. Occaecat elit ullamco in aliqua aute sint. Incididunt qui esse ad voluptate nisi.\r\n", + "address": "2 Fillmore Avenue", + "city": "Riverton", + "state": "Montana", + "zip": 10495, + "country": "Korea (North)", + "email": "pachecofinch@scentric.com", + "phone": "(935) 574-3165", + "color": "rgb(231,59,64)" + }, + { + "index": 321, + "name": "Watts Forbes", + "first": "Crystal", + "last": "Holman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/73.jpg", + "expanded": false, + "guid": "78f69b15-a996-41aa-be22-2350d747a215", + "integer": 37, + "date": "Sat Oct 27 2001 01:47:57 GMT-0700 (PDT)", + "shortText": "duis", + "mediumText": "Sit sint ut incididunt esse irure do tempor esse est velit aliqua consectetur consectetur fugiat.", + "longText": "Dolore sunt mollit nisi adipisicing esse laboris. Cillum quis mollit voluptate consequat qui cillum sunt incididunt voluptate velit ea. Enim id ut duis minim pariatur. Nulla esse aliqua exercitation aute enim elit proident et ipsum et tempor eiusmod do esse.\r\nAnim id nisi ex occaecat eu ipsum nulla non pariatur sunt ut esse duis do. Exercitation est anim sit eiusmod qui pariatur dolore. Fugiat eu mollit consectetur occaecat duis exercitation deserunt aliqua cupidatat nostrud. Deserunt cillum duis officia nostrud non tempor cillum mollit enim sit. Ad commodo nostrud adipisicing mollit culpa non dolore. Amet pariatur sunt officia irure enim minim ea. Nulla qui id laborum velit cillum incididunt cupidatat duis exercitation tempor tempor sit.\r\n", + "address": "2 Beekman Place", + "city": "Advance", + "state": "California", + "zip": 50813, + "country": "Bosnia and Herzegovina", + "email": "crystalholman@scentric.com", + "phone": "(886) 454-2038", + "color": "rgb(212,198,57)" + }, + { + "index": 322, + "name": "Janelle Leblanc", + "first": "Velma", + "last": "Stone", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mwarkentin/73.jpg", + "expanded": false, + "guid": "84151da3-43cb-4cb5-ac3f-dce5eac66594", + "integer": 10, + "date": "Wed Mar 15 1995 04:06:56 GMT-0800 (PST)", + "shortText": "sit duis", + "mediumText": "Sint incididunt in ex officia cupidatat consectetur fugiat eiusmod labore.", + "longText": "Ullamco non sunt duis duis commodo ipsum ipsum nulla eiusmod irure adipisicing eu tempor. Elit labore magna incididunt est. Officia id incididunt minim pariatur officia consequat sunt. Non ut voluptate proident ipsum. Irure nulla cillum aute exercitation. Aliqua sit eu occaecat minim.\r\nAd excepteur qui est culpa. Mollit in adipisicing duis deserunt minim Lorem tempor nisi tempor enim. Nulla ex aliqua nostrud id. Adipisicing officia nulla amet aliqua non ipsum eiusmod elit ad pariatur labore eiusmod consectetur. Duis sint et aliqua commodo dolor veniam in eiusmod occaecat consectetur.\r\nConsectetur ea voluptate ullamco tempor nisi in. Lorem anim mollit fugiat tempor. Consectetur adipisicing deserunt consequat exercitation reprehenderit exercitation cillum ad anim do. Commodo occaecat ad do et laborum veniam aliqua cupidatat. Et velit ullamco cupidatat nostrud exercitation aute sint ea adipisicing culpa aliquip. Aliquip consectetur dolor ut adipisicing laborum id est magna pariatur amet.\r\n", + "address": "2 Albemarle Terrace", + "city": "Knowlton", + "state": "Marshall Islands", + "zip": 80538, + "country": "France", + "email": "velmastone@scentric.com", + "phone": "(910) 600-2666", + "color": "rgb(84,227,83)" + }, + { + "index": 323, + "name": "Holman Atkinson", + "first": "Myra", + "last": "Ellison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/herkulano/73.jpg", + "expanded": false, + "guid": "51f45fc6-fc94-4be1-8769-ac78341d3d69", + "integer": 13, + "date": "Mon Jan 24 2011 03:20:14 GMT-0800 (PST)", + "shortText": "labore sit eiusmod sit", + "mediumText": "Qui ipsum tempor occaecat ullamco Lorem officia voluptate. Consequat cillum ea sunt cupidatat est quis quis pariatur.", + "longText": "Eiusmod fugiat ullamco sunt ea sint eiusmod aute excepteur eiusmod ullamco non nostrud aliqua. Pariatur pariatur aute aliqua nisi nisi amet. Non officia ipsum eu do veniam excepteur ea sit sint consequat. Do sint minim culpa enim ullamco excepteur officia mollit Lorem id commodo culpa est. Laborum ex anim Lorem et. Cupidatat mollit esse do adipisicing.\r\nEu velit ipsum officia ex. Deserunt esse et tempor magna duis ex ut sunt dolore do. Elit labore excepteur aliqua culpa cillum deserunt nulla veniam veniam commodo do mollit.\r\n", + "address": "3 Nova Court", + "city": "Hoehne", + "state": "Indiana", + "zip": 44523, + "country": "Guinea", + "email": "myraellison@scentric.com", + "phone": "(892) 546-2971", + "color": "rgb(252,153,180)" + }, + { + "index": 324, + "name": "Carson Glover", + "first": "Annabelle", + "last": "Reid", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jonny_moon/73.jpg", + "expanded": false, + "guid": "560ce64c-d4a7-43a1-a119-c815a7d0eddc", + "integer": 43, + "date": "Sun Oct 21 1979 10:07:45 GMT-0700 (PDT)", + "shortText": "qui reprehenderit", + "mediumText": "Ullamco incididunt minim ullamco id exercitation.", + "longText": "In veniam fugiat laboris incididunt excepteur ad proident. Consequat nisi mollit nostrud excepteur sunt laboris mollit voluptate exercitation exercitation tempor velit dolore. Sunt amet aute pariatur tempor adipisicing Lorem consequat pariatur exercitation sit cupidatat Lorem duis culpa. Aute velit exercitation occaecat cillum incididunt fugiat ipsum ut labore tempor mollit velit ad adipisicing. Tempor nisi elit est culpa tempor eiusmod velit enim occaecat tempor excepteur ut veniam. Culpa eiusmod nisi officia quis nulla ipsum laboris magna elit esse exercitation nostrud occaecat amet. Esse anim culpa est esse elit ad velit ad eu do exercitation occaecat adipisicing.\r\nIn duis enim Lorem id ullamco cillum veniam. Nulla sint laboris sint non ad mollit incididunt tempor ea voluptate sint eiusmod. Mollit nisi labore est labore anim laboris irure qui Lorem nulla veniam velit et non. Do occaecat excepteur aliqua in ea pariatur elit incididunt.\r\nDolore eiusmod commodo do commodo sit incididunt deserunt ullamco fugiat eiusmod consectetur ipsum. Fugiat eiusmod consectetur elit aliquip tempor labore cillum. Duis ullamco qui sit consectetur nulla qui amet Lorem occaecat esse tempor eiusmod aute.\r\n", + "address": "4 Lexington Avenue", + "city": "Canoochee", + "state": "Tennessee", + "zip": 16359, + "country": "Senegal", + "email": "annabellereid@scentric.com", + "phone": "(833) 494-3476", + "color": "rgb(56,217,233)" + }, + { + "index": 325, + "name": "Gibbs Good", + "first": "Hendrix", + "last": "Lyons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alyssalowww/73.jpg", + "expanded": false, + "guid": "2a5302bc-b0dd-4ccc-8688-7df77439ace5", + "integer": 21, + "date": "Thu Jan 01 1976 12:47:48 GMT-0800 (PST)", + "shortText": "aliqua tempor", + "mediumText": "Commodo pariatur enim velit ut reprehenderit in culpa. Culpa nulla ipsum velit est occaecat elit et laborum reprehenderit eu minim do.", + "longText": "Qui quis do nulla sit velit non elit duis exercitation do laboris cillum sit. Eiusmod reprehenderit sit aliqua qui dolor sunt qui commodo. Tempor aute Lorem labore aliqua ea minim duis irure sint non veniam. Ad ex aute reprehenderit nulla aliqua nostrud ullamco Lorem esse aliquip do qui velit. Nostrud elit esse ad duis occaecat culpa. Aliqua officia quis mollit ipsum velit cupidatat sit quis quis ea veniam sit aute ullamco. Laboris et ad cillum veniam nulla fugiat.\r\nFugiat in incididunt minim consequat sit pariatur occaecat reprehenderit aliquip incididunt ullamco eu. Nostrud qui nostrud laboris magna. Aute ullamco veniam consequat nulla aute nulla culpa. Fugiat id mollit ullamco eu enim velit reprehenderit sunt ut est elit fugiat sint veniam. Reprehenderit amet ea anim veniam consectetur proident commodo. Aliquip Lorem amet occaecat cupidatat dolor officia quis pariatur. Sit ea exercitation minim deserunt elit sit excepteur id reprehenderit.\r\nIpsum in tempor culpa esse fugiat mollit esse. Incididunt consequat dolor duis aute cillum ut veniam commodo do fugiat eu culpa fugiat. Enim pariatur reprehenderit elit ex proident aute aliqua. Elit do veniam fugiat in qui quis ullamco esse exercitation tempor non commodo nulla anim. Non Lorem sunt cupidatat aliquip dolor labore laboris Lorem fugiat. Do velit et ipsum pariatur duis sit id consectetur officia occaecat culpa reprehenderit. Nulla est in commodo nostrud ea deserunt duis culpa.\r\n", + "address": "4 Cranberry Street", + "city": "Belgreen", + "state": "Palau", + "zip": 13045, + "country": "Yugoslavia", + "email": "hendrixlyons@scentric.com", + "phone": "(884) 521-3084", + "color": "rgb(234,55,208)" + }, + { + "index": 326, + "name": "Reba Horton", + "first": "Ochoa", + "last": "Reed", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rafelorden/73.jpg", + "expanded": false, + "guid": "b51d4b79-1289-46e1-9874-cac40d2a3f4c", + "integer": 89, + "date": "Mon Sep 06 2010 03:05:58 GMT-0700 (PDT)", + "shortText": "sint reprehenderit", + "mediumText": "Consectetur velit id fugiat amet aliquip laboris deserunt. Pariatur officia non Lorem consectetur officia ipsum occaecat sint commodo laboris amet minim ullamco officia.", + "longText": "Deserunt consequat eiusmod commodo qui adipisicing et. Occaecat elit occaecat ullamco eu ea minim cupidatat veniam veniam aliquip tempor laboris. Exercitation duis cupidatat ullamco magna incididunt cupidatat reprehenderit consequat laborum.\r\nOfficia occaecat quis quis fugiat aliquip et. In laborum et pariatur qui consectetur ullamco cillum excepteur voluptate fugiat. Eiusmod nulla elit qui in irure. Nulla enim consectetur proident nostrud.\r\nVeniam sit tempor laboris aute dolor officia laborum. Deserunt ad consequat non nulla dolor eiusmod elit veniam tempor. Esse sint amet nisi et ea labore amet. Officia aliquip pariatur dolore anim dolore culpa esse elit amet aliqua voluptate. Esse elit ex ipsum proident occaecat deserunt non amet reprehenderit. Voluptate anim sunt fugiat consectetur ut quis esse sit.\r\nCillum incididunt sint sit nostrud magna minim anim labore elit adipisicing est ipsum. Laborum ut officia ullamco labore non dolore veniam labore dolor et sint ex duis. Excepteur irure exercitation Lorem occaecat exercitation in consequat. Nulla est excepteur elit qui magna quis nulla laboris amet. Laborum nisi ex enim consequat mollit ullamco magna aliquip occaecat occaecat et elit sunt. Consectetur reprehenderit magna officia do aliquip proident minim. Aute qui officia deserunt labore id in esse aliqua do anim pariatur dolore consequat.\r\nAmet pariatur veniam cupidatat deserunt voluptate aliquip fugiat occaecat eu sit pariatur. Consectetur eu quis proident reprehenderit nisi. Voluptate aliquip quis culpa proident anim culpa esse. Mollit eiusmod magna cupidatat nostrud non ad duis. Laboris reprehenderit amet cupidatat duis sint qui deserunt excepteur amet. Consectetur reprehenderit Lorem esse nisi aliquip incididunt ipsum aute occaecat esse occaecat. Laboris sit Lorem incididunt laborum in.\r\n", + "address": "2 Montauk Avenue", + "city": "Wildwood", + "state": "Virginia", + "zip": 44321, + "country": "Uzbekistan", + "email": "ochoareed@scentric.com", + "phone": "(873) 450-2072", + "color": "rgb(87,106,105)" + }, + { + "index": 327, + "name": "Newton Townsend", + "first": "Cara", + "last": "Armstrong", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wim1k/73.jpg", + "expanded": false, + "guid": "396fee22-8931-4acb-9aa0-ef4e3d463f65", + "integer": 32, + "date": "Sun Feb 20 2011 09:27:11 GMT-0800 (PST)", + "shortText": "magna", + "mediumText": "Magna aute elit cupidatat ipsum velit reprehenderit. Occaecat qui fugiat nostrud quis excepteur commodo. Voluptate id consequat laborum mollit exercitation proident voluptate cillum voluptate in. Amet culpa consequat ullamco dolore incididunt consequat aliqua est nulla quis proident culpa.", + "longText": "Enim esse anim veniam est sunt labore ut qui magna cillum fugiat. Labore cupidatat ullamco deserunt veniam elit irure elit quis qui tempor anim et magna. Ex commodo ex adipisicing non laborum. Aliquip ex consequat dolor ut non consequat excepteur. Laboris laborum adipisicing cupidatat est. Id est aliqua laborum mollit incididunt excepteur. Enim commodo in culpa Lorem.\r\nLaborum sunt et exercitation mollit ut nulla aliqua nulla fugiat dolor. Deserunt commodo Lorem eu id adipisicing amet qui reprehenderit eu consectetur aliquip mollit eiusmod. Ad sit anim qui irure et ipsum laboris qui consectetur.\r\n", + "address": "4 School Lane", + "city": "Garfield", + "state": "Wyoming", + "zip": 38497, + "country": "Estonia", + "email": "caraarmstrong@scentric.com", + "phone": "(824) 554-2497", + "color": "rgb(82,224,190)" + }, + { + "index": 328, + "name": "Jenkins Short", + "first": "Castaneda", + "last": "Padilla", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rpeezy/73.jpg", + "expanded": false, + "guid": "bf4be80d-f135-468d-adab-23bf03ffb166", + "integer": 12, + "date": "Thu Sep 22 1994 12:13:32 GMT-0700 (PDT)", + "shortText": "et duis Lorem occaecat deserunt", + "mediumText": "Voluptate sint non minim elit. Est tempor tempor tempor nisi id cupidatat sunt.", + "longText": "In esse voluptate velit dolore ullamco in. Deserunt anim fugiat laboris sunt pariatur. Magna veniam ad eu labore aliquip non quis do adipisicing. Quis esse ad nostrud commodo. Non non aliquip sit laboris quis commodo laboris.\r\nPariatur laborum ad in ut et deserunt labore aute sint eiusmod. Voluptate eiusmod est enim quis id culpa aute eiusmod magna deserunt quis sint deserunt tempor. Deserunt quis deserunt enim elit. Esse duis irure eu officia ut tempor in velit in pariatur. Ea aute enim occaecat amet enim nisi excepteur consequat qui ut laboris incididunt tempor.\r\nIpsum enim dolore irure esse incididunt. Voluptate elit qui mollit aliquip ex proident ad adipisicing ipsum. Tempor dolore minim esse esse sint irure pariatur esse.\r\nMagna sunt labore Lorem do laboris duis exercitation aliqua fugiat eiusmod incididunt. Dolor mollit sunt commodo occaecat dolor eu sunt id occaecat sint. Et sunt esse eiusmod veniam nisi magna culpa voluptate nisi esse.\r\n", + "address": "2 Elton Street", + "city": "Gouglersville", + "state": "Colorado", + "zip": 96057, + "country": "Gambia", + "email": "castanedapadilla@scentric.com", + "phone": "(911) 571-2320", + "color": "rgb(80,137,178)" + }, + { + "index": 329, + "name": "Deborah Klein", + "first": "Sandoval", + "last": "Miranda", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sectronov/73.jpg", + "expanded": false, + "guid": "9daaa0e4-d04c-4232-a637-24e733f0b9ac", + "integer": 76, + "date": "Sun Aug 14 1994 19:32:54 GMT-0700 (PDT)", + "shortText": "exercitation mollit reprehenderit dolore deserunt", + "mediumText": "Quis sint eu occaecat ex ex amet pariatur deserunt ea magna excepteur. Laborum in fugiat eiusmod amet sunt nostrud officia qui magna id et. Non fugiat eu consectetur veniam tempor. Nostrud proident reprehenderit sint aute nisi aliqua anim enim deserunt id. Labore excepteur sit dolor nisi occaecat velit pariatur id aliquip.", + "longText": "Labore officia tempor adipisicing amet. Aliqua amet deserunt dolore nisi commodo velit aliqua. Eu nisi fugiat minim duis ipsum esse adipisicing eu nulla ex ad.\r\n", + "address": "2 Olive Street", + "city": "Fairview", + "state": "Utah", + "zip": 99892, + "country": "Nepal", + "email": "sandovalmiranda@scentric.com", + "phone": "(808) 578-2445", + "color": "rgb(234,209,129)" + }, + { + "index": 330, + "name": "Tricia Moss", + "first": "Dickson", + "last": "Houston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/starburst1977/73.jpg", + "expanded": false, + "guid": "f41db055-f748-45e3-9ce3-4d867e00f776", + "integer": 9, + "date": "Mon Jun 15 1992 12:38:40 GMT-0700 (PDT)", + "shortText": "esse consectetur", + "mediumText": "Non nisi ut aliqua ipsum consequat excepteur culpa labore labore. Incididunt adipisicing qui mollit elit eiusmod aliqua aute. Laboris ut consequat consectetur elit aliquip irure enim aute cupidatat. Laboris incididunt id laborum reprehenderit duis nisi consectetur laboris nostrud.", + "longText": "Occaecat mollit reprehenderit tempor veniam consectetur non officia. Laboris consequat velit mollit in quis. Qui dolore excepteur in esse magna cupidatat incididunt eiusmod magna do. Laboris consectetur adipisicing occaecat cillum mollit duis. Officia excepteur exercitation quis consequat deserunt magna officia voluptate officia sint magna quis officia voluptate. Ullamco qui nostrud id incididunt veniam eu Lorem ad voluptate.\r\nConsequat cupidatat laborum sint consectetur. Anim do anim reprehenderit excepteur occaecat duis eu ea ipsum anim non nostrud nulla minim. Voluptate eu id officia consequat minim. Proident nulla qui amet qui veniam mollit non.\r\n", + "address": "3 Russell Street", + "city": "Fruitdale", + "state": "Idaho", + "zip": 49478, + "country": "Falkland Islands (Malvinas)", + "email": "dicksonhouston@scentric.com", + "phone": "(904) 444-3745", + "color": "rgb(237,192,112)" + }, + { + "index": 331, + "name": "Mclaughlin Spence", + "first": "Vicky", + "last": "Montoya", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mocabyte/73.jpg", + "expanded": false, + "guid": "b76384d1-fb6b-4500-ad6a-f266c0a380ce", + "integer": 95, + "date": "Tue Apr 18 1995 21:15:18 GMT-0700 (PDT)", + "shortText": "aute aliqua", + "mediumText": "Aliquip ea ad aute pariatur exercitation ex elit.", + "longText": "Labore veniam officia officia dolore. Ea quis et incididunt irure. Ut exercitation proident nostrud eiusmod quis ad. Laboris et Lorem qui quis ullamco dolore minim do incididunt. Lorem dolor fugiat consectetur eu qui nulla est voluptate veniam eu reprehenderit laboris dolore ex.\r\nUllamco Lorem voluptate deserunt ut et nulla cupidatat non et exercitation elit est. Mollit esse aute excepteur eiusmod commodo pariatur. Aute exercitation exercitation duis cupidatat ad pariatur minim anim adipisicing minim esse eu sit laborum. Laboris excepteur eu commodo dolor amet eiusmod. Officia quis reprehenderit dolor laborum non amet pariatur sit. Minim anim minim minim nulla minim ut non adipisicing consequat esse.\r\n", + "address": "2 Carlton Avenue", + "city": "Bend", + "state": "Arkansas", + "zip": 21354, + "country": "Peru", + "email": "vickymontoya@scentric.com", + "phone": "(808) 516-2094", + "color": "rgb(156,150,201)" + }, + { + "index": 332, + "name": "Montgomery Farrell", + "first": "Hayden", + "last": "Maldonado", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamasifmirza/73.jpg", + "expanded": false, + "guid": "098a567c-1dc4-4f48-aa95-7c039f017b7e", + "integer": 99, + "date": "Sat Jul 30 2005 17:18:13 GMT-0700 (PDT)", + "shortText": "do culpa elit magna tempor", + "mediumText": "Non esse aliqua dolor irure cillum labore excepteur. Amet labore dolor tempor duis quis ullamco proident enim anim incididunt nulla pariatur sit eiusmod.", + "longText": "Cupidatat anim anim cupidatat fugiat Lorem id pariatur excepteur et nisi. Commodo pariatur proident id fugiat consectetur irure velit consectetur ipsum non velit aute adipisicing irure. Do aliqua aute id esse Lorem. Lorem minim incididunt et labore pariatur Lorem ex enim ipsum cupidatat exercitation. Amet aliquip nisi cupidatat laboris eu officia aute velit. Dolor non sit consequat elit eu ut qui occaecat. Proident ut reprehenderit commodo ipsum deserunt ex quis elit.\r\nEsse Lorem deserunt adipisicing esse tempor ad officia sit do officia laborum voluptate. Do voluptate voluptate eiusmod magna in quis minim consectetur. Officia fugiat cillum aliquip et magna esse elit voluptate ea ad officia dolor sint. Ad velit aliqua reprehenderit consectetur quis incididunt nisi.\r\nAute pariatur pariatur aliquip incididunt ut enim id dolor aute sit aute. Elit occaecat labore nostrud enim veniam. Eu laborum mollit quis sit ut incididunt et. Nulla Lorem excepteur culpa ullamco adipisicing est irure reprehenderit cillum tempor cillum culpa ad.\r\n", + "address": "2 Folsom Place", + "city": "Edmund", + "state": "Delaware", + "zip": 95338, + "country": "Tonga", + "email": "haydenmaldonado@scentric.com", + "phone": "(891) 403-3020", + "color": "rgb(131,136,141)" + }, + { + "index": 333, + "name": "Mavis Sanchez", + "first": "Ginger", + "last": "Dale", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/benoitboucart/73.jpg", + "expanded": false, + "guid": "ba039378-7a45-4b1c-8ec3-cb2714651e82", + "integer": 67, + "date": "Sun Dec 13 1992 23:12:22 GMT-0800 (PST)", + "shortText": "adipisicing sint", + "mediumText": "Pariatur minim ipsum aliquip nulla qui voluptate irure irure est anim culpa laboris cupidatat. Enim adipisicing exercitation eiusmod sunt ex ad irure id labore. Aute labore voluptate amet eu. Dolor ea non enim nostrud elit aliqua qui amet aliqua et.", + "longText": "Occaecat mollit pariatur ea nisi veniam. Dolore incididunt dolore commodo incididunt ad ex dolore officia et ea aliqua magna. Ad sunt est proident nostrud consectetur. Ullamco laboris incididunt sit aute aliquip dolor proident tempor duis adipisicing esse pariatur.\r\nDo quis ea proident quis ea aliquip cupidatat culpa elit deserunt consectetur sunt. Anim excepteur aliquip culpa amet minim nostrud laborum proident eiusmod labore culpa est dolor. Amet et fugiat irure nisi commodo tempor irure aliqua nostrud nostrud. Dolore tempor sit laborum anim.\r\nOfficia commodo dolore duis officia do. Eu fugiat quis voluptate sunt excepteur nulla irure quis cupidatat sit quis. Ex irure non cupidatat ex. Sunt qui sit excepteur occaecat mollit velit eiusmod esse dolore aliqua laborum ullamco.\r\n", + "address": "4 Brown Street", + "city": "Comptche", + "state": "Federated States Of Micronesia", + "zip": 91514, + "country": "Tunisia", + "email": "gingerdale@scentric.com", + "phone": "(883) 563-2014", + "color": "rgb(163,218,120)" + }, + { + "index": 334, + "name": "Terrie Peters", + "first": "Adeline", + "last": "Franklin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/markwienands/73.jpg", + "expanded": false, + "guid": "7eb5d929-28c8-4d9e-8728-a158423e70eb", + "integer": 69, + "date": "Thu Mar 20 1986 06:50:48 GMT-0800 (PST)", + "shortText": "commodo", + "mediumText": "Nisi nulla enim ad deserunt proident qui. Aliqua duis id ea deserunt. Ut amet adipisicing sint consequat qui ut nisi et sit cillum amet. Velit laboris nulla nisi laborum cillum laborum qui minim velit aute sunt elit culpa aliqua. Adipisicing aliqua nulla proident sit sit laborum ea eu.", + "longText": "Fugiat dolor cupidatat sunt ex quis labore proident esse. Cupidatat exercitation elit do commodo ex Lorem tempor pariatur consequat laboris in elit. Ea cupidatat culpa elit officia nulla pariatur consequat magna incididunt tempor sunt voluptate. Voluptate nisi eiusmod fugiat nostrud dolore occaecat labore esse esse incididunt Lorem aliquip et.\r\nCupidatat consectetur dolor culpa cillum cupidatat occaecat. Dolor mollit nostrud cupidatat aliqua enim cupidatat consequat dolor labore ex nisi excepteur. Elit aliqua quis aliquip magna. Nostrud excepteur officia tempor laboris sunt voluptate proident pariatur. Consequat laboris Lorem id dolore in est sunt cillum irure exercitation id adipisicing minim aliquip. Non est dolore duis deserunt commodo elit amet esse sint reprehenderit. Aliqua quis fugiat elit duis minim exercitation consectetur.\r\n", + "address": "3 Desmond Court", + "city": "Fredericktown", + "state": "Guam", + "zip": 17881, + "country": "Guadeloupe", + "email": "adelinefranklin@scentric.com", + "phone": "(814) 430-3138", + "color": "rgb(186,245,118)" + }, + { + "index": 335, + "name": "Reed Banks", + "first": "Frost", + "last": "Velez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/menghe/73.jpg", + "expanded": false, + "guid": "0ea4f50e-f8d5-4d36-b794-5124c98c0103", + "integer": 38, + "date": "Fri Feb 13 1981 04:31:25 GMT-0800 (PST)", + "shortText": "do adipisicing", + "mediumText": "Sit dolor occaecat sint ipsum. Velit nostrud ea ex officia id minim do minim dolore occaecat duis laborum.", + "longText": "Aute ullamco eu ad quis voluptate dolore qui. Laborum deserunt consectetur dolore ut deserunt amet Lorem ut est duis eiusmod Lorem in. Dolor voluptate aliqua aute cillum exercitation sit deserunt ut cillum cupidatat cillum aliquip mollit voluptate. Aute anim ad nulla minim deserunt dolor ut dolore adipisicing anim laborum deserunt do eiusmod. Id excepteur nisi enim ullamco sunt esse minim velit dolore aliqua. Elit adipisicing laborum est est Lorem quis est.\r\n", + "address": "2 Osborn Street", + "city": "Orviston", + "state": "Pennsylvania", + "zip": 73473, + "country": "Australia", + "email": "frostvelez@scentric.com", + "phone": "(805) 408-3874", + "color": "rgb(61,142,146)" + }, + { + "index": 336, + "name": "Horton Howe", + "first": "Loretta", + "last": "Hudson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/heyanata/73.jpg", + "expanded": false, + "guid": "22d30b57-493f-4a7d-9b75-bb3a630d6a21", + "integer": 97, + "date": "Sat Oct 11 1975 04:15:11 GMT-0700 (PDT)", + "shortText": "do enim", + "mediumText": "Ea magna cillum aliqua reprehenderit consequat velit laboris aliqua. Officia laboris nostrud ullamco magna mollit occaecat est velit ea minim veniam tempor esse id. Consequat dolore quis id pariatur velit mollit quis. Quis veniam consectetur ad esse sit amet Lorem anim irure occaecat laborum duis. Aute sunt fugiat anim cillum dolor elit consequat sint magna commodo fugiat laboris.", + "longText": "Ut elit do mollit tempor aliqua duis anim incididunt anim consectetur veniam deserunt enim aliquip. Ad velit ad cupidatat ad deserunt reprehenderit aliqua ut elit sit. Commodo reprehenderit eu do consequat irure enim nisi exercitation qui minim. Minim fugiat culpa excepteur duis ea laborum. Elit occaecat adipisicing fugiat consequat minim cillum commodo laborum labore sunt consequat ut reprehenderit. Veniam non exercitation nostrud magna magna ullamco dolor eiusmod officia enim nisi quis. Enim nisi eu velit excepteur et exercitation irure.\r\nAmet consequat ea proident anim minim sint consequat consectetur sunt nostrud proident ut. Aliquip proident aliqua consectetur occaecat esse magna sunt labore id quis officia pariatur officia excepteur. Occaecat Lorem ut esse irure. Ullamco eiusmod ipsum qui culpa eu esse exercitation ullamco irure elit.\r\nEu consectetur commodo sunt laborum consectetur nulla laboris in reprehenderit id. Culpa dolore deserunt nulla labore cillum enim enim do velit deserunt quis cupidatat tempor labore. Enim proident sunt aliquip dolor laborum labore sint eu cillum. Ut irure quis proident laboris cupidatat et anim anim qui. Nisi reprehenderit eu esse laboris qui excepteur sunt cupidatat eiusmod magna nostrud ipsum consectetur. Non ut amet velit non laboris fugiat duis.\r\nReprehenderit et incididunt sit consectetur qui non aliquip mollit pariatur nisi. Enim eu dolor id eu. Laborum laboris ex esse veniam Lorem exercitation exercitation nostrud officia. Exercitation ipsum dolor exercitation ullamco adipisicing anim non tempor laboris deserunt consequat amet tempor tempor. Cupidatat sunt non magna aute excepteur magna dolor in irure esse dolor pariatur. Eiusmod commodo minim ipsum elit. Ut reprehenderit veniam ex magna mollit duis magna.\r\n", + "address": "3 Hampton Avenue", + "city": "Brecon", + "state": "New Hampshire", + "zip": 11881, + "country": "Dominican Republic", + "email": "lorettahudson@scentric.com", + "phone": "(969) 542-2613", + "color": "rgb(245,143,237)" + }, + { + "index": 337, + "name": "Byrd Hopkins", + "first": "Charmaine", + "last": "Gibbs", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/73.jpg", + "expanded": false, + "guid": "bf3bdf33-82fb-4240-b2be-d215fbaff029", + "integer": 55, + "date": "Wed Sep 12 2001 15:08:00 GMT-0700 (PDT)", + "shortText": "esse", + "mediumText": "Minim culpa et ea labore labore ad do officia eiusmod. Incididunt duis elit sit cupidatat mollit qui ea. Dolor id adipisicing est tempor commodo.", + "longText": "Consequat consequat eiusmod sint esse ex. Nisi eu est magna esse cillum exercitation velit ea. Pariatur irure cupidatat est non anim do magna adipisicing eu aliqua Lorem.\r\nSunt tempor qui id aliqua minim culpa non adipisicing in id elit. Laborum laboris aliquip ea mollit excepteur aute. Culpa id sit quis cupidatat nostrud irure duis aliqua do laboris veniam. Ullamco aute cillum in excepteur enim. Ipsum amet voluptate aliqua mollit commodo sint.\r\nAmet aute pariatur cillum adipisicing ad culpa velit do commodo nulla consequat elit exercitation ad. Do nisi in laboris id proident deserunt. Dolor commodo do qui esse aliqua dolore duis officia adipisicing Lorem.\r\nTempor eu sit id occaecat nostrud esse non voluptate officia exercitation mollit. Aliqua elit commodo incididunt nulla labore nostrud est duis. Pariatur ut laboris laboris laborum mollit anim consequat. Veniam eu non nostrud elit amet incididunt mollit sint duis adipisicing voluptate duis fugiat qui. Velit labore nostrud anim ex laboris ullamco elit. Ad in adipisicing anim culpa. Aliqua ullamco quis cupidatat exercitation qui.\r\n", + "address": "2 Norfolk Street", + "city": "Beechmont", + "state": "North Dakota", + "zip": 44060, + "country": "Zaire", + "email": "charmainegibbs@scentric.com", + "phone": "(882) 485-2815", + "color": "rgb(52,73,103)" + }, + { + "index": 338, + "name": "Walter Hoffman", + "first": "John", + "last": "Arnold", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bluesix/73.jpg", + "expanded": false, + "guid": "775148e8-ce9f-4917-b50d-93d7d88dcc90", + "integer": 64, + "date": "Sat Oct 10 1992 03:41:40 GMT-0700 (PDT)", + "shortText": "culpa esse eiusmod amet nisi", + "mediumText": "Excepteur sunt fugiat dolor dolor cupidatat laboris esse sint incididunt elit fugiat reprehenderit aliqua dolor.", + "longText": "Proident aliquip eu incididunt nulla laboris deserunt dolore ipsum. Officia elit in laboris nulla nostrud. Voluptate dolore Lorem qui consectetur id amet qui esse est. Ipsum pariatur non id quis proident est exercitation culpa consectetur occaecat ut eiusmod minim. Nostrud dolore id nulla ullamco mollit aute minim ad quis.\r\n", + "address": "2 Madeline Court", + "city": "Coinjock", + "state": "Northern Mariana Islands", + "zip": 94228, + "country": "China", + "email": "johnarnold@scentric.com", + "phone": "(832) 506-2961", + "color": "rgb(124,211,144)" + }, + { + "index": 339, + "name": "Conner Santiago", + "first": "Geneva", + "last": "Cline", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/w8candice/73.jpg", + "expanded": false, + "guid": "42040b16-aa43-4862-94d5-186ca3462e87", + "integer": 42, + "date": "Sat Jan 30 1988 20:47:01 GMT-0800 (PST)", + "shortText": "pariatur enim fugiat", + "mediumText": "Pariatur voluptate mollit deserunt voluptate proident sit sint Lorem magna sunt deserunt ipsum. Exercitation nostrud proident consequat amet.", + "longText": "Occaecat nulla nulla labore laborum id est enim adipisicing proident commodo incididunt sit ex. Aute excepteur deserunt tempor quis sit deserunt eu velit elit veniam dolore dolore adipisicing consectetur. Consequat tempor nostrud excepteur laboris quis. Duis aute magna do mollit ullamco ex ipsum occaecat aute sunt.\r\nCupidatat nisi ullamco dolor incididunt magna nulla dolor amet consectetur laborum ex non cupidatat. Labore incididunt in anim anim quis sint sit consequat quis labore aute. Magna nisi sint nostrud ea esse voluptate.\r\nLorem ex cupidatat Lorem aute sunt consectetur proident. Labore dolor ipsum laboris laboris nulla enim ea excepteur aliqua incididunt incididunt et ipsum mollit. Dolor labore cillum dolor Lorem nulla voluptate reprehenderit fugiat dolor ad sint id commodo. Aliqua in fugiat laboris fugiat ea officia dolor magna labore laborum non commodo. In labore consequat incididunt ut minim. Lorem enim tempor mollit minim esse deserunt anim ex labore. Officia nulla reprehenderit dolore eu duis eu.\r\n", + "address": "2 Ford Street", + "city": "Buxton", + "state": "South Dakota", + "zip": 92541, + "country": "British Indian Ocean Territory", + "email": "genevacline@scentric.com", + "phone": "(945) 577-3780", + "color": "rgb(88,84,180)" + }, + { + "index": 340, + "name": "Rosales Cain", + "first": "Lucille", + "last": "Sims", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mbilderbach/73.jpg", + "expanded": false, + "guid": "05c0e183-2ebf-459b-8755-1581a4a5e362", + "integer": 66, + "date": "Thu Oct 16 1997 15:05:12 GMT-0700 (PDT)", + "shortText": "esse labore", + "mediumText": "Ipsum cillum sunt laboris reprehenderit quis nulla.", + "longText": "Enim adipisicing non occaecat dolore sunt qui magna do velit mollit. Adipisicing enim esse quis Lorem sit ut elit est. Nostrud ea sit duis ex esse tempor enim exercitation non exercitation sint. Occaecat ipsum ex id elit eu id occaecat ea pariatur nisi tempor velit. Amet duis do minim minim excepteur adipisicing elit reprehenderit do tempor do sint ex.\r\nElit eu laboris mollit ullamco. Reprehenderit sit elit ipsum ad aliqua nostrud sunt quis ut irure aliqua. Quis non in cillum aliquip laboris esse in aliquip laboris eu qui adipisicing consectetur. Magna tempor irure officia duis sunt.\r\nSit ad dolore mollit fugiat do culpa in anim aliqua. Ad adipisicing esse occaecat ullamco proident. Cillum consequat nostrud sit consequat ullamco do et aute dolore nulla ullamco. Occaecat aliquip ut et incididunt ex fugiat ea esse aute quis amet consequat dolore ex. Officia aute incididunt esse exercitation culpa.\r\n", + "address": "4 Bergen Place", + "city": "Neibert", + "state": "Alaska", + "zip": 90229, + "country": "Libya", + "email": "lucillesims@scentric.com", + "phone": "(881) 438-3457", + "color": "rgb(57,64,85)" + }, + { + "index": 341, + "name": "Jillian Puckett", + "first": "Bean", + "last": "Dyer", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/coreyweb/73.jpg", + "expanded": false, + "guid": "a5317fd0-0be0-41ea-bbe9-a86a56e64aee", + "integer": 79, + "date": "Fri Oct 22 2004 15:49:39 GMT-0700 (PDT)", + "shortText": "ipsum aliqua", + "mediumText": "Occaecat ut eu consectetur sit Lorem nulla incididunt magna mollit reprehenderit fugiat.", + "longText": "Ad non eiusmod ullamco consectetur. In incididunt officia ex irure id. Quis minim ut quis duis id adipisicing commodo consectetur ut voluptate eiusmod duis.\r\nCulpa aliquip amet esse tempor do adipisicing. Excepteur do amet duis ad labore exercitation do nulla minim do pariatur ea. Magna amet dolor Lorem do nostrud aliqua eiusmod ad ut aliquip irure ullamco deserunt ipsum. Eu enim amet ut ut tempor sit cupidatat magna dolore. Laborum magna irure sit incididunt quis duis ex.\r\n", + "address": "2 Throop Avenue", + "city": "Saddlebrooke", + "state": "Louisiana", + "zip": 90267, + "country": "Cook Islands", + "email": "beandyer@scentric.com", + "phone": "(996) 420-2363", + "color": "rgb(127,126,117)" + }, + { + "index": 342, + "name": "Imelda Barrera", + "first": "Ramos", + "last": "Burke", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyshimko/73.jpg", + "expanded": false, + "guid": "7af4342e-1e1e-4807-8c51-aa37e8b7e551", + "integer": 25, + "date": "Thu Apr 19 2012 18:26:05 GMT-0700 (PDT)", + "shortText": "excepteur in culpa duis ullamco", + "mediumText": "In minim officia mollit veniam esse deserunt enim ullamco adipisicing ullamco deserunt quis.", + "longText": "Non cupidatat ipsum sint pariatur laborum ex in non aliquip est laborum. Aliquip fugiat proident sint in ea adipisicing dolor veniam consequat labore quis Lorem occaecat amet. Exercitation do commodo sunt nisi elit aliqua aliqua consectetur. Reprehenderit eu qui ea aliquip labore eiusmod cillum sunt.\r\n", + "address": "4 Cozine Avenue", + "city": "Sedley", + "state": "Missouri", + "zip": 43280, + "country": "Iran", + "email": "ramosburke@scentric.com", + "phone": "(800) 574-2091", + "color": "rgb(187,50,171)" + }, + { + "index": 343, + "name": "Witt Tyson", + "first": "Rebekah", + "last": "Kelly", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pavelbuben/73.jpg", + "expanded": false, + "guid": "81d76694-4ec9-4a0d-b1d2-87c3513414e3", + "integer": 92, + "date": "Thu Jul 31 1975 13:57:11 GMT-0700 (PDT)", + "shortText": "do quis", + "mediumText": "Reprehenderit veniam in sit magna nulla non ad ut enim culpa consequat in nisi id. Aute culpa ex laborum est cillum excepteur amet labore culpa nostrud magna. Enim deserunt aliquip eu et voluptate consequat culpa do minim occaecat voluptate sit.", + "longText": "Dolor excepteur minim magna tempor cillum duis voluptate reprehenderit veniam nulla anim tempor elit sint. Enim eu consectetur aliqua labore est non anim reprehenderit aliquip deserunt aute. Consequat et veniam id id ullamco amet adipisicing eiusmod. Ullamco fugiat quis ad sit consequat aliqua ipsum labore. Laboris magna est incididunt mollit magna voluptate velit duis aute ut. Laborum in proident nulla officia voluptate do in nostrud consectetur cupidatat est.\r\nLorem elit nulla tempor officia incididunt consequat aliqua. Voluptate anim labore esse veniam. Voluptate commodo occaecat minim duis qui enim veniam anim exercitation nulla laborum officia irure.\r\nNulla est eiusmod duis deserunt ea. Non deserunt ea nulla est quis occaecat cupidatat sit officia aliqua et nulla irure sint. Ea duis aliqua veniam reprehenderit culpa eiusmod sint. Quis et eu eu dolore. Nulla est officia adipisicing laborum est dolore duis culpa. Cupidatat eu aliqua adipisicing magna irure et deserunt eu magna Lorem tempor culpa.\r\nIrure cillum velit dolor duis dolore non sunt elit deserunt pariatur ut elit cupidatat. Qui irure sint duis ad nostrud dolore laborum. Labore esse amet et deserunt elit enim est duis in irure proident adipisicing irure. In laboris mollit eiusmod aliquip irure fugiat nulla commodo quis do eiusmod aute.\r\nIn voluptate aute ex qui ex adipisicing ea sint aliqua in mollit consequat. Duis sit adipisicing proident elit eu duis non dolor aliquip eiusmod duis nostrud reprehenderit. Amet et sint aliquip proident ea cillum veniam qui elit excepteur occaecat voluptate culpa. Mollit ea labore nulla mollit Lorem velit velit sit commodo nostrud. Ex deserunt laborum ea laborum culpa culpa sit eu dolor aute sunt amet. Est dolor tempor proident sint labore proident ipsum consectetur nostrud. Qui commodo qui aliqua commodo esse aute non enim.\r\n", + "address": "2 Kosciusko Street", + "city": "Zarephath", + "state": "Kentucky", + "zip": 42417, + "country": "Aruba", + "email": "rebekahkelly@scentric.com", + "phone": "(941) 590-3874", + "color": "rgb(228,211,182)" + }, + { + "index": 344, + "name": "Daphne Murphy", + "first": "Solis", + "last": "Norris", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hafeeskhan/73.jpg", + "expanded": false, + "guid": "aba2b0e9-cd59-410a-b0d2-70b43acabbc0", + "integer": 71, + "date": "Sun Apr 30 1972 14:07:42 GMT-0700 (PDT)", + "shortText": "aute consequat voluptate adipisicing ex", + "mediumText": "Dolore commodo sit ea sunt in consectetur fugiat laboris incididunt aliquip.", + "longText": "Sunt dolor duis fugiat voluptate veniam. In cillum irure nisi quis reprehenderit est ipsum. Dolore duis est ea duis labore laborum ea ex nisi minim. Velit eiusmod nulla laborum eu dolor aliqua sunt officia proident nulla sunt in pariatur. Pariatur sit do ullamco nostrud commodo ex et ex in. Labore excepteur tempor et qui nisi Lorem culpa eu. Incididunt esse Lorem ex ipsum aliquip sunt velit et voluptate consectetur duis.\r\nAdipisicing esse ipsum tempor eu. Voluptate aliqua laborum incididunt excepteur veniam. Laboris sunt id quis sint voluptate duis ex.\r\nQui dolore culpa reprehenderit est est do. Duis mollit consequat quis velit do dolore elit voluptate consequat deserunt aliquip culpa consequat. Laboris adipisicing qui nulla voluptate irure cillum velit eiusmod officia Lorem cillum pariatur tempor duis. Et magna consectetur laborum consectetur est culpa ipsum ullamco sunt aute dolor velit. Duis ipsum reprehenderit quis adipisicing voluptate do laborum.\r\nExcepteur minim est adipisicing ipsum id Lorem eu nisi ea mollit anim ut. Incididunt eu sint eu in ex ut voluptate consectetur ex consectetur aliquip exercitation labore. Proident amet labore sit laborum sit et officia est proident aliqua enim id id. Ea consectetur minim deserunt non. Eu in est labore aliqua non amet aliquip minim enim cupidatat veniam magna. Commodo occaecat dolore Lorem Lorem Lorem sint consequat proident ut duis enim magna. Aute occaecat nisi duis culpa velit sunt.\r\n", + "address": "3 Bushwick Avenue", + "city": "Farmington", + "state": "American Samoa", + "zip": 46996, + "country": "Faroe Islands", + "email": "solisnorris@scentric.com", + "phone": "(926) 567-2180", + "color": "rgb(195,76,204)" + }, + { + "index": 345, + "name": "Summer Sawyer", + "first": "Cheri", + "last": "Watts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/timmillwood/73.jpg", + "expanded": false, + "guid": "edf13e03-caa7-418a-8781-3ec09c26861d", + "integer": 75, + "date": "Tue May 08 2012 18:10:55 GMT-0700 (PDT)", + "shortText": "incididunt excepteur", + "mediumText": "Ullamco adipisicing id culpa irure anim non fugiat. Quis laborum nisi cillum incididunt minim ad cupidatat eiusmod mollit. Et nostrud eiusmod dolor et Lorem aliquip deserunt. In minim ut pariatur commodo. Ullamco minim commodo velit labore commodo eiusmod magna ea officia ex.", + "longText": "Mollit irure non aute magna. Amet dolor dolore ipsum pariatur anim ipsum ipsum cupidatat voluptate. Veniam excepteur eiusmod labore voluptate. Ipsum cillum anim esse aliqua ex consequat. Tempor adipisicing aute laborum deserunt magna labore duis deserunt.\r\nEt fugiat amet esse aliquip veniam magna est ad. Veniam velit velit ipsum pariatur duis incididunt sunt consequat esse. Cillum eiusmod duis aliqua ullamco. Magna pariatur adipisicing magna reprehenderit tempor eiusmod cillum consequat ipsum mollit occaecat enim. Officia tempor aute eu elit aliquip anim voluptate minim cupidatat fugiat esse labore excepteur. Nulla ex aliqua ipsum irure minim. Consectetur dolor non quis consequat eiusmod reprehenderit fugiat eiusmod quis qui qui elit nisi.\r\nDo mollit dolor id occaecat pariatur sint nulla ea aliquip ullamco aliquip exercitation eiusmod ex. Duis magna nulla amet fugiat Lorem tempor duis nisi ex exercitation ex. Non irure ullamco reprehenderit nulla consectetur in.\r\nNisi proident cillum labore anim consectetur in. Amet ullamco magna laboris minim velit eu incididunt non elit sit eu est consequat. Duis consectetur in nulla anim elit in sint nostrud excepteur quis velit. Mollit proident enim voluptate irure officia cupidatat anim Lorem anim occaecat consectetur Lorem.\r\n", + "address": "2 Oxford Street", + "city": "Bordelonville", + "state": "Minnesota", + "zip": 67948, + "country": "Zambia", + "email": "cheriwatts@scentric.com", + "phone": "(854) 438-3356", + "color": "rgb(90,88,182)" + }, + { + "index": 346, + "name": "Anita Jacobson", + "first": "Lucile", + "last": "Roberts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/butchewing/73.jpg", + "expanded": false, + "guid": "c88108ef-0dce-42ae-b03e-770b8b26ecf0", + "integer": 37, + "date": "Mon Apr 18 1977 02:05:21 GMT-0800 (PST)", + "shortText": "nostrud", + "mediumText": "Deserunt fugiat veniam minim ipsum consequat ipsum tempor voluptate ut. Elit tempor eu non ea pariatur dolore incididunt laboris quis eiusmod est qui.", + "longText": "Fugiat tempor dolore proident adipisicing fugiat minim. Sunt in veniam dolor anim non Lorem id proident in anim sint. Cupidatat et esse culpa sunt incididunt ex proident elit qui ad eu elit laboris cillum. Laboris culpa pariatur ea sit culpa et ea minim fugiat. Eu nulla est excepteur deserunt officia.\r\nSunt cupidatat do sunt anim ad ullamco veniam est tempor elit id ex sunt. Velit consectetur occaecat laborum do consequat dolore duis sint exercitation anim. Ad sunt aliqua culpa dolore fugiat excepteur elit magna labore. Nostrud cupidatat aliquip et officia aliquip incididunt. Fugiat excepteur pariatur officia magna. Ex id velit enim amet culpa.\r\n", + "address": "2 Adams Street", + "city": "Southview", + "state": "Hawaii", + "zip": 67415, + "country": "Albania", + "email": "lucileroberts@scentric.com", + "phone": "(826) 522-3183", + "color": "rgb(114,159,181)" + }, + { + "index": 347, + "name": "Beverly Ayala", + "first": "Teresa", + "last": "Serrano", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dotmariusz/73.jpg", + "expanded": false, + "guid": "e5824ea2-1204-42b5-8075-232d1e648cfc", + "integer": 47, + "date": "Mon Jul 24 2000 15:52:57 GMT-0700 (PDT)", + "shortText": "non cillum mollit enim ullamco", + "mediumText": "Amet do eu non culpa ea eiusmod culpa reprehenderit aute adipisicing duis nostrud in dolor. Do sint ex anim consectetur reprehenderit.", + "longText": "Et quis laboris ad ea do quis id enim. Ex culpa cupidatat velit nostrud cupidatat voluptate velit ipsum. Eu amet culpa aute officia non commodo irure fugiat. Qui sit consectetur labore exercitation officia cillum veniam enim.\r\n", + "address": "2 Quincy Street", + "city": "Vale", + "state": "Alabama", + "zip": 98150, + "country": "Panama", + "email": "teresaserrano@scentric.com", + "phone": "(898) 426-2065", + "color": "rgb(110,156,140)" + }, + { + "index": 348, + "name": "Golden Zimmerman", + "first": "Greta", + "last": "Gillespie", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aaronbeashel/73.jpg", + "expanded": false, + "guid": "e4300d91-7791-4fcb-b61e-c551eeed9488", + "integer": 57, + "date": "Thu Sep 20 2007 17:36:22 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Lorem duis adipisicing et ea dolore dolore non anim nisi exercitation enim. Ea incididunt velit quis mollit nisi dolor proident. Ipsum enim id eiusmod ex reprehenderit magna et reprehenderit deserunt aliqua. Qui mollit sit occaecat sunt ex veniam excepteur ex velit ea commodo ad.", + "longText": "Do dolore culpa cillum officia aliqua cillum. Fugiat nisi ipsum proident reprehenderit velit. Nulla proident aliqua proident velit incididunt consectetur quis ut adipisicing do aliqua. Amet laboris elit amet commodo adipisicing. Nisi esse minim ut elit. Est officia do minim mollit occaecat ipsum officia aliqua commodo in ipsum laborum labore.\r\nReprehenderit dolore irure dolore occaecat cillum minim quis non laborum ullamco tempor. Irure ut magna ad esse nostrud nostrud ut. Eiusmod sunt nulla commodo officia incididunt nisi aliqua. Eiusmod occaecat non do non qui eiusmod. Amet sit dolore fugiat aliquip.\r\n", + "address": "2 Foster Avenue", + "city": "Neahkahnie", + "state": "North Carolina", + "zip": 57285, + "country": "Turks and Caicos Islands", + "email": "gretagillespie@scentric.com", + "phone": "(907) 597-3902", + "color": "rgb(54,207,230)" + }, + { + "index": 349, + "name": "Sandra Taylor", + "first": "Schroeder", + "last": "Noel", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jina/73.jpg", + "expanded": false, + "guid": "10f56b06-75ab-4405-929b-533362c0fd8f", + "integer": 65, + "date": "Thu Jul 19 1979 21:31:02 GMT-0700 (PDT)", + "shortText": "laboris pariatur anim est", + "mediumText": "Velit nostrud voluptate labore eu irure laboris proident reprehenderit.", + "longText": "Ex irure sit ut quis exercitation enim voluptate laborum. Cillum deserunt amet est et. Nostrud consequat ullamco minim sit deserunt amet officia sit dolore. Incididunt laboris amet cupidatat exercitation enim enim veniam nostrud ipsum excepteur reprehenderit esse. Adipisicing esse do et est esse nulla duis nisi veniam sint.\r\nAmet incididunt est velit incididunt id consectetur ut eiusmod commodo nostrud do aliqua esse excepteur. Ullamco laborum proident ullamco aliqua nisi aliquip ex id. Irure voluptate non exercitation qui do enim incididunt incididunt esse dolor. Eiusmod aute id consectetur ullamco laboris cupidatat consequat.\r\nSunt commodo amet deserunt sit esse ad eiusmod tempor. Excepteur deserunt ea aliquip tempor nostrud nostrud labore eu et et. Dolore ex mollit officia voluptate non consequat. Tempor enim eiusmod est labore ut esse magna minim eu officia sit enim veniam. Quis do veniam magna elit enim amet est veniam irure.\r\nMollit sit incididunt sunt tempor adipisicing Lorem incididunt. Dolor veniam velit esse laboris fugiat eiusmod velit tempor ea pariatur nisi fugiat. Velit proident ex ipsum id cillum amet ad.\r\nCupidatat incididunt minim ex ipsum exercitation commodo aliquip excepteur. Voluptate labore reprehenderit quis in ex magna. Ad cillum adipisicing proident nostrud eu proident cupidatat consectetur adipisicing amet. Quis labore sunt sit ullamco deserunt amet ad occaecat cupidatat et pariatur fugiat commodo aute. Enim et veniam proident Lorem sint. Labore nisi in esse eiusmod laborum occaecat excepteur cillum incididunt esse in dolore. Aliqua eiusmod velit id occaecat sunt qui ex ea.\r\n", + "address": "2 Williams Court", + "city": "Davenport", + "state": "Connecticut", + "zip": 57031, + "country": "Christmas Island", + "email": "schroedernoel@scentric.com", + "phone": "(982) 532-3421", + "color": "rgb(240,238,143)" + }, + { + "index": 350, + "name": "Shelby Lott", + "first": "Maryanne", + "last": "Dixon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gu5taf/73.jpg", + "expanded": false, + "guid": "86ccb30c-436b-4e11-b33f-231007768e3c", + "integer": 16, + "date": "Wed Jan 07 1970 01:58:18 GMT-0800 (PST)", + "shortText": "anim officia nulla aliqua", + "mediumText": "Officia et eu enim esse veniam. Incididunt fugiat occaecat amet officia ad commodo aute amet reprehenderit reprehenderit nostrud non aute velit. Duis excepteur consectetur enim consequat labore exercitation irure nisi sint ullamco qui quis labore.", + "longText": "Tempor culpa mollit id anim labore sit Lorem cillum. Occaecat cupidatat sit ad voluptate tempor non do. Ullamco id laborum et ex esse. Do ex ad excepteur magna consequat. Qui proident qui occaecat ut aute nostrud.\r\n", + "address": "2 Quay Street", + "city": "Santel", + "state": "South Carolina", + "zip": 32917, + "country": "Botswana", + "email": "maryannedixon@scentric.com", + "phone": "(808) 502-2314", + "color": "rgb(150,72,230)" + }, + { + "index": 351, + "name": "Buck Reyes", + "first": "Meredith", + "last": "Kennedy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/antonkudin/73.jpg", + "expanded": false, + "guid": "1836f1d4-6bef-4b29-8a27-b11d78119e5a", + "integer": 56, + "date": "Wed Jul 03 2013 04:17:00 GMT-0700 (PDT)", + "shortText": "cillum enim aute ea enim", + "mediumText": "Voluptate do Lorem veniam ullamco id excepteur. Mollit et occaecat ut amet nostrud dolore consectetur id minim. Eu esse nisi incididunt nulla occaecat sunt. Minim labore dolor do pariatur voluptate do nostrud irure tempor ipsum consectetur ea fugiat ut.", + "longText": "Et ex ipsum eu commodo aliquip sit officia id. Deserunt reprehenderit sunt dolore nisi veniam adipisicing esse exercitation velit anim ex. Eiusmod do aliquip magna cillum dolore cillum excepteur. Excepteur dolore quis nisi veniam quis eiusmod occaecat. Amet nulla ut excepteur duis officia dolor esse incididunt ipsum. Laboris est aliqua qui nostrud labore duis eu non do.\r\nDo id commodo et deserunt aliquip. Aliqua in ullamco ex consequat nisi laborum esse culpa ipsum mollit do occaecat occaecat incididunt. Tempor est irure irure ex incididunt laboris. Dolore veniam fugiat ea eiusmod cupidatat nostrud est reprehenderit sit id sunt consectetur eu irure. In laborum voluptate proident et dolor aute. Deserunt dolore dolor ad sit duis veniam.\r\n", + "address": "4 Herzl Street", + "city": "Sisquoc", + "state": "Michigan", + "zip": 13348, + "country": "Algeria", + "email": "meredithkennedy@scentric.com", + "phone": "(805) 554-3669", + "color": "rgb(179,239,148)" + }, + { + "index": 352, + "name": "Wooten Sloan", + "first": "Allen", + "last": "Wade", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/derekebradley/73.jpg", + "expanded": false, + "guid": "dc87dc7f-bf6e-4633-9a8e-2e7ce98a216b", + "integer": 94, + "date": "Fri Mar 13 1998 22:52:34 GMT-0800 (PST)", + "shortText": "consectetur ipsum eu velit", + "mediumText": "Lorem commodo sit nostrud culpa esse deserunt laboris magna. Elit esse id Lorem ut.", + "longText": "Sunt veniam est ex duis sit amet eiusmod ullamco cupidatat cillum Lorem. Deserunt ex do mollit consequat elit. Nostrud voluptate proident do commodo Lorem fugiat nostrud minim anim excepteur ad magna.\r\nQui et velit consequat Lorem occaecat irure anim esse. Labore veniam exercitation do excepteur velit pariatur excepteur consectetur aute voluptate enim exercitation non deserunt. Mollit irure magna id elit laborum. Elit pariatur aute pariatur nulla deserunt. Deserunt sit consectetur anim tempor duis laborum do quis enim.\r\nDolore dolore nostrud voluptate ipsum qui. Ea laboris culpa proident duis officia sit. Non do pariatur aute elit dolor aliqua cillum. Lorem ullamco eiusmod laboris mollit sint tempor consectetur laborum laboris deserunt exercitation. Eu fugiat nulla irure excepteur aliqua enim et consequat culpa. Amet dolor excepteur proident labore mollit mollit pariatur culpa incididunt occaecat dolor aliqua aliquip dolor.\r\nIn qui enim cupidatat quis magna do qui aliquip magna. Proident culpa nostrud nulla eiusmod occaecat sit id pariatur labore voluptate aute veniam. Eu amet labore labore aliqua amet adipisicing commodo. Non commodo est ea reprehenderit fugiat est ullamco voluptate excepteur ipsum sint est.\r\nCupidatat dolor aliqua amet ipsum incididunt non consectetur duis proident aliqua sit. Occaecat aliqua labore commodo qui consequat reprehenderit ut voluptate. Sint velit minim mollit elit occaecat laboris aliqua dolor enim do.\r\n", + "address": "2 Sandford Street", + "city": "Levant", + "state": "Maine", + "zip": 74609, + "country": "Switzerland", + "email": "allenwade@scentric.com", + "phone": "(971) 515-2074", + "color": "rgb(55,67,137)" + }, + { + "index": 353, + "name": "Luella Hogan", + "first": "Flores", + "last": "Wolfe", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karachentsov/73.jpg", + "expanded": false, + "guid": "3e88723e-2180-4ee0-8c96-fd9c48538abd", + "integer": 65, + "date": "Thu Sep 03 1998 10:25:29 GMT-0700 (PDT)", + "shortText": "commodo reprehenderit anim", + "mediumText": "Magna in quis irure duis. Nisi duis non pariatur magna ipsum excepteur ea. Ea exercitation culpa commodo consectetur. Do cillum Lorem nisi ipsum nulla cupidatat officia sunt pariatur ea. Dolor deserunt enim reprehenderit in in.", + "longText": "Officia cillum proident consequat quis non dolor nisi id sit amet laborum sint. Elit enim ex laborum amet nulla qui. Ut amet eiusmod mollit id.\r\nEt fugiat laborum adipisicing laboris adipisicing. Sint ea est non ut laborum velit irure officia cupidatat excepteur. Eu cillum occaecat minim id proident incididunt.\r\nLaboris enim aliqua id et duis laborum dolore mollit proident. Culpa commodo dolor labore tempor minim nulla minim esse cupidatat do. Adipisicing ut non ullamco magna do commodo est dolore elit ea est eu. Est dolore duis Lorem culpa adipisicing. Tempor qui sunt qui et. Anim veniam esse consequat ut elit Lorem voluptate excepteur non culpa. Quis veniam Lorem aliqua culpa.\r\nNisi duis ex sunt magna enim proident et sint proident minim. In excepteur id pariatur ullamco. Nulla ea cupidatat sunt ut pariatur minim duis.\r\n", + "address": "2 Grafton Street", + "city": "Falconaire", + "state": "Kansas", + "zip": 39969, + "country": "S. Georgia and S. Sandwich Isls.", + "email": "floreswolfe@scentric.com", + "phone": "(961) 502-3921", + "color": "rgb(81,99,101)" + }, + { + "index": 354, + "name": "Mckee Tillman", + "first": "Patsy", + "last": "Odonnell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmeffess/73.jpg", + "expanded": false, + "guid": "3cc7cc1e-1856-4b5a-a9f7-0e938e0206e5", + "integer": 14, + "date": "Fri Jan 11 1985 09:25:30 GMT-0800 (PST)", + "shortText": "minim in proident", + "mediumText": "Duis eiusmod pariatur consectetur et laboris magna. Est aute cupidatat enim proident qui ea quis officia anim reprehenderit officia deserunt nostrud deserunt.", + "longText": "Qui occaecat irure veniam aliqua nisi Lorem exercitation in consequat nostrud fugiat. Magna cupidatat incididunt tempor in. Esse cillum ullamco minim et nisi tempor nostrud tempor. Fugiat duis veniam enim enim consequat. Incididunt anim fugiat in Lorem sunt sit fugiat. Do ut anim officia aliquip irure consectetur ipsum eu ex magna esse et exercitation. Reprehenderit irure velit sunt minim aute proident nisi ad enim tempor nostrud dolor.\r\n", + "address": "2 Dekalb Avenue", + "city": "Sattley", + "state": "Iowa", + "zip": 56105, + "country": "Brazil", + "email": "patsyodonnell@scentric.com", + "phone": "(991) 576-3320", + "color": "rgb(151,157,82)" + }, + { + "index": 355, + "name": "Tammy Mckenzie", + "first": "Araceli", + "last": "Villarreal", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bmovement/73.jpg", + "expanded": false, + "guid": "645a7c4c-a0cf-4361-9c6d-5d32d77d5500", + "integer": 69, + "date": "Sun Dec 24 2006 07:06:15 GMT-0800 (PST)", + "shortText": "anim laborum nisi", + "mediumText": "Incididunt consectetur culpa nisi Lorem eiusmod cillum non nisi tempor mollit irure nisi ut cupidatat. Proident non magna consectetur ut consequat occaecat est consectetur culpa aliqua cupidatat consequat ea. Commodo et veniam qui magna velit non deserunt exercitation proident Lorem eu non. Mollit eu laboris labore ipsum id nisi aute culpa dolore in magna ad cillum. Ea adipisicing Lorem ad irure exercitation amet aliqua esse.", + "longText": "Ea laboris in irure labore cillum. Lorem aliqua ut amet aliqua sint sunt officia adipisicing ipsum minim velit. Elit in reprehenderit occaecat et et elit sint. In consequat quis nulla cillum cillum sint ullamco do officia. Excepteur id fugiat ullamco elit adipisicing veniam deserunt tempor. Nisi dolor tempor amet irure in amet consequat ea. Sit tempor amet excepteur in tempor irure ut ipsum amet velit culpa dolor occaecat fugiat.\r\nLorem consequat deserunt irure veniam culpa fugiat incididunt eu sunt excepteur commodo sit adipisicing cillum. Magna ea mollit anim ullamco nisi do laboris duis aliquip excepteur labore reprehenderit dolor. Amet ea proident cupidatat cupidatat magna magna amet proident aute tempor. Officia non culpa tempor reprehenderit nostrud ut anim quis nisi laboris ipsum nostrud deserunt. Magna proident elit eiusmod et incididunt deserunt est ad anim occaecat enim tempor ex. Id veniam ad commodo ad proident reprehenderit. Veniam in culpa do dolore excepteur pariatur mollit.\r\nCupidatat ex occaecat nulla irure excepteur. Duis sit do nisi officia. Ea eu commodo magna aliquip ea sint aute dolor mollit laborum aute reprehenderit Lorem sit. Proident laboris incididunt sit in sint. Veniam nisi sunt laboris eu aliquip sunt reprehenderit irure ad reprehenderit. In ea ullamco ullamco amet cillum irure pariatur veniam.\r\nDolor deserunt sunt sunt aliqua consequat est deserunt culpa proident labore proident sit laborum. Cupidatat aute nostrud ad non consequat laboris. Cupidatat dolor magna et occaecat laboris. Ipsum magna id amet non consectetur adipisicing veniam. Aliqua anim pariatur nostrud anim in sint sit deserunt anim. Laborum dolor sunt anim sunt eiusmod consectetur do aliqua aute magna ad ea. Enim amet exercitation culpa deserunt proident.\r\nCommodo nisi officia commodo Lorem irure occaecat qui. Est eu Lorem et labore excepteur elit enim. Minim occaecat eu cupidatat labore ad deserunt irure officia quis enim. Consequat eiusmod labore minim ex ipsum velit ea veniam. Elit minim do non eiusmod cillum incididunt proident. In excepteur exercitation nisi aliquip adipisicing consequat qui.\r\n", + "address": "2 Richards Street", + "city": "Bancroft", + "state": "Vermont", + "zip": 63605, + "country": "Anguilla", + "email": "aracelivillarreal@scentric.com", + "phone": "(922) 535-2085", + "color": "rgb(123,74,237)" + }, + { + "index": 356, + "name": "Joyce Carney", + "first": "Vance", + "last": "Boyd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/taiyab/73.jpg", + "expanded": false, + "guid": "0714e7c1-db9c-4bc9-ae14-47d72e9f36b2", + "integer": 29, + "date": "Sat Jan 18 1986 13:37:09 GMT-0800 (PST)", + "shortText": "Lorem non cillum laborum culpa", + "mediumText": "Laboris Lorem anim cillum et deserunt nostrud laborum ex laborum laboris laborum sint nostrud. In anim aliqua pariatur cupidatat adipisicing esse ex nulla pariatur sunt velit laborum cupidatat. Culpa irure elit occaecat ea in aliqua. Aliqua ex sint anim elit aute enim consectetur ea culpa pariatur. Reprehenderit culpa nisi nostrud cillum sint ullamco mollit sit velit ea officia pariatur.", + "longText": "Minim magna ipsum excepteur irure non qui pariatur excepteur. Minim velit ea ullamco irure quis est duis velit est enim do labore. Irure laboris mollit commodo fugiat. Elit dolor ipsum non veniam culpa id esse.\r\nAnim excepteur deserunt cillum fugiat quis dolor aliqua cillum occaecat. Occaecat deserunt incididunt voluptate cupidatat eu nulla do consequat laborum id veniam laborum. Laboris adipisicing cupidatat laboris sint elit fugiat ipsum mollit laboris sint proident dolore officia. Pariatur ut laboris aliquip culpa irure magna officia velit velit occaecat. Duis ipsum duis occaecat aute magna sunt ex veniam dolore laborum aliqua.\r\nUllamco deserunt minim et qui consequat esse. Cillum do elit magna culpa exercitation occaecat tempor reprehenderit nostrud ex do. Ex laborum irure aliquip ipsum. Excepteur cupidatat laboris consequat sint esse est aute voluptate est minim.\r\n", + "address": "3 Suydam Place", + "city": "Wiscon", + "state": "Nebraska", + "zip": 24690, + "country": "Mayotte", + "email": "vanceboyd@scentric.com", + "phone": "(950) 499-2028", + "color": "rgb(151,255,141)" + }, + { + "index": 357, + "name": "Briggs Cash", + "first": "Mason", + "last": "Norton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rigelstpierre/73.jpg", + "expanded": false, + "guid": "06751f30-d76a-46ef-a97a-3d8233acee4e", + "integer": 36, + "date": "Wed Oct 22 1997 23:32:22 GMT-0700 (PDT)", + "shortText": "qui aliquip laborum", + "mediumText": "Velit eiusmod est incididunt sint ipsum qui ullamco amet. Elit est velit adipisicing occaecat velit nisi irure tempor enim exercitation tempor sunt nulla elit. Incididunt ad quis officia nostrud aliqua incididunt commodo. Duis ex quis sint mollit laboris sint in ipsum enim.", + "longText": "Nisi excepteur culpa ipsum cillum aute cupidatat nisi. Culpa aliqua in excepteur et elit eu est irure laboris amet pariatur. Eiusmod culpa do nostrud sunt velit ea aliquip laboris nulla occaecat quis amet elit cupidatat. Excepteur sit mollit fugiat laborum nostrud sint pariatur. Officia ullamco consequat ex est quis. Dolor est laboris sint eu in laborum culpa.\r\n", + "address": "3 Williams Avenue", + "city": "Marbury", + "state": "Florida", + "zip": 96679, + "country": "Northern Mariana Islands", + "email": "masonnorton@scentric.com", + "phone": "(988) 478-3734", + "color": "rgb(122,225,185)" + }, + { + "index": 358, + "name": "Frank Vance", + "first": "Eva", + "last": "Christian", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vlajki/73.jpg", + "expanded": false, + "guid": "90639571-dc94-4c8f-98c8-db8781d4d7e2", + "integer": 11, + "date": "Thu Jan 05 1984 02:00:59 GMT-0800 (PST)", + "shortText": "laboris non cillum laborum amet", + "mediumText": "Nulla consequat aute non non esse elit nostrud labore dolor consectetur. Fugiat culpa dolore commodo aute et enim exercitation reprehenderit. Mollit velit anim labore est dolor. Id fugiat proident qui in Lorem eiusmod. Officia labore reprehenderit nulla irure aute enim tempor sint mollit et.", + "longText": "Duis ad proident anim sint eu. Qui aute dolore minim nisi proident cillum consequat laboris. Aliquip sunt sunt irure eiusmod esse laboris amet ad nisi occaecat exercitation ullamco aliqua ex. Ipsum minim labore ut officia ut ut minim officia qui. Qui aliqua commodo nulla labore nulla aliqua sunt laboris ullamco anim. Enim exercitation labore excepteur et eiusmod Lorem fugiat sunt nulla enim aliquip magna. Excepteur esse et nisi in excepteur reprehenderit excepteur duis magna cupidatat labore exercitation adipisicing enim.\r\n", + "address": "2 Cypress Avenue", + "city": "Westwood", + "state": "New Jersey", + "zip": 64807, + "country": "Pitcairn", + "email": "evachristian@scentric.com", + "phone": "(933) 555-3019", + "color": "rgb(65,246,66)" + }, + { + "index": 359, + "name": "Bennett Fitzgerald", + "first": "Alyce", + "last": "Roth", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/leeiio/73.jpg", + "expanded": false, + "guid": "abc6eb23-4f14-4711-aaa1-0356ef6ac47e", + "integer": 79, + "date": "Mon Dec 15 1986 02:54:47 GMT-0800 (PST)", + "shortText": "veniam adipisicing velit magna deserunt", + "mediumText": "Laboris fugiat cupidatat ad aute laboris aliquip qui magna cupidatat cupidatat reprehenderit occaecat do.", + "longText": "Incididunt pariatur qui et ad adipisicing laborum. Aliqua eiusmod qui occaecat incididunt laboris sit. Amet ut commodo amet reprehenderit sit ex labore labore reprehenderit velit irure officia esse. Fugiat dolor ullamco sit ex ipsum aliqua irure aute dolore dolor.\r\n", + "address": "3 Howard Avenue", + "city": "Imperial", + "state": "Wisconsin", + "zip": 43410, + "country": "Saint Vincent and The Grenadines", + "email": "alyceroth@scentric.com", + "phone": "(930) 449-2969", + "color": "rgb(122,168,204)" + }, + { + "index": 360, + "name": "Garrett Lawson", + "first": "Marlene", + "last": "Hatfield", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/brad_frost/73.jpg", + "expanded": false, + "guid": "ea670adf-3aa0-4b5f-9ffc-4e448f9ad69b", + "integer": 63, + "date": "Sun Nov 16 1986 08:23:14 GMT-0800 (PST)", + "shortText": "aliqua sit aliquip id elit", + "mediumText": "Anim qui adipisicing enim est consequat duis qui aliquip. Elit excepteur tempor in eu ex exercitation. Dolor ex velit amet laboris. Sit non nisi anim ut et quis qui non irure elit pariatur nulla.", + "longText": "Ut pariatur magna duis cupidatat enim proident eiusmod tempor do aute Lorem non occaecat. Amet anim id quis cupidatat nulla exercitation nulla dolore eu irure Lorem anim incididunt. Laboris id dolore ullamco exercitation nostrud mollit pariatur Lorem. Consequat labore ea Lorem elit duis cupidatat nostrud do nulla. Elit amet proident fugiat commodo nostrud ipsum incididunt. Incididunt sunt qui laborum officia sit proident aute. Laboris laboris do est voluptate eu id officia labore amet aliquip eiusmod.\r\nLorem tempor elit nisi sunt. Laboris eu ea id id. Esse ad duis laboris elit tempor sint officia enim qui nulla elit aliquip cillum qui. Ex id culpa consequat laboris et voluptate esse irure.\r\nMollit sunt elit duis sunt reprehenderit aliquip id consequat elit ea amet Lorem non culpa. Et ad qui est mollit laboris mollit aute amet ut. Veniam occaecat mollit aliquip cillum consequat sit sint eu Lorem voluptate pariatur ad ad irure. Id aliquip velit eiusmod veniam anim duis proident do esse culpa non aliqua. Irure duis aute fugiat aliquip esse sint mollit aute non magna aliquip. Aliqua Lorem officia veniam cillum ad. Laboris reprehenderit adipisicing occaecat labore cupidatat cupidatat consectetur elit fugiat.\r\nUt amet tempor qui irure ex sunt nisi nostrud. Ipsum dolor cillum nisi mollit cupidatat adipisicing tempor ipsum veniam mollit anim aute nulla. Dolor aliqua occaecat aliqua eiusmod Lorem voluptate laborum. Aliquip sit quis culpa quis velit ut minim anim quis aliquip voluptate laborum. Sint qui exercitation elit occaecat consequat fugiat in nulla voluptate. Consequat fugiat culpa nulla qui Lorem cillum commodo elit aliqua proident enim dolore dolor excepteur. Voluptate pariatur ad culpa eiusmod ad nisi.\r\nSint eiusmod non reprehenderit proident Lorem anim nostrud id id. Adipisicing cupidatat magna commodo culpa quis amet sunt amet dolore veniam duis veniam duis occaecat. Cillum exercitation elit fugiat non. Consequat enim deserunt et nisi id. Ut occaecat est amet ea Lorem occaecat minim irure dolor nulla esse fugiat in aliqua. Commodo commodo occaecat duis consectetur sint ad ea exercitation adipisicing amet adipisicing aute duis.\r\n", + "address": "4 Elm Avenue", + "city": "Bluffview", + "state": "Washington", + "zip": 66639, + "country": "Iceland", + "email": "marlenehatfield@scentric.com", + "phone": "(944) 414-3916", + "color": "rgb(156,157,84)" + }, + { + "index": 361, + "name": "Rosalinda Barber", + "first": "Rosalind", + "last": "Little", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alsobrooks/73.jpg", + "expanded": false, + "guid": "301b4435-b804-43a6-b90e-8b509a8d7482", + "integer": 30, + "date": "Mon Dec 21 2009 13:14:30 GMT-0800 (PST)", + "shortText": "ea veniam dolor enim", + "mediumText": "Excepteur et labore esse commodo in. In irure quis qui veniam cillum. Reprehenderit aliqua velit cillum fugiat velit eiusmod ad ex consectetur occaecat.", + "longText": "Aliquip minim ex adipisicing tempor labore qui deserunt laborum consequat. Cillum excepteur id cupidatat minim ex. Consequat officia voluptate aliqua cupidatat qui.\r\n", + "address": "4 Centre Street", + "city": "Efland", + "state": "Oregon", + "zip": 37697, + "country": "Andorra", + "email": "rosalindlittle@scentric.com", + "phone": "(912) 415-2087", + "color": "rgb(158,187,61)" + }, + { + "index": 362, + "name": "Krystal Lane", + "first": "Kitty", + "last": "Hodge", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thekishpatel/73.jpg", + "expanded": false, + "guid": "8918af69-f5ee-41e7-b442-d3e13fa03f20", + "integer": 88, + "date": "Tue Apr 11 1978 05:39:13 GMT-0800 (PST)", + "shortText": "adipisicing quis dolore ullamco exercitation", + "mediumText": "Nulla ipsum mollit sunt ad fugiat officia labore velit Lorem elit id. Tempor magna aliquip nulla laborum labore ea voluptate.", + "longText": "Nostrud culpa pariatur mollit nisi labore aliquip enim nulla reprehenderit. Laborum magna ut voluptate in occaecat irure non magna non aliqua sunt commodo anim. Consectetur officia irure proident enim. Sit amet nulla duis minim cillum consequat labore anim cillum. Cillum minim voluptate commodo ex aute duis nulla do. Incididunt cupidatat occaecat commodo labore pariatur eu sit commodo fugiat proident exercitation sint est.\r\nSunt voluptate sunt quis pariatur excepteur et. Id exercitation veniam cupidatat incididunt quis commodo duis cupidatat enim laboris elit. Consectetur irure reprehenderit consequat labore qui commodo quis excepteur irure nisi labore mollit Lorem voluptate. Aute dolore consectetur voluptate cillum anim qui incididunt.\r\n", + "address": "3 President Street", + "city": "Laurelton", + "state": "Illinois", + "zip": 32233, + "country": "Myanmar", + "email": "kittyhodge@scentric.com", + "phone": "(994) 498-3202", + "color": "rgb(139,225,83)" + }, + { + "index": 363, + "name": "Lorrie Carey", + "first": "Moran", + "last": "Bradshaw", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iqonicd/73.jpg", + "expanded": false, + "guid": "8040adde-26e1-416b-9053-e33e98a911a9", + "integer": 0, + "date": "Sat May 27 1972 21:40:25 GMT-0700 (PDT)", + "shortText": "culpa fugiat", + "mediumText": "Commodo cillum Lorem duis laborum minim cillum labore irure nostrud excepteur ut fugiat fugiat anim. Occaecat do eiusmod proident irure. Voluptate id nisi veniam tempor. Consequat non reprehenderit nulla esse irure magna pariatur occaecat minim nisi sunt velit. Labore reprehenderit ad consectetur et exercitation esse commodo.", + "longText": "Ad occaecat amet cillum nisi culpa pariatur sint Lorem ex. Ea ullamco Lorem officia exercitation pariatur cupidatat non mollit voluptate proident. Fugiat tempor irure pariatur eu minim nisi fugiat cupidatat. Ad anim ad qui occaecat. Do id veniam est cupidatat non proident occaecat deserunt fugiat incididunt.\r\nAliqua ea adipisicing elit est officia. Dolor voluptate ex labore proident aute laboris fugiat fugiat. Et fugiat enim qui et laborum sint. Aute excepteur ut ad duis. Voluptate duis adipisicing cupidatat ullamco magna.\r\nEu sint anim ea mollit ea labore pariatur velit adipisicing laborum velit. Irure eu ipsum consequat Lorem aute aliqua exercitation magna est anim commodo deserunt ea. Minim laboris adipisicing laboris in cillum culpa magna ea esse enim veniam. Non enim velit qui veniam commodo do incididunt. Aliqua quis reprehenderit consequat tempor ut excepteur fugiat ad tempor sit est ad est.\r\nUllamco quis et ea ex est deserunt ut. Adipisicing quis commodo laboris pariatur exercitation sit mollit labore. Dolore ut ad do magna incididunt ut adipisicing dolor eu eiusmod irure consectetur ipsum. Exercitation magna incididunt exercitation eiusmod. Esse veniam mollit Lorem qui eu officia aute.\r\n", + "address": "3 Hart Street", + "city": "Vandiver", + "state": "West Virginia", + "zip": 46407, + "country": "Saint Lucia", + "email": "moranbradshaw@scentric.com", + "phone": "(807) 537-3271", + "color": "rgb(54,143,210)" + }, + { + "index": 364, + "name": "Kirk Richard", + "first": "Delia", + "last": "Cervantes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamlechev/73.jpg", + "expanded": false, + "guid": "42e322d1-8045-429a-8eeb-8c62ba84d618", + "integer": 75, + "date": "Sat Nov 22 2003 15:26:15 GMT-0800 (PST)", + "shortText": "eu in consequat qui", + "mediumText": "Ullamco elit eu id excepteur incididunt Lorem ipsum pariatur laboris incididunt Lorem ullamco. Veniam consequat id sunt commodo fugiat magna velit laborum do Lorem enim in sunt. In non non magna deserunt duis nisi exercitation cupidatat eiusmod fugiat ea ex do in. Reprehenderit non consequat sit nostrud.", + "longText": "Dolor excepteur exercitation et ullamco. Non nulla duis qui cillum aliqua nostrud elit sunt dolor. Ex excepteur voluptate do minim non ea sint Lorem incididunt laborum sint. Officia elit labore reprehenderit proident. Laborum eiusmod occaecat eu nulla nisi voluptate. Dolor id in ullamco laborum ut ea est laborum adipisicing tempor et. Incididunt laborum consequat quis anim proident irure amet do.\r\n", + "address": "3 Amboy Street", + "city": "Tuttle", + "state": "Mississippi", + "zip": 27056, + "country": "Equatorial Guinea", + "email": "deliacervantes@scentric.com", + "phone": "(829) 471-3065", + "color": "rgb(94,71,106)" + }, + { + "index": 365, + "name": "Tate Mcdowell", + "first": "Adrian", + "last": "Mccullough", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elliotpopel/73.jpg", + "expanded": false, + "guid": "9e89b9c6-cf38-4f45-99ed-c7f3f5623d7c", + "integer": 86, + "date": "Sat Jul 23 1977 13:14:21 GMT-0700 (PDT)", + "shortText": "exercitation", + "mediumText": "In non excepteur est ex sunt laborum commodo esse ex. Elit officia laborum incididunt tempor consectetur ea incididunt duis aliqua culpa quis occaecat minim.", + "longText": "Aliquip nisi elit commodo quis exercitation aliquip et do magna quis aute excepteur tempor dolor. Laborum deserunt ullamco aute velit fugiat non labore aliquip. Non exercitation aliqua sunt eiusmod laborum occaecat cupidatat amet commodo enim occaecat amet. Duis laboris labore enim dolor nisi deserunt id cupidatat id. Deserunt esse Lorem minim proident laboris fugiat irure laborum consectetur cillum laborum proident ex. Nulla est excepteur nostrud eiusmod consectetur dolor magna nostrud elit dolore.\r\nElit magna do occaecat in ea elit reprehenderit cupidatat excepteur labore consequat est minim enim. Laborum culpa id commodo esse elit nulla. Irure nulla aliquip adipisicing deserunt nisi ut duis sint. Duis culpa id ex duis incididunt irure nostrud excepteur.\r\nDolor cillum nisi eiusmod ea Lorem sint. Aute duis proident aute in aliquip. Nostrud ut cupidatat ex sit pariatur tempor duis consequat quis quis mollit. Ullamco nostrud id consequat ut. Nostrud officia officia nostrud anim occaecat culpa laborum nostrud fugiat cupidatat irure ex aliqua tempor. Eiusmod pariatur adipisicing reprehenderit exercitation minim Lorem commodo deserunt velit dolor esse elit dolore. Mollit dolore ipsum eu do excepteur nulla magna ea aliquip ut velit aliquip exercitation.\r\nDuis dolor magna voluptate irure enim eu mollit commodo enim commodo nostrud. Laborum magna culpa aliqua aliquip consequat consequat incididunt sunt proident ex eu adipisicing. Sunt esse non exercitation excepteur quis quis fugiat. Qui anim sint nisi proident non quis cillum magna. Ipsum amet veniam anim esse sint et occaecat occaecat in.\r\nAdipisicing ad mollit consequat ut quis eiusmod exercitation quis elit veniam do. Lorem excepteur occaecat labore ex deserunt cupidatat irure officia dolor sunt adipisicing elit officia. Laboris labore aliqua aliqua dolore Lorem laboris ipsum in. Irure ut mollit adipisicing incididunt magna.\r\n", + "address": "2 Bedell Lane", + "city": "Chilton", + "state": "Rhode Island", + "zip": 97237, + "country": "Tanzania", + "email": "adrianmccullough@scentric.com", + "phone": "(810) 599-3339", + "color": "rgb(178,126,71)" + }, + { + "index": 366, + "name": "Terry Romero", + "first": "Barrett", + "last": "Burgess", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/diesellaws/73.jpg", + "expanded": false, + "guid": "f92c32bc-6e74-46d1-85b4-49fefcf41773", + "integer": 59, + "date": "Thu Mar 25 2004 20:56:10 GMT-0800 (PST)", + "shortText": "amet ex aliqua dolor", + "mediumText": "Ullamco mollit in excepteur et sit do ad nulla in ex. Deserunt dolore elit velit est cillum irure non dolor consectetur pariatur adipisicing aute qui officia. Quis minim cillum ex reprehenderit Lorem eu non consequat dolor nisi consequat qui. Ex do eu ad velit ad do ut dolor aliquip id. Aliqua ullamco elit cupidatat laborum laborum ut velit quis aliquip.", + "longText": "In duis aute elit nostrud sint ut veniam. Aute sunt tempor laborum et consectetur. Incididunt qui excepteur dolor proident in et aliqua anim nisi magna incididunt duis fugiat. Irure amet laboris excepteur consequat dolore est magna. Eu velit dolore velit eiusmod id mollit esse dolore ullamco enim aute reprehenderit commodo occaecat. Ea quis cillum cillum ea consequat dolor non ea aute ipsum.\r\nDolore qui consectetur Lorem deserunt cupidatat pariatur est magna consectetur veniam. Pariatur ullamco nostrud commodo cillum fugiat cillum id ipsum ad. Occaecat laboris irure est nostrud proident ipsum aliqua cillum fugiat nulla enim.\r\n", + "address": "2 Whitney Avenue", + "city": "Weeksville", + "state": "Georgia", + "zip": 31104, + "country": "Slovak Republic", + "email": "barrettburgess@scentric.com", + "phone": "(946) 534-2498", + "color": "rgb(219,133,212)" + }, + { + "index": 367, + "name": "Karen Collins", + "first": "Barton", + "last": "Diaz", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/juanpablob/73.jpg", + "expanded": false, + "guid": "98c26038-07d2-4135-bbd2-9a3f427c12e0", + "integer": 8, + "date": "Sat Sep 17 2005 00:39:48 GMT-0700 (PDT)", + "shortText": "aute aute nulla Lorem", + "mediumText": "Aliqua aliquip adipisicing veniam aliqua magna adipisicing dolor officia nisi nulla non voluptate ut.", + "longText": "Qui aliqua culpa sunt ea eu ipsum velit reprehenderit. Do eu veniam ad velit proident ea ea ut cupidatat elit sunt. Nisi cillum est tempor anim veniam. Sit nostrud exercitation veniam minim magna. Esse veniam amet est cillum dolore magna sunt ea minim aliqua incididunt reprehenderit est. Nulla pariatur consectetur officia aliqua veniam irure labore minim dolor amet cupidatat anim sint.\r\nCulpa id amet esse officia. Officia esse ex cillum velit. Cupidatat in in adipisicing exercitation deserunt. Amet id adipisicing ipsum deserunt.\r\n", + "address": "4 Garland Court", + "city": "Martinez", + "state": "New Mexico", + "zip": 87856, + "country": "Iraq", + "email": "bartondiaz@scentric.com", + "phone": "(915) 446-2455", + "color": "rgb(198,214,168)" + }, + { + "index": 368, + "name": "Carly Kirkland", + "first": "Malone", + "last": "West", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/whale/73.jpg", + "expanded": false, + "guid": "a0fe6dd2-da36-4fe8-9172-64d79b76016a", + "integer": 40, + "date": "Thu Sep 03 2009 05:16:20 GMT-0700 (PDT)", + "shortText": "dolor culpa", + "mediumText": "Incididunt nulla est do proident qui culpa ea non eu et velit.", + "longText": "Quis non exercitation in cupidatat ad. Irure pariatur anim magna est elit excepteur nulla elit est quis nisi tempor quis. Sint irure consectetur consequat nostrud. Excepteur officia eiusmod reprehenderit sit irure aliqua id minim esse consectetur dolore.\r\nIncididunt incididunt sint magna excepteur quis reprehenderit qui pariatur dolore magna est. Pariatur exercitation minim et culpa consequat eiusmod cillum nostrud Lorem cupidatat. Amet labore amet laborum qui qui id laborum. Officia magna ipsum proident mollit deserunt sit veniam nostrud reprehenderit do laborum voluptate. Excepteur laboris excepteur pariatur proident pariatur minim dolor. Fugiat veniam nostrud ut non duis fugiat ex culpa. Velit enim culpa voluptate culpa reprehenderit officia irure velit ad qui veniam non exercitation.\r\nLaborum fugiat ea ex sint. Veniam labore duis non sunt ad reprehenderit voluptate irure voluptate commodo elit non. Eiusmod labore elit magna irure dolor aliquip.\r\nDolore qui occaecat magna ex amet irure officia adipisicing consequat Lorem proident reprehenderit sint. Laboris esse eiusmod quis ex sunt dolor ipsum sunt Lorem labore laborum id eu. Quis dolore qui quis exercitation minim nostrud do aliquip qui deserunt commodo aute fugiat aliqua. Pariatur proident eiusmod pariatur sit esse eiusmod aliquip fugiat exercitation culpa duis eiusmod. Mollit pariatur commodo ex qui et incididunt.\r\n", + "address": "2 Livonia Avenue", + "city": "Bartley", + "state": "Arizona", + "zip": 65737, + "country": "Congo", + "email": "malonewest@scentric.com", + "phone": "(884) 560-3387", + "color": "rgb(203,128,144)" + }, + { + "index": 369, + "name": "Cline Porter", + "first": "Villarreal", + "last": "Berg", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kalmerrautam/73.jpg", + "expanded": false, + "guid": "bc0ae406-a0b0-46b8-a78c-e814bf6e352a", + "integer": 34, + "date": "Sat Dec 17 2011 17:11:11 GMT-0800 (PST)", + "shortText": "aliquip", + "mediumText": "Sit eu exercitation deserunt fugiat sunt. Duis amet Lorem sint fugiat aliquip sint nisi nulla officia. Mollit magna esse magna mollit ex aliquip sit voluptate occaecat. Sint ea reprehenderit pariatur ut proident consequat tempor do irure.", + "longText": "Sunt sunt culpa enim anim reprehenderit minim occaecat officia est exercitation exercitation. Magna irure consequat aliquip nisi sint. Ad excepteur et exercitation consectetur. Nulla magna pariatur commodo velit consectetur elit sunt voluptate laborum eiusmod sint cupidatat proident ex.\r\nConsectetur minim aute in eu tempor enim laboris deserunt. Proident laboris fugiat cupidatat ullamco ex. Laboris et eu qui tempor nisi non anim magna sunt est commodo qui et. In sint eu quis ea. Adipisicing ad nisi non mollit officia elit. Reprehenderit veniam aute consequat qui aliqua incididunt.\r\n", + "address": "4 Willmohr Street", + "city": "Russellville", + "state": "Texas", + "zip": 61324, + "country": "Cocos (Keeling Islands)", + "email": "villarrealberg@scentric.com", + "phone": "(934) 457-2444", + "color": "rgb(128,225,98)" + }, + { + "index": 370, + "name": "Davidson Parker", + "first": "George", + "last": "Pittman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicoleglynn/73.jpg", + "expanded": false, + "guid": "4d0d0e84-953f-4ab2-819d-ae72aa4552f7", + "integer": 2, + "date": "Sat Jun 23 1979 15:10:33 GMT-0700 (PDT)", + "shortText": "adipisicing Lorem", + "mediumText": "Est ullamco qui est cupidatat magna velit cupidatat do sunt officia ad.", + "longText": "Velit enim nostrud et ut elit nostrud laboris mollit. Pariatur sit sint proident officia ea sunt consectetur occaecat esse velit. Nulla Lorem ad anim ut aute nostrud amet sit labore sint ullamco nisi ad.\r\nEsse proident in magna elit ex esse et consequat incididunt eiusmod officia. Occaecat labore ut aliqua sunt labore minim Lorem ut velit magna occaecat sit sunt. Commodo ut magna cillum minim.\r\nDolor cupidatat et ullamco velit elit labore. Sint dolore incididunt anim nisi aliquip. Ullamco id laboris cillum id enim cillum exercitation non.\r\nLaboris qui Lorem ipsum dolor proident exercitation consectetur commodo incididunt. Ad pariatur cillum et aute. Nulla cillum sint quis laboris fugiat do ullamco incididunt aliqua aliquip eu aute.\r\nLorem irure nisi magna ex do voluptate tempor consequat. Aliquip dolore ullamco laboris reprehenderit Lorem elit. Dolor esse minim veniam eu ex reprehenderit. Sit do irure anim ipsum id duis culpa laboris dolore velit cillum nulla amet dolor. Exercitation enim proident ut aliqua culpa ipsum. Aute ad irure ipsum exercitation fugiat ut. Labore non do incididunt nulla veniam ex exercitation nostrud enim fugiat.\r\n", + "address": "3 Stryker Court", + "city": "Bourg", + "state": "District Of Columbia", + "zip": 63976, + "country": "Saint Kitts and Nevis", + "email": "georgepittman@scentric.com", + "phone": "(812) 518-3391", + "color": "rgb(128,255,152)" + }, + { + "index": 371, + "name": "Ingram Ware", + "first": "Caitlin", + "last": "Hart", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/rickdt/73.jpg", + "expanded": false, + "guid": "b6de624e-cbfa-436a-9fcb-b5d584616793", + "integer": 24, + "date": "Thu Feb 14 1974 18:30:07 GMT-0700 (PDT)", + "shortText": "tempor reprehenderit nulla quis", + "mediumText": "Qui id adipisicing do deserunt laboris anim. Eiusmod magna dolor labore fugiat aute amet commodo ad sit. Esse occaecat labore qui culpa aute pariatur commodo velit laborum enim voluptate. Consequat sunt labore cupidatat ex labore id exercitation ad deserunt quis laboris et dolor.", + "longText": "Et consequat duis excepteur occaecat reprehenderit labore dolor nostrud. Aliqua irure ullamco reprehenderit incididunt dolore aliquip eiusmod. Et et in commodo quis.\r\nFugiat fugiat amet qui deserunt incididunt consequat ex anim culpa Lorem. Magna cillum incididunt ut consectetur esse quis veniam nulla aliqua esse velit consequat ipsum. Veniam ut amet officia tempor aliquip ad ad ad commodo ut et. Ad esse mollit adipisicing adipisicing cillum.\r\nUllamco dolore ullamco adipisicing in duis enim eiusmod sit. Proident nisi nostrud ea ipsum. Aliquip officia est ut Lorem ad incididunt qui tempor aliquip aute non esse. Id culpa ipsum proident duis eu sint elit eiusmod esse quis veniam nulla mollit. Elit mollit pariatur occaecat sunt duis et ipsum quis pariatur consequat ad culpa deserunt ex.\r\n", + "address": "2 Elliott Place", + "city": "Moscow", + "state": "Virgin Islands", + "zip": 16190, + "country": "Spain", + "email": "caitlinhart@scentric.com", + "phone": "(802) 458-3217", + "color": "rgb(245,222,100)" + }, + { + "index": 372, + "name": "Rodriguez Herring", + "first": "Blevins", + "last": "Richards", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/funwatercat/73.jpg", + "expanded": false, + "guid": "16027d94-5563-418b-b92e-879c2bfe66a2", + "integer": 27, + "date": "Thu Aug 04 1977 16:52:59 GMT-0700 (PDT)", + "shortText": "ea incididunt commodo", + "mediumText": "Fugiat culpa duis velit ullamco cupidatat esse pariatur deserunt laborum. Irure nostrud nulla culpa cupidatat est quis sunt veniam culpa. Aliqua anim mollit nulla aliquip quis dolore irure aliquip non est.", + "longText": "Anim laborum aliquip et culpa mollit eiusmod laboris. Consectetur tempor deserunt ullamco cillum elit sunt esse ut ullamco do aliquip. Irure pariatur occaecat id deserunt fugiat irure Lorem tempor excepteur ut dolor cupidatat reprehenderit adipisicing.\r\nIpsum sit ipsum aute ex sint magna commodo in anim enim consequat occaecat nisi. Qui do pariatur do ea. Consequat cupidatat sit aute fugiat qui laboris culpa elit irure excepteur. Duis ea elit et aliqua qui ipsum commodo proident adipisicing duis tempor. Duis ad nulla dolore minim anim dolore aute amet tempor.\r\nExercitation pariatur mollit cupidatat adipisicing deserunt pariatur incididunt. Sit deserunt consequat nisi do irure et duis quis. Cupidatat ea et ut velit ullamco ad dolore fugiat voluptate cillum.\r\nDolore ipsum anim nisi voluptate id ad non do dolor cupidatat duis dolor in. Excepteur esse aliquip ex dolor aute adipisicing duis dolore. Mollit amet deserunt occaecat qui cupidatat do et ea reprehenderit qui.\r\n", + "address": "2 Mill Street", + "city": "Sunriver", + "state": "Puerto Rico", + "zip": 60210, + "country": "Guinea-Bissau", + "email": "blevinsrichards@scentric.com", + "phone": "(880) 569-2358", + "color": "rgb(141,69,176)" + }, + { + "index": 373, + "name": "Larsen Petersen", + "first": "Kayla", + "last": "Wolf", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ssiskind/73.jpg", + "expanded": false, + "guid": "a7e99e07-e0c7-499a-a66b-a5b931143a55", + "integer": 25, + "date": "Fri Nov 24 1995 21:45:58 GMT-0800 (PST)", + "shortText": "elit exercitation", + "mediumText": "Minim in laboris culpa cupidatat ea nostrud sunt id dolore officia ea ipsum sit.", + "longText": "Id amet fugiat voluptate labore ea. Velit fugiat qui magna cillum ullamco duis eu qui pariatur. Do laboris irure nulla id. Minim enim commodo non ut sint. Consequat ut in consequat laborum pariatur commodo consectetur irure.\r\nDolor in aute mollit anim. Laboris incididunt occaecat ipsum Lorem velit nisi anim sunt consectetur. Occaecat aliquip ex irure adipisicing. Culpa elit dolore deserunt nisi. Laboris quis nulla in incididunt culpa proident culpa Lorem ea. Incididunt eiusmod culpa Lorem in cillum amet eu aute qui anim et qui sunt et.\r\nAmet veniam adipisicing minim minim proident sit commodo reprehenderit. Duis consequat do ex mollit minim consectetur. Nulla cillum enim esse sit commodo ad cupidatat ipsum veniam aliquip sunt. Ut dolore ullamco velit est minim laboris incididunt consequat.\r\nVoluptate excepteur Lorem ut id minim incididunt quis proident cupidatat consequat sunt magna dolor. Nostrud aliqua laborum exercitation dolor Lorem. Magna adipisicing cupidatat anim reprehenderit mollit aliquip esse nisi magna est. Laboris mollit consectetur ut tempor minim excepteur fugiat do consectetur tempor. Enim fugiat tempor labore occaecat elit est minim. Enim ex quis pariatur est eiusmod.\r\nDo velit nisi enim adipisicing qui consectetur reprehenderit aute occaecat exercitation consectetur. Cupidatat proident aute sit aliqua cupidatat velit adipisicing occaecat eu sint et proident ad quis. Qui laboris dolore id proident mollit labore aliqua sint aliquip. Minim reprehenderit consequat est voluptate proident irure aliqua reprehenderit do nisi. Nulla culpa culpa eu ea laborum minim ad culpa Lorem enim. Aliqua officia ut id et laboris quis eiusmod ex consequat aliquip voluptate.\r\n", + "address": "4 Sunnyside Avenue", + "city": "Jacksonwald", + "state": "Maryland", + "zip": 86841, + "country": "Cameroon", + "email": "kaylawolf@scentric.com", + "phone": "(905) 565-3468", + "color": "rgb(60,235,69)" + }, + { + "index": 374, + "name": "Holt Oconnor", + "first": "Newman", + "last": "Skinner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_purplebunny/73.jpg", + "expanded": false, + "guid": "b20aa0b1-320a-4487-8af0-78e7cbf30443", + "integer": 29, + "date": "Sun Apr 26 1981 19:50:41 GMT-0700 (PDT)", + "shortText": "non duis elit", + "mediumText": "Esse fugiat ut incididunt fugiat minim enim sit. Aliquip amet incididunt enim quis culpa et ut incididunt eu officia mollit adipisicing ex. Tempor velit magna deserunt voluptate occaecat id laborum occaecat labore id dolore.", + "longText": "Ut deserunt ut minim consequat. Non aute commodo minim proident ex ex id. Consectetur sunt reprehenderit consectetur Lorem eu sit ut reprehenderit aliqua eu occaecat.\r\nEiusmod occaecat dolor mollit adipisicing aute enim do. Aliqua ut sit tempor velit sunt. Minim eiusmod qui aute ea quis dolor et dolor excepteur qui sit eu incididunt qui. Ex id incididunt nisi sint dolore laboris reprehenderit officia velit.\r\nCupidatat dolor nostrud reprehenderit irure aliquip minim minim voluptate in Lorem labore eiusmod proident minim. Commodo reprehenderit eu velit magna fugiat ad cillum in deserunt elit tempor est commodo. Pariatur aliqua dolore proident cillum ex laboris culpa proident irure velit reprehenderit. Irure sit ad ipsum mollit ex. Reprehenderit nulla sit adipisicing excepteur dolore magna ullamco quis laborum minim enim ut.\r\nEnim sit Lorem nulla adipisicing ipsum cillum pariatur cillum aute culpa proident non Lorem dolor. Ea cupidatat anim labore duis nisi et ex id proident tempor. Qui sunt est aliqua in non do ea fugiat. Aute aliqua consectetur sunt culpa nisi sunt. Ipsum nulla quis ad ut elit proident ad culpa deserunt enim elit ea. Ea sint ea ipsum velit esse labore labore est ex aliquip nulla fugiat id dolor. Officia sunt ipsum est officia laborum in ea eiusmod irure laborum ea id magna non.\r\nAliquip nostrud nisi dolor aliquip commodo. Enim ex labore velit anim nisi consectetur excepteur labore reprehenderit. Lorem exercitation ut cillum et magna commodo labore esse nostrud duis Lorem. Cillum incididunt deserunt eu in cupidatat. Veniam cillum culpa voluptate irure cillum sit veniam elit velit labore. Dolore voluptate commodo labore nisi anim esse veniam deserunt sint anim amet velit.\r\n", + "address": "2 Neptune Avenue", + "city": "Croom", + "state": "Massachusetts", + "zip": 45897, + "country": "Niger", + "email": "newmanskinner@scentric.com", + "phone": "(895) 579-2625", + "color": "rgb(213,132,55)" + }, + { + "index": 375, + "name": "Ray Mcdonald", + "first": "Gladys", + "last": "Hamilton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linkthief/73.jpg", + "expanded": false, + "guid": "129213d5-185b-462e-9d98-ec5d7ebbf584", + "integer": 29, + "date": "Fri Oct 24 2008 13:24:33 GMT-0700 (PDT)", + "shortText": "sit in", + "mediumText": "Sit ut sit ut ullamco pariatur.", + "longText": "Nulla veniam officia ipsum cupidatat est sit deserunt officia eiusmod. Ut aliquip mollit sint qui do laborum esse id. Cillum mollit Lorem laboris deserunt quis reprehenderit do deserunt excepteur ullamco cillum. Qui sit consequat velit ipsum elit non officia laborum eiusmod ad aliquip velit. Minim consectetur reprehenderit nisi irure ullamco occaecat ipsum.\r\nEu fugiat do in ad dolore reprehenderit aute ullamco sit non. Incididunt qui esse fugiat nisi excepteur eiusmod mollit non deserunt qui sunt do. Velit deserunt ex culpa sunt ipsum elit veniam aute. Dolor occaecat officia eiusmod sint sint non aute consectetur quis ea.\r\n", + "address": "4 Lacon Court", + "city": "Iberia", + "state": "Oklahoma", + "zip": 71131, + "country": "Malta", + "email": "gladyshamilton@scentric.com", + "phone": "(966) 483-3351", + "color": "rgb(155,104,148)" + }, + { + "index": 376, + "name": "Clay Langley", + "first": "Burris", + "last": "Randall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ffbel/73.jpg", + "expanded": false, + "guid": "51f80793-c017-41ad-9079-d752d4d47d9e", + "integer": 53, + "date": "Mon Jun 07 1982 18:22:42 GMT-0700 (PDT)", + "shortText": "elit", + "mediumText": "Irure in cillum eiusmod do laboris. Magna sit consectetur elit quis dolore quis ea esse. Minim velit adipisicing consequat mollit veniam. Minim eiusmod laboris nisi mollit ea labore commodo ipsum et ullamco duis.", + "longText": "Sit est fugiat sit nostrud laboris veniam aliqua enim aliqua eu ex cillum. Incididunt occaecat minim consectetur duis eiusmod. Pariatur laborum nostrud dolore minim excepteur sunt pariatur aute. Do anim quis ad enim est sint minim dolore laboris in fugiat cupidatat mollit pariatur. Ipsum est dolor aliqua aute. Sunt proident duis pariatur qui veniam sunt. Ea anim consequat nostrud reprehenderit ea ad non.\r\n", + "address": "4 McClancy Place", + "city": "Nash", + "state": "Ohio", + "zip": 18742, + "country": "Antigua and Barbuda", + "email": "burrisrandall@scentric.com", + "phone": "(844) 495-2795", + "color": "rgb(161,56,157)" + }, + { + "index": 377, + "name": "Whitaker Duffy", + "first": "Consuelo", + "last": "Vaughn", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/labibjaffar/73.jpg", + "expanded": false, + "guid": "d79e9e47-4d77-47c0-9b13-a19147d76339", + "integer": 69, + "date": "Tue Apr 18 1989 16:24:01 GMT-0700 (PDT)", + "shortText": "adipisicing", + "mediumText": "Cillum mollit amet fugiat aliquip proident. Cillum veniam ut do anim eiusmod officia laborum enim voluptate commodo.", + "longText": "Aliquip labore non amet cillum ipsum ex non commodo enim eiusmod ea. Est non do nulla laborum minim nostrud esse exercitation fugiat eiusmod. Aliquip labore dolor ad duis velit nisi exercitation fugiat proident cupidatat Lorem elit ullamco dolore. Cupidatat enim sunt id veniam exercitation voluptate consectetur pariatur. Irure labore tempor sint adipisicing nisi anim. Proident officia minim amet sunt enim in officia dolor voluptate ea magna ullamco.\r\n", + "address": "4 Senator Street", + "city": "Emerald", + "state": "Nevada", + "zip": 95049, + "country": "Kazakhstan", + "email": "consuelovaughn@scentric.com", + "phone": "(820) 453-3820", + "color": "rgb(211,124,127)" + }, + { + "index": 378, + "name": "Millicent Brewer", + "first": "Carpenter", + "last": "French", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tnrzdmr/73.jpg", + "expanded": false, + "guid": "fc81e8c8-56bf-4cc7-9a99-bc5e5336cc44", + "integer": 10, + "date": "Mon Dec 20 2004 03:29:39 GMT-0800 (PST)", + "shortText": "cillum elit dolore id", + "mediumText": "Consectetur laboris velit culpa nisi est nostrud ea laboris et. Voluptate incididunt qui cillum velit occaecat nisi deserunt. Ut nisi do veniam sunt deserunt adipisicing nostrud nostrud eu nulla consectetur amet elit.", + "longText": "Enim aliquip ipsum voluptate ut adipisicing anim dolor. Est est nisi est ex fugiat labore aute proident nisi amet deserunt anim nisi dolore. Eiusmod elit Lorem et officia cillum in proident cillum sint do. Laboris dolore ad cupidatat anim et eu.\r\nIn aute eiusmod esse commodo officia culpa Lorem quis laboris. Ipsum pariatur pariatur dolore amet ipsum amet ex laboris laboris. Magna elit sunt Lorem magna ea laborum non voluptate eu velit irure id excepteur. Adipisicing non pariatur culpa sit tempor ea anim officia aute. Magna eu cupidatat sint nostrud veniam sunt irure non. Lorem mollit eiusmod ea magna qui consectetur quis aliqua nulla nulla. Ipsum deserunt cupidatat irure fugiat et commodo ut.\r\nVelit anim eiusmod Lorem incididunt id deserunt mollit voluptate. Commodo id excepteur id occaecat sit. Qui amet proident ipsum est aute culpa et mollit et nulla occaecat minim minim. Magna ut enim exercitation laborum deserunt occaecat enim sunt veniam aliquip exercitation elit et. Nulla enim tempor fugiat eiusmod qui laborum ad est minim incididunt reprehenderit voluptate ad reprehenderit. Officia exercitation reprehenderit aliquip in id Lorem laboris laboris ipsum laborum minim ullamco eiusmod.\r\nConsectetur consequat irure consectetur reprehenderit aliqua quis ea fugiat ullamco reprehenderit. Fugiat fugiat elit voluptate in aliqua qui excepteur duis ipsum veniam occaecat eu sint amet. Aliquip deserunt ea ipsum ea pariatur in magna dolore voluptate.\r\nEnim eiusmod laboris officia exercitation irure laboris sit adipisicing non tempor nostrud officia. Quis ut esse deserunt qui laborum do velit eu amet dolore. Consequat adipisicing nulla officia ipsum veniam eiusmod. Occaecat deserunt veniam tempor sint labore nisi irure. Ullamco ad eu pariatur commodo aute ea cupidatat et consequat do commodo tempor. Adipisicing eiusmod culpa nostrud commodo adipisicing irure dolore aliquip labore. Ullamco commodo mollit consequat incididunt ut in officia occaecat voluptate.\r\n", + "address": "3 Drew Street", + "city": "Enetai", + "state": "Montana", + "zip": 76072, + "country": "Bahrain", + "email": "carpenterfrench@scentric.com", + "phone": "(981) 464-3639", + "color": "rgb(116,120,98)" + }, + { + "index": 379, + "name": "Blanchard Solis", + "first": "Kristie", + "last": "Cabrera", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/jeremyjantz/73.jpg", + "expanded": false, + "guid": "c2c84ffa-4a75-48e1-998f-924681ab4240", + "integer": 1, + "date": "Sat Jul 09 1988 08:58:08 GMT-0700 (PDT)", + "shortText": "excepteur velit quis dolore amet", + "mediumText": "Culpa magna fugiat est consequat deserunt elit eiusmod ullamco. Non esse consectetur id amet excepteur magna culpa mollit ea veniam elit.", + "longText": "Nulla et laboris qui aute commodo sunt enim occaecat ad eu. Enim eu consequat in id irure minim. Id pariatur commodo duis ea aute deserunt. Cillum consequat ea nostrud cillum proident.\r\n", + "address": "3 Aitken Place", + "city": "Germanton", + "state": "California", + "zip": 10214, + "country": "India", + "email": "kristiecabrera@scentric.com", + "phone": "(870) 486-2499", + "color": "rgb(60,117,146)" + }, + { + "index": 380, + "name": "Armstrong Leon", + "first": "Wolfe", + "last": "Hansen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ibrahemaq/73.jpg", + "expanded": false, + "guid": "ae0fcdb0-49fc-4ff8-85f2-7414f67b99f6", + "integer": 60, + "date": "Fri Feb 27 1970 07:01:10 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Laboris adipisicing consectetur qui do nostrud occaecat in consectetur sit. Esse nisi commodo voluptate magna eu nisi fugiat amet nostrud.", + "longText": "Sunt ut labore sint sint labore dolor ullamco cupidatat velit tempor ea cillum. Veniam sit ex dolor sint irure ut. Nulla culpa ullamco ut ullamco tempor consectetur pariatur adipisicing reprehenderit laborum nostrud sint.\r\nEnim nisi aliquip pariatur non laboris ea. Aute aute pariatur commodo tempor sint pariatur quis ad ea pariatur Lorem cupidatat aute consectetur. Laboris ad laboris in cillum proident nostrud mollit consectetur irure nisi magna. Dolor nisi amet anim esse voluptate ipsum minim officia ut ex laboris cillum sunt elit. Tempor quis ex ullamco pariatur officia. Ad excepteur enim ea laborum id officia aliquip cillum est. Do ut labore aliquip dolor sit commodo.\r\nMinim excepteur esse esse enim proident eiusmod reprehenderit proident qui amet. Lorem culpa proident reprehenderit officia tempor magna sunt deserunt qui velit voluptate sunt. Ad ex nulla dolore duis veniam exercitation enim dolore excepteur consequat laborum officia ea fugiat. Et proident eiusmod incididunt quis do fugiat consectetur consectetur esse culpa magna magna.\r\nIn excepteur eu esse duis et excepteur. Qui incididunt eu dolore tempor pariatur occaecat. Dolor ex voluptate ut incididunt est mollit mollit aliqua Lorem sunt est irure ullamco in. Id culpa amet voluptate do aliquip laborum sit duis anim occaecat ea adipisicing do.\r\n", + "address": "4 Kent Street", + "city": "Carlton", + "state": "Marshall Islands", + "zip": 34631, + "country": "Qatar", + "email": "wolfehansen@scentric.com", + "phone": "(834) 587-3684", + "color": "rgb(135,161,252)" + }, + { + "index": 381, + "name": "Kerry Emerson", + "first": "Hurst", + "last": "Gilliam", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/croakx/73.jpg", + "expanded": false, + "guid": "454852cf-301c-42cc-88a5-fef2dce8ac2d", + "integer": 54, + "date": "Mon Jan 15 1990 07:32:08 GMT-0800 (PST)", + "shortText": "amet ullamco", + "mediumText": "Sunt tempor irure nulla do esse aliqua. Velit fugiat incididunt aliqua voluptate nisi qui ut.", + "longText": "Do labore aute veniam voluptate reprehenderit Lorem cupidatat excepteur est cupidatat adipisicing irure. Veniam consectetur fugiat esse et. Excepteur magna dolore duis ea occaecat. Voluptate occaecat id occaecat velit nostrud.\r\nFugiat sint eiusmod reprehenderit magna consequat esse. Dolor sint officia aliquip occaecat occaecat qui ipsum magna cupidatat excepteur ad et est laborum. Ut consectetur ex proident elit.\r\nAdipisicing incididunt excepteur ea labore proident proident et id in reprehenderit ut occaecat et. Et aliquip incididunt enim ea enim ea minim ut eiusmod. Velit mollit sunt voluptate laboris aliquip incididunt. Duis laborum do adipisicing non tempor nisi minim do aliquip laboris irure tempor ad dolore. Aliqua amet adipisicing eu Lorem esse fugiat fugiat velit.\r\nSunt irure ex reprehenderit nostrud minim magna. Commodo nostrud mollit pariatur reprehenderit consequat occaecat aliqua. Reprehenderit id non magna nisi amet sunt incididunt deserunt dolor quis cupidatat adipisicing voluptate sunt. Tempor proident magna amet culpa est est. Mollit sint eiusmod reprehenderit est. Lorem do culpa ut enim quis enim cillum elit ullamco deserunt fugiat commodo dolor.\r\n", + "address": "3 Vandam Street", + "city": "Carlos", + "state": "Indiana", + "zip": 18552, + "country": "Vatican City State (Holy See)", + "email": "hurstgilliam@scentric.com", + "phone": "(883) 509-3820", + "color": "rgb(92,147,218)" + }, + { + "index": 382, + "name": "Rosanna Mercer", + "first": "Jeannie", + "last": "Harrington", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_dukex/73.jpg", + "expanded": false, + "guid": "81b02f40-06df-4e1f-bb59-400a488d75c1", + "integer": 9, + "date": "Thu Apr 29 1982 09:20:09 GMT-0700 (PDT)", + "shortText": "velit exercitation laborum excepteur nulla", + "mediumText": "Lorem minim consequat sunt eu commodo. Irure occaecat do irure ex dolore. Dolore consequat occaecat aliqua aliqua do incididunt consectetur in et eiusmod. Laboris incididunt esse magna aliquip excepteur sint quis ipsum consectetur aute labore. Et non consequat reprehenderit ipsum incididunt nisi do.", + "longText": "Dolor esse nostrud in culpa. Elit cillum cupidatat cillum aute nulla labore sint aliquip enim exercitation. Nulla do tempor labore sit adipisicing. Ex sint deserunt in pariatur veniam. Ea do do aliqua cillum id mollit duis elit aute eiusmod pariatur cupidatat duis anim.\r\nCulpa officia ea amet non non nulla occaecat quis ut Lorem eiusmod velit ad ut. Ex deserunt ut pariatur excepteur fugiat dolor ex aute elit officia amet consectetur consectetur excepteur. Dolor culpa pariatur proident anim reprehenderit velit laboris velit aliquip.\r\nSit velit amet laboris incididunt qui excepteur irure excepteur. Nulla adipisicing pariatur enim nisi. Dolore ea veniam adipisicing mollit eiusmod. Eu sit ea in consequat proident ex magna veniam pariatur quis aute aliquip sint. Ullamco irure nisi anim tempor.\r\n", + "address": "3 Brooklyn Road", + "city": "Northchase", + "state": "Tennessee", + "zip": 58954, + "country": "Malaysia", + "email": "jeannieharrington@scentric.com", + "phone": "(869) 440-3471", + "color": "rgb(54,179,184)" + }, + { + "index": 383, + "name": "Hudson Gill", + "first": "Erma", + "last": "Medina", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gregsqueeb/73.jpg", + "expanded": false, + "guid": "5cc52dab-f9b6-4d23-9718-12faaca42aaa", + "integer": 29, + "date": "Fri Nov 07 1975 23:03:48 GMT-0800 (PST)", + "shortText": "elit consequat", + "mediumText": "Exercitation aliqua fugiat Lorem fugiat amet est elit. Incididunt voluptate sunt sint ut veniam. Non velit deserunt duis est excepteur consectetur excepteur commodo non ex consequat. Non et ullamco ipsum eiusmod.", + "longText": "Sint ea duis commodo sunt elit ut nulla. Tempor consectetur id aliqua voluptate. Anim sint occaecat nisi eu commodo nisi magna deserunt commodo fugiat quis aliqua.\r\nEiusmod aliquip incididunt dolore elit et fugiat in ex. Qui cupidatat duis tempor amet aute. Nulla et cillum culpa irure consequat sit exercitation ex quis ex. Qui sit ipsum non laboris esse cupidatat eu excepteur. Incididunt tempor sit in fugiat tempor excepteur culpa veniam in incididunt reprehenderit. Ad quis enim cillum quis anim.\r\n", + "address": "2 Decatur Street", + "city": "Hardyville", + "state": "Palau", + "zip": 41443, + "country": "Belize", + "email": "ermamedina@scentric.com", + "phone": "(806) 595-3481", + "color": "rgb(144,140,116)" + }, + { + "index": 384, + "name": "Dominique Valenzuela", + "first": "Stacey", + "last": "Foreman", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/csmnng/73.jpg", + "expanded": false, + "guid": "11147a9a-0058-436d-96c3-f7ae0639677c", + "integer": 82, + "date": "Sat Jul 25 1992 11:14:15 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Enim aliqua aute nostrud ad veniam eiusmod Lorem occaecat sit magna aliqua. Ad ut ipsum dolore pariatur officia sunt tempor velit minim ea consequat commodo deserunt cupidatat. Aliqua ad nostrud aliqua officia mollit ut dolor aliqua est mollit elit ad in veniam. Dolor et nostrud elit ea proident dolore excepteur sit adipisicing cillum enim. Reprehenderit mollit do adipisicing excepteur ullamco exercitation culpa ipsum in eu aliqua.", + "longText": "Reprehenderit ullamco esse aute et laborum pariatur consectetur tempor. Consequat eiusmod fugiat commodo incididunt laborum. Et eiusmod cupidatat incididunt dolor cupidatat sint in nisi anim duis sit labore ex occaecat. Excepteur ipsum officia ut qui ad tempor eu ad cillum commodo.\r\nMagna quis nisi nostrud sint et eiusmod laborum laborum ut. In labore labore veniam anim labore laboris reprehenderit aliquip voluptate aute ullamco duis. Aute tempor magna elit elit aute adipisicing est consequat enim occaecat culpa.\r\nIn aliqua adipisicing aliquip do consequat ipsum Lorem. Nisi nulla velit mollit deserunt laboris elit magna ullamco sint magna anim ut ullamco. Aliquip commodo qui ipsum tempor amet nostrud sit aliquip qui eiusmod minim deserunt esse. Incididunt adipisicing irure excepteur reprehenderit id officia sit amet reprehenderit reprehenderit nostrud ut. Officia deserunt officia qui magna incididunt non cillum esse cupidatat dolor quis eiusmod. Cillum amet minim dolor ipsum anim officia velit aliqua adipisicing anim mollit. Irure enim laborum ex esse id magna dolore non nulla nisi excepteur ad nulla aute.\r\n", + "address": "3 McDonald Avenue", + "city": "Robbins", + "state": "Virginia", + "zip": 22185, + "country": "Singapore", + "email": "staceyforeman@scentric.com", + "phone": "(829) 412-3655", + "color": "rgb(214,140,189)" + }, + { + "index": 385, + "name": "Dolores Morgan", + "first": "Gaines", + "last": "Mullen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ogmenemre/73.jpg", + "expanded": false, + "guid": "ee76f873-95bb-4f4d-84fd-c7313d26386b", + "integer": 51, + "date": "Mon Feb 22 1999 15:26:58 GMT-0800 (PST)", + "shortText": "officia proident", + "mediumText": "Aliquip proident ad incididunt veniam.", + "longText": "Esse excepteur ex sunt id sit laborum. Ut ea qui esse esse qui aliqua ut ex in. Dolore magna laborum veniam magna non ad eiusmod et eiusmod deserunt tempor occaecat. Eiusmod voluptate ut do non. Deserunt est laborum eu aute deserunt eiusmod amet consectetur elit ullamco laboris elit.\r\nConsectetur aliquip reprehenderit est sunt do est sint ad deserunt dolor est. Pariatur id Lorem nostrud elit proident in nulla anim. Duis sunt veniam fugiat sunt aliquip ea eiusmod consectetur nulla consectetur quis.\r\n", + "address": "4 Village Road", + "city": "Springville", + "state": "Wyoming", + "zip": 48245, + "country": "Trinidad and Tobago", + "email": "gainesmullen@scentric.com", + "phone": "(832) 562-2069", + "color": "rgb(177,196,203)" + }, + { + "index": 386, + "name": "Washington Bates", + "first": "Mccray", + "last": "Davenport", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ionutmaxim/73.jpg", + "expanded": false, + "guid": "97224884-727c-4a89-b596-60fbca7914a7", + "integer": 34, + "date": "Thu Nov 13 1980 22:28:43 GMT-0800 (PST)", + "shortText": "enim nostrud", + "mediumText": "Sunt fugiat esse ad sint sint duis ex tempor enim excepteur ullamco. Dolor ipsum occaecat laborum enim. Nisi ex cillum ex culpa laborum proident esse minim incididunt anim est occaecat deserunt cillum. Excepteur aliqua dolore duis do non adipisicing anim excepteur. Sit aliquip ut nisi aliquip labore do officia proident amet esse deserunt laborum sunt veniam.", + "longText": "Aute magna amet irure mollit ex. Deserunt exercitation irure aute eiusmod aute occaecat mollit reprehenderit sit ea esse esse. Laborum cillum Lorem Lorem officia velit minim cillum reprehenderit tempor velit exercitation deserunt ad velit. Irure nulla aliqua ex cupidatat adipisicing cillum amet ex quis deserunt.\r\nVoluptate amet nisi incididunt eiusmod consequat et laboris consequat est voluptate sunt enim. Adipisicing nostrud pariatur aute commodo minim veniam. Anim mollit velit esse cupidatat aliquip exercitation est id est. Cillum incididunt nulla duis non incididunt dolore ipsum est culpa pariatur duis quis.\r\nAd commodo laborum ex voluptate commodo non fugiat ut. Id labore quis aute eiusmod deserunt cupidatat. Consequat irure eu velit aliqua reprehenderit consequat qui labore magna. Sunt ad ad sit irure laboris enim sint do eiusmod Lorem velit cupidatat labore enim. Exercitation veniam sint nulla excepteur id reprehenderit laboris qui et adipisicing. Anim occaecat duis cupidatat dolore labore id duis ad ipsum do.\r\nCulpa fugiat minim cupidatat nisi occaecat reprehenderit sit. Ipsum laboris incididunt tempor irure adipisicing veniam. Nisi laborum cupidatat anim quis fugiat velit ea ad commodo cupidatat. Aliquip esse eu deserunt sint.\r\n", + "address": "4 Lincoln Avenue", + "city": "Deercroft", + "state": "Colorado", + "zip": 53863, + "country": "Namibia", + "email": "mccraydavenport@scentric.com", + "phone": "(970) 600-2028", + "color": "rgb(55,74,60)" + }, + { + "index": 387, + "name": "Estela Dotson", + "first": "Brewer", + "last": "Barnett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teylorfeliz/73.jpg", + "expanded": false, + "guid": "ec7da2db-8a36-430c-bb60-68be4ca38e6f", + "integer": 50, + "date": "Tue Sep 10 1985 22:13:34 GMT-0700 (PDT)", + "shortText": "pariatur do deserunt enim velit", + "mediumText": "Nulla consequat incididunt sint do. Mollit dolor veniam sunt nisi ex consectetur eu excepteur officia culpa.", + "longText": "Veniam proident laboris fugiat id. Ex ut consectetur tempor pariatur duis quis veniam eiusmod amet cupidatat amet enim. Est consectetur exercitation deserunt tempor laboris dolor velit dolore consectetur. Amet anim excepteur sunt sunt ut exercitation minim. Cillum velit aliqua enim magna sunt cillum exercitation esse.\r\nFugiat magna eu nulla anim est voluptate pariatur dolore tempor esse. Nostrud adipisicing laborum ea sint sint aliquip deserunt culpa ipsum sunt. Dolor deserunt ex quis duis dolor sint labore. Et tempor eu cillum est aliqua non. Proident dolore irure est labore duis. Cupidatat ullamco magna excepteur et ex adipisicing ullamco consectetur.\r\n", + "address": "4 Batchelder Street", + "city": "Unionville", + "state": "Utah", + "zip": 19511, + "country": "Paraguay", + "email": "brewerbarnett@scentric.com", + "phone": "(824) 468-3108", + "color": "rgb(251,142,227)" + }, + { + "index": 388, + "name": "Griffith Calhoun", + "first": "Elma", + "last": "Delaney", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/73.jpg", + "expanded": false, + "guid": "bcdb801c-da6b-4e33-8b60-cb63d7391110", + "integer": 26, + "date": "Thu Oct 07 2004 12:09:01 GMT-0700 (PDT)", + "shortText": "incididunt commodo est", + "mediumText": "Ullamco aliqua excepteur nisi veniam dolor veniam excepteur aute est. Sit in reprehenderit laborum non laboris incididunt esse quis veniam ex. In sit laboris enim ex mollit. Esse nisi ipsum sit adipisicing velit excepteur reprehenderit pariatur excepteur aute Lorem consequat. Aliquip culpa dolor commodo consectetur ad aute amet eu tempor velit eiusmod.", + "longText": "Do velit in aliqua id eu occaecat duis ex officia amet. Aliquip consectetur fugiat quis labore. Commodo commodo veniam incididunt aute sit in dolore excepteur eiusmod mollit sint nisi laborum incididunt.\r\n", + "address": "3 Willow Street", + "city": "Craig", + "state": "Idaho", + "zip": 23018, + "country": "Macau", + "email": "elmadelaney@scentric.com", + "phone": "(820) 569-3637", + "color": "rgb(73,159,77)" + }, + { + "index": 389, + "name": "Delgado Brennan", + "first": "Mercedes", + "last": "Livingston", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/S0ufi4n3/73.jpg", + "expanded": false, + "guid": "f39cc1c7-24fe-4b1d-a1ae-3a5b625510ee", + "integer": 14, + "date": "Wed May 28 2008 07:59:57 GMT-0700 (PDT)", + "shortText": "sint", + "mediumText": "Sit et labore aute exercitation cupidatat deserunt proident proident et ad occaecat. Sint occaecat adipisicing qui eiusmod id enim consectetur dolor qui dolore sunt ullamco. Laboris ex ad ad nostrud nisi laborum est sint occaecat elit. Ut ad anim aliquip voluptate aute eiusmod do minim ad do voluptate ullamco in occaecat. Irure deserunt culpa dolor consectetur eu ad magna officia nostrud ea.", + "longText": "Ex id adipisicing non ipsum sint tempor in anim. Fugiat consequat culpa dolor eu non sint quis velit nulla voluptate. Et commodo laborum laboris anim ut fugiat occaecat sunt pariatur. Commodo adipisicing cillum consectetur proident velit deserunt. Dolore veniam aute ipsum minim velit occaecat. Ut aute laborum quis in mollit. Quis labore sit sint elit deserunt nostrud deserunt elit ex cillum.\r\nElit incididunt cillum ad ullamco nisi eu esse nisi ipsum voluptate magna exercitation nisi sit. Adipisicing mollit dolore magna duis. Aliqua non Lorem voluptate nulla ad id excepteur ullamco magna id magna pariatur ea anim. Officia voluptate laborum reprehenderit consequat.\r\nMagna deserunt consequat dolor elit ullamco. Amet labore tempor esse ipsum excepteur officia ut irure reprehenderit dolor fugiat proident culpa. Enim eu eiusmod do ex sit ut aute sit dolore consequat et laboris labore sint. Elit elit laborum exercitation velit consectetur. Aute esse occaecat in nisi sunt veniam sint sit sunt dolor pariatur consectetur.\r\nConsectetur cupidatat amet id mollit dolore occaecat pariatur in ea proident consectetur. Minim eiusmod nulla proident ut pariatur incididunt ullamco mollit nulla occaecat excepteur fugiat eu. Sint veniam anim nostrud deserunt excepteur id labore aliquip consectetur.\r\n", + "address": "4 Summit Street", + "city": "Chloride", + "state": "Arkansas", + "zip": 87932, + "country": "Mauritania", + "email": "mercedeslivingston@scentric.com", + "phone": "(982) 574-2165", + "color": "rgb(166,233,208)" + }, + { + "index": 390, + "name": "Melanie Gilmore", + "first": "Michael", + "last": "Rodriquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nepdud/73.jpg", + "expanded": false, + "guid": "7505cfd7-3696-48c3-8cb0-20a4ddd83340", + "integer": 30, + "date": "Sun Dec 27 1992 18:33:54 GMT-0800 (PST)", + "shortText": "cupidatat est in excepteur dolor", + "mediumText": "Consectetur est Lorem do dolore reprehenderit irure. Culpa et aliquip nulla pariatur aute sit aliqua incididunt enim. Elit nostrud excepteur nulla dolor aute ad sunt laboris sint reprehenderit est do. Irure irure reprehenderit adipisicing amet fugiat sunt ullamco nisi laborum non ad.", + "longText": "Voluptate officia eu dolore ullamco laborum enim id et adipisicing aute reprehenderit cillum. Incididunt et deserunt mollit elit incididunt qui dolore quis. Consectetur magna minim irure culpa sint tempor aliquip proident cillum elit velit. Elit pariatur aliquip cillum id enim.\r\n", + "address": "2 Havens Place", + "city": "Nettie", + "state": "Delaware", + "zip": 89009, + "country": "Ghana", + "email": "michaelrodriquez@scentric.com", + "phone": "(870) 537-3435", + "color": "rgb(69,106,81)" + }, + { + "index": 391, + "name": "Hamilton Sanford", + "first": "Quinn", + "last": "Deleon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/amir_hooseini/73.jpg", + "expanded": false, + "guid": "f4a9b5c2-7e54-4d86-ac2b-dd1367a2ddb7", + "integer": 84, + "date": "Mon Feb 27 2006 05:53:41 GMT-0800 (PST)", + "shortText": "consequat cupidatat dolore veniam", + "mediumText": "Do id aliquip esse Lorem anim mollit est velit laborum deserunt.", + "longText": "Quis commodo esse aute qui ea anim ex Lorem duis culpa ipsum. Nostrud sint et anim Lorem officia sit dolor ipsum voluptate fugiat proident incididunt. Deserunt magna eu aute aliquip culpa exercitation. Voluptate et sit non dolor reprehenderit non proident enim qui. Ea do labore nisi commodo deserunt qui esse incididunt mollit velit esse fugiat officia.\r\nVoluptate dolor Lorem cillum commodo esse adipisicing veniam est pariatur esse aliqua. Aliquip commodo tempor fugiat ea quis deserunt sint nostrud minim. Consequat occaecat reprehenderit deserunt nisi irure consectetur et veniam esse exercitation dolore quis enim. Lorem deserunt anim ut occaecat culpa. Magna reprehenderit quis sunt deserunt ipsum.\r\nLaboris ut labore aliqua ut in anim sint. Ex fugiat duis elit ullamco veniam excepteur laboris. Aliqua dolore consequat excepteur incididunt nisi laboris irure et adipisicing aliquip Lorem fugiat dolor. Irure magna do cupidatat qui sint cupidatat qui commodo aute nostrud incididunt.\r\nPariatur minim proident excepteur ad pariatur mollit ipsum. Id eu elit deserunt elit cupidatat duis cillum proident do voluptate commodo aliqua. Tempor deserunt eiusmod commodo officia est enim non fugiat excepteur. Laborum exercitation Lorem voluptate sit est esse laboris ea sunt nostrud ipsum. Elit nostrud exercitation ad consequat ipsum velit velit fugiat excepteur consequat exercitation qui. Fugiat ex aliqua officia velit occaecat sint dolore. Excepteur cupidatat sit dolor dolore et eu.\r\nQui laboris aute et exercitation elit sint pariatur ea nulla Lorem do laboris ipsum. Fugiat nostrud proident laboris laborum adipisicing. Eu consectetur in ad tempor nisi qui do ea Lorem id labore pariatur anim officia. Cillum commodo est ex commodo nostrud elit consequat est dolore enim minim cillum. Dolore tempor dolor irure cupidatat eiusmod magna sit pariatur occaecat. Consequat non sit pariatur consequat nulla dolore adipisicing.\r\n", + "address": "4 Gerald Court", + "city": "Wanship", + "state": "Federated States Of Micronesia", + "zip": 83910, + "country": "Moldova", + "email": "quinndeleon@scentric.com", + "phone": "(843) 402-3938", + "color": "rgb(178,174,101)" + }, + { + "index": 392, + "name": "Williams Wiggins", + "first": "Brooke", + "last": "Pitts", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kokikillara/73.jpg", + "expanded": false, + "guid": "4ed6c0c9-de4f-460e-807c-24402159047d", + "integer": 8, + "date": "Mon May 03 1976 22:14:52 GMT-0700 (PDT)", + "shortText": "velit elit", + "mediumText": "Voluptate ea officia laborum exercitation ullamco veniam aliquip mollit duis dolor eu et. Veniam exercitation fugiat aute ipsum cupidatat. Mollit ad id irure enim adipisicing. Ullamco aliqua voluptate laborum non commodo pariatur aliquip.", + "longText": "Dolor fugiat aliqua aliqua Lorem tempor proident elit cillum exercitation. Voluptate ipsum Lorem pariatur fugiat mollit exercitation occaecat consequat laborum enim Lorem. Elit exercitation tempor eu sint nostrud aliquip aliquip enim in. Anim incididunt ad laboris deserunt duis sit ut anim esse ea dolore ipsum nostrud. Id pariatur velit velit pariatur elit sunt aliqua excepteur. Enim commodo amet sunt id mollit adipisicing quis sunt incididunt aliqua eiusmod nostrud.\r\nOfficia id sunt nulla adipisicing laborum. Laborum laborum eiusmod velit commodo non labore eu. Non nostrud sint do Lorem. Excepteur ipsum est esse minim ullamco reprehenderit quis Lorem sit veniam magna cupidatat laboris. Incididunt est in officia qui sit sit dolore. Aute voluptate irure commodo ad mollit elit amet consequat elit cupidatat consectetur tempor.\r\nOccaecat Lorem aliquip amet sint enim. Ullamco sunt quis commodo cupidatat voluptate ea. Est sint commodo exercitation sunt duis duis mollit reprehenderit. Incididunt consectetur eu et esse et pariatur velit laborum tempor. Nulla ea ea est pariatur et non.\r\nIn irure pariatur non commodo est cillum ut esse. Amet aliquip proident culpa Lorem velit et nostrud amet. Esse Lorem anim nulla dolore cillum labore do irure est aliqua labore sint magna non. Quis consequat nulla ex deserunt ex. Eiusmod commodo magna voluptate qui ex. Ex anim exercitation deserunt duis proident ea voluptate non enim.\r\nAd fugiat dolor officia cupidatat aute dolor dolor consectetur sit. Aliqua magna occaecat nulla minim ea aute fugiat sint irure aliquip nostrud dolor. Amet et non duis fugiat enim excepteur ipsum nisi. Ex amet dolore ex reprehenderit elit consectetur sunt sint laboris et. Ad do consequat aliqua adipisicing tempor pariatur non excepteur nisi ipsum elit cupidatat. Aliqua exercitation pariatur ullamco sint exercitation irure cupidatat aliquip mollit elit veniam ex reprehenderit.\r\n", + "address": "3 Portal Street", + "city": "Berwind", + "state": "Guam", + "zip": 84129, + "country": "Costa Rica", + "email": "brookepitts@scentric.com", + "phone": "(951) 474-2640", + "color": "rgb(210,98,96)" + }, + { + "index": 393, + "name": "Lucia Maynard", + "first": "Moore", + "last": "Bass", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/christianoliff/73.jpg", + "expanded": false, + "guid": "044b1bae-19f0-48c3-a675-b3840c1f0350", + "integer": 13, + "date": "Sun Jun 29 2008 08:11:07 GMT-0700 (PDT)", + "shortText": "eiusmod", + "mediumText": "Est ullamco aute deserunt minim duis sunt dolore cillum tempor exercitation sit. Laboris voluptate labore sit eu adipisicing in occaecat excepteur elit ipsum in eu. Eiusmod est minim veniam do excepteur laborum amet aute. Laboris tempor deserunt cillum ipsum.", + "longText": "Laboris ad excepteur eiusmod non dolor sunt in proident velit. Incididunt laborum eiusmod enim pariatur exercitation ut. Laboris culpa fugiat consequat qui. Do aliquip incididunt et labore minim ex mollit. Occaecat id duis velit velit occaecat laborum ex officia. Veniam irure fugiat cillum dolore nostrud. Amet ea consectetur incididunt ut minim.\r\nAdipisicing quis consectetur consectetur adipisicing eiusmod excepteur ullamco nostrud sit tempor labore ad. Ea incididunt commodo occaecat qui ea veniam nulla sunt ex. Non aliquip incididunt aute cillum magna nisi. Aliqua culpa deserunt nulla ad fugiat. Enim non consectetur pariatur voluptate enim qui consectetur aliquip irure nisi. Minim eu commodo aliquip laboris elit sint quis.\r\nMagna commodo laborum fugiat commodo voluptate quis. Adipisicing laborum in anim exercitation proident. Magna est cillum voluptate consectetur reprehenderit. Velit veniam laboris fugiat anim est esse aliquip. Cupidatat aliquip excepteur voluptate laboris.\r\nOfficia anim laborum anim velit adipisicing et. Velit magna quis culpa ipsum. Id et culpa eu dolore ullamco aute ut cupidatat pariatur commodo anim nostrud qui sit. Qui nulla veniam quis elit sint et exercitation exercitation aute cupidatat nostrud. Aliquip fugiat aute nostrud magna amet dolore adipisicing elit ipsum sint labore nisi.\r\nPariatur aute voluptate veniam eu eu id tempor exercitation ipsum eu cillum velit. Elit fugiat commodo officia in. Laboris do sunt excepteur ut deserunt aliquip. Adipisicing commodo ipsum quis proident voluptate reprehenderit sint ea magna ipsum anim est occaecat. Aliqua do eu elit aute dolor culpa nisi cupidatat incididunt. Id eu veniam adipisicing veniam qui sint velit voluptate. Laborum amet ea minim minim nulla sint sit labore dolor pariatur.\r\n", + "address": "4 Newton Street", + "city": "Harviell", + "state": "Pennsylvania", + "zip": 25300, + "country": "El Salvador", + "email": "moorebass@scentric.com", + "phone": "(913) 577-3866", + "color": "rgb(103,233,105)" + }, + { + "index": 394, + "name": "Walker Workman", + "first": "Howard", + "last": "Fleming", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/andrey_maxim/73.jpg", + "expanded": false, + "guid": "ec870357-2a02-4dff-b9c5-a4574e39ddcf", + "integer": 73, + "date": "Sun Jun 02 1974 13:38:40 GMT-0700 (PDT)", + "shortText": "officia dolore consequat", + "mediumText": "Aliqua ex nisi adipisicing tempor elit pariatur voluptate cillum dolore duis excepteur commodo do eiusmod. Exercitation nulla sint officia voluptate ut ipsum esse fugiat quis sint reprehenderit irure. Voluptate voluptate deserunt sit aliqua Lorem et labore. Magna qui eu nisi do cupidatat eu ea. Nulla sint eiusmod in ipsum est dolor qui.", + "longText": "Magna elit sunt qui ut dolor et. Enim adipisicing aliquip dolore ex consectetur dolor ut. Ex culpa fugiat id sunt sunt incididunt Lorem adipisicing nostrud magna dolore mollit enim est.\r\nPariatur ea magna anim sit incididunt veniam occaecat pariatur ullamco nulla. Sit commodo cupidatat elit commodo eu do officia nostrud. Eu consequat ipsum amet eiusmod elit commodo ut enim ex.\r\nIrure ipsum ipsum ullamco magna deserunt pariatur in consectetur. Mollit nisi mollit reprehenderit et laboris in esse irure minim. Ipsum culpa nostrud nisi fugiat sint culpa consequat incididunt nostrud culpa occaecat aliquip sit. Commodo cupidatat nulla qui cupidatat sint anim. Ad quis cillum magna adipisicing ad qui ex fugiat velit velit amet aliqua. Ea laboris laborum dolor amet sunt. Fugiat sit dolor ipsum ut.\r\nElit labore fugiat commodo reprehenderit nostrud culpa qui cupidatat deserunt eiusmod tempor est excepteur laboris. Aliqua aliqua elit occaecat magna ullamco nisi commodo enim. Reprehenderit et mollit mollit aliqua ex tempor sint minim magna eu. Voluptate ullamco voluptate excepteur ullamco ea consectetur non do. Officia deserunt duis ullamco Lorem officia esse. Consequat et quis cupidatat officia.\r\nDo esse reprehenderit incididunt quis voluptate sunt eu amet ad incididunt. Do occaecat amet in culpa anim id. Fugiat est fugiat Lorem enim adipisicing do qui officia. Proident elit labore consectetur Lorem eiusmod cupidatat mollit sit fugiat magna ex commodo minim. Ea nisi amet non enim culpa veniam aliqua ad labore.\r\n", + "address": "3 Exeter Street", + "city": "Wakulla", + "state": "New Hampshire", + "zip": 85378, + "country": "Oman", + "email": "howardfleming@scentric.com", + "phone": "(844) 545-2412", + "color": "rgb(126,110,68)" + }, + { + "index": 395, + "name": "Harper Chase", + "first": "Glenda", + "last": "Burns", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/muringa/73.jpg", + "expanded": false, + "guid": "d6866e9e-6cc1-4021-9e8e-c0657bd2f64c", + "integer": 36, + "date": "Sun Dec 12 1971 00:30:23 GMT-0800 (PST)", + "shortText": "ad aliquip consequat", + "mediumText": "Consectetur exercitation commodo ut labore incididunt velit laborum labore velit aute. Aliquip velit id enim sit. Nostrud magna est veniam excepteur commodo irure. Sunt ex sint irure nisi anim. Nisi dolore veniam tempor cupidatat irure incididunt culpa veniam sunt aute.", + "longText": "Duis enim ex officia reprehenderit consectetur esse. Adipisicing ea velit labore officia sint nisi do anim ex incididunt irure. Laborum amet fugiat laboris proident. Ex duis dolor dolor nisi Lorem do qui sunt incididunt exercitation nulla do deserunt pariatur.\r\nOfficia et dolor incididunt elit non quis. Deserunt ad esse enim tempor aliquip officia excepteur magna esse deserunt. Excepteur dolore veniam commodo non quis. Do Lorem ex est exercitation sit consectetur exercitation duis duis laborum. Aliquip elit ea nulla elit quis deserunt eu adipisicing id pariatur non occaecat. Irure dolore nulla nisi irure qui tempor quis ut minim.\r\nAnim officia et laboris culpa velit consectetur do voluptate ad voluptate Lorem. Nostrud fugiat ut ad amet est elit duis consequat cupidatat. Ad minim cillum dolore incididunt sunt enim deserunt. Dolor aliqua qui nulla aliquip enim magna incididunt. Minim enim occaecat dolor in aliqua. Laborum eu quis culpa in voluptate commodo culpa sint dolor Lorem duis elit. Incididunt sint et enim sit laboris pariatur laboris eu sit eu anim.\r\nEa elit minim tempor ut id ut ea et tempor aute magna eiusmod adipisicing exercitation. Culpa elit esse tempor proident sint duis consequat. Sint ullamco ex veniam aliquip aute labore anim adipisicing est magna velit nisi. Ipsum dolore labore proident id irure qui velit anim. Incididunt Lorem nisi ut amet in enim laboris labore proident fugiat officia irure. Occaecat dolor Lorem qui nulla. Aliqua officia ipsum et cillum aliquip adipisicing ex.\r\nEu incididunt deserunt cupidatat ex laborum in voluptate excepteur ea consectetur est incididunt. Occaecat qui aliqua consequat nostrud in ex labore dolor eiusmod. Enim duis eu laboris consectetur culpa aliquip commodo. Elit ullamco reprehenderit consequat proident et ex veniam ea consectetur aute minim. Voluptate ut in laborum exercitation laboris irure culpa esse deserunt adipisicing sunt.\r\n", + "address": "4 Hinsdale Street", + "city": "Belva", + "state": "North Dakota", + "zip": 11729, + "country": "Belgium", + "email": "glendaburns@scentric.com", + "phone": "(856) 471-3316", + "color": "rgb(157,180,79)" + }, + { + "index": 396, + "name": "Lynch Dillard", + "first": "Marta", + "last": "Trujillo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ahmedelgabri/73.jpg", + "expanded": false, + "guid": "66702f6f-a19b-4e41-8b5c-0df08d432b1b", + "integer": 55, + "date": "Mon Nov 21 1983 17:47:19 GMT-0800 (PST)", + "shortText": "culpa qui ullamco", + "mediumText": "Lorem dolor esse veniam minim culpa aliquip dolore occaecat Lorem quis.", + "longText": "Ea est sunt et duis dolor irure voluptate. Nostrud esse do irure exercitation officia magna proident irure deserunt magna. Dolore minim exercitation qui exercitation proident. Excepteur ea occaecat irure qui ea et duis minim voluptate id culpa enim ad dolor. Enim anim aliquip sint aliqua veniam Lorem id.\r\n", + "address": "3 Eckford Street", + "city": "Savage", + "state": "Northern Mariana Islands", + "zip": 46157, + "country": "Kyrgyzstan", + "email": "martatrujillo@scentric.com", + "phone": "(867) 559-3000", + "color": "rgb(184,176,151)" + }, + { + "index": 397, + "name": "Blake Wilkins", + "first": "Lara", + "last": "Gentry", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/bobbytwoshoes/73.jpg", + "expanded": false, + "guid": "e4e03f54-413f-4638-be7c-12175f24c458", + "integer": 5, + "date": "Sun Oct 10 1971 04:19:14 GMT-0700 (PDT)", + "shortText": "ex", + "mediumText": "Ullamco ut ex tempor est irure proident.", + "longText": "Labore id reprehenderit elit velit adipisicing amet voluptate exercitation adipisicing. Eiusmod anim officia sint Lorem ullamco cupidatat. Consectetur culpa nostrud elit nisi aute velit amet Lorem esse laborum sint exercitation.\r\nNon labore proident adipisicing duis veniam. Mollit ad irure Lorem minim ullamco elit aliqua occaecat excepteur. Veniam elit eiusmod quis minim enim ad Lorem est ut nulla voluptate amet Lorem ad. In dolore irure magna elit officia. Non velit anim Lorem eiusmod fugiat nostrud in reprehenderit officia commodo culpa ea sunt. Enim ut exercitation deserunt laborum laboris fugiat pariatur incididunt officia deserunt consectetur Lorem. Dolor nisi culpa dolor anim id laborum aute qui elit est quis occaecat esse id.\r\nEu ullamco aliquip enim qui cillum non anim reprehenderit. Nulla et tempor enim nulla consectetur. Reprehenderit nulla velit sunt consectetur exercitation consequat cupidatat. Anim dolor qui enim ex do labore dolore commodo voluptate ut laborum. Ut aute sint adipisicing reprehenderit est aliquip laborum esse dolore commodo aute excepteur fugiat est. Ex cupidatat commodo sit mollit veniam sint ex magna adipisicing occaecat laborum occaecat.\r\n", + "address": "4 Schenck Place", + "city": "Greenwich", + "state": "South Dakota", + "zip": 61210, + "country": "Swaziland", + "email": "laragentry@scentric.com", + "phone": "(909) 447-3849", + "color": "rgb(209,112,163)" + }, + { + "index": 398, + "name": "Lawson Peck", + "first": "Mullen", + "last": "Keller", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/milovanovicdu/73.jpg", + "expanded": false, + "guid": "27329629-6fcc-48e1-a7b9-e3158f75ea79", + "integer": 2, + "date": "Wed Jul 31 1974 10:57:47 GMT-0700 (PDT)", + "shortText": "ut", + "mediumText": "Irure ut velit ea nisi enim est fugiat magna non duis pariatur. Sint voluptate irure incididunt incididunt exercitation id magna culpa.", + "longText": "Ex labore ut aliquip magna. Laborum consectetur anim voluptate commodo Lorem nisi veniam incididunt dolor aliqua irure fugiat nostrud. Amet aliquip elit in sint. Proident voluptate nisi nulla culpa tempor. Fugiat dolor minim elit dolor elit ex incididunt Lorem non eu. Ad ex laboris ut magna eu sunt veniam excepteur velit officia ipsum reprehenderit commodo.\r\nEu irure ullamco aute qui ex mollit. Officia anim proident non officia. Aute in voluptate mollit eiusmod voluptate. Culpa esse deserunt nostrud culpa consectetur mollit. Minim fugiat amet cillum anim eu velit qui non et duis ut.\r\nDo labore enim tempor in ipsum dolore veniam consequat aliqua deserunt excepteur duis. Sunt ad elit in aliquip officia veniam tempor ad velit consectetur Lorem. Voluptate sint commodo ullamco nisi sunt minim enim labore labore. In sit laboris officia exercitation labore minim ex velit ullamco. Adipisicing ex consectetur mollit occaecat id. Officia minim dolore qui do magna exercitation. Nisi in ipsum aliqua adipisicing ad sit ad anim dolore ipsum officia elit.\r\n", + "address": "2 Rugby Road", + "city": "Kirk", + "state": "Alaska", + "zip": 73560, + "country": "Slovenia", + "email": "mullenkeller@scentric.com", + "phone": "(964) 598-3707", + "color": "rgb(210,88,176)" + }, + { + "index": 399, + "name": "Rosario Camacho", + "first": "Trina", + "last": "Perez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imughal7/73.jpg", + "expanded": false, + "guid": "2f75ea28-cf05-4abd-8600-a3f69265392c", + "integer": 41, + "date": "Mon Jul 19 1993 06:30:42 GMT-0700 (PDT)", + "shortText": "est fugiat tempor", + "mediumText": "Irure cupidatat et officia velit ut ipsum exercitation. Aliquip pariatur enim enim duis labore duis. Excepteur Lorem eu in id exercitation eu enim dolore occaecat deserunt consequat. Aute commodo amet incididunt cillum ipsum adipisicing in. Aute sunt consequat fugiat cillum qui velit deserunt nisi nisi cupidatat.", + "longText": "Minim elit nisi enim pariatur tempor consequat et voluptate. Proident officia ipsum aliqua esse deserunt ex id nisi. Labore reprehenderit sint fugiat duis Lorem consectetur enim labore nostrud sit commodo id anim sint.\r\nEa labore et consectetur in aliqua consectetur exercitation labore dolor laborum id labore irure irure. Commodo elit ex culpa amet ex velit eiusmod consequat. Nostrud consequat id excepteur consequat et ad labore. Tempor sint consequat exercitation consectetur ex ad laboris et. Laboris fugiat consequat minim commodo veniam cillum nostrud dolore voluptate minim aute.\r\nAdipisicing commodo aliquip occaecat incididunt consequat aliqua dolor in nulla aliquip veniam aliqua aute. Incididunt ex ut minim aute mollit fugiat proident voluptate Lorem minim. Ipsum eiusmod ullamco consectetur sint in. Qui magna occaecat cillum eu et consectetur. Cillum duis occaecat cillum ipsum aliquip fugiat laborum et eiusmod consectetur id deserunt. Minim minim qui ea cillum sit quis duis non anim.\r\nVelit mollit aute ex exercitation sit consequat incididunt voluptate. Non eu laboris nulla cillum anim eu minim elit eu occaecat culpa reprehenderit consectetur. Tempor cupidatat est aute cupidatat laboris culpa qui aute veniam cillum ut incididunt esse dolor. Laboris irure ex ad ut labore dolore irure mollit irure aliquip eu tempor proident Lorem. Lorem sit eiusmod do Lorem consequat quis id minim cupidatat ex sunt magna. Laboris tempor adipisicing adipisicing et sint cupidatat ad dolor exercitation et qui occaecat laborum et.\r\nDuis incididunt anim proident dolore tempor voluptate nulla sunt aliquip voluptate dolor enim. Laborum anim sunt anim adipisicing exercitation commodo eu esse. Proident labore nostrud et excepteur sit eiusmod exercitation culpa eu in id adipisicing voluptate. Pariatur officia aute mollit amet et nisi aute sit. Aute eiusmod consectetur excepteur magna quis enim sint velit velit excepteur fugiat. Non Lorem nostrud eu voluptate anim reprehenderit et aliquip nostrud ipsum Lorem. Magna fugiat laborum culpa anim sunt laboris consectetur culpa quis pariatur minim minim minim.\r\n", + "address": "4 Ridge Boulevard", + "city": "Crown", + "state": "Louisiana", + "zip": 12286, + "country": "Mali", + "email": "trinaperez@scentric.com", + "phone": "(848) 593-3474", + "color": "rgb(121,115,73)" + }, + { + "index": 400, + "name": "Savannah Nieves", + "first": "Sutton", + "last": "Oneill", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/creative_px/73.jpg", + "expanded": false, + "guid": "2a23bf3c-f5ec-4e78-90bc-ace28f8f2bab", + "integer": 2, + "date": "Thu Apr 23 1992 13:29:05 GMT-0700 (PDT)", + "shortText": "excepteur", + "mediumText": "Et aute minim non exercitation ut in aliqua officia consequat.", + "longText": "Elit officia excepteur aliqua deserunt est. Exercitation magna culpa ut aute. Laborum Lorem aliquip labore enim velit in. Dolore in do do dolor do do qui.\r\nLabore sunt laborum id sit esse pariatur amet ea. Nostrud irure excepteur Lorem ea duis adipisicing est ea voluptate. Ea consectetur dolor duis anim. Non laborum incididunt aliquip mollit pariatur. Amet laborum esse enim velit aute sit fugiat sit laborum commodo. In nulla veniam adipisicing et velit dolore culpa mollit ad dolore dolor commodo proident dolore.\r\nPariatur nisi eu sint ullamco proident elit dolore officia quis mollit nisi. Do officia cillum minim occaecat duis. Exercitation adipisicing reprehenderit esse aliqua non elit eiusmod deserunt qui.\r\nMinim culpa aliqua sit id ex. Qui do ea in sint cillum Lorem non. Consequat Lorem sunt est nulla Lorem exercitation culpa esse ex. Veniam dolor in Lorem cillum amet esse eiusmod minim voluptate aute ipsum ex ad. Elit magna laboris id occaecat aute sit tempor fugiat velit incididunt consectetur minim. Sint est dolore occaecat aliquip in sint amet eiusmod esse exercitation quis duis dolore adipisicing.\r\n", + "address": "2 Ridgewood Place", + "city": "Ventress", + "state": "Missouri", + "zip": 37064, + "country": "Cyprus", + "email": "suttononeill@scentric.com", + "phone": "(957) 407-3116", + "color": "rgb(163,237,93)" + }, + { + "index": 401, + "name": "Faye Graves", + "first": "Mildred", + "last": "Branch", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gabrielizalo/73.jpg", + "expanded": false, + "guid": "12b69605-f47d-4b63-b96d-48e2e24c1031", + "integer": 82, + "date": "Wed Feb 04 1981 06:07:39 GMT-0800 (PST)", + "shortText": "tempor occaecat ullamco", + "mediumText": "Velit aute non nisi elit laborum. Id nisi reprehenderit culpa incididunt eu labore est excepteur aute laborum officia enim. Qui proident deserunt voluptate commodo elit id irure voluptate. Consequat quis dolor id ea tempor ipsum culpa.", + "longText": "Velit sit eu nulla sunt nulla veniam velit mollit nostrud reprehenderit cillum velit. Nostrud non deserunt culpa Lorem quis. Sit elit ex tempor amet officia cupidatat. Dolore laboris et est consectetur elit dolor. Exercitation consectetur qui pariatur laborum pariatur aliquip irure veniam dolore laboris.\r\nLabore incididunt cupidatat elit nostrud ipsum aliquip ipsum commodo incididunt reprehenderit exercitation ipsum. Voluptate et ipsum qui nisi irure esse cillum ut. Tempor culpa et excepteur incididunt adipisicing laboris aliqua mollit minim incididunt. Dolor dolor fugiat anim culpa culpa id reprehenderit voluptate laboris occaecat. Esse Lorem sit cillum non consequat mollit minim non tempor aliquip culpa. Pariatur velit amet ad reprehenderit esse cillum veniam in ad. Nisi dolore irure dolore deserunt.\r\nNon amet elit pariatur nisi id dolor in adipisicing nisi elit sit. Adipisicing cillum sint tempor deserunt aute exercitation do pariatur. Nulla et eiusmod do dolore elit ullamco magna mollit. Irure deserunt consectetur Lorem ex elit consequat consequat laboris.\r\nDuis aute sint nisi tempor in ipsum laboris. Cillum magna exercitation mollit eu amet proident reprehenderit cupidatat irure. Ea minim dolor magna id aliquip. Ex commodo proident adipisicing sint velit non eiusmod sit in exercitation non laboris. Consequat nulla laborum sint qui dolor sint amet non. Qui sint dolore occaecat cillum proident ullamco ipsum incididunt duis sit duis fugiat consequat.\r\nQuis occaecat nulla officia quis nulla sunt reprehenderit nostrud. Cillum anim duis irure do nulla id. Sunt eiusmod quis dolor aliqua occaecat non. Sit velit elit sit laborum et cupidatat est veniam aliqua enim. In dolore veniam amet duis incididunt. Elit est quis minim nisi consectetur consequat sunt enim culpa eiusmod ea elit cupidatat. Officia reprehenderit in do consequat.\r\n", + "address": "4 Farragut Place", + "city": "Grayhawk", + "state": "Kentucky", + "zip": 53142, + "country": "Georgia", + "email": "mildredbranch@scentric.com", + "phone": "(888) 489-2923", + "color": "rgb(206,181,98)" + }, + { + "index": 402, + "name": "England Cameron", + "first": "Heath", + "last": "Roach", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/xtr1mal2/73.jpg", + "expanded": false, + "guid": "7eecdcf4-46f8-401c-aff2-9c22abf751ae", + "integer": 92, + "date": "Mon Jul 02 1990 04:55:35 GMT-0700 (PDT)", + "shortText": "velit", + "mediumText": "Cillum minim qui ex officia magna velit sunt nisi. Non reprehenderit sint pariatur minim elit commodo reprehenderit proident elit occaecat non duis voluptate. Aliquip ullamco ut duis officia do magna minim cupidatat in. Ex irure officia occaecat laboris tempor velit reprehenderit quis anim ipsum sit.", + "longText": "Cupidatat excepteur officia veniam id tempor sit amet. Deserunt mollit aliquip labore cupidatat sint laboris velit voluptate aute consectetur exercitation sit sint. Labore et pariatur laboris quis labore. Irure consectetur labore sit et. Aute consectetur veniam veniam id nulla pariatur deserunt. Deserunt nulla proident id nulla.\r\nUt nostrud tempor et laborum laboris aliquip ullamco exercitation exercitation elit culpa non culpa in. Cupidatat consectetur exercitation ea excepteur culpa sint eiusmod culpa reprehenderit Lorem fugiat laboris. Veniam sint mollit dolor consequat sunt officia. Irure ipsum culpa et non. Aliqua nisi amet Lorem nisi enim commodo aliquip occaecat duis aute eu cupidatat ut. Pariatur Lorem tempor consequat in irure pariatur mollit sunt reprehenderit dolore officia.\r\n", + "address": "2 Maujer Street", + "city": "Morningside", + "state": "American Samoa", + "zip": 87621, + "country": "Djibouti", + "email": "heathroach@scentric.com", + "phone": "(947) 435-3218", + "color": "rgb(247,200,211)" + }, + { + "index": 403, + "name": "Michele Reynolds", + "first": "Mayo", + "last": "Gray", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eugenerifan/73.jpg", + "expanded": false, + "guid": "826af78f-bd69-4f81-a45e-1a38d5afb1a8", + "integer": 54, + "date": "Mon Nov 02 2009 06:31:46 GMT-0800 (PST)", + "shortText": "exercitation adipisicing et", + "mediumText": "Aliqua ex amet anim proident nostrud et id Lorem aliqua. Quis reprehenderit veniam cupidatat fugiat.", + "longText": "Ipsum ullamco commodo aliqua non consectetur culpa in. Et nulla nulla adipisicing sit sunt irure ea commodo ex cupidatat enim excepteur. Aliqua eu dolore commodo culpa est nostrud velit exercitation irure. Ad est fugiat duis ipsum non Lorem deserunt esse.\r\nAliquip reprehenderit id voluptate ullamco anim sunt aliquip veniam proident esse magna officia eiusmod. Nostrud nostrud cillum sunt fugiat incididunt irure pariatur veniam incididunt irure Lorem irure velit velit. Eiusmod occaecat proident culpa Lorem labore culpa ad. Eu dolor ad cupidatat sunt fugiat sint. Ea sunt quis amet nulla labore dolor occaecat consequat ea nulla. Sint magna qui et veniam cillum.\r\nOccaecat sunt aliqua adipisicing non consequat in ipsum esse sunt elit reprehenderit. Enim adipisicing cupidatat voluptate deserunt aliqua reprehenderit aliquip excepteur dolore non Lorem est do. Dolor ipsum non ex id tempor tempor mollit. Consequat cupidatat ad elit nulla ex nostrud nisi dolor nulla cillum labore dolor dolor.\r\nFugiat exercitation nulla irure aliqua id. Laboris reprehenderit cillum quis cillum Lorem exercitation Lorem ipsum deserunt. Velit sint aute adipisicing aliquip voluptate et culpa ullamco aliqua.\r\nNon cillum magna elit sunt aliqua ea. Veniam eu esse in est proident non reprehenderit nulla enim. Nisi non sunt et laborum minim non qui nisi nisi elit excepteur nisi. Ex excepteur consequat mollit sunt proident velit et deserunt sint excepteur et. Ullamco qui ipsum labore culpa aliquip. Qui pariatur veniam non velit qui nisi non veniam incididunt Lorem laboris occaecat. Ut duis qui labore anim amet dolor.\r\n", + "address": "4 Eagle Street", + "city": "Allentown", + "state": "Minnesota", + "zip": 44111, + "country": "Tokelau", + "email": "mayogray@scentric.com", + "phone": "(992) 459-3031", + "color": "rgb(215,198,143)" + }, + { + "index": 404, + "name": "Dorthy Simon", + "first": "Gena", + "last": "Calderon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/imcoding/73.jpg", + "expanded": false, + "guid": "6afa8867-330b-419e-b186-df524f163ef0", + "integer": 1, + "date": "Mon Jun 09 2014 19:43:18 GMT-0700 (PDT)", + "shortText": "esse", + "mediumText": "Incididunt ea id eu id mollit eu. Culpa fugiat dolor minim mollit.", + "longText": "Dolor exercitation dolor minim cillum anim ut ex elit sunt laborum voluptate est ea non. Sunt tempor deserunt aute ut aliqua. Nostrud eu ullamco in est eu ea mollit qui. Ad mollit fugiat quis ex elit. Proident duis cupidatat ex amet sint dolore laboris elit. Excepteur cupidatat minim id consequat dolor.\r\nTempor ipsum eu commodo ipsum ut. Elit elit eiusmod fugiat ullamco labore. Mollit est ea nulla ea cupidatat excepteur.\r\nDeserunt duis ipsum adipisicing in laboris sit. Esse incididunt in aliqua non anim esse consectetur. Exercitation dolor deserunt eiusmod incididunt et ea culpa. Mollit anim non mollit adipisicing est. Pariatur aliqua dolore ullamco aliqua.\r\nEt id laboris sit adipisicing adipisicing eu occaecat et quis sint. Proident voluptate ad et velit. Quis aliqua elit deserunt consectetur sunt. Incididunt sit qui ex excepteur et culpa et. Non occaecat ea amet commodo Lorem. Minim mollit eu eiusmod id ipsum esse ut mollit do do.\r\n", + "address": "3 Vermont Court", + "city": "Williston", + "state": "Hawaii", + "zip": 55240, + "country": "San Marino", + "email": "genacalderon@scentric.com", + "phone": "(888) 431-2447", + "color": "rgb(169,113,77)" + }, + { + "index": 405, + "name": "Estella Bird", + "first": "Candice", + "last": "Grant", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/madhan4uu/73.jpg", + "expanded": false, + "guid": "acee6de8-e101-4121-92a2-004058e99752", + "integer": 82, + "date": "Sat Sep 14 2002 06:24:28 GMT-0700 (PDT)", + "shortText": "id pariatur in tempor", + "mediumText": "Reprehenderit nulla consectetur minim minim ut consequat id tempor anim labore. Occaecat reprehenderit in consequat velit occaecat Lorem.", + "longText": "Nulla tempor et esse nostrud minim aliqua mollit ullamco elit consectetur cupidatat. Non non aliqua labore aute Lorem magna excepteur tempor. Velit exercitation veniam elit proident do nostrud et adipisicing et consectetur est dolore. Quis minim cupidatat occaecat Lorem aute labore ea et do nisi nisi consectetur. Do aute commodo labore elit laboris. In ipsum quis voluptate nulla est officia eu.\r\n", + "address": "4 Wythe Avenue", + "city": "Rivera", + "state": "Alabama", + "zip": 33941, + "country": "Vanuatu", + "email": "candicegrant@scentric.com", + "phone": "(991) 536-3705", + "color": "rgb(157,106,60)" + }, + { + "index": 406, + "name": "Clarissa Bray", + "first": "Rojas", + "last": "Robles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/tirsope/73.jpg", + "expanded": false, + "guid": "bfc3f083-ca88-443f-8639-1467b45a7b5e", + "integer": 54, + "date": "Fri Jul 03 1970 19:21:58 GMT-0700 (PDT)", + "shortText": "consectetur duis ullamco est", + "mediumText": "Excepteur qui sint nulla pariatur reprehenderit ex fugiat anim ut. Id voluptate quis incididunt sint sint aliqua aliquip excepteur sit officia ad dolore. Aute eu elit tempor laborum eu voluptate ipsum duis sunt. Reprehenderit fugiat ex Lorem aute quis nostrud commodo Lorem.", + "longText": "Labore ad nostrud ad eu dolor pariatur sit exercitation tempor voluptate do eu deserunt. Consectetur culpa culpa veniam nisi eu elit minim est est. Mollit cillum sit pariatur quis. Cupidatat ex reprehenderit ad eu ad amet id esse aliqua. Adipisicing sint adipisicing ex consectetur magna quis sint culpa irure pariatur laboris exercitation ea ex. Elit fugiat proident dolor amet minim cillum et sint. Non nostrud nulla ipsum eu.\r\n", + "address": "4 Clifton Place", + "city": "Walton", + "state": "North Carolina", + "zip": 22683, + "country": "Somalia", + "email": "rojasrobles@scentric.com", + "phone": "(829) 530-3596", + "color": "rgb(58,225,142)" + }, + { + "index": 407, + "name": "Jody Schultz", + "first": "Baird", + "last": "Robinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lorenzosinisi/73.jpg", + "expanded": false, + "guid": "7a26e07a-6210-47eb-8a15-d60b73f0b0ba", + "integer": 34, + "date": "Sat Oct 25 1980 07:30:41 GMT-0700 (PDT)", + "shortText": "dolor qui", + "mediumText": "Aliqua sunt magna esse aute veniam occaecat tempor aliquip aliquip adipisicing aliquip qui deserunt incididunt.", + "longText": "Laboris dolore anim pariatur laboris in veniam irure. Lorem laborum nulla amet dolore cupidatat. Dolor est reprehenderit eiusmod labore excepteur duis mollit veniam ipsum sunt magna. Minim ut aliquip sunt ut irure voluptate voluptate duis ea. Exercitation occaecat mollit cupidatat sint dolore aliquip cupidatat aute minim exercitation ipsum occaecat. Consequat sit tempor esse ut culpa tempor duis irure duis quis. Enim incididunt sint consequat adipisicing veniam fugiat eiusmod.\r\nMinim mollit voluptate amet laborum fugiat eiusmod duis esse aute ea tempor. Ea minim ipsum sint pariatur amet voluptate ipsum. Excepteur magna pariatur esse culpa ipsum do. Ad deserunt excepteur aliquip cillum non eiusmod excepteur non labore ut nostrud fugiat. Minim sunt duis dolor ex ipsum reprehenderit. Magna incididunt reprehenderit tempor reprehenderit voluptate. Irure magna non minim quis sunt laboris ut velit velit eu consequat ad.\r\nEst et sunt consequat adipisicing elit non pariatur nostrud reprehenderit sit. Pariatur irure veniam veniam aliquip velit fugiat adipisicing. Consectetur ex mollit tempor cillum commodo ad magna dolore Lorem. Consectetur non esse ex esse irure consectetur ullamco proident eu ex ullamco. Ipsum ut tempor Lorem exercitation et voluptate nulla aute commodo. Adipisicing nostrud laboris quis elit minim.\r\nProident ea irure ex qui qui deserunt ex consequat est ex et elit consequat ut. Sunt deserunt tempor dolor esse reprehenderit excepteur est. Mollit eu occaecat anim voluptate.\r\n", + "address": "4 Montieth Street", + "city": "Lowell", + "state": "Connecticut", + "zip": 26397, + "country": "Maldives", + "email": "bairdrobinson@scentric.com", + "phone": "(881) 497-3274", + "color": "rgb(109,107,114)" + }, + { + "index": 408, + "name": "Sullivan Singleton", + "first": "Lupe", + "last": "Shields", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/celikovic/73.jpg", + "expanded": false, + "guid": "77364f56-0bf3-44a2-b715-57adc5471291", + "integer": 76, + "date": "Sun Jan 30 2000 05:01:36 GMT-0800 (PST)", + "shortText": "eiusmod enim officia", + "mediumText": "Deserunt sunt nulla ex reprehenderit nulla laborum fugiat consectetur aliqua est. Dolor qui laborum non anim in. Nisi amet commodo ullamco id excepteur ipsum veniam. Id quis nulla amet sint pariatur. Velit irure exercitation ut excepteur pariatur anim amet deserunt.", + "longText": "Ullamco labore cupidatat qui ad consequat consequat incididunt ullamco non. Id tempor est laboris non. Pariatur incididunt veniam irure Lorem aute. Eu reprehenderit do adipisicing adipisicing officia est consectetur laboris ut et et consequat duis ut.\r\nFugiat excepteur dolore culpa excepteur excepteur laboris Lorem non esse do ad. Duis consectetur aliqua voluptate veniam velit culpa incididunt incididunt ad anim. Quis id elit officia in ut.\r\nCupidatat dolor excepteur in mollit proident nostrud duis consequat in. Duis ullamco eu qui culpa. Nostrud culpa eu cupidatat occaecat. Eu reprehenderit ex nisi voluptate aliqua aute.\r\n", + "address": "4 Knickerbocker Avenue", + "city": "Alafaya", + "state": "South Carolina", + "zip": 66270, + "country": "Israel", + "email": "lupeshields@scentric.com", + "phone": "(945) 571-2010", + "color": "rgb(61,207,100)" + }, + { + "index": 409, + "name": "Bullock Harrell", + "first": "Morse", + "last": "Haynes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_kshitish/73.jpg", + "expanded": false, + "guid": "4176d27b-2ff0-44dd-9f1e-17963821d222", + "integer": 45, + "date": "Sat Feb 20 1999 17:08:27 GMT-0800 (PST)", + "shortText": "id nostrud fugiat irure culpa", + "mediumText": "Reprehenderit quis elit id amet laborum labore.", + "longText": "Nulla pariatur in cupidatat qui fugiat. Id incididunt ad aute consequat velit anim ad velit fugiat labore. Sunt magna do dolore ullamco Lorem Lorem enim et aliquip mollit esse id sunt. Nisi reprehenderit magna sit non officia Lorem eu fugiat. Elit non occaecat laborum in sunt consequat amet in non.\r\nSit ipsum mollit proident pariatur ea esse. Culpa magna aliqua ipsum excepteur ea esse laborum aliquip occaecat reprehenderit nostrud ex ea. Non esse exercitation nulla nostrud esse in sunt. Esse tempor aliqua sit veniam proident aute sint nulla do velit eiusmod. Qui duis occaecat tempor do aliquip irure cillum elit. Culpa Lorem et est nisi ut qui consequat exercitation magna nisi ad officia magna voluptate.\r\nTempor enim sit deserunt do nisi amet enim ipsum ea dolore eu. Proident excepteur aliqua sit sit qui duis ad nostrud adipisicing qui. Exercitation eiusmod velit aliquip officia voluptate anim laborum anim duis in enim qui consectetur. Ad est occaecat occaecat do ex esse ipsum ipsum Lorem veniam. Minim et et sunt non sit irure ad amet minim in et anim reprehenderit voluptate. Irure anim id nisi eiusmod eu eiusmod proident aute sunt. Consequat et aute ipsum ullamco do aute ad do Lorem ipsum in minim.\r\n", + "address": "4 Louise Terrace", + "city": "Blodgett", + "state": "Michigan", + "zip": 68968, + "country": "Reunion", + "email": "morsehaynes@scentric.com", + "phone": "(933) 478-3987", + "color": "rgb(127,118,223)" + }, + { + "index": 410, + "name": "Tammi Gordon", + "first": "Cooke", + "last": "Chandler", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/2fockus/73.jpg", + "expanded": false, + "guid": "c65f8ce1-2436-4ef2-9dc8-74fcc3a09b55", + "integer": 7, + "date": "Wed Jan 12 2005 21:50:12 GMT-0800 (PST)", + "shortText": "laboris est ipsum", + "mediumText": "Id dolore quis voluptate dolor ullamco enim velit cillum mollit dolor occaecat officia.", + "longText": "Laborum est amet mollit esse exercitation exercitation culpa commodo laborum irure enim commodo aliquip amet. Eu ea commodo occaecat cupidatat velit adipisicing reprehenderit amet. Reprehenderit in Lorem voluptate amet consectetur id incididunt reprehenderit in quis commodo est deserunt non. Pariatur pariatur in elit labore ut esse esse irure. Tempor mollit labore laborum voluptate ut. Ut occaecat mollit mollit cillum aliquip ipsum quis voluptate veniam. Cillum ad exercitation incididunt culpa ex in reprehenderit eiusmod deserunt voluptate.\r\nDo eiusmod esse aliquip eiusmod veniam deserunt do non dolor pariatur. Occaecat dolore minim irure proident laborum in nostrud sit. Ipsum deserunt duis reprehenderit duis occaecat fugiat voluptate aute aliquip consectetur consequat eiusmod. Qui laborum sunt incididunt id quis eu consectetur adipisicing mollit commodo eiusmod ipsum amet.\r\nCulpa anim officia ea occaecat occaecat occaecat occaecat mollit ipsum commodo dolore laboris. Ut anim velit amet laboris velit et aliqua aliquip incididunt consectetur culpa aliquip sint cupidatat. Enim eu adipisicing ut non. Amet duis nostrud est ad dolore non cupidatat veniam in. Voluptate nostrud sint aliqua voluptate culpa qui Lorem tempor.\r\nCommodo Lorem officia aute ut do mollit sint labore ex fugiat ullamco eu ut consectetur. Nulla nisi laborum anim et qui ullamco est dolore enim pariatur ex velit. Sit ullamco aliqua reprehenderit ea anim aliquip velit ut amet culpa eiusmod cillum. Aute eu sit aute proident Lorem dolor ea pariatur. Nisi pariatur consequat tempor occaecat consectetur deserunt irure magna adipisicing anim.\r\n", + "address": "3 Bergen Avenue", + "city": "Tolu", + "state": "Maine", + "zip": 88956, + "country": "Taiwan", + "email": "cookechandler@scentric.com", + "phone": "(975) 467-3292", + "color": "rgb(138,124,136)" + }, + { + "index": 411, + "name": "Jeanine Shaw", + "first": "Kasey", + "last": "Guerrero", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dnevozhai/73.jpg", + "expanded": false, + "guid": "be3a2408-087f-4d1d-ba80-0cffdd225a29", + "integer": 82, + "date": "Sun May 13 2001 01:14:30 GMT-0700 (PDT)", + "shortText": "sint", + "mediumText": "Non quis officia mollit labore velit est in Lorem culpa laboris voluptate et. Exercitation dolor non sit magna Lorem consequat.", + "longText": "Labore ea elit irure eiusmod deserunt aliqua. Aliqua velit esse voluptate sunt duis dolor ad in nostrud consectetur proident. Amet aliquip excepteur veniam commodo dolore do voluptate non. Lorem sunt duis anim officia sunt culpa laborum dolor occaecat.\r\nOfficia cillum est enim labore minim esse voluptate culpa consectetur Lorem aliquip. Quis incididunt esse dolor Lorem nulla nostrud aliquip duis aliqua laboris ut. Qui nisi proident voluptate nostrud anim. Sunt culpa est elit exercitation magna sint.\r\nEst mollit quis fugiat deserunt quis ullamco dolore enim exercitation occaecat nulla aute anim ullamco. Nisi consequat consequat consequat pariatur nostrud ad nostrud voluptate irure anim adipisicing ex in sint. Sunt culpa incididunt laborum laborum in adipisicing excepteur dolor tempor ad. Reprehenderit et mollit sint duis irure sit enim ex dolore est duis sunt incididunt. Eiusmod deserunt et est laborum est ipsum reprehenderit pariatur sunt duis. Sunt minim magna consectetur do occaecat. Duis ut tempor ullamco sunt dolor sit deserunt nisi amet.\r\n", + "address": "3 Conduit Boulevard", + "city": "Itmann", + "state": "Kansas", + "zip": 88741, + "country": "Cuba", + "email": "kaseyguerrero@scentric.com", + "phone": "(807) 548-3703", + "color": "rgb(77,230,193)" + }, + { + "index": 412, + "name": "Mcmahon Reeves", + "first": "Amanda", + "last": "Holloway", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sebasribas/73.jpg", + "expanded": false, + "guid": "d7d7d64e-e5c2-426c-b930-5d2e09aba244", + "integer": 32, + "date": "Thu May 08 1986 15:44:35 GMT-0700 (PDT)", + "shortText": "ut", + "mediumText": "Dolor aute Lorem irure occaecat. Dolore culpa eu ex id eu ad ad quis.", + "longText": "Nisi officia commodo consequat consequat aliquip. Eu non esse sit sit ipsum duis exercitation tempor. Voluptate officia eiusmod consequat sunt esse exercitation sint tempor nulla cillum ad Lorem qui ea. Id dolore elit ullamco ex ea commodo reprehenderit consequat. Anim dolore id ullamco laborum commodo dolore proident ex.\r\nEnim minim elit adipisicing occaecat occaecat veniam. Dolor culpa occaecat adipisicing proident ex id. Incididunt ullamco aute ex anim est ullamco magna nisi. Occaecat duis mollit id duis ipsum reprehenderit proident ut elit consectetur non deserunt eiusmod commodo.\r\nIrure do nulla consequat fugiat. Aliqua proident est voluptate consectetur culpa reprehenderit labore aute voluptate aliqua anim laborum. Voluptate consectetur commodo et enim enim sint eiusmod ut consectetur quis ipsum. Proident dolor ipsum duis cillum sunt.\r\nEsse culpa non esse consectetur mollit reprehenderit commodo velit esse nulla sit ad. Ex ad amet exercitation irure velit reprehenderit. Qui officia incididunt commodo minim fugiat exercitation ut magna amet voluptate ullamco.\r\nEnim occaecat consequat officia ad incididunt magna nulla ea laborum in consectetur laborum Lorem laboris. Deserunt esse cillum nulla anim. Ea laborum amet ex aliquip aliquip.\r\n", + "address": "3 Kingston Avenue", + "city": "Herlong", + "state": "Iowa", + "zip": 83835, + "country": "Turkey", + "email": "amandaholloway@scentric.com", + "phone": "(818) 520-3833", + "color": "rgb(198,210,85)" + }, + { + "index": 413, + "name": "Fox Patterson", + "first": "Samantha", + "last": "Frazier", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cepreygolubev/73.jpg", + "expanded": false, + "guid": "24f589f7-f6f9-4cab-9292-d754c16d9e45", + "integer": 63, + "date": "Fri Mar 16 2007 14:40:33 GMT-0700 (PDT)", + "shortText": "adipisicing velit Lorem", + "mediumText": "Anim amet dolore eiusmod sit ea officia duis aliqua ipsum ea consequat Lorem. Lorem sunt non amet ullamco elit. Aliquip reprehenderit pariatur mollit officia irure irure dolor incididunt voluptate qui sit duis esse amet. Tempor aliqua magna excepteur ad aliqua. In fugiat et aliqua irure excepteur dolore ipsum voluptate.", + "longText": "Consequat sit pariatur exercitation esse tempor adipisicing labore amet nulla elit elit fugiat. Laborum id in ad laborum officia nulla id cillum occaecat. Esse consectetur fugiat veniam ex minim eiusmod nostrud.\r\nExercitation officia velit officia occaecat voluptate ipsum ipsum et fugiat id enim laboris veniam. Commodo eu velit reprehenderit cupidatat. Do incididunt anim irure laborum ut voluptate est aute elit anim. Duis dolor dolore ex sit adipisicing ipsum voluptate voluptate anim. Non adipisicing aute nostrud anim magna id qui quis.\r\nEst sint irure eu pariatur elit id non cupidatat. Exercitation nisi ea commodo in nulla pariatur anim sunt adipisicing culpa esse sint. Quis et culpa ad anim cillum mollit excepteur. Cillum fugiat amet reprehenderit nisi ullamco. In ipsum commodo nisi ut reprehenderit. Deserunt eiusmod labore enim consequat.\r\nSit eu est irure excepteur ea esse magna minim adipisicing consequat ad ut esse. Laboris ut duis culpa nulla cillum sunt sint velit. Excepteur aute aliquip aute id adipisicing aute nulla ex incididunt consequat occaecat cillum. In consectetur aute veniam adipisicing et non dolor aliqua qui eiusmod ea aliquip elit. Ut fugiat aliqua nisi deserunt excepteur eu aute minim culpa aute mollit.\r\nQui et laborum deserunt proident dolore mollit fugiat labore. Dolore et ullamco laboris sit adipisicing do voluptate ullamco nulla amet eu voluptate. Mollit nisi officia nisi incididunt minim culpa commodo irure elit quis in.\r\n", + "address": "2 Roosevelt Court", + "city": "Mammoth", + "state": "Vermont", + "zip": 32042, + "country": "Solomon Islands", + "email": "samanthafrazier@scentric.com", + "phone": "(831) 425-2424", + "color": "rgb(239,229,222)" + }, + { + "index": 414, + "name": "Gloria Mcclain", + "first": "Marisol", + "last": "Marshall", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/iamphilipjoyce/73.jpg", + "expanded": false, + "guid": "0eb44c61-37e0-4715-9356-2231abd957a0", + "integer": 93, + "date": "Thu Nov 03 2005 21:43:21 GMT-0800 (PST)", + "shortText": "quis nisi ad ut commodo", + "mediumText": "Consequat tempor ad id sint consectetur officia aliqua excepteur duis. Voluptate cupidatat id est eu velit id voluptate aute sunt cillum elit minim nulla tempor.", + "longText": "Magna tempor elit reprehenderit aliquip laboris eu commodo et consectetur laborum officia magna. Veniam fugiat minim ut occaecat incididunt nisi. Sunt adipisicing quis aliqua sit in aliquip eiusmod laborum.\r\n", + "address": "2 Scott Avenue", + "city": "Emison", + "state": "Nebraska", + "zip": 11179, + "country": "Malawi", + "email": "marisolmarshall@scentric.com", + "phone": "(850) 423-2670", + "color": "rgb(179,133,229)" + }, + { + "index": 415, + "name": "Mcintyre Cochran", + "first": "Courtney", + "last": "Faulkner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/russell_baylis/73.jpg", + "expanded": false, + "guid": "07e7e322-9ff5-428a-a8d7-1d9e39a2bc7c", + "integer": 19, + "date": "Tue Aug 26 1975 19:13:06 GMT-0700 (PDT)", + "shortText": "ullamco fugiat", + "mediumText": "Ipsum veniam commodo consectetur occaecat. Aliqua velit dolor aliqua pariatur eu proident enim do eu mollit proident consectetur ipsum.", + "longText": "Sunt in veniam dolor anim cupidatat Lorem proident pariatur culpa. Pariatur ipsum consectetur nostrud officia dolor magna esse anim aliqua. Exercitation ex nisi enim irure veniam eiusmod et ipsum sint do. Consectetur eu minim minim aute aliquip consequat laborum exercitation commodo ex adipisicing culpa.\r\nNulla anim velit amet laboris. Commodo deserunt et duis consectetur consequat aute est pariatur consequat do tempor. Voluptate reprehenderit irure esse minim. Qui tempor id eiusmod id aliquip sit quis quis anim exercitation nulla. Laborum cillum veniam cupidatat incididunt adipisicing magna non laboris labore aliquip. Minim sit sint id ea in adipisicing et ex cillum reprehenderit. Pariatur tempor ea fugiat in irure.\r\nEa culpa proident aliquip officia sint irure Lorem consectetur. Ad reprehenderit adipisicing mollit nostrud ad amet ipsum aliqua dolore dolor eiusmod in. Lorem sit in aliquip esse aute sunt id nostrud ex culpa reprehenderit mollit. Qui laboris anim culpa id fugiat veniam. Reprehenderit exercitation sint pariatur mollit sint sunt. Velit excepteur consectetur proident non labore non aute incididunt duis. Excepteur amet occaecat occaecat commodo ut do velit tempor aliqua laborum.\r\nMinim veniam dolor id id culpa cillum enim sunt qui esse pariatur pariatur aliquip. Esse et ad dolor aliquip. Adipisicing fugiat do elit exercitation eiusmod fugiat ea ullamco mollit non. Minim occaecat ipsum dolore elit anim velit occaecat cupidatat. Irure irure reprehenderit fugiat ad mollit ullamco esse sit. Fugiat veniam reprehenderit amet ullamco nostrud irure ea reprehenderit.\r\n", + "address": "4 Nassau Street", + "city": "Bowden", + "state": "Florida", + "zip": 14172, + "country": "Samoa", + "email": "courtneyfaulkner@scentric.com", + "phone": "(861) 587-3003", + "color": "rgb(87,119,212)" + }, + { + "index": 416, + "name": "Sheppard Pacheco", + "first": "Shepard", + "last": "Hopper", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kijanmaharjan/73.jpg", + "expanded": false, + "guid": "25a22dc2-f676-4e38-b172-8b3d6598cafd", + "integer": 98, + "date": "Thu Jun 19 2003 12:30:27 GMT-0700 (PDT)", + "shortText": "incididunt ad ad nulla elit", + "mediumText": "Consectetur magna dolore consequat consectetur officia labore culpa aute deserunt officia laboris exercitation. Duis labore consectetur ex id id ullamco voluptate commodo ut ea cillum.", + "longText": "Ea do adipisicing enim mollit cillum officia sunt amet exercitation esse. Incididunt deserunt dolore deserunt sunt ut tempor. Quis magna consectetur commodo nisi eiusmod cupidatat ea velit. Consectetur Lorem cillum laborum velit enim esse et officia ipsum consectetur sit.\r\nDo cillum irure aliqua nostrud elit proident sunt deserunt pariatur sunt ad. Esse adipisicing fugiat sunt irure duis eu non officia eiusmod fugiat. Quis ut officia commodo elit ad veniam ut eu amet do. Mollit eiusmod Lorem adipisicing officia cillum culpa deserunt ullamco reprehenderit eu labore voluptate. Irure reprehenderit consequat tempor laboris exercitation aliquip velit nulla. Tempor quis adipisicing et esse. Lorem ea nulla consequat culpa aliquip tempor amet.\r\n", + "address": "4 Buffalo Avenue", + "city": "Tampico", + "state": "New Jersey", + "zip": 90074, + "country": "United Kingdom", + "email": "shepardhopper@scentric.com", + "phone": "(985) 565-3301", + "color": "rgb(103,234,218)" + }, + { + "index": 417, + "name": "Hobbs Chapman", + "first": "Byers", + "last": "Craig", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/73.jpg", + "expanded": false, + "guid": "355ebabb-a1d0-4ed7-adfb-e8a0515d4ee5", + "integer": 3, + "date": "Fri Mar 26 2010 15:05:55 GMT-0700 (PDT)", + "shortText": "cupidatat", + "mediumText": "Aute sit fugiat nostrud enim proident ad quis reprehenderit irure. Enim esse ex sunt dolore id occaecat proident fugiat cillum non ex dolore.", + "longText": "Nisi excepteur cillum incididunt ipsum ullamco esse do sit duis deserunt pariatur. Eiusmod commodo veniam excepteur deserunt veniam aliquip aute nisi dolore ut do cupidatat. Aliqua tempor occaecat amet sit do laboris ea dolor mollit duis laborum dolore aute deserunt. Nulla non duis sunt do eiusmod sunt labore dolore excepteur cillum reprehenderit veniam elit reprehenderit. Occaecat Lorem incididunt amet ad ullamco minim ullamco enim nostrud aute occaecat duis Lorem. Ea labore in nostrud pariatur ea fugiat deserunt. Laborum eu enim officia amet sint et qui in id.\r\nFugiat minim adipisicing anim duis eiusmod id deserunt ea minim esse est nostrud laboris cupidatat. Ex ut reprehenderit commodo veniam. Aliquip duis incididunt proident ut sit aliquip occaecat commodo reprehenderit qui. Enim enim dolor non quis magna esse aliqua labore labore officia ut ut anim. Ex dolor velit aliqua pariatur.\r\nDolor enim ad non dolor do qui nulla exercitation eiusmod cillum elit minim non. Esse sint voluptate ullamco et sit esse. Ut ullamco non eiusmod anim quis anim ullamco irure amet. Amet ut pariatur ad mollit eu occaecat aliqua adipisicing. Dolore et sint veniam qui ad veniam fugiat aliqua dolor. Deserunt eiusmod et reprehenderit consequat enim quis deserunt dolor.\r\nCillum amet aliquip laborum eiusmod. Consequat commodo aliquip velit quis fugiat velit. Lorem nulla nostrud deserunt aliquip Lorem sunt et. Ea sunt duis officia Lorem elit do commodo. Tempor nostrud incididunt sunt nisi fugiat ex eu. Commodo nisi do duis non culpa consectetur ut exercitation ad in. Laborum laborum tempor sit laborum labore reprehenderit voluptate.\r\n", + "address": "2 Aberdeen Street", + "city": "Maplewood", + "state": "Wisconsin", + "zip": 44000, + "country": "French Guiana", + "email": "byerscraig@scentric.com", + "phone": "(830) 519-3986", + "color": "rgb(189,244,220)" + }, + { + "index": 418, + "name": "Lisa Yates", + "first": "Lea", + "last": "Underwood", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/noufalibrahim/73.jpg", + "expanded": false, + "guid": "dc5b7819-35b2-4a5e-b228-74fa3c7bdf7a", + "integer": 38, + "date": "Mon Nov 07 2011 03:37:10 GMT-0800 (PST)", + "shortText": "laborum ipsum enim et quis", + "mediumText": "Nulla proident ut aliquip consectetur occaecat aliqua laboris incididunt. Reprehenderit labore laborum sint non mollit reprehenderit amet ullamco proident dolore cupidatat ad adipisicing. Cupidatat consectetur mollit enim sit ipsum sunt consequat.", + "longText": "Lorem adipisicing velit in ipsum aliqua ad anim nulla tempor id eu laboris. Sunt velit minim elit laboris tempor irure culpa laboris laborum qui pariatur est. Ea laboris id nostrud exercitation non. Aute irure do eiusmod in. Anim pariatur proident enim ex commodo cupidatat nisi dolore non est cupidatat reprehenderit. Id deserunt amet aliquip in quis do ipsum duis ipsum deserunt commodo culpa incididunt irure. Deserunt aliquip incididunt eiusmod laboris et culpa qui Lorem ad magna voluptate ad est.\r\nMollit velit ut eu magna non proident ullamco. Aliquip incididunt consectetur nostrud sunt sint eu labore magna ex. Reprehenderit labore cupidatat voluptate eiusmod pariatur consequat proident aliquip. Ea irure ad aliqua eu exercitation ullamco laborum duis. Ea et quis esse magna sunt quis tempor irure elit veniam sunt nulla irure nisi.\r\nIrure consequat veniam esse ea nostrud excepteur ipsum. Dolore minim tempor in ad ex aliquip amet. Sint id excepteur commodo ipsum ullamco consequat ut nisi nulla.\r\nQuis sunt reprehenderit ad quis. Fugiat commodo adipisicing ex irure consectetur ullamco ullamco culpa ullamco aliqua laborum aliquip duis incididunt. Lorem Lorem est fugiat ex veniam minim amet magna minim quis incididunt ullamco nostrud. Qui nostrud reprehenderit sint non sint irure adipisicing mollit mollit proident consequat nostrud esse pariatur. Ex aute velit magna enim veniam enim id eiusmod. Adipisicing Lorem eiusmod ea minim anim do deserunt pariatur aliquip qui ullamco velit qui.\r\nMollit occaecat voluptate sint ea dolor non ullamco nostrud enim minim duis sit amet. Enim ex reprehenderit nisi ipsum deserunt. Aliqua sit Lorem esse qui et deserunt esse.\r\n", + "address": "4 Apollo Street", + "city": "Gilgo", + "state": "Washington", + "zip": 82570, + "country": "Latvia", + "email": "leaunderwood@scentric.com", + "phone": "(828) 506-3671", + "color": "rgb(157,198,63)" + }, + { + "index": 419, + "name": "Casey Long", + "first": "Ella", + "last": "Ingram", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/avclarkey/73.jpg", + "expanded": false, + "guid": "9594164f-bed6-4350-84a7-8006ac0ac9a1", + "integer": 72, + "date": "Sun Nov 13 1988 09:05:46 GMT-0800 (PST)", + "shortText": "irure labore", + "mediumText": "Esse aliquip est ullamco velit. Amet tempor est consectetur consequat voluptate. Tempor ipsum fugiat enim et. Id officia cupidatat magna ullamco enim occaecat exercitation in sunt enim do nisi culpa cupidatat.", + "longText": "Eiusmod in et sit voluptate culpa sit velit et irure minim tempor ipsum. Aliqua elit consectetur ea aliqua excepteur eiusmod cillum dolor in ullamco. Commodo quis qui laborum labore minim. Ipsum est do proident labore incididunt nisi. Adipisicing magna velit sit consequat mollit proident commodo quis. Laboris quis elit adipisicing labore consectetur incididunt in reprehenderit enim. Magna cillum enim id veniam velit aliquip amet deserunt ea.\r\nReprehenderit ea ullamco do id tempor in duis nulla pariatur. Eiusmod adipisicing in consectetur exercitation. Fugiat enim veniam occaecat esse exercitation eu ullamco cillum quis consequat.\r\nAliqua non enim sunt amet cillum id proident do nulla eiusmod eu. Fugiat in nisi incididunt irure enim. Occaecat culpa tempor culpa anim laborum dolore consectetur Lorem eu.\r\nOfficia et aliqua aliqua ex occaecat est magna officia enim. Commodo officia dolor officia esse aute eiusmod. Velit quis reprehenderit reprehenderit laborum occaecat voluptate. Eiusmod dolor culpa irure do mollit excepteur ullamco aute est culpa. Ad ullamco incididunt minim eu mollit irure esse adipisicing laborum mollit cupidatat dolore.\r\n", + "address": "2 Dorchester Road", + "city": "Kersey", + "state": "Oregon", + "zip": 52838, + "country": "Netherlands Antilles", + "email": "ellaingram@scentric.com", + "phone": "(939) 546-2501", + "color": "rgb(50,99,109)" + }, + { + "index": 420, + "name": "Kent Fitzpatrick", + "first": "Lara", + "last": "Vinson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/arindam_/73.jpg", + "expanded": false, + "guid": "8c5b6ef8-755b-48a6-9d5c-2fbfc73015b9", + "integer": 94, + "date": "Wed Nov 13 1991 18:16:19 GMT-0800 (PST)", + "shortText": "labore", + "mediumText": "Esse ipsum culpa magna consequat fugiat magna aute.", + "longText": "Elit dolore incididunt non anim cupidatat magna exercitation quis ut eiusmod adipisicing mollit excepteur ut. Voluptate sunt velit cupidatat consectetur occaecat est sint eiusmod. Ullamco sint do magna quis culpa sit id pariatur reprehenderit reprehenderit cupidatat aliqua reprehenderit. Et cillum est nisi laborum nisi officia sint ut deserunt eiusmod in. Incididunt dolore duis eiusmod eiusmod officia.\r\nEiusmod occaecat sint mollit aliqua dolore velit ea laboris cupidatat adipisicing ullamco duis commodo. Laborum commodo officia tempor ea id eu aliquip quis veniam Lorem nostrud in duis fugiat. Quis aliquip esse cupidatat cillum quis sint. Aute sunt qui dolore laboris.\r\nTempor sunt tempor minim fugiat cupidatat occaecat aute adipisicing eu minim mollit fugiat exercitation. Tempor occaecat sint ad enim sit occaecat Lorem nisi. Sunt sunt occaecat nisi nisi eiusmod fugiat labore adipisicing sit sint ut.\r\nConsequat minim ad laboris et est. Voluptate cupidatat amet dolore consectetur deserunt nulla laboris proident consectetur nulla. Ex voluptate magna velit ex cillum do. Adipisicing adipisicing esse magna amet consectetur pariatur aute cupidatat eiusmod velit. Fugiat sint occaecat tempor qui cillum ad nulla. Aliquip aliqua in aute dolor laborum cupidatat adipisicing mollit excepteur tempor do sunt adipisicing in. Ipsum ex dolore cupidatat non minim ullamco velit cillum irure aute irure occaecat.\r\n", + "address": "2 Reeve Place", + "city": "Grahamtown", + "state": "Illinois", + "zip": 69832, + "country": "Colombia", + "email": "laravinson@scentric.com", + "phone": "(965) 578-3210", + "color": "rgb(152,231,185)" + }, + { + "index": 421, + "name": "Claudia Ochoa", + "first": "Maynard", + "last": "Giles", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/emmakardaras/73.jpg", + "expanded": false, + "guid": "97fdeebe-aaf9-4f67-a240-254056b3fbc4", + "integer": 43, + "date": "Thu Oct 04 2007 14:11:47 GMT-0700 (PDT)", + "shortText": "commodo nostrud", + "mediumText": "Consectetur aliquip reprehenderit magna id ex sint nostrud aute aliquip adipisicing. Laboris mollit aute ad ea pariatur proident laborum in sint consectetur velit anim.", + "longText": "Ea sint id dolore in enim non nulla tempor dolor excepteur non quis minim occaecat. Velit eu nostrud in eiusmod irure ea nulla in dolore Lorem consectetur ex in tempor. Ad duis ullamco dolor elit Lorem est dolore irure et non enim. Tempor laborum dolor velit consequat incididunt.\r\n", + "address": "2 Dikeman Street", + "city": "Wawona", + "state": "West Virginia", + "zip": 90747, + "country": "Wallis and Futuna Islands", + "email": "maynardgiles@scentric.com", + "phone": "(868) 426-2611", + "color": "rgb(82,210,230)" + }, + { + "index": 422, + "name": "Deleon Madden", + "first": "Jeri", + "last": "Roy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/georgespillman/73.jpg", + "expanded": false, + "guid": "0eeed2b0-573c-4b2a-8cf7-24f3929d42f6", + "integer": 3, + "date": "Mon Jul 24 2006 08:25:36 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Veniam mollit ut veniam anim ex proident nostrud. Qui dolore aute velit non voluptate sit ad reprehenderit sunt mollit. Reprehenderit fugiat occaecat duis mollit.", + "longText": "Reprehenderit exercitation nisi consequat veniam duis quis id aliqua ut ex aliqua sunt ipsum. Ad ad amet qui mollit officia Lorem exercitation dolore nulla. Quis commodo mollit sunt labore aliquip ipsum. Excepteur nisi non esse duis aliqua commodo officia consequat amet aliqua voluptate exercitation in nulla.\r\nConsectetur aute sit quis qui laboris. Laboris anim nulla in voluptate. Commodo magna nisi nisi commodo consectetur enim est do exercitation nisi. Mollit aliquip sint ea qui laborum.\r\nConsectetur eiusmod magna nisi mollit sint sunt id nostrud dolor eu. Exercitation mollit fugiat anim nisi nisi irure ipsum tempor eu. Est nisi consequat occaecat voluptate ad velit mollit amet. Elit est quis laboris culpa proident occaecat adipisicing officia cillum ea reprehenderit. Do quis ex aliqua culpa.\r\nIn minim proident enim nisi quis consequat. Deserunt veniam occaecat laborum laborum ex ipsum cupidatat commodo commodo adipisicing dolor in. Ex et est irure irure consequat ut sint in voluptate laborum eu nulla officia aute. Non enim magna nostrud deserunt minim pariatur irure elit ex qui minim. Exercitation nostrud dolore cupidatat dolore excepteur excepteur ad qui ex. Enim non occaecat ea enim officia exercitation proident irure nulla occaecat reprehenderit elit nostrud id. Culpa pariatur fugiat mollit labore non officia magna exercitation anim esse et.\r\n", + "address": "2 Lafayette Walk", + "city": "Kennedyville", + "state": "Mississippi", + "zip": 49852, + "country": "Bouvet Island", + "email": "jeriroy@scentric.com", + "phone": "(840) 457-2791", + "color": "rgb(127,95,131)" + }, + { + "index": 423, + "name": "Alexander Carroll", + "first": "Spears", + "last": "Obrien", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fireupman/73.jpg", + "expanded": false, + "guid": "36236dec-3738-49d8-befd-946c2774fd1e", + "integer": 88, + "date": "Tue Jul 01 1986 19:56:06 GMT-0700 (PDT)", + "shortText": "aute non ex Lorem", + "mediumText": "Proident Lorem aliqua laboris adipisicing ullamco velit consequat exercitation nisi. Laborum enim duis nulla reprehenderit est eu ad laboris ad.", + "longText": "Adipisicing tempor commodo nulla sint tempor veniam deserunt do eiusmod. Do tempor voluptate cillum ipsum veniam voluptate occaecat enim cillum anim mollit ad adipisicing. Consequat consequat aute dolor anim ut. Incididunt Lorem mollit anim esse veniam.\r\nCillum consequat proident consectetur ex proident ad cupidatat laboris do officia. Amet deserunt eu eiusmod aliquip esse ipsum laboris. Do dolor nostrud dolore sint quis nulla pariatur quis adipisicing. Culpa exercitation incididunt ullamco culpa sit.\r\nDolore irure sunt eiusmod tempor. Esse deserunt ex elit Lorem et nulla esse officia ipsum culpa. Lorem sunt duis tempor nostrud enim ea excepteur ad. Ea ut commodo minim et adipisicing veniam exercitation ad et dolor et tempor et. Minim duis Lorem excepteur ipsum ipsum ea esse velit voluptate dolore tempor sunt nulla incididunt. Excepteur est est consectetur in. Aliquip nisi ipsum deserunt nulla.\r\n", + "address": "3 Doone Court", + "city": "Fulford", + "state": "Rhode Island", + "zip": 83826, + "country": "Niue", + "email": "spearsobrien@scentric.com", + "phone": "(832) 502-3659", + "color": "rgb(138,211,151)" + }, + { + "index": 424, + "name": "Debora Gibson", + "first": "Crane", + "last": "Lawrence", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kylefrost/73.jpg", + "expanded": false, + "guid": "0a2de76d-c5db-4e74-89e0-3ff39bf504ad", + "integer": 29, + "date": "Fri Apr 01 1977 03:54:28 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Esse veniam veniam in do incididunt non culpa laborum.", + "longText": "Ullamco exercitation deserunt enim est ea. Ullamco irure ipsum dolore labore do nisi in minim occaecat irure reprehenderit sit. Elit culpa officia ut labore nulla duis ullamco magna culpa veniam. Cupidatat irure esse voluptate amet sit aliquip est pariatur ut deserunt enim labore. Nulla occaecat cupidatat et ex amet qui esse. Eu ullamco adipisicing aliquip consectetur voluptate officia magna incididunt officia reprehenderit.\r\nNon id magna esse tempor commodo reprehenderit quis culpa dolore mollit cupidatat non. Ullamco sit aute consectetur aliquip et amet eu dolore dolor amet occaecat. Cillum labore cupidatat esse veniam irure dolor minim minim dolore excepteur do minim exercitation est. Tempor dolor Lorem ipsum cupidatat aliqua ea est velit excepteur excepteur anim magna esse consectetur. Labore fugiat laboris excepteur mollit qui esse aliquip aliqua tempor. Eiusmod magna eiusmod incididunt exercitation nostrud dolore consectetur sunt ullamco. Cillum aliquip et cillum officia est nostrud enim sit irure proident elit ipsum.\r\n", + "address": "3 Dean Street", + "city": "Freeburn", + "state": "Georgia", + "zip": 97509, + "country": "Sweden", + "email": "cranelawrence@scentric.com", + "phone": "(871) 449-2232", + "color": "rgb(249,221,142)" + }, + { + "index": 425, + "name": "Effie Witt", + "first": "Tamika", + "last": "Mcfarland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/quser/73.jpg", + "expanded": false, + "guid": "24996c53-4fce-4e30-9a15-01ad7f8a690e", + "integer": 72, + "date": "Sun Nov 03 1991 09:36:14 GMT-0800 (PST)", + "shortText": "dolore ullamco do dolor", + "mediumText": "Ad ex aliquip minim exercitation ex incididunt adipisicing sit sit aliqua. Laboris voluptate sint Lorem officia pariatur nostrud non amet ea consectetur esse. Amet aliqua id est irure minim duis nostrud laboris laborum reprehenderit. Ea anim proident nisi adipisicing dolor. Magna mollit do irure do veniam minim proident.", + "longText": "Laboris aute duis aliquip pariatur adipisicing irure adipisicing sunt irure commodo nulla occaecat amet veniam. Nostrud ex voluptate elit nulla voluptate culpa dolore excepteur. Qui ea ex adipisicing proident sint adipisicing ea. Nulla consequat enim et consequat ad ullamco magna anim tempor excepteur. Amet officia irure adipisicing in eiusmod minim eu sunt in veniam culpa. Quis eu aliqua proident in aute proident ea. Adipisicing occaecat laborum consectetur elit aute velit ullamco ad cillum ipsum non aliquip.\r\nCommodo qui incididunt deserunt enim excepteur ut fugiat. Consectetur aliquip incididunt est minim nostrud irure officia enim occaecat quis minim pariatur. Cillum aliquip commodo excepteur incididunt officia tempor ea occaecat in tempor magna.\r\n", + "address": "4 Homecrest Avenue", + "city": "Tioga", + "state": "New Mexico", + "zip": 47382, + "country": "Bolivia", + "email": "tamikamcfarland@scentric.com", + "phone": "(822) 428-3372", + "color": "rgb(123,143,247)" + }, + { + "index": 426, + "name": "Marissa Winters", + "first": "Bradford", + "last": "Tate", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/maikelk/73.jpg", + "expanded": false, + "guid": "03ba235d-b8bd-446d-a82f-209ef1f02bc3", + "integer": 21, + "date": "Sat Feb 21 1987 11:19:00 GMT-0800 (PST)", + "shortText": "deserunt mollit", + "mediumText": "Velit non amet irure dolore nisi proident nisi.", + "longText": "Et ad occaecat ipsum amet aliquip sit nisi. Adipisicing ut esse dolore aliquip ut. Aliqua sunt anim ullamco voluptate eiusmod est et nulla amet duis voluptate enim elit. Ea consequat ea aliquip nulla enim in enim mollit ea consequat.\r\n", + "address": "3 Bush Street", + "city": "Trinway", + "state": "Arizona", + "zip": 66056, + "country": "Barbados", + "email": "bradfordtate@scentric.com", + "phone": "(895) 532-2566", + "color": "rgb(254,114,222)" + }, + { + "index": 427, + "name": "Keri Holt", + "first": "Pate", + "last": "Ford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ifarafonow/73.jpg", + "expanded": false, + "guid": "fe01b1c1-e14b-4167-92b2-6eef711b41a3", + "integer": 74, + "date": "Sun Jul 01 1979 19:51:30 GMT-0700 (PDT)", + "shortText": "eiusmod pariatur sunt sit", + "mediumText": "Tempor officia velit commodo aute laborum nostrud incididunt id id et. Esse cillum do deserunt sit tempor nisi ipsum sint proident sint. Aute officia esse voluptate pariatur ut. In consequat eiusmod exercitation nostrud reprehenderit et.", + "longText": "Voluptate pariatur eu eu voluptate enim cillum consequat proident pariatur esse est veniam. Qui nisi nulla laborum adipisicing irure occaecat. Mollit amet ullamco velit et reprehenderit amet. Ex ex quis do et anim fugiat exercitation nulla fugiat. Fugiat deserunt irure voluptate consequat reprehenderit Lorem sint ullamco. Ipsum non labore occaecat incididunt amet esse elit enim nostrud eu Lorem nisi.\r\nId culpa non enim aliquip dolore. Laborum nostrud minim deserunt excepteur exercitation voluptate eiusmod. Adipisicing pariatur occaecat voluptate reprehenderit aute. Aliquip incididunt non adipisicing veniam adipisicing occaecat do irure occaecat aliqua veniam laboris. Nulla veniam minim reprehenderit laboris in ut id nulla eiusmod dolor ut voluptate. Tempor enim nostrud ut velit eu cupidatat amet.\r\nAute ipsum ex nulla ut labore ex exercitation nulla anim. Pariatur sit voluptate reprehenderit enim amet. In duis sint excepteur anim proident elit proident non adipisicing exercitation aliquip. Reprehenderit occaecat duis ipsum eu et ad elit do sunt fugiat aliqua. Ea enim mollit dolore qui reprehenderit pariatur nostrud. Aliqua voluptate adipisicing ipsum occaecat cupidatat est do esse sunt enim aliquip sit adipisicing nulla.\r\nId ullamco amet ad deserunt. Pariatur duis ea excepteur proident ad cupidatat consectetur mollit et sint officia voluptate. Sunt et aliqua anim quis proident culpa cillum. Deserunt consequat dolore do anim eiusmod magna. Quis dolor adipisicing anim aliquip exercitation quis adipisicing. Culpa ipsum ea enim anim aliqua occaecat aliquip non reprehenderit dolor. Non proident labore enim est.\r\nProident reprehenderit sunt est aliqua. Dolor ex voluptate occaecat Lorem velit minim do voluptate aute in aliqua. Aute ut voluptate Lorem eu occaecat non deserunt nulla Lorem do minim magna. Duis sit nisi commodo aliquip enim pariatur. Cillum velit officia proident irure dolor.\r\n", + "address": "3 Aviation Road", + "city": "Baker", + "state": "Texas", + "zip": 94487, + "country": "Haiti", + "email": "pateford@scentric.com", + "phone": "(933) 513-2608", + "color": "rgb(74,250,221)" + }, + { + "index": 428, + "name": "Billie Dennis", + "first": "Noreen", + "last": "Chambers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ananya159/73.jpg", + "expanded": false, + "guid": "1277af24-5433-4c02-a123-9dbc3554824d", + "integer": 91, + "date": "Tue Jun 01 1999 05:28:24 GMT-0700 (PDT)", + "shortText": "anim consectetur minim esse", + "mediumText": "Sunt eu velit irure ipsum velit.", + "longText": "Culpa ipsum irure eiusmod et ad esse cillum. In ipsum qui dolor dolor. Ex deserunt incididunt duis exercitation quis est esse. Anim adipisicing ipsum aute qui mollit. Occaecat veniam excepteur velit nostrud cillum in nostrud ex magna ex.\r\nNostrud ipsum do deserunt ipsum consequat cupidatat elit fugiat duis duis consequat magna ea. Do labore ea do et cupidatat mollit et eiusmod. Exercitation exercitation aliqua ea irure duis. Lorem ipsum eu veniam ad nulla nisi ipsum in eu laborum pariatur ipsum cupidatat officia. Adipisicing pariatur velit commodo ipsum sint fugiat elit esse dolore ipsum ut exercitation officia excepteur.\r\n", + "address": "2 Jerome Street", + "city": "Fostoria", + "state": "District Of Columbia", + "zip": 51169, + "country": "Heard and McDonald Islands", + "email": "noreenchambers@scentric.com", + "phone": "(921) 600-2756", + "color": "rgb(240,228,68)" + }, + { + "index": 429, + "name": "Norris Henderson", + "first": "Rhea", + "last": "Velasquez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/horaciobella/73.jpg", + "expanded": false, + "guid": "f6c07756-a3f1-410c-a912-acb877dca497", + "integer": 10, + "date": "Thu Jul 17 2008 11:56:06 GMT-0700 (PDT)", + "shortText": "adipisicing irure cillum", + "mediumText": "Sint duis irure cupidatat aliqua nostrud magna aliquip do do quis mollit occaecat.", + "longText": "Dolor et duis nisi est elit dolore amet enim et ad officia duis. Pariatur adipisicing aliquip reprehenderit exercitation qui occaecat consequat excepteur anim est do mollit amet. In eu eiusmod ea elit. Laborum duis culpa reprehenderit reprehenderit.\r\nOccaecat culpa aliquip elit sunt proident mollit ad reprehenderit occaecat consequat. Id pariatur commodo consectetur cillum laboris et dolor ea voluptate. Laborum magna nisi sunt eu ut mollit amet esse consectetur sunt. Est qui ea cillum excepteur ullamco velit excepteur in ea incididunt ipsum. Tempor reprehenderit velit non adipisicing dolore non nisi proident consequat sit. Nulla est incididunt sint proident do sunt ipsum adipisicing Lorem ad.\r\nNulla excepteur enim ipsum est. Dolor magna consequat ex magna nostrud duis eiusmod enim nulla reprehenderit esse fugiat irure amet. Et officia voluptate aliqua dolore fugiat voluptate nisi mollit occaecat ipsum qui. Fugiat sint magna et cillum aliqua cupidatat deserunt cupidatat aute laboris.\r\nEiusmod consequat ea aute cillum do enim quis commodo excepteur magna labore elit. Voluptate nisi velit dolore consequat elit irure fugiat. Sunt veniam ea enim ullamco esse excepteur quis voluptate excepteur Lorem nostrud amet. Ad commodo labore excepteur velit sunt ut. Ullamco consectetur esse voluptate eu minim deserunt nulla ipsum reprehenderit deserunt laborum.\r\nDuis adipisicing reprehenderit enim qui. Sit duis fugiat dolore consequat mollit incididunt irure ullamco proident quis minim qui ex irure. Est magna laboris magna minim aute excepteur commodo ullamco duis duis nulla sunt deserunt. Irure sunt ea do ipsum aliquip nisi nulla ex ex nostrud. Elit amet voluptate commodo id minim ut est ut minim adipisicing in. Eu nostrud anim irure do eu consectetur anim esse eiusmod officia laboris.\r\n", + "address": "2 Fillmore Place", + "city": "Castleton", + "state": "Virgin Islands", + "zip": 22826, + "country": "United States", + "email": "rheavelasquez@scentric.com", + "phone": "(801) 444-3966", + "color": "rgb(186,114,65)" + }, + { + "index": 430, + "name": "Carrillo Park", + "first": "Ola", + "last": "Allison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/thatdesigner/73.jpg", + "expanded": false, + "guid": "3a544cbd-1319-4b62-b664-89f96dc2d58f", + "integer": 79, + "date": "Wed Feb 03 1999 14:08:18 GMT-0800 (PST)", + "shortText": "tempor", + "mediumText": "Id et eiusmod ad sunt laborum. Veniam magna veniam ea incididunt occaecat quis veniam et laboris aliquip ea Lorem ut. Eu officia incididunt eu veniam.", + "longText": "Voluptate reprehenderit nostrud non adipisicing ad ex enim. Id incididunt veniam pariatur ut id qui fugiat reprehenderit laboris consequat officia. Aliquip exercitation excepteur elit aliqua esse tempor nulla laborum.\r\nIn mollit reprehenderit irure duis cupidatat ad velit irure ad. Est et laborum non reprehenderit. Est elit non aliquip pariatur do dolore Lorem enim exercitation tempor. Amet culpa ut nostrud dolor fugiat.\r\nNon duis aliquip laboris consequat nisi sunt ad velit ipsum eu deserunt sit labore. Qui velit ipsum cupidatat ad irure nisi adipisicing eu. Reprehenderit deserunt cillum ut exercitation labore enim deserunt elit. Incididunt sint reprehenderit aliquip eiusmod consectetur quis ad pariatur ea dolor ea minim ex. Non labore labore amet excepteur aliquip amet anim do in eiusmod sunt laboris nisi. Est qui qui laboris veniam elit elit sunt in. Tempor commodo ex ea laborum.\r\nDolore dolore dolore labore velit fugiat commodo consectetur. Ullamco qui quis labore velit exercitation irure voluptate nulla duis occaecat. Ad quis ullamco magna occaecat esse dolore et id reprehenderit enim nisi commodo irure.\r\nFugiat proident deserunt nulla et pariatur ullamco do. Enim cillum nulla sint in laboris cillum excepteur anim irure ad sint laboris tempor nostrud. Enim pariatur amet sint non nisi commodo. Cupidatat qui incididunt sit labore ex enim Lorem aute excepteur veniam consequat nisi labore. Proident dolor excepteur aute et proident. Veniam excepteur veniam laboris deserunt sint.\r\n", + "address": "3 Noel Avenue", + "city": "Seymour", + "state": "Puerto Rico", + "zip": 59608, + "country": "Jamaica", + "email": "olaallison@scentric.com", + "phone": "(813) 560-2883", + "color": "rgb(206,102,76)" + }, + { + "index": 431, + "name": "Aileen Manning", + "first": "Sophia", + "last": "House", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/snaphappydad/73.jpg", + "expanded": false, + "guid": "832335a5-d05a-4d43-8c98-091dad23386f", + "integer": 82, + "date": "Fri Feb 17 2012 22:56:46 GMT-0800 (PST)", + "shortText": "amet est Lorem velit tempor", + "mediumText": "Cupidatat incididunt do aliqua velit occaecat officia occaecat amet occaecat Lorem veniam eu ipsum cillum. Amet esse aliqua in qui excepteur commodo veniam ut velit.", + "longText": "Officia esse consectetur proident consequat. Ex eiusmod cupidatat labore velit anim fugiat amet ipsum labore. Ut velit id ullamco occaecat et. Labore amet consequat excepteur adipisicing ut nisi dolore consectetur tempor veniam mollit reprehenderit quis. Esse ad irure elit et.\r\n", + "address": "3 Cove Lane", + "city": "Mappsville", + "state": "Maryland", + "zip": 46354, + "country": "Sao Tome and Principe", + "email": "sophiahouse@scentric.com", + "phone": "(829) 411-2721", + "color": "rgb(188,234,157)" + }, + { + "index": 432, + "name": "Angeline Welch", + "first": "Riggs", + "last": "Albert", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/cristianovalim/73.jpg", + "expanded": false, + "guid": "ff60a0af-9800-4828-beec-cc4ad3e7a4f5", + "integer": 75, + "date": "Wed Oct 28 1992 15:16:43 GMT-0800 (PST)", + "shortText": "laborum aliquip minim", + "mediumText": "Minim est qui proident deserunt nostrud commodo nisi non in veniam duis. Nisi minim aliqua cupidatat est dolore consequat nisi. Proident ut incididunt aute ea qui id reprehenderit veniam commodo.", + "longText": "Eu velit exercitation id amet. Incididunt eu nulla occaecat sunt pariatur culpa magna incididunt mollit id consectetur exercitation. Dolor pariatur voluptate aliquip quis aliquip anim amet qui commodo elit fugiat. Non dolore Lorem laboris voluptate voluptate ex anim eiusmod quis id magna proident.\r\nElit aliqua velit consequat velit laboris officia ut cillum mollit nulla culpa. Ut ea qui minim deserunt aliquip cillum ea proident duis. Laborum fugiat consequat ex magna irure proident reprehenderit officia consectetur fugiat excepteur laborum et. Est veniam non elit nisi minim. Ex sunt elit minim incididunt eu officia excepteur mollit nisi ad. Do est nisi magna et tempor culpa. Elit irure ex ut cillum ipsum ipsum ex esse dolor.\r\n", + "address": "4 Irvington Place", + "city": "Kempton", + "state": "Massachusetts", + "zip": 55149, + "country": "Belarus", + "email": "riggsalbert@scentric.com", + "phone": "(964) 471-3289", + "color": "rgb(143,144,152)" + }, + { + "index": 433, + "name": "Wilder Parks", + "first": "Guzman", + "last": "Gay", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pmeissner/73.jpg", + "expanded": false, + "guid": "34d47442-340f-4017-a323-333b9d8966a7", + "integer": 46, + "date": "Sat May 01 1982 19:47:12 GMT-0700 (PDT)", + "shortText": "fugiat nisi fugiat", + "mediumText": "Lorem ipsum ipsum elit ad reprehenderit do culpa proident qui labore ea cillum tempor aute. Velit nisi anim excepteur commodo tempor. Id reprehenderit reprehenderit adipisicing exercitation aliqua ipsum dolore est cillum pariatur in quis est. Ad adipisicing irure qui ullamco eiusmod excepteur laborum.", + "longText": "Lorem id elit est velit veniam ullamco voluptate et do. Non ea ad minim Lorem in. Laborum amet enim magna et qui eu ullamco labore do minim in magna esse veniam. Incididunt nostrud nulla ut excepteur et et. Laborum labore qui adipisicing consectetur adipisicing incididunt excepteur Lorem eu nulla tempor ipsum. Ipsum labore dolore in qui irure pariatur proident laboris tempor ipsum culpa est ea cillum. Lorem sunt eu proident enim.\r\n", + "address": "4 Cumberland Street", + "city": "Enlow", + "state": "Oklahoma", + "zip": 93935, + "country": "Russian Federation", + "email": "guzmangay@scentric.com", + "phone": "(995) 459-2856", + "color": "rgb(54,118,212)" + }, + { + "index": 434, + "name": "Nash Valencia", + "first": "Leanne", + "last": "Stafford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akbarbobojonov/73.jpg", + "expanded": false, + "guid": "0594778f-1bb9-4338-88af-480e9dcce7ec", + "integer": 12, + "date": "Wed Aug 07 1985 09:48:17 GMT-0700 (PDT)", + "shortText": "exercitation", + "mediumText": "Incididunt commodo exercitation do eu laborum do fugiat aute dolore nostrud proident tempor. Aute laborum elit dolor sint aliquip mollit laboris tempor ea irure incididunt magna. Id aliquip sit do magna.", + "longText": "Consectetur voluptate duis cupidatat incididunt laborum. Magna non laboris reprehenderit duis consequat cupidatat aliquip ex aliquip pariatur. Adipisicing incididunt pariatur magna adipisicing amet dolore pariatur laboris nulla esse duis labore. Dolore est aute do do culpa pariatur. Consequat ea minim qui laborum culpa velit id fugiat nostrud sint. Ipsum irure cillum quis officia eu laboris.\r\nLorem ex duis eu deserunt minim cupidatat et non non et sunt. Pariatur ut culpa et non non voluptate ut velit sunt eu non. Cillum exercitation veniam nostrud est id laboris. Tempor do et consectetur reprehenderit ut dolor deserunt fugiat consectetur velit. Nulla elit deserunt dolor do cupidatat amet velit consectetur. Consectetur in nostrud sunt deserunt est aute cupidatat mollit aliquip sint cupidatat sit esse. Ut eu ut veniam sunt do proident cillum velit voluptate.\r\nCupidatat et aute tempor dolore. Aute exercitation sunt eiusmod ut consequat ut pariatur et excepteur. Tempor ea deserunt duis incididunt aute minim cupidatat veniam non elit.\r\nEiusmod occaecat culpa ipsum enim deserunt qui irure. Reprehenderit dolor quis dolor dolore culpa aliquip ipsum. Enim aliquip ullamco minim laboris do non laborum sint id incididunt voluptate. Do ea enim cupidatat deserunt ipsum nulla mollit ullamco laborum sint.\r\nElit minim et cupidatat voluptate aliqua proident mollit amet qui cupidatat. Enim cillum commodo consequat adipisicing dolore occaecat sit consectetur incididunt pariatur tempor. Ea eu do ea elit et.\r\n", + "address": "2 Hopkins Street", + "city": "Sunwest", + "state": "Ohio", + "zip": 99728, + "country": "Croatia (Hrvatska)", + "email": "leannestafford@scentric.com", + "phone": "(976) 400-2448", + "color": "rgb(172,121,148)" + }, + { + "index": 435, + "name": "Mann Lindsey", + "first": "Angelita", + "last": "Holland", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pjnes/73.jpg", + "expanded": false, + "guid": "b158f0bc-58b6-497c-b8e9-827e2fd5adcb", + "integer": 86, + "date": "Tue Mar 30 1999 04:50:25 GMT-0800 (PST)", + "shortText": "nulla", + "mediumText": "Cupidatat sint laboris irure irure quis irure laborum anim ex aliquip ad. Ullamco anim cillum ex aliqua cillum reprehenderit ipsum exercitation ea non laborum nulla. Consectetur dolor duis anim irure duis dolor qui sint aliquip est pariatur ullamco.", + "longText": "Laboris minim commodo qui ad mollit non sunt laborum dolore irure ad dolore aliquip sit. Eu ullamco nulla magna velit non. Cupidatat nulla reprehenderit qui elit nisi mollit adipisicing anim. Irure laborum aute culpa nisi et voluptate esse minim.\r\nEt proident ipsum ex reprehenderit deserunt nostrud amet commodo nulla eu tempor culpa sit. Aute fugiat dolor commodo quis laboris nulla ea laboris. Et excepteur laborum aute et.\r\nPariatur et excepteur irure tempor duis consectetur nisi pariatur in ea ut commodo ad. Esse sint tempor qui consectetur ad nisi ut reprehenderit sit excepteur. Dolore mollit voluptate ipsum ad in aliqua nisi. Officia nulla aliquip tempor do culpa velit. Ut Lorem non cillum ipsum. Qui exercitation non velit elit quis voluptate ipsum adipisicing occaecat minim. Est consectetur duis minim irure reprehenderit.\r\nVoluptate deserunt duis ut elit ut cillum officia nulla sint do. Elit deserunt est mollit mollit et ullamco dolore. Amet consequat pariatur cupidatat velit. Eiusmod elit qui mollit nisi ipsum enim. Ullamco eu commodo est consequat. Voluptate excepteur adipisicing ad sit velit duis enim fugiat et sit nisi veniam ipsum occaecat.\r\nAnim exercitation mollit ullamco sunt pariatur excepteur anim exercitation velit ex enim fugiat. Ullamco excepteur ex sint nulla laboris qui anim sunt nisi. Esse ea exercitation dolore adipisicing. Quis amet aute consequat occaecat officia ea nulla.\r\n", + "address": "3 Williamsburg Street", + "city": "Hiwasse", + "state": "Nevada", + "zip": 20139, + "country": "Indonesia", + "email": "angelitaholland@scentric.com", + "phone": "(939) 494-2894", + "color": "rgb(245,81,217)" + }, + { + "index": 436, + "name": "Herring Barry", + "first": "Fanny", + "last": "Mills", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/balintorosz/73.jpg", + "expanded": false, + "guid": "80d4034b-37c2-4d36-8a84-8902d6dbd1e8", + "integer": 7, + "date": "Thu Feb 26 1987 04:22:07 GMT-0800 (PST)", + "shortText": "culpa veniam laborum", + "mediumText": "Eu culpa qui cillum nulla occaecat irure proident laboris. Enim Lorem eiusmod minim magna ea eu reprehenderit eu ea nulla aute. Et in laborum aliqua consectetur consectetur aute sint velit fugiat dolore.", + "longText": "Minim ea magna laboris commodo in fugiat qui non reprehenderit. Sint tempor labore qui ullamco nisi tempor consequat tempor quis. Aute dolore minim nulla magna ut ex commodo mollit dolor ipsum dolor. Eu eu labore deserunt et occaecat excepteur consectetur cupidatat mollit nisi.\r\nTempor aute culpa sit occaecat consequat. Culpa ullamco proident aliquip labore. Reprehenderit pariatur aute fugiat irure adipisicing sint anim anim occaecat adipisicing labore ipsum deserunt consectetur. Voluptate eiusmod eu pariatur proident nostrud sint labore. Sit adipisicing ipsum proident non incididunt mollit minim labore elit nulla elit et occaecat.\r\nSit culpa veniam id minim minim dolore elit culpa ut enim est. Ex adipisicing deserunt ex officia commodo sit nostrud labore aute est sit. Elit eu sint consequat cillum deserunt eu anim nostrud reprehenderit cupidatat occaecat consequat. Sint anim est ullamco non sint dolore excepteur.\r\n", + "address": "2 Grand Avenue", + "city": "Gasquet", + "state": "Montana", + "zip": 88459, + "country": "Nauru", + "email": "fannymills@scentric.com", + "phone": "(961) 418-2958", + "color": "rgb(207,161,63)" + }, + { + "index": 437, + "name": "Davenport Knowles", + "first": "Carol", + "last": "Acevedo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/martinhn/73.jpg", + "expanded": false, + "guid": "20017740-0bff-43ce-a66b-b139bdd82fdf", + "integer": 10, + "date": "Sat Aug 12 1989 13:36:36 GMT-0700 (PDT)", + "shortText": "tempor fugiat ex do", + "mediumText": "Culpa quis minim eiusmod veniam ullamco cupidatat velit dolore cillum aute duis reprehenderit. Enim cupidatat dolore qui ex dolor magna mollit amet adipisicing dolor.", + "longText": "Voluptate ex duis culpa est ullamco magna ullamco id. Magna ullamco aliquip anim laborum velit deserunt consectetur sunt irure. Anim nulla ullamco veniam sint ex culpa eu minim dolor excepteur. Adipisicing ex tempor duis ea. Labore enim pariatur dolore irure et elit ad ipsum exercitation mollit aliqua deserunt. Minim labore ea dolor duis tempor veniam id incididunt occaecat non incididunt dolor sit.\r\nLaboris voluptate duis deserunt aute sunt et voluptate proident est nulla. Labore aute esse est nisi in excepteur laborum irure. Fugiat sint qui esse excepteur duis qui do labore. Non incididunt elit nulla ex officia cupidatat elit culpa id aliqua. Ex aute esse ex reprehenderit. Veniam excepteur aliquip irure laborum eiusmod. Elit qui sunt mollit dolor non fugiat est qui nostrud est do consequat aute officia.\r\nConsequat occaecat incididunt enim excepteur nostrud dolor amet duis ea irure sit. Veniam et reprehenderit labore officia ex ipsum officia consequat voluptate. Incididunt duis commodo deserunt aute deserunt dolore sunt Lorem. Veniam non ea laborum mollit aliquip qui eu fugiat duis. Fugiat id sunt aute mollit elit sit incididunt veniam tempor. Consectetur pariatur consectetur labore et non et commodo qui mollit minim enim esse. Et proident elit minim est occaecat.\r\nDo aliquip excepteur nulla elit. Laboris consequat do officia veniam laboris. Non quis velit velit ipsum sint amet ut aliqua quis laboris est pariatur ut officia. Eu esse consequat irure dolore quis in sit. Labore ipsum minim ad ut voluptate ea non. In voluptate magna esse est elit voluptate labore irure minim aliqua velit laborum et nulla. Ipsum nostrud est consequat tempor velit culpa sint fugiat dolor.\r\nLorem esse aliqua cillum excepteur labore proident ipsum dolor enim ut aliquip laboris ut. Ullamco aliqua pariatur enim dolore est irure. Quis nisi officia mollit nostrud consectetur pariatur ad id adipisicing aute laboris qui reprehenderit tempor. Nulla non nostrud excepteur duis excepteur quis. Ex do voluptate sit Lorem ea irure eu velit culpa.\r\n", + "address": "2 Lincoln Terrace", + "city": "Eggertsville", + "state": "California", + "zip": 49607, + "country": "Ireland", + "email": "carolacevedo@scentric.com", + "phone": "(873) 489-2712", + "color": "rgb(215,231,234)" + }, + { + "index": 438, + "name": "Sonia Moses", + "first": "Patel", + "last": "Thompson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/73.jpg", + "expanded": false, + "guid": "e3a9a23d-000c-47aa-8039-4fce46c5565c", + "integer": 26, + "date": "Sun Jan 13 1991 10:21:14 GMT-0800 (PST)", + "shortText": "enim tempor ea", + "mediumText": "Deserunt consectetur velit proident ipsum aute sunt ullamco incididunt consequat aliqua sit mollit. Sit deserunt minim eu laborum quis cupidatat nulla id sit esse ea ad amet.", + "longText": "Dolor anim incididunt ullamco esse qui occaecat in dolore Lorem. Nisi eiusmod laboris ullamco quis consequat pariatur et cupidatat ad exercitation. In eu cillum occaecat amet tempor cillum. Exercitation id ullamco mollit non. Eiusmod culpa reprehenderit consectetur officia officia ad elit adipisicing est ut ea. Fugiat dolor nostrud occaecat consequat elit nulla ex. Ullamco pariatur incididunt nisi voluptate consequat deserunt proident exercitation ad labore ad.\r\nExcepteur tempor dolor eu duis Lorem deserunt elit ipsum. Cillum velit dolor esse Lorem commodo. Sint cupidatat ex deserunt voluptate adipisicing eiusmod sit proident aliqua excepteur. Consequat cillum irure sint ex reprehenderit incididunt est.\r\nCommodo minim cupidatat voluptate aliqua laborum deserunt sint elit nisi officia sit nostrud. Lorem exercitation laborum mollit adipisicing quis. Ad officia nisi cillum consequat non sunt sunt. Nulla id labore ut qui deserunt aute officia voluptate dolor laboris laboris reprehenderit do. Irure esse Lorem labore enim culpa eu amet ut aliquip esse exercitation elit. Nulla do id anim exercitation commodo pariatur nostrud incididunt aliquip irure. Deserunt ea do velit veniam duis culpa aliqua elit consequat amet aliqua qui.\r\nAliquip et nostrud tempor occaecat amet nulla duis non amet. Ipsum mollit mollit tempor nostrud sint aliqua ea aliquip non pariatur esse nulla cillum magna. Adipisicing excepteur Lorem cillum nisi sint magna laboris do ipsum aliquip eiusmod veniam ullamco.\r\n", + "address": "2 Prescott Place", + "city": "Norwood", + "state": "Marshall Islands", + "zip": 70002, + "country": "Luxembourg", + "email": "patelthompson@scentric.com", + "phone": "(883) 472-3011", + "color": "rgb(207,132,88)" + }, + { + "index": 439, + "name": "Gabrielle Black", + "first": "Holmes", + "last": "Valentine", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/vovkasolovev/73.jpg", + "expanded": false, + "guid": "4bc9e815-0354-4c95-b76c-945cd74c26d0", + "integer": 40, + "date": "Mon May 10 2010 09:38:40 GMT-0700 (PDT)", + "shortText": "Lorem", + "mediumText": "Eiusmod velit ea exercitation voluptate qui labore voluptate amet proident. Ullamco nulla cupidatat id in anim. Cupidatat nisi culpa nostrud laboris aute labore sunt elit in mollit aliquip. Incididunt incididunt consequat aliqua ullamco velit.", + "longText": "Consequat sint ad reprehenderit nisi quis aliqua laborum sint elit pariatur labore magna officia. Occaecat culpa do laboris amet mollit ex velit. Proident fugiat sint laborum nostrud aute ex in veniam fugiat. Adipisicing velit ex non aliqua ex amet ex adipisicing enim consequat mollit occaecat irure cillum. Ad eu eiusmod cupidatat consectetur commodo laborum duis in sit labore laborum cillum. Enim qui cupidatat amet non fugiat.\r\nPariatur mollit consequat eiusmod consectetur labore velit cupidatat mollit sit nostrud laborum. Aliquip occaecat sunt aute occaecat exercitation enim quis excepteur amet id. Ullamco sunt est consequat do voluptate. Incididunt do anim do voluptate do ut deserunt minim enim non. Occaecat proident aute officia fugiat do sint in reprehenderit. Duis incididunt labore nisi laboris reprehenderit tempor non adipisicing enim ad pariatur commodo consectetur minim.\r\nTempor elit est et esse. Sit sint culpa laborum id et cupidatat qui cupidatat. Veniam veniam pariatur dolore ipsum quis officia aliquip eiusmod amet aliqua occaecat tempor laboris irure. Aute in pariatur cillum irure. Fugiat in nisi Lorem sit sint amet amet. Proident eu voluptate irure ipsum cupidatat aliquip cupidatat tempor ea labore enim. Cupidatat duis velit irure eiusmod pariatur reprehenderit eu excepteur enim nostrud mollit commodo.\r\nVelit mollit Lorem enim ullamco nostrud exercitation. Enim occaecat Lorem aliquip nulla velit fugiat. Ullamco voluptate non fugiat non minim voluptate velit. Duis dolor laborum qui est enim ut. Nulla reprehenderit esse ea nisi sit et non nulla voluptate laboris ullamco. Labore in fugiat esse culpa dolor duis anim sunt duis do sint officia non. Laborum dolor pariatur consequat ullamco fugiat.\r\n", + "address": "3 Pleasant Place", + "city": "Fairforest", + "state": "Indiana", + "zip": 30882, + "country": "Afghanistan", + "email": "holmesvalentine@scentric.com", + "phone": "(990) 581-2101", + "color": "rgb(140,238,67)" + }, + { + "index": 440, + "name": "Lakisha Cross", + "first": "Pena", + "last": "Compton", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/urbanjahvier/73.jpg", + "expanded": false, + "guid": "cd35d1ad-004f-43fa-a754-2ab807d0ab4d", + "integer": 1, + "date": "Mon Feb 27 2012 17:16:59 GMT-0800 (PST)", + "shortText": "adipisicing anim velit esse", + "mediumText": "Dolor excepteur non id laboris. Consectetur in duis sint labore duis ut. Consequat elit adipisicing amet cillum non tempor pariatur.", + "longText": "Ipsum non enim aliqua culpa velit enim deserunt proident laboris sunt. Sunt esse officia qui est ut ad cillum eu est cupidatat Lorem proident incididunt. Officia duis culpa duis in exercitation irure officia quis aliquip. Tempor nulla consequat exercitation eu nulla.\r\nEu enim labore excepteur proident. Commodo aliqua Lorem aute dolore ullamco ipsum mollit exercitation veniam. Labore enim veniam ea aliquip esse non id aliqua aliquip nostrud aliquip eu voluptate. Do reprehenderit velit proident ad occaecat sit dolor. Occaecat proident tempor aute nisi ipsum commodo dolore ipsum labore do laborum ea in. Non esse ut qui anim sint cupidatat amet est in consequat aliqua eiusmod. Reprehenderit consectetur amet commodo incididunt do amet laboris.\r\nVeniam magna consequat consequat eiusmod aliqua nulla commodo aliquip magna aute. Excepteur culpa ea consectetur sint velit sunt nulla Lorem ex. Irure in amet cupidatat duis occaecat pariatur.\r\nUt commodo laboris incididunt amet exercitation consectetur adipisicing eu. Aliqua in ex cillum Lorem reprehenderit cillum esse non ut cupidatat. Dolore et dolore duis exercitation sunt fugiat. Irure commodo eiusmod est fugiat ipsum anim ullamco ut. Duis amet duis non sint. Fugiat excepteur dolore et aliqua veniam aute elit mollit sit eu. Eiusmod dolore in magna voluptate reprehenderit pariatur non qui in qui Lorem ipsum.\r\nConsequat mollit tempor do sunt Lorem do est reprehenderit. Lorem aliqua culpa irure duis laborum non ut elit ad. Ad ipsum cillum nisi est aute nisi ad et. Aliquip voluptate voluptate elit amet in laboris fugiat. Non voluptate amet ut cillum exercitation veniam. Ea Lorem nostrud aliquip ex.\r\n", + "address": "4 Belvidere Street", + "city": "Whitestone", + "state": "Tennessee", + "zip": 30601, + "country": "St. Pierre and Miquelon", + "email": "penacompton@scentric.com", + "phone": "(979) 573-3861", + "color": "rgb(191,149,118)" + }, + { + "index": 441, + "name": "Concetta Whitaker", + "first": "Lora", + "last": "Mccarthy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/betraydan/73.jpg", + "expanded": false, + "guid": "4527d6de-ed39-4b47-8916-33b23feda2f9", + "integer": 64, + "date": "Tue Jul 24 2012 12:23:04 GMT-0700 (PDT)", + "shortText": "voluptate", + "mediumText": "Id pariatur aliqua ea id id duis qui sint mollit commodo.", + "longText": "Incididunt voluptate do id labore. Voluptate aliqua tempor quis anim magna quis pariatur et quis voluptate dolor occaecat. In veniam commodo sunt quis consectetur non minim. Laboris velit fugiat aliqua deserunt nostrud amet sint ad Lorem Lorem cupidatat cillum. Ullamco enim minim et eu non Lorem eu laborum magna duis velit esse reprehenderit laboris. Ad enim irure dolor laboris excepteur fugiat exercitation occaecat commodo aliqua ex.\r\nMinim ex est culpa ipsum cupidatat ullamco exercitation cupidatat exercitation veniam cillum. Proident enim elit cupidatat sunt aliqua non minim officia. Laboris veniam laboris id cillum labore occaecat quis cupidatat velit excepteur aute nostrud est anim. Non do ut dolore veniam dolor labore reprehenderit sunt velit officia.\r\n", + "address": "4 Remsen Avenue", + "city": "Northridge", + "state": "Palau", + "zip": 32997, + "country": "Montserrat", + "email": "loramccarthy@scentric.com", + "phone": "(878) 505-2614", + "color": "rgb(124,101,157)" + }, + { + "index": 442, + "name": "Tammie Juarez", + "first": "Liza", + "last": "Daniel", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justme_timothyg/73.jpg", + "expanded": false, + "guid": "0ed69dca-4d57-43c4-835b-b4f0d9654df4", + "integer": 11, + "date": "Sun Jul 08 2012 11:35:08 GMT-0700 (PDT)", + "shortText": "cillum", + "mediumText": "Culpa nulla aliqua nulla adipisicing reprehenderit. Labore nisi non dolore deserunt ut elit anim ullamco ullamco eiusmod cupidatat. Nisi proident qui culpa deserunt velit aliquip cillum deserunt tempor exercitation dolore eu. Do non anim aliquip id dolore anim velit qui ut sunt consequat deserunt. Eiusmod ea proident culpa exercitation enim occaecat.", + "longText": "Minim ex labore Lorem eiusmod laboris voluptate irure est. Dolore occaecat excepteur commodo ullamco deserunt irure cillum. Nisi nostrud in sint sunt excepteur culpa sunt do eu aute deserunt. Irure pariatur proident sit proident exercitation ex aute aliquip eiusmod est Lorem adipisicing laborum officia. Aute consectetur dolor occaecat incididunt cillum eiusmod culpa anim cupidatat est exercitation est. Sunt culpa quis cillum et sint dolor pariatur enim non nostrud dolore sunt proident do.\r\nQui enim do qui aliqua velit ullamco irure culpa aliqua adipisicing velit in tempor aute. Amet consectetur officia do elit. Aute laborum esse ullamco dolore id ullamco velit Lorem. Fugiat dolore et velit velit ut.\r\nSunt non anim veniam proident id est magna ullamco exercitation consequat est. Laborum culpa eiusmod non eu ipsum occaecat excepteur minim occaecat velit magna. Voluptate aliquip tempor do excepteur est enim. Do tempor laboris ut laborum in tempor Lorem occaecat dolore. Est id veniam dolore dolor eiusmod enim ea adipisicing fugiat ad nostrud ullamco ex. Occaecat nisi et ea eiusmod duis Lorem labore enim non veniam labore.\r\nMagna occaecat dolor nisi sint est magna magna tempor sunt. Minim amet sunt exercitation incididunt ea dolore tempor tempor magna pariatur aliqua. Mollit amet et in veniam. Reprehenderit do ut cupidatat incididunt. Eu anim Lorem laboris qui cillum officia amet aute minim magna proident officia.\r\n", + "address": "2 Friel Place", + "city": "Waverly", + "state": "Virginia", + "zip": 15976, + "country": "Norway", + "email": "lizadaniel@scentric.com", + "phone": "(837) 444-2117", + "color": "rgb(169,145,105)" + }, + { + "index": 443, + "name": "Bettie Osborne", + "first": "Daugherty", + "last": "Randolph", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/justinteractive/73.jpg", + "expanded": false, + "guid": "3d66fd94-2bfe-43f5-9b83-14c609449f27", + "integer": 7, + "date": "Sat Jan 20 2007 20:48:29 GMT-0800 (PST)", + "shortText": "velit", + "mediumText": "Veniam quis ea ipsum adipisicing quis excepteur proident laboris fugiat id reprehenderit aute occaecat.", + "longText": "Sunt anim reprehenderit eu in sit culpa enim. Magna voluptate pariatur fugiat commodo fugiat ad voluptate ipsum ut elit ullamco dolor amet. Ut cupidatat consectetur velit velit est labore. Ex cillum ad duis excepteur irure officia eiusmod labore in culpa exercitation duis anim non. Deserunt ullamco consequat tempor tempor incididunt esse laboris.\r\nProident ex dolor anim laboris aliqua velit sit est. Aute aute velit eiusmod non irure nostrud pariatur anim tempor pariatur ipsum labore do. Lorem laborum ipsum minim eu nulla minim ullamco culpa in ex velit veniam aliqua cillum. Exercitation aliquip sit proident nostrud. Dolor ipsum aute nulla Lorem dolore amet dolor nisi enim irure.\r\nIpsum deserunt cupidatat ea nisi anim aliquip et excepteur pariatur nisi dolor. Quis exercitation ea pariatur eiusmod. Sint qui Lorem eu velit aute.\r\n", + "address": "3 Utica Avenue", + "city": "Glenbrook", + "state": "Wyoming", + "zip": 52525, + "country": "Guam", + "email": "daughertyrandolph@scentric.com", + "phone": "(978) 484-3479", + "color": "rgb(158,76,101)" + }, + { + "index": 444, + "name": "Valenzuela Swanson", + "first": "Buckner", + "last": "Dawson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/psdesignuk/73.jpg", + "expanded": false, + "guid": "4fe81672-768e-44ba-b3d5-c57fbb9c3507", + "integer": 27, + "date": "Mon Feb 03 1975 20:36:41 GMT-0800 (PST)", + "shortText": "fugiat fugiat", + "mediumText": "Eiusmod eu elit do in occaecat dolor consectetur non mollit. Officia eiusmod consectetur veniam laboris consequat velit commodo exercitation tempor officia commodo. Voluptate elit Lorem elit non elit. Dolor consequat exercitation cillum labore do cillum irure exercitation. Lorem et irure velit eiusmod sit ut.", + "longText": "Amet enim eiusmod anim culpa non ipsum dolor deserunt adipisicing fugiat. Ut irure ipsum et incididunt veniam proident ex veniam. Magna eu dolor do minim elit culpa labore. Commodo non amet qui nisi nisi anim ex. Sit ipsum nulla fugiat ea exercitation duis in sint ex ea. Minim est ut minim in laboris est esse culpa minim pariatur exercitation ex. Ex voluptate sint sunt velit in adipisicing.\r\n", + "address": "4 Bridge Street", + "city": "Byrnedale", + "state": "Colorado", + "zip": 22776, + "country": "Gibraltar", + "email": "bucknerdawson@scentric.com", + "phone": "(822) 533-3432", + "color": "rgb(72,149,99)" + }, + { + "index": 445, + "name": "Bernice Hood", + "first": "Dionne", + "last": "Russo", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/teclaro/73.jpg", + "expanded": false, + "guid": "604ff26f-12a6-4e76-bbcc-b8004c60fc12", + "integer": 25, + "date": "Sat Sep 15 2001 19:47:51 GMT-0700 (PDT)", + "shortText": "id commodo aute eu", + "mediumText": "Aliquip ut proident ad consequat proident velit magna. Non excepteur Lorem labore et fugiat quis laboris anim ut fugiat tempor consectetur laborum aute. Ullamco dolor nulla esse nisi aliquip fugiat fugiat dolor.", + "longText": "Elit ipsum voluptate laborum veniam cillum reprehenderit aliqua quis incididunt id excepteur. Reprehenderit qui fugiat nostrud quis. Ad nostrud amet do quis pariatur laborum in reprehenderit. Irure ipsum qui aute deserunt deserunt amet adipisicing eu dolor minim. Ad dolor aliquip quis sit nulla culpa nulla commodo aliqua non. Proident enim consequat elit tempor ut non est. Qui aliquip dolor ut consequat officia reprehenderit ea minim nisi cillum irure.\r\nCillum eu nisi consequat ipsum est aliqua cillum ad et laborum. Lorem incididunt occaecat ex ullamco et nostrud sint elit proident sunt adipisicing eu quis. Voluptate mollit sit sunt ad velit nisi commodo cupidatat. Nisi tempor nostrud minim magna id occaecat aliquip aute.\r\nEiusmod elit sit adipisicing reprehenderit nisi eiusmod incididunt eiusmod laboris mollit mollit do. Do aliqua adipisicing nostrud eu voluptate. Officia ut aliquip excepteur aute consequat sit pariatur amet id dolor.\r\nMagna cillum aliquip laborum anim aliquip in officia excepteur id dolore excepteur nostrud ullamco commodo. Excepteur enim anim esse occaecat quis cupidatat consectetur. Reprehenderit tempor fugiat laborum labore fugiat eiusmod quis.\r\n", + "address": "2 Verona Place", + "city": "Connerton", + "state": "Utah", + "zip": 18395, + "country": "Hungary", + "email": "dionnerusso@scentric.com", + "phone": "(890) 461-3250", + "color": "rgb(229,252,247)" + }, + { + "index": 446, + "name": "Schneider Small", + "first": "West", + "last": "Buckner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/eyronn/73.jpg", + "expanded": false, + "guid": "4fdfdfc4-3a77-47b8-acab-91a565572331", + "integer": 44, + "date": "Fri Jul 16 2004 09:13:39 GMT-0700 (PDT)", + "shortText": "sunt esse Lorem", + "mediumText": "Irure dolor minim dolore voluptate ut laborum Lorem nostrud nostrud voluptate nisi sunt culpa. Proident pariatur sit id occaecat do qui reprehenderit laboris exercitation qui ad.", + "longText": "Labore nostrud consequat laboris amet do sint pariatur. Commodo incididunt amet reprehenderit laboris enim eu nostrud ea velit. In nisi proident ullamco in deserunt elit labore. Irure exercitation ipsum officia sint magna tempor do et sit.\r\nMollit nulla aliquip pariatur excepteur dolore sint ipsum mollit qui consectetur id. In amet laborum ea deserunt duis ipsum dolor magna aliquip non ea reprehenderit proident. Excepteur labore dolore reprehenderit elit. Est commodo esse est ea. Amet cupidatat exercitation eiusmod id sit.\r\nAliqua dolor anim est in esse ex id ad incididunt mollit occaecat ad sint. Lorem dolore ipsum ad amet cillum excepteur sint anim pariatur. Ipsum consectetur irure dolore fugiat duis anim id. Esse non est id mollit quis proident qui ex labore sit. Consequat mollit veniam nisi irure cupidatat nostrud.\r\n", + "address": "2 Fuller Place", + "city": "Felt", + "state": "Idaho", + "zip": 83579, + "country": "Kenya", + "email": "westbuckner@scentric.com", + "phone": "(972) 592-3400", + "color": "rgb(90,160,183)" + }, + { + "index": 447, + "name": "Jones Fields", + "first": "Trujillo", + "last": "Morales", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/gulian/73.jpg", + "expanded": false, + "guid": "c09e1f92-8061-47f3-a5ae-13fe4589613e", + "integer": 97, + "date": "Wed Feb 14 2007 05:02:54 GMT-0800 (PST)", + "shortText": "tempor laborum commodo nostrud", + "mediumText": "Cillum nulla veniam ipsum exercitation nulla dolor anim in amet. Velit proident excepteur nisi et minim anim incididunt sit. Et sit eu eu est anim nulla. Ex consectetur fugiat cupidatat eiusmod in commodo cupidatat irure.", + "longText": "Aute ex exercitation nulla pariatur eu. Labore veniam amet voluptate occaecat consectetur consectetur nostrud laborum. Sit consequat nulla tempor culpa minim labore exercitation laboris incididunt sint. Dolor nisi quis id ullamco eu qui non ullamco esse amet irure dolor aute non. Ex exercitation irure ad laboris eiusmod non minim non anim ex in magna.\r\nCommodo ullamco excepteur culpa cillum incididunt. Ad nostrud est aliqua officia. Aliqua et laboris incididunt est. Irure reprehenderit ea ut minim culpa.\r\n", + "address": "3 Goodwin Place", + "city": "Lacomb", + "state": "Arkansas", + "zip": 64762, + "country": "Honduras", + "email": "trujillomorales@scentric.com", + "phone": "(908) 595-3540", + "color": "rgb(252,248,234)" + }, + { + "index": 448, + "name": "Ester Weber", + "first": "Eve", + "last": "Bonner", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/drebbits/73.jpg", + "expanded": false, + "guid": "daccfe7a-2e90-4485-b570-2ea85b7b196f", + "integer": 29, + "date": "Wed Aug 08 1979 00:51:20 GMT-0700 (PDT)", + "shortText": "qui", + "mediumText": "Magna dolore commodo aute ad excepteur ex proident non veniam proident irure dolore adipisicing deserunt. Anim mollit velit laboris velit labore pariatur. Non amet qui ut magna.", + "longText": "Cupidatat ea sit dolor eu sit tempor culpa magna. Ipsum excepteur nulla elit sit laboris dolor commodo. Deserunt aliquip officia minim sunt non sunt. Elit tempor consequat ullamco irure in ullamco. Ad do adipisicing sunt nisi eu veniam aliquip anim.\r\nAute ullamco incididunt dolore mollit fugiat deserunt adipisicing occaecat cupidatat sunt aute. Velit excepteur ullamco excepteur incididunt velit. Do adipisicing aute sint commodo qui adipisicing aliqua incididunt mollit. Adipisicing consectetur nulla consequat sunt nulla est sunt anim consequat ipsum ad dolor.\r\n", + "address": "4 Furman Avenue", + "city": "Devon", + "state": "Delaware", + "zip": 13560, + "country": "Eritrea", + "email": "evebonner@scentric.com", + "phone": "(993) 461-3721", + "color": "rgb(220,194,238)" + }, + { + "index": 449, + "name": "Jaclyn Bright", + "first": "Christy", + "last": "Graham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/alexhaniotis/73.jpg", + "expanded": false, + "guid": "3d5752b1-b775-4866-9151-376be7d53cdd", + "integer": 47, + "date": "Fri Oct 07 1994 14:59:41 GMT-0700 (PDT)", + "shortText": "ut minim in laboris officia", + "mediumText": "Esse mollit ad sunt incididunt labore dolore exercitation nostrud commodo minim nisi sit. Enim tempor tempor veniam culpa laboris incididunt sunt ex magna fugiat. Quis veniam adipisicing est sunt proident aliquip enim commodo sunt duis sint est nulla Lorem.", + "longText": "Sint aliquip qui aliqua ipsum magna eiusmod non ea exercitation non duis cupidatat officia. Proident esse mollit culpa excepteur irure consectetur consequat amet ipsum sit ut officia amet. Deserunt non in qui sit aliquip et irure et commodo mollit esse ullamco consequat. Commodo ea mollit incididunt ex anim labore sint eu sint sunt deserunt commodo irure ex. Magna reprehenderit voluptate anim commodo et excepteur amet nulla sint. Qui laboris qui et veniam eiusmod pariatur voluptate eiusmod ea occaecat cillum dolore velit magna.\r\nNostrud in esse est tempor minim ex fugiat qui Lorem. Non enim tempor amet consequat pariatur irure voluptate enim aliqua tempor exercitation. Lorem reprehenderit et deserunt velit deserunt pariatur elit et consectetur irure. Culpa velit aliquip sit sunt adipisicing exercitation. Eiusmod mollit consequat laboris non nostrud pariatur laborum quis anim consectetur veniam amet culpa esse. Consequat irure aute commodo incididunt tempor elit aliqua est reprehenderit sunt ex veniam id.\r\nProident eu cillum est eiusmod sint quis in eiusmod occaecat adipisicing quis tempor adipisicing ea. Adipisicing reprehenderit exercitation eu reprehenderit elit cupidatat nostrud pariatur. Veniam officia quis Lorem magna reprehenderit esse ipsum minim quis laborum reprehenderit.\r\n", + "address": "3 Kathleen Court", + "city": "Groveville", + "state": "Federated States Of Micronesia", + "zip": 97417, + "country": "Tajikistan", + "email": "christygraham@scentric.com", + "phone": "(943) 493-3287", + "color": "rgb(201,124,187)" + }, + { + "index": 450, + "name": "Burton Valdez", + "first": "Aurora", + "last": "Morse", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/twahlin/73.jpg", + "expanded": false, + "guid": "7ea797c6-ef0a-49c2-b043-2ca76a30e148", + "integer": 66, + "date": "Mon Jul 09 1984 05:20:31 GMT-0700 (PDT)", + "shortText": "officia", + "mediumText": "Nulla ut eiusmod consequat sunt est proident mollit elit laboris nulla ex Lorem tempor culpa.", + "longText": "Laborum labore ad cupidatat fugiat laborum proident mollit elit Lorem elit. Voluptate ex magna voluptate ex incididunt eiusmod dolor anim sit. Aliquip sint reprehenderit officia ex irure veniam aliquip laborum eu exercitation magna veniam enim. Minim culpa Lorem et sit. Velit aute elit et incididunt do velit mollit qui.\r\n", + "address": "2 Sheffield Avenue", + "city": "Sheatown", + "state": "Guam", + "zip": 73715, + "country": "Brunei Darussalam", + "email": "auroramorse@scentric.com", + "phone": "(866) 493-3254", + "color": "rgb(60,132,78)" + }, + { + "index": 451, + "name": "Sharpe Mccall", + "first": "Leanna", + "last": "Day", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ntfblog/73.jpg", + "expanded": false, + "guid": "241e6ae2-b23e-44bc-b8ed-aeb9d50f0395", + "integer": 7, + "date": "Sun Oct 27 2002 01:07:01 GMT-0700 (PDT)", + "shortText": "sit", + "mediumText": "Commodo commodo nostrud deserunt nostrud velit tempor culpa exercitation occaecat. Officia officia fugiat consectetur deserunt eu sunt ullamco commodo elit veniam nostrud dolore. Aute duis occaecat nisi culpa nulla laborum deserunt aliquip irure.", + "longText": "Qui do ex nostrud qui officia velit. Quis laborum aute nulla sint excepteur magna nisi est eu. Commodo qui id ex pariatur est sit. Do quis mollit minim consectetur exercitation. Elit reprehenderit labore minim laboris laborum adipisicing incididunt adipisicing. Ad reprehenderit enim reprehenderit sit.\r\nIpsum veniam nulla et enim. Consectetur sint laborum voluptate nulla non non eiusmod. Incididunt laborum voluptate voluptate cupidatat amet minim culpa sint laborum commodo. Ad mollit ea culpa sit fugiat.\r\nEx ex incididunt eu dolore laboris duis culpa duis magna eu minim sint. Ea sunt sunt mollit ut voluptate duis. Magna sit irure voluptate Lorem tempor consectetur eu aute sunt eiusmod deserunt laboris anim. Ut aliqua irure pariatur cillum eiusmod Lorem cupidatat qui mollit laborum excepteur irure. Officia voluptate aute officia incididunt deserunt velit enim sint anim mollit aliqua deserunt. Excepteur dolor irure sint quis nulla ipsum sint duis consectetur. Eiusmod id cillum exercitation veniam in anim tempor velit id culpa in.\r\nLabore amet non culpa ea in ullamco duis dolore cillum commodo laborum. In et elit ex aliqua commodo labore dolor proident et mollit. Dolor Lorem deserunt ipsum adipisicing sunt enim nulla ullamco. Enim ullamco ea irure sit elit cillum reprehenderit mollit voluptate enim aliquip ad officia.\r\nLaborum eiusmod esse sit excepteur duis. Quis magna cillum proident tempor qui ex sunt amet ex cillum id elit. Lorem sit cillum exercitation eu reprehenderit ea ex. Fugiat commodo irure elit est esse labore laboris do ullamco dolor. Adipisicing excepteur et culpa occaecat. Ea aute et deserunt quis laborum eiusmod et exercitation mollit excepteur duis nulla.\r\n", + "address": "2 Sapphire Street", + "city": "Delco", + "state": "Pennsylvania", + "zip": 99885, + "country": "Macedonia", + "email": "leannaday@scentric.com", + "phone": "(926) 463-2373", + "color": "rgb(219,81,203)" + }, + { + "index": 452, + "name": "Richmond Clayton", + "first": "Sherrie", + "last": "Robertson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/commoncentssss/73.jpg", + "expanded": false, + "guid": "dd129f81-2042-434a-9563-8047b70bad0a", + "integer": 45, + "date": "Sat Apr 07 2001 06:49:07 GMT-0700 (PDT)", + "shortText": "in", + "mediumText": "Adipisicing excepteur ad proident id veniam consectetur sit.", + "longText": "Amet commodo do aliquip ipsum sunt dolor id magna officia officia commodo minim. Qui duis occaecat in cillum ipsum pariatur excepteur officia velit incididunt exercitation irure mollit quis. Et cillum id velit elit et fugiat qui nisi officia incididunt voluptate cupidatat duis. Ut fugiat dolore eiusmod non ad aliquip labore sit proident. Duis amet aliqua deserunt commodo do anim quis elit excepteur. Sunt dolore magna dolore enim labore minim do enim anim officia cupidatat cupidatat. Aliqua anim veniam tempor sit incididunt quis ex ex laboris reprehenderit Lorem.\r\nExercitation irure tempor proident culpa. Ut enim culpa nulla ipsum consectetur enim eu dolor fugiat occaecat pariatur ex. Fugiat aliqua anim veniam aliquip irure nostrud adipisicing id. Tempor laborum enim excepteur ipsum dolore pariatur anim sit id qui duis duis sit duis. Dolore deserunt do est irure consectetur consequat ea aliqua veniam enim qui Lorem. Ipsum et nulla eiusmod Lorem et id anim aliquip. Velit mollit dolor non ullamco do aliqua qui mollit excepteur qui amet.\r\n", + "address": "4 Opal Court", + "city": "Dawn", + "state": "New Hampshire", + "zip": 25154, + "country": "French Polynesia", + "email": "sherrierobertson@scentric.com", + "phone": "(950) 518-2372", + "color": "rgb(116,89,161)" + }, + { + "index": 453, + "name": "Small Church", + "first": "Sylvia", + "last": "Terrell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anissa_anwar/73.jpg", + "expanded": false, + "guid": "5653dcb2-2ec5-4de9-93a5-534b963da42d", + "integer": 32, + "date": "Sat Mar 10 2001 07:02:05 GMT-0800 (PST)", + "shortText": "velit et non in sint", + "mediumText": "Commodo aute irure cillum laboris aliquip aute aliqua consequat qui esse do Lorem deserunt adipisicing. Velit esse nulla in do ut aliquip proident ut qui occaecat reprehenderit nisi. Velit tempor eu non in officia cupidatat fugiat culpa. Proident nostrud irure cupidatat quis enim nisi reprehenderit qui deserunt tempor eiusmod cupidatat nulla. Proident exercitation esse sint esse sunt qui ad magna eu do magna esse sunt nulla.", + "longText": "Consequat proident id laboris id labore ipsum officia officia non consectetur dolore esse cupidatat. In commodo et amet qui in et exercitation non eiusmod dolore sunt nostrud. Non quis fugiat Lorem amet voluptate excepteur. Proident officia labore aliquip sunt Lorem ex nulla fugiat incididunt. In dolore aute enim esse cupidatat commodo cupidatat commodo ipsum nulla. Officia dolore dolore eu reprehenderit.\r\nAd occaecat consequat adipisicing do eiusmod voluptate proident. Eu dolore aute aliqua cillum enim incididunt non adipisicing ipsum laborum sunt Lorem Lorem. Ex ad excepteur occaecat quis aliqua do nostrud irure in sunt aliqua amet. Commodo ea voluptate sit mollit nisi excepteur reprehenderit incididunt. Do cillum aliquip in eu.\r\n", + "address": "2 Wolcott Street", + "city": "Salix", + "state": "North Dakota", + "zip": 11231, + "country": "Bahamas", + "email": "sylviaterrell@scentric.com", + "phone": "(823) 424-2163", + "color": "rgb(216,232,199)" + }, + { + "index": 454, + "name": "Alyson Dudley", + "first": "Mckay", + "last": "Holmes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/btrig/73.jpg", + "expanded": false, + "guid": "c1a70e93-2f1c-402a-aafb-f66c1441b471", + "integer": 36, + "date": "Fri May 18 2001 01:24:33 GMT-0700 (PDT)", + "shortText": "veniam ipsum ullamco", + "mediumText": "Sunt culpa in consectetur tempor consectetur non eu ex elit aliquip incididunt eu cillum quis. Dolor laborum pariatur nulla nostrud culpa quis dolor ipsum deserunt fugiat non amet non. Magna sint sint ea voluptate nostrud consequat labore elit.", + "longText": "Enim ex consequat quis proident ipsum commodo labore dolore esse fugiat. Commodo sit eu ullamco incididunt ipsum. Qui officia eiusmod adipisicing dolor exercitation. Laborum occaecat proident deserunt dolore labore est in. Exercitation enim sunt reprehenderit est est. Ullamco dolor laborum ea quis aute aliqua.\r\nNulla sint in aliqua do minim aliqua voluptate enim deserunt occaecat esse excepteur. Qui est veniam proident anim fugiat velit qui aliqua eiusmod proident mollit. Qui velit est in consectetur ad esse consequat aute laborum. Amet cupidatat cupidatat et amet.\r\nDeserunt qui labore veniam irure eiusmod ad nisi anim non aliqua culpa ea consequat ea. Id sunt mollit minim qui sunt consequat in aliquip eu consectetur. Et nostrud velit excepteur in magna dolor elit. Reprehenderit nisi enim dolor amet ipsum in voluptate veniam voluptate consectetur aliquip. Quis sint duis ut dolor ea. Magna deserunt sunt aute quis veniam laboris aute ea ex velit irure cupidatat.\r\nQui qui labore voluptate velit ad eu mollit sit cillum non exercitation cillum aliqua. Quis tempor consectetur eiusmod aliqua id. Qui duis elit ut do nisi nostrud et ullamco mollit. Labore officia fugiat nisi dolore. Adipisicing in voluptate aliquip occaecat mollit anim pariatur occaecat sint aliqua. Anim esse adipisicing aliqua tempor sit elit deserunt sunt. Eiusmod consectetur anim ipsum est elit laborum magna consectetur id aliquip Lorem.\r\n", + "address": "3 Walker Court", + "city": "Wattsville", + "state": "Northern Mariana Islands", + "zip": 63152, + "country": "Palau", + "email": "mckayholmes@scentric.com", + "phone": "(951) 589-2723", + "color": "rgb(163,183,107)" + }, + { + "index": 455, + "name": "Curry Webb", + "first": "Sheena", + "last": "Wilkerson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/ug_rick/73.jpg", + "expanded": false, + "guid": "5fdb3b33-e4f6-42fd-9ef8-f5187a85f89a", + "integer": 86, + "date": "Sat Jun 12 1976 02:00:05 GMT-0700 (PDT)", + "shortText": "labore laborum", + "mediumText": "Nostrud nisi incididunt quis enim esse proident aliquip laboris. Velit officia quis amet cillum sint pariatur aliqua velit eiusmod. Adipisicing in nisi qui duis anim dolor laborum esse aute est ex amet sit.", + "longText": "Pariatur magna sit reprehenderit sint est non velit sint veniam. Laboris qui labore esse consequat tempor ut elit elit aliquip dolor duis tempor velit cupidatat. Consequat duis fugiat id excepteur. Duis veniam laboris est ut pariatur ullamco reprehenderit elit irure. Aute elit excepteur officia pariatur labore. Commodo sit officia ullamco reprehenderit sit exercitation ad consequat.\r\nEsse nostrud voluptate anim Lorem aute do tempor cupidatat do adipisicing magna commodo et dolore. Quis eiusmod velit est in laborum sit. Elit veniam ipsum id dolor. Labore eiusmod ex anim amet. Do velit cillum velit voluptate nostrud sint consequat ipsum ullamco do eiusmod sint. Reprehenderit minim reprehenderit et sunt aliqua nisi sint magna mollit aliquip. Esse esse labore minim cillum ut cupidatat dolor incididunt proident dolor.\r\nVoluptate aute anim commodo occaecat non voluptate magna. Laboris do quis laborum qui cillum qui commodo amet minim consectetur voluptate. Labore anim tempor sint ut. Tempor nisi sit officia Lorem.\r\nMinim consectetur ex velit nulla occaecat id sunt. Veniam laboris cupidatat reprehenderit ullamco eiusmod. Cupidatat velit non nulla amet aliqua fugiat aute ullamco nisi aliqua adipisicing exercitation quis proident. Ut ullamco dolor pariatur nisi excepteur occaecat commodo proident nisi minim est consequat.\r\nOccaecat aliquip duis duis deserunt cupidatat sint. Anim id et dolore labore nostrud ad Lorem sunt pariatur ad adipisicing. Qui enim nostrud officia adipisicing voluptate ea in nisi duis velit consectetur. Ut nisi voluptate dolor quis est anim in fugiat. Eu tempor dolore reprehenderit ut est aliqua elit in non velit velit. In adipisicing ullamco minim laboris incididunt enim voluptate ea minim sint dolor ut laborum amet. Aliquip est ut ipsum veniam.\r\n", + "address": "4 Lee Avenue", + "city": "Chamberino", + "state": "South Dakota", + "zip": 13592, + "country": "Tuvalu", + "email": "sheenawilkerson@scentric.com", + "phone": "(879) 403-2513", + "color": "rgb(118,194,142)" + }, + { + "index": 456, + "name": "Christian Snyder", + "first": "Lawanda", + "last": "Bradford", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/blakestevenson/73.jpg", + "expanded": false, + "guid": "bfb51aa2-d989-470d-97e5-64f04272b0ec", + "integer": 77, + "date": "Sat Jul 05 2014 23:12:53 GMT-0700 (PDT)", + "shortText": "quis ex et", + "mediumText": "Consectetur sit veniam excepteur Lorem commodo.", + "longText": "Qui dolor ut ipsum ex fugiat deserunt irure fugiat. Nisi anim culpa est non adipisicing ullamco dolore aute ex occaecat minim. Occaecat reprehenderit aliqua aute fugiat veniam officia cillum quis nostrud minim ullamco velit officia. Lorem ex labore magna qui velit commodo anim dolore veniam dolor et reprehenderit.\r\nDolor ad irure esse tempor commodo ullamco adipisicing dolore amet magna aliqua enim adipisicing. Laboris irure culpa est excepteur mollit magna consectetur id aliquip magna. Occaecat commodo elit pariatur reprehenderit eiusmod labore. Nisi aliquip minim est labore quis fugiat. Minim nulla Lorem dolore nostrud reprehenderit nulla mollit incididunt anim adipisicing.\r\n", + "address": "4 Newport Street", + "city": "Indio", + "state": "Alaska", + "zip": 48616, + "country": "Liechtenstein", + "email": "lawandabradford@scentric.com", + "phone": "(888) 481-3858", + "color": "rgb(247,122,60)" + }, + { + "index": 457, + "name": "Contreras Jenkins", + "first": "Lester", + "last": "Garrett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/karalek/73.jpg", + "expanded": false, + "guid": "0618babd-91c3-4050-8bf8-5d1f94383568", + "integer": 14, + "date": "Fri Mar 31 1972 00:34:05 GMT-0800 (PST)", + "shortText": "commodo aliqua", + "mediumText": "Ullamco commodo consequat id officia duis duis amet quis incididunt consectetur consequat laboris ex dolore. Aliquip dolore cupidatat sit aliqua dolore sit irure reprehenderit anim nulla adipisicing est. Cupidatat et fugiat minim exercitation eiusmod est esse eiusmod proident.", + "longText": "Qui cillum ipsum amet adipisicing veniam Lorem ullamco. Aute ea sunt veniam nisi laboris cupidatat officia minim. Consectetur deserunt cupidatat fugiat deserunt mollit mollit. Elit magna consequat qui tempor in non velit ea cillum tempor non. Consectetur est mollit aliqua adipisicing elit cillum consequat duis enim. Reprehenderit in et dolor nulla duis.\r\nEsse cillum Lorem veniam officia voluptate eu tempor. Consectetur dolore fugiat proident duis ullamco dolore occaecat dolore sit. Consequat commodo fugiat dolor minim elit elit laborum elit do. Exercitation occaecat exercitation cillum eu occaecat sit sit magna voluptate dolor aliqua ad commodo esse. Cillum fugiat excepteur sunt incididunt nisi.\r\nLabore aute eiusmod aute ullamco sunt sint nisi aute laboris reprehenderit duis qui incididunt labore. Sint occaecat sint id esse. Consectetur pariatur minim proident do magna mollit veniam dolore commodo et officia adipisicing commodo pariatur. Consequat eu id pariatur occaecat eu nostrud proident enim eu. Id cillum consequat aliquip reprehenderit. Adipisicing Lorem eu et veniam aliquip pariatur commodo culpa anim adipisicing commodo labore. Qui adipisicing incididunt in eiusmod.\r\n", + "address": "4 Morton Street", + "city": "Yonah", + "state": "Louisiana", + "zip": 53661, + "country": "Virgin Islands (US)", + "email": "lestergarrett@scentric.com", + "phone": "(972) 517-3113", + "color": "rgb(239,120,56)" + }, + { + "index": 458, + "name": "Holly Jackson", + "first": "Susie", + "last": "Watkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elusiveanmol/73.jpg", + "expanded": false, + "guid": "2a001ee1-bb06-41ce-ba9b-334ce428a78e", + "integer": 45, + "date": "Tue Aug 24 1993 08:13:13 GMT-0700 (PDT)", + "shortText": "qui ex deserunt veniam enim", + "mediumText": "Dolore deserunt proident ex non ullamco amet esse cillum adipisicing adipisicing tempor sunt dolore. Amet mollit velit enim qui elit nostrud duis quis duis deserunt ut quis minim incididunt. Proident duis laboris sunt esse laborum duis officia esse irure esse. Cupidatat incididunt labore pariatur mollit. Sint officia aliquip adipisicing sint id et officia nulla.", + "longText": "Officia labore fugiat tempor sint est labore aliqua quis nisi labore adipisicing. Deserunt occaecat occaecat cupidatat occaecat. Minim consequat nisi non reprehenderit tempor. Irure nulla minim veniam laboris ut duis adipisicing. Occaecat culpa cillum magna sint nisi sit ex. Reprehenderit quis aliqua officia ipsum dolor irure nulla ipsum ex.\r\nIpsum proident esse tempor in ut proident reprehenderit reprehenderit fugiat pariatur reprehenderit cillum. Ipsum ipsum velit labore id do sint. Ea velit tempor cillum officia qui elit id excepteur. Fugiat laboris amet ullamco et dolor. Enim ut id fugiat qui. Sunt anim pariatur nisi fugiat ex. In ipsum nulla officia ipsum ex aliquip ad cupidatat aliqua amet adipisicing anim in amet.\r\nMagna pariatur nisi occaecat veniam reprehenderit esse dolor aliqua culpa labore. Elit do aliquip est magna culpa officia id pariatur id commodo non officia incididunt proident. Quis consequat laborum consectetur nostrud magna amet irure do irure ipsum culpa reprehenderit. Exercitation elit magna irure mollit cillum velit ullamco tempor ex.\r\nIpsum mollit reprehenderit elit aliqua nulla laborum dolor voluptate commodo ipsum laboris. Elit ut enim tempor elit nisi tempor ipsum. Ullamco velit incididunt elit aliqua amet commodo amet dolore dolore fugiat id.\r\n", + "address": "3 Beard Street", + "city": "Sterling", + "state": "Missouri", + "zip": 70724, + "country": "Svalbard and Jan Mayen Islands", + "email": "susiewatkins@scentric.com", + "phone": "(837) 537-2963", + "color": "rgb(172,67,201)" + }, + { + "index": 459, + "name": "Josefina Gonzales", + "first": "Erickson", + "last": "Bennett", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/shoo7830/73.jpg", + "expanded": false, + "guid": "88320e02-8633-4df8-a096-8b6cd39d0786", + "integer": 31, + "date": "Tue Jul 27 2010 06:12:05 GMT-0700 (PDT)", + "shortText": "proident nostrud", + "mediumText": "Cupidatat officia duis do sunt veniam voluptate exercitation. Ea excepteur tempor magna fugiat Lorem adipisicing dolor sit amet sunt aute laboris. Ea sunt fugiat ad commodo amet elit elit minim nostrud occaecat magna. Incididunt ea do id id laboris magna do ea. Eu duis amet cupidatat proident culpa deserunt.", + "longText": "Lorem ipsum culpa voluptate labore consectetur reprehenderit anim duis fugiat anim consequat tempor officia. Occaecat culpa tempor ad ea excepteur ad enim incididunt. Adipisicing commodo elit nisi magna incididunt. Ea est occaecat et dolor reprehenderit fugiat est id dolore. Culpa commodo ullamco est voluptate ad mollit sunt deserunt. Pariatur tempor excepteur laborum ex ea ea consectetur enim ut ad sunt nulla.\r\n", + "address": "4 Malbone Street", + "city": "Eagletown", + "state": "Kentucky", + "zip": 72696, + "country": "Ethiopia", + "email": "ericksonbennett@scentric.com", + "phone": "(937) 528-2434", + "color": "rgb(132,110,89)" + }, + { + "index": 460, + "name": "Sybil Boyle", + "first": "Rosetta", + "last": "Joseph", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/oanacr/73.jpg", + "expanded": false, + "guid": "3cf8b3eb-9567-4dbe-ad09-b792ef4b7f81", + "integer": 86, + "date": "Thu Aug 06 1992 04:15:43 GMT-0700 (PDT)", + "shortText": "reprehenderit", + "mediumText": "Consectetur irure ut minim proident laboris. Ea est et mollit voluptate aliquip qui enim incididunt nisi magna sunt tempor nulla. Pariatur officia id velit laborum quis id tempor cillum aliquip dolore sunt eiusmod enim. Elit id cillum occaecat sit exercitation fugiat eiusmod fugiat sunt cillum. Incididunt magna aliqua cupidatat fugiat voluptate nostrud voluptate.", + "longText": "Qui sunt irure veniam occaecat commodo sint labore nostrud qui do mollit. Non enim anim elit aute incididunt. Voluptate qui ullamco in sit cillum consectetur voluptate commodo. Non laboris anim minim anim nisi duis consectetur ad aute nisi nostrud. Id quis dolor consequat consequat nostrud ullamco dolore enim labore ipsum ipsum do voluptate aute.\r\nNisi dolor dolor elit veniam sint nisi eu officia incididunt ut labore elit id eu. Fugiat magna ex esse consectetur excepteur occaecat deserunt eiusmod ullamco ullamco do incididunt. Labore ad anim occaecat ullamco pariatur proident duis commodo. Quis reprehenderit consectetur exercitation fugiat dolor anim laboris dolor eu cupidatat adipisicing adipisicing Lorem. Ad voluptate officia pariatur ipsum Lorem ex aute sit non officia officia sint. Veniam aliqua labore ut enim in incididunt sit aute culpa magna officia ex officia nisi.\r\nNostrud incididunt consectetur nulla voluptate pariatur qui excepteur amet incididunt cupidatat culpa laboris sint. Sunt Lorem aute proident in velit ipsum. Magna fugiat veniam excepteur esse eiusmod sint cillum aute deserunt. Mollit magna quis excepteur in ex irure sit ea proident magna enim.\r\nConsectetur nisi culpa mollit eu in do consectetur sunt ad aliqua. Esse laboris adipisicing Lorem aute reprehenderit Lorem excepteur nisi id cupidatat aliqua cupidatat occaecat sit. Lorem Lorem ad ullamco quis reprehenderit nostrud elit enim ullamco incididunt. Culpa tempor consectetur exercitation velit consequat consequat dolore excepteur elit qui tempor est excepteur.\r\n", + "address": "4 Harman Street", + "city": "Sylvanite", + "state": "American Samoa", + "zip": 13569, + "country": "Togo", + "email": "rosettajoseph@scentric.com", + "phone": "(981) 470-3813", + "color": "rgb(209,237,158)" + }, + { + "index": 461, + "name": "Case Decker", + "first": "Santos", + "last": "Rice", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/elamyr/73.jpg", + "expanded": false, + "guid": "bf49a638-bbff-435c-9756-52b76f67815d", + "integer": 66, + "date": "Tue Apr 29 2003 07:40:21 GMT-0700 (PDT)", + "shortText": "ullamco aliqua sunt fugiat", + "mediumText": "Mollit Lorem exercitation cupidatat occaecat eiusmod qui. Magna et reprehenderit labore in. Excepteur ad enim aliqua aute ullamco cupidatat esse. Officia quis qui sunt nisi ipsum eu deserunt nulla fugiat magna sunt et quis pariatur. Voluptate cillum nostrud aliqua minim nulla minim dolore labore magna.", + "longText": "Laboris amet irure aute ipsum anim irure quis elit Lorem enim non id officia. Qui quis fugiat do esse. Eiusmod anim quis magna deserunt labore proident ullamco consequat cupidatat velit laboris ut aute. Quis excepteur ullamco officia ad reprehenderit. Irure occaecat reprehenderit ad consequat id laborum amet nisi tempor eu laboris. Irure sit cillum proident occaecat in ipsum. Quis esse officia sunt sunt anim ullamco ad amet ullamco Lorem.\r\nReprehenderit excepteur est officia consequat ea cupidatat excepteur sunt id ad adipisicing occaecat magna minim. Exercitation quis irure nostrud irure eiusmod laborum pariatur fugiat commodo id velit culpa reprehenderit id. Commodo mollit aute esse laboris fugiat pariatur mollit voluptate nulla. Commodo esse proident anim aliqua et duis exercitation cupidatat incididunt est laborum incididunt laborum. Aliqua est aute qui ullamco sunt ut cillum commodo cupidatat. Est sint est id consectetur ad duis duis culpa fugiat sit sit id aute. Dolor occaecat non cillum amet proident cupidatat laboris.\r\nIn sit non nostrud labore laboris commodo sit ea nisi commodo irure reprehenderit nostrud reprehenderit. Nostrud ad velit enim magna esse adipisicing. Labore occaecat anim irure magna sit duis ullamco exercitation ipsum mollit. Laboris irure ipsum occaecat ea anim id sunt irure deserunt eu et. Incididunt ex fugiat Lorem aliquip. Anim ea duis duis aliquip ex. Qui Lorem officia cillum nisi irure Lorem.\r\n", + "address": "3 Suydam Street", + "city": "Waumandee", + "state": "Minnesota", + "zip": 74848, + "country": "Zimbabwe", + "email": "santosrice@scentric.com", + "phone": "(890) 599-3600", + "color": "rgb(95,54,177)" + }, + { + "index": 462, + "name": "Snider Monroe", + "first": "Jensen", + "last": "Atkins", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hmenchaca2/73.jpg", + "expanded": false, + "guid": "f24bb864-fe55-4bd6-9144-5bc756f08b1c", + "integer": 74, + "date": "Mon Sep 14 1981 09:51:33 GMT-0700 (PDT)", + "shortText": "eu", + "mediumText": "Laboris proident ullamco ipsum ea ullamco non minim id dolore ad labore. Culpa cillum nostrud deserunt ea in sunt eu ex. Est ullamco sint nulla irure anim velit in. Do sint id exercitation labore do adipisicing.", + "longText": "Non labore culpa laborum fugiat nostrud sunt labore id duis ullamco aliquip exercitation sint. Ex nisi duis nostrud consequat occaecat. Cupidatat dolore occaecat do ea ut ex amet duis mollit magna et commodo aliquip fugiat. Nostrud ut tempor est voluptate sunt enim. Labore commodo consequat ad fugiat.\r\nAute consequat enim ut esse laboris excepteur est nisi laboris veniam esse veniam Lorem Lorem. Aliquip aliquip laboris sit quis. Lorem id ipsum et eiusmod aliqua tempor ipsum cupidatat Lorem anim ipsum aute do consectetur.\r\n", + "address": "3 Boerum Street", + "city": "Crucible", + "state": "Hawaii", + "zip": 89416, + "country": "Azerbaijan", + "email": "jensenatkins@scentric.com", + "phone": "(839) 445-3763", + "color": "rgb(116,98,175)" + }, + { + "index": 463, + "name": "Calderon Pugh", + "first": "Monroe", + "last": "Travis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dparrelli/73.jpg", + "expanded": false, + "guid": "c9c9f502-618c-4896-b09e-c4d5fb42384c", + "integer": 81, + "date": "Sat Jan 21 1978 16:37:46 GMT-0800 (PST)", + "shortText": "commodo aliqua ullamco mollit excepteur", + "mediumText": "Consequat et ad nulla id velit officia aliqua nulla eu anim sit magna. Enim in ad Lorem consequat amet nisi magna pariatur in in proident esse mollit sit.", + "longText": "In ut dolore enim ullamco non culpa ea voluptate. Enim Lorem est labore magna reprehenderit laboris amet aliqua sint eiusmod cupidatat amet. Non sit eu quis minim ut. Ex mollit qui aliqua quis adipisicing consectetur esse adipisicing sunt ex tempor. Ad mollit in laboris amet occaecat cupidatat eiusmod id. Aliqua sint pariatur proident ad laboris consequat nostrud quis dolore laborum. Excepteur ipsum ea veniam minim dolore nostrud veniam et voluptate cupidatat elit.\r\nEnim laborum dolore ullamco veniam. Mollit nostrud eu occaecat eu qui laborum sit reprehenderit excepteur amet magna tempor sunt et. Nostrud pariatur qui reprehenderit Lorem amet ullamco sint sint commodo cupidatat est sint officia ea. Ut ut dolore eiusmod magna occaecat incididunt minim consequat quis dolor et duis sunt.\r\n", + "address": "3 Hawthorne Street", + "city": "Coalmont", + "state": "Alabama", + "zip": 60080, + "country": "French Southern Territories", + "email": "monroetravis@scentric.com", + "phone": "(806) 479-3754", + "color": "rgb(93,63,172)" + }, + { + "index": 464, + "name": "Colleen Haley", + "first": "Conley", + "last": "Stanley", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/okansurreel/73.jpg", + "expanded": false, + "guid": "05acd8c3-414b-4b60-ac92-b0b7eba4e0c3", + "integer": 42, + "date": "Mon Mar 02 2009 03:09:26 GMT-0800 (PST)", + "shortText": "enim ad", + "mediumText": "Esse tempor voluptate aliqua culpa laborum pariatur cillum sint reprehenderit adipisicing. Elit esse anim sint duis voluptate nostrud culpa proident esse fugiat Lorem velit ut. Nostrud officia dolore voluptate proident eu ex consequat ipsum ad velit nisi laborum ea. Laboris in consequat elit et in ut. Qui ex ea reprehenderit sit dolor eiusmod minim deserunt.", + "longText": "Est dolor Lorem consequat excepteur excepteur nisi enim velit. Tempor velit veniam tempor cillum ea dolore est deserunt anim ex. Enim non id proident officia fugiat amet laborum veniam ullamco dolor est consequat incididunt occaecat. Enim culpa qui ipsum est. Amet sunt consectetur reprehenderit aute excepteur quis consequat minim tempor ullamco.\r\nEt ad aute non ut magna mollit sunt dolore laborum. Elit voluptate anim mollit est consequat officia laborum ad officia eu. Irure quis qui ipsum pariatur commodo commodo proident amet deserunt ut ea officia voluptate elit. Nulla Lorem voluptate commodo minim veniam dolore irure nulla excepteur ipsum eu pariatur. Ipsum amet commodo velit cillum. Laborum esse enim laboris sit esse labore quis proident sint officia ea Lorem.\r\nEnim quis enim consectetur elit ex duis. Tempor culpa labore excepteur mollit ea enim non reprehenderit fugiat elit laborum ea. Occaecat dolore excepteur adipisicing incididunt excepteur esse fugiat pariatur ut labore id consequat aliqua sunt. Elit est irure nisi labore quis magna consequat eiusmod culpa voluptate fugiat excepteur pariatur Lorem. Laboris magna irure consequat enim incididunt consectetur aute. Amet aliquip occaecat laboris ea. Fugiat ea non qui culpa pariatur quis nostrud commodo.\r\nDolore non do dolor culpa enim. Elit reprehenderit voluptate cupidatat fugiat. Aute enim occaecat nostrud cillum commodo mollit voluptate in esse labore fugiat. In nulla sit ullamco nisi velit. Et nostrud qui dolore ad laboris excepteur minim esse quis qui pariatur irure eu exercitation. Commodo labore in ex sint occaecat sint id esse reprehenderit commodo voluptate. Enim nostrud anim id velit id officia laborum deserunt laboris nostrud.\r\nNon excepteur exercitation eiusmod dolor laborum nulla laborum irure adipisicing id. Lorem cillum aliqua eu enim exercitation. Proident incididunt irure exercitation amet ad occaecat.\r\n", + "address": "2 Knapp Street", + "city": "Shindler", + "state": "North Carolina", + "zip": 55329, + "country": "Finland", + "email": "conleystanley@scentric.com", + "phone": "(887) 439-2117", + "color": "rgb(90,231,64)" + }, + { + "index": 465, + "name": "Barry Andrews", + "first": "Leona", + "last": "Nash", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lwilsonsmith/73.jpg", + "expanded": false, + "guid": "d6109791-de8e-41c5-9d94-00e69ae0b6e5", + "integer": 45, + "date": "Sun Jan 10 2010 12:46:09 GMT-0800 (PST)", + "shortText": "laborum", + "mediumText": "Commodo eiusmod do fugiat nostrud laborum id incididunt nulla. Tempor amet nostrud commodo id occaecat veniam. Ad ea eu eiusmod minim nostrud deserunt adipisicing reprehenderit ut ea occaecat.", + "longText": "Pariatur ea veniam fugiat officia incididunt aliquip occaecat commodo. Enim anim officia aliquip eu. Occaecat nostrud veniam laboris in Lorem excepteur laboris laborum duis laboris incididunt. Eu proident incididunt sint nostrud reprehenderit esse duis exercitation et ipsum exercitation consectetur aliquip Lorem.\r\nAdipisicing non nisi consectetur est consectetur ullamco enim dolore. Commodo eu Lorem consectetur esse. Cillum eiusmod incididunt exercitation elit labore duis esse. Adipisicing occaecat aliquip adipisicing pariatur laborum aute laboris velit incididunt amet. Nulla aliqua id ex velit consequat ex mollit minim Lorem. Irure anim ad laboris ullamco minim et consectetur adipisicing sunt sint in.\r\nEx magna excepteur esse consequat ex commodo commodo. Commodo non incididunt consequat consequat mollit duis quis Lorem non adipisicing pariatur incididunt ex nulla. Ex ut in laboris labore consequat mollit. Sint ex minim adipisicing velit cupidatat id anim excepteur nostrud consectetur proident. Commodo minim eiusmod veniam pariatur laboris cupidatat. Labore ullamco consequat velit ad consequat occaecat et tempor dolore ut sint esse ullamco amet.\r\nQui officia laborum laborum laborum. Ipsum Lorem ipsum sunt tempor exercitation dolore. Dolore reprehenderit do sit nulla dolor ea incididunt do id esse. Consectetur nulla enim ipsum velit reprehenderit non irure non.\r\n", + "address": "4 Highland Avenue", + "city": "Innsbrook", + "state": "Connecticut", + "zip": 62850, + "country": "United Arab Emirates", + "email": "leonanash@scentric.com", + "phone": "(892) 484-3082", + "color": "rgb(232,187,145)" + }, + { + "index": 466, + "name": "Lynette Shepard", + "first": "Walls", + "last": "Baxter", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/klimmka/73.jpg", + "expanded": false, + "guid": "f477123a-40c0-4cb9-8d64-cbf4c127e7bf", + "integer": 54, + "date": "Tue May 06 2008 02:57:35 GMT-0700 (PDT)", + "shortText": "officia ea ullamco", + "mediumText": "Do deserunt aute duis non proident commodo occaecat do reprehenderit eu aliqua est aliqua dolor. Culpa do laboris eiusmod do eiusmod enim irure ex nostrud. Dolor eiusmod enim pariatur duis non sunt quis dolor. Cupidatat aliqua ut cillum adipisicing non. Eiusmod labore in aliquip dolore magna cillum aliqua mollit irure.", + "longText": "Sunt consequat eiusmod qui irure ex excepteur culpa. Consectetur nostrud exercitation aliquip ex dolore quis. Mollit esse et non cupidatat proident eu voluptate et dolor pariatur fugiat. Amet qui ut quis do voluptate eu dolor enim tempor adipisicing.\r\nExercitation laboris pariatur deserunt laborum irure tempor ullamco id sit adipisicing nisi enim. Do amet consectetur ullamco culpa laborum dolor ut amet sit. Exercitation magna incididunt consectetur laborum excepteur. Laboris tempor ad sint esse ipsum irure culpa eiusmod labore cillum ad fugiat magna magna. Quis ut magna labore sunt laborum nostrud excepteur exercitation aliqua do aliqua velit esse pariatur. Aliqua Lorem qui proident aliqua culpa voluptate non officia.\r\nIncididunt do sunt ex dolor aute ut anim nisi nisi et fugiat. Id pariatur do aliqua ullamco fugiat eu irure reprehenderit ea sint excepteur. Minim aliquip culpa ea nulla aliqua id pariatur culpa ut deserunt magna. Laboris eiusmod ad eu fugiat id adipisicing occaecat qui tempor culpa aute ipsum in. Ea sit veniam dolore consectetur non cupidatat velit fugiat cillum. Cillum labore id labore fugiat consequat consequat cillum laboris amet velit adipisicing ipsum pariatur. Pariatur in irure ipsum consectetur laborum esse labore sint esse occaecat irure.\r\nDolore dolor esse esse ut labore anim deserunt tempor id reprehenderit irure veniam pariatur exercitation. Proident incididunt non ad Lorem est eiusmod aute elit qui Lorem enim. Mollit magna Lorem laboris excepteur occaecat consectetur tempor commodo irure. Sunt in eiusmod ullamco ad commodo laboris Lorem Lorem ullamco cupidatat. Lorem culpa ea do voluptate voluptate exercitation nulla. Officia adipisicing ullamco nisi officia laboris reprehenderit et ipsum. Dolor excepteur duis anim exercitation quis culpa culpa anim eiusmod ex laborum cillum.\r\nDo pariatur ad laborum occaecat labore occaecat amet non. Consequat non sit ullamco nulla cupidatat officia qui duis. Laborum duis ad velit eiusmod ea eu. Tempor incididunt tempor eiusmod duis.\r\n", + "address": "2 Forest Place", + "city": "Sabillasville", + "state": "South Carolina", + "zip": 36003, + "country": "Portugal", + "email": "wallsbaxter@scentric.com", + "phone": "(910) 431-2449", + "color": "rgb(74,195,121)" + }, + { + "index": 467, + "name": "Vega Dickson", + "first": "Bishop", + "last": "Stout", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_kalibry/73.jpg", + "expanded": false, + "guid": "c40dd867-a925-4993-a4f1-e7e411637845", + "integer": 69, + "date": "Sun May 04 2008 00:14:56 GMT-0700 (PDT)", + "shortText": "sit sunt", + "mediumText": "Adipisicing sit cillum nostrud nostrud commodo. Sunt labore veniam dolor enim nostrud deserunt. Consectetur est aute laboris aliqua. Sit velit ad dolore cupidatat nisi nisi nostrud minim in est.", + "longText": "Labore esse occaecat commodo pariatur consectetur Lorem. Et minim sint in laborum. Do laborum nulla culpa ex dolor ipsum ut excepteur id deserunt ad quis aliquip. Ipsum proident amet cupidatat labore veniam aliquip ipsum laboris. Incididunt sunt excepteur non ut pariatur aute. Duis exercitation cillum cillum do nostrud minim. Labore eiusmod eiusmod voluptate consectetur id.\r\n", + "address": "3 Seeley Street", + "city": "Westmoreland", + "state": "Michigan", + "zip": 41497, + "country": "Comoros", + "email": "bishopstout@scentric.com", + "phone": "(988) 498-2056", + "color": "rgb(228,157,219)" + }, + { + "index": 468, + "name": "Noelle Mosley", + "first": "Barnes", + "last": "Bowen", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/dhoot_amit/73.jpg", + "expanded": false, + "guid": "987c2384-3ee6-442a-859a-8839de50f5b6", + "integer": 90, + "date": "Thu Feb 26 2009 03:38:03 GMT-0800 (PST)", + "shortText": "voluptate", + "mediumText": "Lorem enim in incididunt proident commodo adipisicing laborum ut. Magna velit nostrud ipsum velit occaecat. Laborum duis reprehenderit reprehenderit id elit aute est occaecat nostrud exercitation reprehenderit esse. Reprehenderit adipisicing laborum laboris culpa magna commodo ullamco amet dolore.", + "longText": "Commodo occaecat magna consectetur esse culpa. Sunt ea adipisicing dolore laboris adipisicing officia proident culpa adipisicing et. Duis reprehenderit sunt proident sint exercitation enim irure esse voluptate mollit irure sint. Occaecat non amet nisi nisi Lorem duis aute incididunt nostrud elit veniam adipisicing proident. Fugiat id nostrud Lorem veniam aliquip Lorem occaecat ea nulla veniam. Sit amet laboris consequat esse excepteur dolore minim.\r\nAliqua ut dolor ex esse laboris consectetur incididunt. Dolore in commodo duis et enim consectetur eiusmod anim sit officia. Eu ut excepteur labore mollit sunt aliqua culpa sunt deserunt eiusmod.\r\nVeniam occaecat reprehenderit magna nisi elit deserunt. Dolore ullamco nisi aute excepteur aliquip aliquip duis eu laboris eu exercitation tempor. Lorem anim commodo esse fugiat enim aliquip aliqua consequat ullamco non aute magna veniam qui. Esse enim eu dolor aliqua pariatur culpa ea.\r\n", + "address": "2 Barwell Terrace", + "city": "Norvelt", + "state": "Maine", + "zip": 82709, + "country": "Central African Republic", + "email": "barnesbowen@scentric.com", + "phone": "(874) 465-2581", + "color": "rgb(201,251,62)" + }, + { + "index": 469, + "name": "Parrish Fowler", + "first": "Glenna", + "last": "Gaines", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/actionsmile/73.jpg", + "expanded": false, + "guid": "82d27516-08d2-4a84-9d5c-ed237bcbbee1", + "integer": 75, + "date": "Sun Oct 29 2000 13:21:37 GMT-0800 (PST)", + "shortText": "aliqua magna ad", + "mediumText": "In qui do velit aliquip voluptate duis eu in deserunt officia fugiat exercitation irure do.", + "longText": "Qui dolor nisi adipisicing mollit laboris velit ad sunt. Magna do esse nostrud excepteur aliqua duis ea cupidatat ut. Nostrud dolore laborum id incididunt duis consectetur sint amet aliqua aliquip elit laborum minim. Proident in anim sunt enim in commodo occaecat magna. Magna est excepteur duis laboris laborum anim esse aute Lorem adipisicing.\r\nAnim voluptate minim adipisicing irure sit ipsum. Dolor dolore velit quis eu. Ex sit ex consequat minim consequat nisi aliqua incididunt voluptate incididunt id anim irure. Velit sit aliquip incididunt do commodo officia enim excepteur ut nisi laborum culpa anim. Ea sint fugiat quis nulla do. Tempor deserunt reprehenderit veniam pariatur velit velit labore culpa ut consequat reprehenderit ipsum. Eu reprehenderit ut excepteur do velit occaecat duis.\r\n", + "address": "2 Dare Court", + "city": "Muse", + "state": "Kansas", + "zip": 37729, + "country": "Gabon", + "email": "glennagaines@scentric.com", + "phone": "(819) 430-2612", + "color": "rgb(196,125,143)" + }, + { + "index": 470, + "name": "Booth Goodman", + "first": "Kathrine", + "last": "Curtis", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/craftified/73.jpg", + "expanded": false, + "guid": "15c7abe9-175a-412b-b120-6bd621022908", + "integer": 6, + "date": "Sat Mar 28 1992 21:26:09 GMT-0800 (PST)", + "shortText": "proident reprehenderit", + "mediumText": "Deserunt id occaecat reprehenderit sint ea reprehenderit mollit eiusmod ea. Sint velit voluptate non Lorem deserunt dolore voluptate enim sunt laborum ad ullamco reprehenderit enim. Excepteur pariatur veniam amet qui in culpa magna. Commodo sit ad veniam deserunt excepteur aute laborum incididunt laborum ut.", + "longText": "Dolor do est occaecat ut ipsum nulla est anim minim voluptate incididunt officia dolor. Adipisicing in id sunt cillum nisi laborum cillum amet laborum aute consectetur. Officia sit dolor elit consequat adipisicing magna magna eu do non pariatur velit dolore ipsum.\r\nReprehenderit Lorem mollit irure laborum voluptate aute. Tempor enim nulla aliquip Lorem id dolor exercitation Lorem minim cupidatat irure et ipsum. Aliqua aute mollit culpa non ex labore quis eu do esse. In laborum adipisicing voluptate culpa pariatur ad et adipisicing. Ut eiusmod esse proident reprehenderit magna ut in nisi cillum sunt consequat pariatur. Consequat enim eiusmod fugiat magna nulla veniam nostrud veniam Lorem adipisicing amet consequat labore. Occaecat duis ad esse sint et cupidatat consequat culpa sint pariatur officia quis.\r\nCulpa id sit qui ea incididunt laboris laboris nisi voluptate nostrud. Enim in voluptate cillum dolore irure occaecat cupidatat pariatur ad elit excepteur. Lorem anim reprehenderit aliqua ipsum officia esse quis incididunt sint sunt esse. Deserunt culpa cillum nulla eiusmod incididunt est exercitation do ea. Voluptate magna occaecat excepteur incididunt tempor occaecat exercitation ad incididunt cupidatat dolor occaecat voluptate.\r\n", + "address": "3 Interborough Parkway", + "city": "Bethany", + "state": "Iowa", + "zip": 27481, + "country": "Cambodia", + "email": "kathrinecurtis@scentric.com", + "phone": "(857) 508-2561", + "color": "rgb(174,52,167)" + }, + { + "index": 471, + "name": "Benton Waters", + "first": "Marietta", + "last": "Cantu", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/aleksitappura/73.jpg", + "expanded": false, + "guid": "f166dfbf-b1f4-4bbf-8d31-7979b09bc29c", + "integer": 84, + "date": "Sat Aug 15 1970 03:51:29 GMT-0700 (PDT)", + "shortText": "ipsum", + "mediumText": "Commodo duis laborum ut aliqua et nostrud incididunt. Cillum et sint do pariatur quis non ex duis deserunt esse eiusmod nulla aliqua id. Consequat amet cupidatat ea non ea ipsum Lorem nulla ut ipsum aliqua eiusmod do nostrud. Quis elit est esse officia.", + "longText": "In magna quis duis et. Veniam consectetur dolor excepteur aute sit minim aute aute ipsum dolor id sint quis. Ex aute Lorem commodo sit et qui esse nulla excepteur tempor. Cillum consectetur nulla consequat nisi elit ex labore. Ex officia labore sunt exercitation aliquip culpa elit commodo fugiat aute ut. Id velit velit sunt qui aliquip laborum nulla ea sit in commodo.\r\nPariatur commodo excepteur aliquip voluptate esse do velit do deserunt. Laboris anim deserunt laborum duis cillum aliqua esse cillum sunt. Ad fugiat nostrud amet sunt ipsum. Laborum deserunt qui eiusmod consequat.\r\nIrure qui enim voluptate laboris ex ad esse irure sunt officia aliquip do elit esse. Eu do commodo in excepteur ad. Aliquip nulla Lorem nisi sunt quis ex in eu fugiat minim elit consectetur occaecat.\r\n", + "address": "3 Falmouth Street", + "city": "Manchester", + "state": "Vermont", + "zip": 34619, + "country": "New Zealand", + "email": "mariettacantu@scentric.com", + "phone": "(932) 598-2276", + "color": "rgb(156,114,200)" + }, + { + "index": 472, + "name": "Lambert Spears", + "first": "Harding", + "last": "Woodward", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/nicollerich/73.jpg", + "expanded": false, + "guid": "32d3c3aa-0997-4d88-b2e7-9b28713b91bd", + "integer": 85, + "date": "Fri Feb 10 2006 11:58:14 GMT-0800 (PST)", + "shortText": "ullamco enim aliquip amet veniam", + "mediumText": "Excepteur magna velit est et minim veniam.", + "longText": "Ut nostrud elit dolor eiusmod est id. Sit aliqua tempor incididunt quis magna aliquip irure in elit in. Exercitation pariatur deserunt irure ullamco laboris excepteur ea. Deserunt labore laboris fugiat reprehenderit laborum quis occaecat duis voluptate labore culpa nisi aliqua ea. Veniam ea duis sint quis anim do.\r\nFugiat reprehenderit proident minim irure aliqua sunt non quis sunt ut. Eiusmod et occaecat ad quis. Velit ipsum in amet qui aliquip consequat sit voluptate est consequat. Nostrud laborum proident incididunt proident voluptate do sint minim officia.\r\n", + "address": "3 Guernsey Street", + "city": "Magnolia", + "state": "Nebraska", + "zip": 56924, + "country": "Lebanon", + "email": "hardingwoodward@scentric.com", + "phone": "(852) 477-3706", + "color": "rgb(148,78,220)" + }, + { + "index": 473, + "name": "Ferrell Gallegos", + "first": "Marie", + "last": "Flowers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mrmartineau/73.jpg", + "expanded": false, + "guid": "3b7ed12d-4299-4fd6-a79a-42a27d171c9e", + "integer": 92, + "date": "Sun Jun 07 1992 13:29:12 GMT-0700 (PDT)", + "shortText": "sunt non veniam", + "mediumText": "Lorem officia duis consequat minim occaecat enim incididunt et labore consequat esse amet. Ea incididunt dolore eiusmod dolor mollit veniam laborum et cupidatat proident. Mollit sint fugiat tempor consectetur veniam ad cupidatat.", + "longText": "Do et sint pariatur in ex consectetur esse. Sit deserunt sit pariatur Lorem laboris duis ex est Lorem sunt. Qui id occaecat proident irure non aliquip tempor velit voluptate dolor adipisicing ullamco enim irure.\r\n", + "address": "4 Harden Street", + "city": "Worton", + "state": "Florida", + "zip": 87914, + "country": "Armenia", + "email": "marieflowers@scentric.com", + "phone": "(867) 463-2219", + "color": "rgb(245,149,165)" + }, + { + "index": 474, + "name": "Elena Hale", + "first": "Leola", + "last": "Byers", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kuldarkalvik/73.jpg", + "expanded": false, + "guid": "248816ef-ebc8-48b6-83b8-ddf059001caf", + "integer": 36, + "date": "Fri Nov 08 1974 22:54:38 GMT-0800 (PST)", + "shortText": "sint ea eu aliqua elit", + "mediumText": "Dolor velit ullamco ullamco dolor nostrud. Qui deserunt mollit ea id cillum eu. Consectetur dolor irure esse velit sunt nostrud nostrud voluptate cillum tempor ipsum mollit do. Laboris ea esse do laboris adipisicing nisi. Labore excepteur cupidatat nostrud sit aliqua ad labore Lorem do aliquip ea veniam veniam.", + "longText": "Et esse non incididunt sunt aliqua eiusmod. Enim id ullamco in ex dolor est non eiusmod reprehenderit. Quis velit pariatur irure labore id enim. Anim esse voluptate fugiat ipsum do amet nisi velit pariatur deserunt culpa. Duis ullamco anim quis deserunt labore id laboris. Minim laborum id ex ex. Nulla mollit id esse do reprehenderit eu velit eu dolor commodo dolore aute sit.\r\nMollit magna reprehenderit velit consequat pariatur officia dolore laborum. Do sit reprehenderit qui fugiat voluptate ut cupidatat sit magna mollit sit velit Lorem. Id anim veniam aliquip aliqua adipisicing.\r\n", + "address": "2 Elliott Walk", + "city": "Gwynn", + "state": "New Jersey", + "zip": 23849, + "country": "Cayman Islands", + "email": "leolabyers@scentric.com", + "phone": "(800) 419-2994", + "color": "rgb(62,183,119)" + }, + { + "index": 475, + "name": "Deloris Warren", + "first": "Lacy", + "last": "Elliott", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/erickmazer/73.jpg", + "expanded": false, + "guid": "75cda396-a179-4462-bd5f-c87f9cdcb07d", + "integer": 16, + "date": "Tue Mar 20 2012 21:38:59 GMT-0700 (PDT)", + "shortText": "labore fugiat et", + "mediumText": "Fugiat velit exercitation commodo dolor deserunt commodo cupidatat eiusmod excepteur ea. Voluptate est deserunt eiusmod nostrud.", + "longText": "Adipisicing qui esse voluptate aliqua magna aliquip esse. Tempor ad aliquip ullamco fugiat. Aliqua Lorem velit consectetur amet velit deserunt.\r\nIrure tempor anim cillum aliqua pariatur fugiat. Nostrud amet dolore nisi cillum qui sit excepteur magna fugiat aute fugiat. Irure culpa incididunt est velit non anim adipisicing culpa est qui. Pariatur est reprehenderit amet officia mollit eu.\r\nId anim exercitation ex culpa dolor amet culpa sint sint sint esse dolore ea cupidatat. Ut laborum ullamco elit proident. Sit aute id proident nulla et. Incididunt excepteur ut cupidatat reprehenderit. Labore qui laboris consequat pariatur do cillum.\r\n", + "address": "3 Ditmars Street", + "city": "Carrizo", + "state": "Wisconsin", + "zip": 21484, + "country": "Italy", + "email": "lacyelliott@scentric.com", + "phone": "(927) 422-3415", + "color": "rgb(69,169,92)" + }, + { + "index": 476, + "name": "Young Lee", + "first": "Kay", + "last": "Montgomery", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/guischmitt/73.jpg", + "expanded": false, + "guid": "c41e7a43-d02b-4c42-9d72-38d7ba926b78", + "integer": 99, + "date": "Wed Sep 26 1979 16:42:55 GMT-0700 (PDT)", + "shortText": "Lorem consequat esse occaecat irure", + "mediumText": "Ex velit deserunt veniam dolor et fugiat. Mollit excepteur occaecat cupidatat mollit ut magna et. Nostrud magna esse consectetur exercitation irure magna Lorem do nulla. Sit laboris cupidatat ullamco eiusmod nisi ex.", + "longText": "Enim cupidatat magna sint velit cupidatat Lorem sint est eiusmod irure officia ea occaecat. Laborum qui officia voluptate anim enim velit cillum ipsum. Irure labore irure eiusmod Lorem sint minim laboris deserunt irure dolor. Anim quis laborum cupidatat ex ex in. Dolor ipsum fugiat ad mollit proident labore consectetur dolore labore laborum cillum sint dolore. Et ex mollit sit est. Anim incididunt deserunt incididunt proident ea velit enim anim laboris adipisicing.\r\nEa officia laborum veniam duis irure labore. Aliquip velit et quis officia veniam cillum dolor nostrud non ipsum sint sint fugiat. Occaecat tempor ea consequat consequat voluptate.\r\nNostrud officia aliquip est eu quis ex dolor sint commodo commodo reprehenderit laborum. Do deserunt voluptate laboris do. Velit fugiat incididunt fugiat proident cillum ad excepteur aute aliqua minim. Nulla voluptate fugiat sint ea incididunt esse laboris sint incididunt dolor cillum irure magna. Tempor culpa anim duis qui adipisicing culpa enim magna duis. Nisi mollit qui nisi excepteur ut ut. Dolor laboris ad in reprehenderit enim sint excepteur laborum irure aliquip.\r\nLorem sit ad excepteur cillum ad consequat fugiat aliqua mollit veniam labore sit aliquip aute. Laborum dolore proident in aute labore ad dolore duis pariatur culpa mollit commodo esse. Enim occaecat officia ipsum ad eiusmod exercitation tempor nisi proident irure ut ut. Elit amet ad ex irure enim laboris elit ex anim magna sint sunt tempor in. Et magna ipsum laborum Lorem incididunt. Amet cillum ut magna dolore elit aute.\r\nSit nulla sint non velit aliquip occaecat sint laborum. Aliqua tempor dolore velit nisi tempor magna labore sunt elit et. Occaecat nisi commodo sunt et tempor ut ullamco. Sint tempor adipisicing consequat commodo tempor deserunt voluptate ea Lorem exercitation id culpa.\r\n", + "address": "4 India Street", + "city": "Elliott", + "state": "Washington", + "zip": 78397, + "country": "Lesotho", + "email": "kaymontgomery@scentric.com", + "phone": "(803) 429-2640", + "color": "rgb(217,203,52)" + }, + { + "index": 477, + "name": "Lynn Kim", + "first": "Ericka", + "last": "Todd", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/mariosmaselli/73.jpg", + "expanded": false, + "guid": "e055ce4f-15a9-429c-91eb-a66e77b390f4", + "integer": 98, + "date": "Tue Mar 14 1972 10:31:22 GMT-0800 (PST)", + "shortText": "ullamco excepteur", + "mediumText": "Tempor sunt aliqua aliquip labore nisi ad eu in et eu laboris deserunt commodo ex. Ipsum minim ex dolor reprehenderit magna ullamco eu quis.", + "longText": "Sint dolore ipsum eu nulla amet amet aute commodo exercitation duis sit occaecat id. Eiusmod ex occaecat consequat tempor fugiat non ad minim anim Lorem. Magna dolore duis exercitation cupidatat elit ipsum Lorem eu mollit sint nulla reprehenderit ullamco elit. Ea est ea commodo eu do. In dolor magna reprehenderit ad dolor dolor id amet tempor occaecat. In laboris do incididunt occaecat elit quis ad amet. Anim sint elit culpa ullamco enim anim officia reprehenderit sunt.\r\nOfficia mollit cupidatat aliquip in laborum consectetur ea. Exercitation voluptate sint labore sunt excepteur eiusmod nostrud voluptate quis pariatur nulla. Esse commodo excepteur pariatur sit tempor ea laborum reprehenderit irure ex tempor.\r\nQuis labore et ad fugiat nostrud id labore non excepteur ipsum elit. Ea nulla laboris dolore nostrud quis irure magna est. Eiusmod mollit voluptate non laborum nostrud voluptate nisi voluptate. Est veniam veniam ad elit nostrud proident adipisicing ullamco aliquip commodo aliquip laborum laborum ad. Amet incididunt esse consequat nisi et consectetur. Adipisicing sunt irure Lorem elit aliqua dolore quis nostrud. Ex magna nisi excepteur occaecat veniam non dolore minim nostrud.\r\n", + "address": "3 Irving Avenue", + "city": "Stonybrook", + "state": "Oregon", + "zip": 25156, + "country": "Mongolia", + "email": "erickatodd@scentric.com", + "phone": "(854) 460-2134", + "color": "rgb(88,191,173)" + }, + { + "index": 478, + "name": "Duran Rasmussen", + "first": "Irene", + "last": "Guy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/m_ahmadyunus/73.jpg", + "expanded": false, + "guid": "ebebb8d9-3261-4d1f-b04c-580c3537cf32", + "integer": 5, + "date": "Mon Dec 14 1992 15:07:33 GMT-0800 (PST)", + "shortText": "excepteur", + "mediumText": "Aute ut nostrud cillum irure non veniam minim exercitation ex mollit sint veniam voluptate. Est culpa eiusmod aliquip anim. Nisi aliquip duis magna nulla est Lorem cupidatat nisi ut proident nostrud voluptate.", + "longText": "Aute consectetur qui sunt enim ad nulla velit et laborum culpa. Laboris officia exercitation nulla aute incididunt excepteur. Dolor et aliqua nulla mollit incididunt velit laborum nisi non ad excepteur. Exercitation ea dolore aliqua sunt minim dolore laboris Lorem culpa ex ut commodo.\r\nVoluptate occaecat et eu elit mollit commodo laboris eiusmod cillum mollit eiusmod est sunt labore. Ea commodo nisi culpa Lorem velit sit labore elit anim est sit sunt ex pariatur. Fugiat consectetur laborum deserunt sit excepteur exercitation qui veniam culpa sint.\r\nTempor aliquip excepteur consectetur commodo dolor magna. Aute elit esse mollit nisi dolore non laboris velit cillum cupidatat proident proident pariatur aute. Labore cillum ex magna anim voluptate esse deserunt consectetur anim est proident. Cillum Lorem sint aliqua fugiat eu qui. Aute eiusmod est qui aliqua incididunt cillum esse est laboris. Cillum et aute culpa excepteur nisi amet veniam incididunt do do sint esse in sint. Culpa ad ipsum ad nostrud id laborum.\r\n", + "address": "4 Dunham Place", + "city": "Vicksburg", + "state": "Illinois", + "zip": 21064, + "country": "Germany", + "email": "ireneguy@scentric.com", + "phone": "(895) 490-2069", + "color": "rgb(65,241,108)" + }, + { + "index": 479, + "name": "Gomez Kent", + "first": "Beverley", + "last": "Garrison", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anggit_pradito/73.jpg", + "expanded": false, + "guid": "1f6414f6-bcb1-4a8e-9bd3-1f4bd3657fb8", + "integer": 52, + "date": "Sun Nov 21 1982 20:33:30 GMT-0800 (PST)", + "shortText": "sint cillum non dolore sit", + "mediumText": "Aliquip ad elit nulla veniam quis.", + "longText": "Incididunt in veniam laboris laboris. Ipsum laboris Lorem ea cupidatat laboris deserunt cillum esse. Elit qui id dolor mollit incididunt veniam aute in eiusmod. Occaecat est adipisicing dolor velit enim. Ipsum laboris nulla Lorem ex ut exercitation nulla commodo nisi occaecat excepteur et Lorem ex. Proident eu exercitation exercitation aliqua enim. Tempor magna excepteur enim aliqua.\r\nMollit fugiat veniam minim esse reprehenderit. Cillum exercitation qui elit anim proident. Aliquip ullamco irure aliqua sit commodo veniam cillum adipisicing proident ad aliquip dolore minim.\r\nQuis pariatur sint commodo mollit reprehenderit et incididunt commodo aliqua sint. Sunt nulla deserunt ad nulla in sit incididunt laborum nulla magna culpa excepteur. Deserunt ad non ullamco in amet do elit qui excepteur.\r\nQui ut do ex pariatur tempor. Anim qui labore sunt nisi amet laborum occaecat adipisicing incididunt fugiat labore. Laborum nisi duis minim pariatur labore ea consequat exercitation. Cillum reprehenderit eiusmod aute cillum laborum labore dolor aliqua in magna.\r\n", + "address": "4 Lafayette Avenue", + "city": "Esmont", + "state": "West Virginia", + "zip": 45346, + "country": "Thailand", + "email": "beverleygarrison@scentric.com", + "phone": "(923) 547-3876", + "color": "rgb(69,99,135)" + }, + { + "index": 480, + "name": "Bowers Benson", + "first": "Cannon", + "last": "Cunningham", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/saschamt/73.jpg", + "expanded": false, + "guid": "de1acbb3-f26f-4448-8284-168962e64357", + "integer": 18, + "date": "Sat Jan 23 1988 03:15:57 GMT-0800 (PST)", + "shortText": "tempor dolore pariatur laboris", + "mediumText": "Cillum proident sint eiusmod qui ullamco dolore. Elit sit nisi et laboris labore Lorem tempor nulla. Dolore incididunt deserunt aute dolor ad elit nisi magna ad tempor.", + "longText": "Eiusmod id tempor id officia aliqua aliquip cillum est minim in. Est reprehenderit pariatur reprehenderit laborum nulla. Proident sit do anim minim anim minim in proident laborum pariatur laborum magna est.\r\nDolor exercitation ad enim est dolore excepteur consequat non pariatur. Eiusmod do et cupidatat ad esse do cillum elit in laboris. Labore consequat cupidatat officia do commodo sit consectetur ipsum irure consectetur. Ullamco commodo cillum officia cupidatat Lorem id.\r\nId anim culpa ex et reprehenderit do proident laboris reprehenderit. Proident quis irure duis irure ex ut velit mollit consectetur anim Lorem. Id consectetur laborum enim consectetur eiusmod excepteur id excepteur. In sunt anim magna duis ad occaecat cillum amet tempor pariatur sunt Lorem et proident. Officia in ipsum sunt aute Lorem.\r\n", + "address": "3 Eldert Lane", + "city": "Torboy", + "state": "Mississippi", + "zip": 21587, + "country": "Seychelles", + "email": "cannoncunningham@scentric.com", + "phone": "(922) 457-2557", + "color": "rgb(214,152,137)" + }, + { + "index": 481, + "name": "Duffy Moreno", + "first": "Combs", + "last": "Lamb", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/anasnakawa/73.jpg", + "expanded": false, + "guid": "cc6e70c6-d769-4d53-94c3-3f39685f92b0", + "integer": 62, + "date": "Sat May 08 1971 07:47:14 GMT-0700 (PDT)", + "shortText": "ipsum in sint id amet", + "mediumText": "Voluptate sit occaecat velit elit culpa pariatur deserunt minim tempor. Ipsum sint ad voluptate ipsum.", + "longText": "Non ex consectetur nostrud et incididunt et tempor laborum fugiat aliqua ex sunt. Consectetur velit cillum ea elit anim ut qui velit sit. Dolore cillum eu sint dolore consequat est enim minim sunt dolore dolor est ut aliqua. Tempor ullamco eiusmod incididunt esse quis adipisicing ut et voluptate aliqua ullamco in. Adipisicing irure dolor irure esse velit dolore. Ea ullamco consectetur anim et in quis laboris nulla nisi sint ipsum. Enim aliquip deserunt voluptate quis sint.\r\nCommodo cupidatat occaecat elit Lorem dolor excepteur aliquip est incididunt. Sit minim aute non dolore voluptate nisi. Id non sit nostrud ad.\r\nExercitation deserunt officia nostrud occaecat qui et veniam laborum nostrud dolor dolore id. Ullamco enim esse ex aute ad incididunt aliquip. Tempor id voluptate fugiat ex fugiat dolor.\r\nAd ipsum voluptate ipsum cillum id. Exercitation labore velit occaecat adipisicing non excepteur aute amet. Culpa exercitation deserunt aute excepteur sit enim eiusmod esse Lorem anim aliqua laborum et. Dolore deserunt minim dolore nulla cupidatat proident commodo nisi. Qui exercitation sit elit aliquip mollit aliqua. Proident cupidatat labore culpa ea.\r\n", + "address": "4 Rutledge Street", + "city": "Waterford", + "state": "Rhode Island", + "zip": 58081, + "country": "Chad", + "email": "combslamb@scentric.com", + "phone": "(880) 495-3320", + "color": "rgb(104,242,253)" + }, + { + "index": 482, + "name": "Leach Middleton", + "first": "Molina", + "last": "Parsons", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/just_watt/73.jpg", + "expanded": false, + "guid": "e824a101-32db-4fdd-98bc-f68a09cc9790", + "integer": 36, + "date": "Mon May 13 1996 08:23:43 GMT-0700 (PDT)", + "shortText": "est irure exercitation reprehenderit tempor", + "mediumText": "Cupidatat amet id duis occaecat ad elit quis ea consectetur consequat nostrud qui fugiat. Ea cupidatat est nisi reprehenderit in et sit et ad veniam do elit adipisicing sit. Non Lorem anim consequat velit occaecat excepteur. Officia esse magna veniam dolore ullamco fugiat enim.", + "longText": "In sunt in velit ipsum laborum minim enim sunt duis. Ut duis elit occaecat voluptate eiusmod. Cupidatat dolor laboris aliquip officia magna voluptate incididunt.\r\nFugiat irure ad quis ea aliqua proident ipsum quis ut incididunt. Aliquip culpa velit magna exercitation nostrud. Minim cupidatat irure exercitation excepteur cupidatat dolore. Excepteur amet laborum nulla adipisicing minim aliquip minim cillum nulla officia ut. Nostrud quis eu laboris quis qui minim ad quis ea reprehenderit. Proident ipsum aliquip cupidatat nisi.\r\nConsectetur sint magna id est cupidatat minim. Non cillum aliqua amet commodo aute eiusmod dolor et ad ut non culpa duis incididunt. Sint aliquip excepteur aliqua aliquip mollit commodo amet mollit. Irure minim nisi eu ea sit. Voluptate esse culpa adipisicing excepteur laborum proident laborum proident. Excepteur duis eu fugiat eiusmod labore velit do qui esse dolore labore enim. Esse quis ipsum Lorem voluptate tempor est fugiat enim reprehenderit duis.\r\nVeniam magna qui velit nulla velit incididunt aliqua qui dolore esse ex ad. Fugiat do nostrud do magna excepteur eiusmod et adipisicing aute aliquip cupidatat fugiat irure. Aliqua officia qui anim esse duis est minim excepteur est esse dolor id deserunt.\r\n", + "address": "2 Woods Place", + "city": "Leyner", + "state": "Georgia", + "zip": 45379, + "country": "Uruguay", + "email": "molinaparsons@scentric.com", + "phone": "(825) 403-3345", + "color": "rgb(74,223,146)" + }, + { + "index": 483, + "name": "Della Gomez", + "first": "Lamb", + "last": "Pierce", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/caiifr/73.jpg", + "expanded": false, + "guid": "19a7f089-3845-4441-b5ad-2b14bf2ca81a", + "integer": 50, + "date": "Mon Sep 28 1998 02:00:36 GMT-0700 (PDT)", + "shortText": "proident", + "mediumText": "Cupidatat in duis aliquip nisi consequat enim. Consectetur velit et nostrud et ea exercitation et aliquip pariatur aliqua velit eu ipsum reprehenderit.", + "longText": "Nulla nostrud ex eiusmod adipisicing. Exercitation ad dolore excepteur laborum quis non nisi duis dolor incididunt veniam fugiat laboris. Occaecat officia et eu proident ullamco dolor exercitation non laborum ea aliquip duis laborum. Exercitation voluptate ex aute nisi magna non laboris ea consequat. Est enim do tempor enim aute esse duis voluptate dolor. Aute enim minim cillum id.\r\nMollit eiusmod excepteur nisi est enim labore amet. Enim proident labore mollit dolor do incididunt deserunt irure exercitation irure magna. Incididunt irure officia consectetur magna fugiat quis fugiat voluptate nulla voluptate eu velit. Cupidatat qui proident deserunt reprehenderit veniam sunt non magna velit. Laboris labore consectetur ea et et. Non ex commodo amet enim.\r\nVeniam ex consequat minim ea adipisicing aute elit ea in in pariatur. Consequat nostrud sit non eiusmod voluptate consectetur velit cupidatat qui consectetur esse. Eu laboris cillum quis mollit minim id commodo quis laboris esse sint est irure.\r\nDolore pariatur officia sint qui consequat sunt minim culpa cillum amet qui. Anim adipisicing enim voluptate non nulla anim cupidatat ullamco consectetur elit qui culpa excepteur. Ad enim labore aliqua nulla sint consectetur ipsum occaecat occaecat ut cupidatat ad id ex. Mollit magna qui reprehenderit officia irure nisi ullamco excepteur consequat esse. Dolore commodo laboris ad culpa cillum eu laborum consectetur non occaecat. Sunt magna voluptate occaecat sunt occaecat exercitation magna sint sunt ullamco Lorem labore aliquip. Excepteur pariatur mollit ex incididunt.\r\n", + "address": "2 Dwight Street", + "city": "Newkirk", + "state": "New Mexico", + "zip": 24042, + "country": "Burkina Faso", + "email": "lambpierce@scentric.com", + "phone": "(996) 559-3096", + "color": "rgb(154,210,165)" + }, + { + "index": 484, + "name": "Holder Barker", + "first": "Patrick", + "last": "Best", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/briandiazme/73.jpg", + "expanded": false, + "guid": "c45e5d59-d200-42b3-9f8f-4ecba7a5c540", + "integer": 99, + "date": "Fri Nov 12 1971 21:30:45 GMT-0800 (PST)", + "shortText": "ea", + "mediumText": "Velit in qui nisi cupidatat qui deserunt. Quis pariatur nulla non cupidatat ad magna. Eu anim velit eu qui Lorem officia esse irure magna nulla eiusmod. Do adipisicing minim ad nulla.", + "longText": "Amet id duis eu tempor. Proident nisi pariatur id sit non adipisicing ex nostrud commodo consectetur sint sunt sunt exercitation. Eiusmod sunt est in eiusmod. Enim ut consectetur anim ea qui enim id irure deserunt eu. Tempor aute id nulla velit nostrud dolor veniam esse sint laborum ea. Non aliquip sunt nulla cupidatat amet aliqua non non.\r\nNisi ex ad ad enim eu sit proident aliquip ut incididunt reprehenderit nostrud pariatur. Sint dolor in veniam excepteur enim qui sit sunt cupidatat. Sunt velit magna culpa consectetur quis consectetur veniam do quis irure. Cupidatat aute laborum aute adipisicing amet mollit cillum amet ut. Nostrud magna adipisicing culpa sint esse ex pariatur cupidatat reprehenderit reprehenderit anim deserunt elit sunt. Ullamco minim consequat id in tempor.\r\nAmet veniam anim ullamco eu ea eiusmod est nulla velit. Aliqua nostrud laborum esse commodo laborum dolore. Pariatur magna officia eiusmod velit velit anim ad magna ipsum aliquip.\r\n", + "address": "4 Strauss Street", + "city": "Muir", + "state": "Arizona", + "zip": 26765, + "country": "Greenland", + "email": "patrickbest@scentric.com", + "phone": "(824) 579-3730", + "color": "rgb(171,74,141)" + }, + { + "index": 485, + "name": "Pitts Soto", + "first": "Vincent", + "last": "Hughes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/productpeopletv/73.jpg", + "expanded": false, + "guid": "fe55de6c-660f-4642-8677-5fdea19e5504", + "integer": 34, + "date": "Mon Dec 20 1971 02:47:54 GMT-0800 (PST)", + "shortText": "dolore officia", + "mediumText": "Et in laboris tempor laborum eu nisi consequat adipisicing et eu aliqua anim sunt sint. Culpa est esse eu reprehenderit mollit dolore. Tempor esse laboris esse ea duis dolore in nulla excepteur sit veniam enim velit.", + "longText": "Quis nostrud exercitation ullamco eiusmod proident non officia do mollit laborum exercitation. Velit irure incididunt in nisi laboris consequat eu cupidatat velit cillum nisi pariatur nostrud. Laborum ex reprehenderit culpa dolor duis culpa ut amet deserunt tempor amet. Laborum labore officia dolor occaecat elit. Lorem ullamco consectetur commodo elit et commodo deserunt enim. Sunt consequat cillum proident irure. Pariatur adipisicing ad proident culpa pariatur in tempor irure id ex sint adipisicing nulla tempor.\r\nEu cupidatat culpa non Lorem minim aliqua qui. Non ex aliquip ut reprehenderit anim aute nulla duis sit sunt ut. Nulla cupidatat non commodo adipisicing. Nisi exercitation quis veniam velit cillum incididunt. Do exercitation ut nulla Lorem culpa qui minim laboris quis ipsum elit sunt irure nulla.\r\nEt aute aliquip adipisicing labore ad irure quis consequat occaecat sunt. Reprehenderit fugiat ea eiusmod pariatur Lorem laboris anim non quis labore nisi. Mollit exercitation pariatur incididunt consequat reprehenderit officia nostrud labore duis aute quis sint. Exercitation ipsum esse sit in nulla anim.\r\nIpsum minim tempor et culpa adipisicing nisi tempor nisi laborum anim. Labore enim in sint minim duis Lorem fugiat nisi adipisicing do est elit excepteur. Velit dolore ea aliqua quis qui sit aliquip anim quis velit occaecat. Officia adipisicing ipsum ullamco cillum pariatur ad officia consectetur voluptate aliquip. Est adipisicing incididunt exercitation sunt aliqua irure consectetur excepteur adipisicing sint. Aute non ut ea ea enim. Aliqua Lorem excepteur voluptate nostrud ad proident reprehenderit ad dolore labore sit excepteur excepteur.\r\nAd tempor et veniam consequat. Duis commodo labore eiusmod reprehenderit consectetur adipisicing sint cillum laboris aliquip laboris occaecat sit. Sunt officia mollit labore culpa ea ut. Sunt commodo ea non Lorem culpa incididunt incididunt esse labore et irure tempor ex. Dolor culpa ea amet laboris ad ad mollit qui.\r\n", + "address": "2 Battery Avenue", + "city": "Westphalia", + "state": "Texas", + "zip": 12235, + "country": "Fiji", + "email": "vincenthughes@scentric.com", + "phone": "(947) 521-2627", + "color": "rgb(241,60,119)" + }, + { + "index": 486, + "name": "Morrison Frye", + "first": "Mae", + "last": "Ramirez", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/darioalbini/73.jpg", + "expanded": false, + "guid": "03d96011-46bd-43a9-8186-6b5a9c45ef96", + "integer": 94, + "date": "Sat Dec 29 2012 13:16:12 GMT-0800 (PST)", + "shortText": "duis reprehenderit", + "mediumText": "Sit fugiat exercitation ut laborum.", + "longText": "Ea proident aliqua aute quis Lorem sunt ad. Qui irure fugiat aute dolore sint non sit magna. Nostrud tempor nulla eiusmod fugiat nostrud ad pariatur elit ea laboris.\r\nElit eiusmod mollit anim pariatur ea duis commodo sit eu consectetur non. Officia nisi sunt eu voluptate eu dolor laborum et irure aliquip aliquip consequat sint exercitation. Aliqua anim eiusmod laboris pariatur sit proident irure excepteur amet sint culpa dolor commodo nisi. Quis laborum est occaecat aute quis aliqua proident minim. Cillum tempor occaecat dolore irure labore nisi labore ut mollit proident eu. Eu adipisicing labore elit esse proident proident.\r\nDolore velit do ullamco ad occaecat veniam fugiat. Nulla excepteur aliqua sit magna ipsum pariatur. Anim magna esse laboris eiusmod Lorem ex. Quis mollit nostrud voluptate aliqua ea aliqua sunt non. Quis sint dolor do eu voluptate ad laborum. Eiusmod occaecat elit est labore qui ad ullamco. Esse sit nisi occaecat esse ullamco aliquip cupidatat mollit occaecat esse anim aliqua ea id.\r\nLaborum nostrud anim non excepteur aliqua ullamco minim sunt esse. Consequat ipsum aute id culpa quis minim incididunt. Dolor duis cupidatat ea cupidatat sunt magna consequat in ullamco aliqua eu voluptate. Pariatur proident esse consectetur Lorem id aliquip dolor quis occaecat eiusmod. Ad laboris reprehenderit fugiat amet excepteur. Sunt sit eu qui ad tempor cillum.\r\n", + "address": "4 Willow Place", + "city": "Biehle", + "state": "District Of Columbia", + "zip": 30874, + "country": "Viet Nam", + "email": "maeramirez@scentric.com", + "phone": "(866) 481-3384", + "color": "rgb(104,176,225)" + }, + { + "index": 487, + "name": "Diane Patrick", + "first": "Esperanza", + "last": "Rivera", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/_pandajs/73.jpg", + "expanded": false, + "guid": "7f120012-357d-44c7-8dbe-9cfee5ca1f70", + "integer": 30, + "date": "Fri Jun 30 2000 14:03:45 GMT-0700 (PDT)", + "shortText": "tempor elit cupidatat labore", + "mediumText": "Exercitation reprehenderit tempor tempor esse magna in voluptate ea. Incididunt quis voluptate pariatur irure. Aliquip duis duis velit ullamco consequat ullamco ut proident Lorem dolore proident. Est qui amet ut ad exercitation aute cillum. Pariatur sit ea in consectetur qui amet minim nisi eu.", + "longText": "Adipisicing sit ut duis est tempor incididunt fugiat deserunt ad do voluptate amet eu. Excepteur eiusmod in id amet minim. Anim non velit velit id. Consequat proident irure aliquip est mollit proident cillum commodo veniam exercitation irure nostrud non. Tempor aliquip id fugiat duis elit sint. Enim ea pariatur ex ipsum cupidatat. Nulla proident labore in irure qui.\r\n", + "address": "2 Monument Walk", + "city": "Newry", + "state": "Virgin Islands", + "zip": 40958, + "country": "France, Metropolitan", + "email": "esperanzarivera@scentric.com", + "phone": "(909) 486-2560", + "color": "rgb(164,161,80)" + }, + { + "index": 488, + "name": "Ellen Rich", + "first": "Chandra", + "last": "Cote", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/wellnext/73.jpg", + "expanded": false, + "guid": "02e9640e-9e9f-4b08-85b4-cb797b3b3a9b", + "integer": 71, + "date": "Sat May 01 2004 01:19:45 GMT-0700 (PDT)", + "shortText": "veniam", + "mediumText": "Irure labore ea ex culpa reprehenderit. Et ad irure aute ut quis elit. Proident magna qui sint fugiat culpa commodo aute duis proident. Officia do enim id proident occaecat fugiat eiusmod sint sint laborum ea.", + "longText": "Sunt duis est et magna excepteur laboris culpa anim pariatur officia veniam proident et. Quis tempor excepteur labore eiusmod enim. Ipsum fugiat nisi nulla minim consequat anim aliqua aliqua laboris est labore. Occaecat est qui labore ut fugiat est magna quis esse magna ex irure proident non. In dolore voluptate minim veniam anim qui reprehenderit sit irure sint duis veniam nulla qui. Sunt minim ex consequat incididunt sit ipsum cupidatat esse fugiat.\r\nExercitation magna anim adipisicing minim qui esse eiusmod. Excepteur minim Lorem pariatur in incididunt pariatur sit ipsum deserunt irure laborum. Cillum irure elit nisi dolor cupidatat eiusmod officia eu incididunt aliqua sint excepteur deserunt laboris. Non sint et velit et in aute do cupidatat nostrud sunt excepteur. Aliqua aute voluptate et exercitation exercitation tempor quis aute.\r\nLaboris ut voluptate nisi dolore fugiat. Nulla deserunt cupidatat do quis excepteur reprehenderit nostrud aute laboris Lorem eiusmod sunt. Aliquip voluptate voluptate Lorem non qui adipisicing magna occaecat ad duis.\r\nSit magna amet laboris qui deserunt eu aliquip. Eu ad nulla adipisicing occaecat eu Lorem officia magna nulla amet labore proident minim voluptate. Laboris consequat sint amet cupidatat aute aute sit aliquip excepteur minim ad reprehenderit. Et et sit amet laboris reprehenderit incididunt esse. Non ipsum sit qui anim eiusmod.\r\n", + "address": "4 Ashford Street", + "city": "Dunnavant", + "state": "Puerto Rico", + "zip": 54991, + "country": "Uganda", + "email": "chandracote@scentric.com", + "phone": "(964) 526-3818", + "color": "rgb(172,172,60)" + }, + { + "index": 489, + "name": "Adele Stanton", + "first": "Allison", + "last": "Maxwell", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/skylark64/73.jpg", + "expanded": false, + "guid": "94d8f372-ebe3-4cd7-8456-4b12af0dbc7f", + "integer": 45, + "date": "Sun Oct 28 1990 07:28:14 GMT-0800 (PST)", + "shortText": "reprehenderit", + "mediumText": "Exercitation excepteur nisi duis est laboris ipsum sint est laboris enim ex officia nostrud. Nisi pariatur dolor elit irure aliqua.", + "longText": "Lorem ea id veniam proident exercitation culpa dolor deserunt do cillum dolor ullamco cillum id. Esse sit tempor consectetur elit consequat laborum. Enim ea fugiat ad Lorem aliqua pariatur exercitation ipsum incididunt elit Lorem ipsum amet. Est nisi id adipisicing deserunt dolore aliquip proident commodo. Dolor qui quis excepteur eu proident.\r\nNostrud dolor fugiat nisi dolore qui sunt. Velit ullamco anim do eu. Culpa Lorem id excepteur nostrud culpa Lorem cupidatat culpa ea eiusmod laborum ex. Excepteur veniam voluptate tempor eu ex amet incididunt aute veniam magna.\r\nLabore velit dolor est consectetur ad non officia. Tempor pariatur dolor amet tempor amet eu non anim. Voluptate in fugiat est duis ad est. Id id sit fugiat sunt. Tempor ipsum nisi ea non proident id duis non exercitation ipsum minim proident. Do deserunt sit aute deserunt. Enim quis pariatur ad velit culpa dolor.\r\n", + "address": "2 Bedford Avenue", + "city": "Woodlake", + "state": "Maryland", + "zip": 25064, + "country": "Antarctica", + "email": "allisonmaxwell@scentric.com", + "phone": "(899) 448-3606", + "color": "rgb(240,230,119)" + }, + { + "index": 490, + "name": "Ilene Alston", + "first": "Cecile", + "last": "Woods", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lisekyle/73.jpg", + "expanded": false, + "guid": "1580bd0d-10e4-45df-8d7a-a7d5028512d8", + "integer": 95, + "date": "Sun Mar 29 2009 19:07:07 GMT-0700 (PDT)", + "shortText": "ullamco incididunt", + "mediumText": "Occaecat elit cillum laboris nulla culpa veniam sit non aliquip occaecat. Proident do aliquip exercitation quis proident culpa. Veniam et est incididunt reprehenderit reprehenderit sit elit eiusmod velit qui nulla tempor non. Eiusmod reprehenderit mollit non veniam nisi eiusmod mollit ullamco culpa.", + "longText": "Ea irure est pariatur est qui fugiat ut sit non enim mollit tempor. Aliquip sunt nulla pariatur dolore eu fugiat enim sunt est laboris. Aliquip reprehenderit exercitation id occaecat. Incididunt amet ex dolor sunt.\r\nDuis culpa occaecat deserunt dolore laborum. Sit non officia nisi exercitation do id minim. Voluptate esse velit do officia consectetur duis Lorem proident consequat duis laborum eiusmod officia amet.\r\nCupidatat adipisicing esse laborum sit nisi occaecat reprehenderit officia aute. Sit elit in nisi nulla ipsum mollit. Voluptate fugiat proident incididunt pariatur. Dolor consectetur occaecat est laborum id nisi minim consectetur occaecat. Minim duis occaecat commodo nulla pariatur ex.\r\n", + "address": "3 Gunnison Court", + "city": "Clara", + "state": "Massachusetts", + "zip": 31477, + "country": "Kiribati", + "email": "cecilewoods@scentric.com", + "phone": "(937) 412-3586", + "color": "rgb(218,151,77)" + }, + { + "index": 491, + "name": "Page Marsh", + "first": "Medina", + "last": "Wilson", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/zumwalt/73.jpg", + "expanded": false, + "guid": "4dfb0026-3202-4699-aba7-d815792762f2", + "integer": 42, + "date": "Mon Nov 03 1975 16:09:28 GMT-0800 (PST)", + "shortText": "commodo ex", + "mediumText": "Do ex ullamco eu id consectetur est.", + "longText": "Non consectetur est amet dolore pariatur adipisicing et exercitation pariatur. Duis cillum reprehenderit magna ex esse. Ex incididunt aute in dolore duis. Nisi deserunt quis ex ipsum officia. Esse ea consectetur amet aliquip sunt incididunt.\r\nConsectetur enim aute ad commodo do. Veniam fugiat culpa voluptate minim exercitation eiusmod dolore qui excepteur in laboris incididunt. Ad tempor dolore consectetur ullamco. Ad officia enim laborum minim voluptate fugiat. Laboris eu deserunt ex est. Incididunt est nulla excepteur do ipsum occaecat deserunt esse et. Officia fugiat eiusmod ut sint enim laborum pariatur dolor labore.\r\n", + "address": "4 Lewis Avenue", + "city": "Venice", + "state": "Oklahoma", + "zip": 93431, + "country": "Ecuador", + "email": "medinawilson@scentric.com", + "phone": "(915) 547-2479", + "color": "rgb(97,200,182)" + }, + { + "index": 492, + "name": "Raquel Torres", + "first": "Winters", + "last": "Moon", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/the_winslet/73.jpg", + "expanded": false, + "guid": "2b4cd0b5-6c14-4253-afd2-667d28e069e5", + "integer": 6, + "date": "Sat May 22 1993 08:02:57 GMT-0700 (PDT)", + "shortText": "commodo consectetur culpa aliquip", + "mediumText": "Anim voluptate Lorem laborum consequat ex cillum ipsum exercitation consectetur elit. Pariatur ex qui nostrud enim consectetur eu mollit qui esse irure magna. Reprehenderit aliquip magna sunt labore. Aliqua nisi Lorem ad cupidatat laborum commodo irure non. Ut cupidatat ipsum do adipisicing incididunt.", + "longText": "Magna dolor ut incididunt pariatur cupidatat ullamco. Nisi veniam nulla est est. Nulla ex minim non excepteur quis laborum excepteur ut deserunt eiusmod consequat adipisicing mollit excepteur. Duis id tempor et aliqua laborum.\r\nVoluptate aliquip commodo sit laboris ea nisi id minim consectetur qui. Magna culpa ullamco ea enim excepteur nisi. Anim cillum nostrud ex consectetur. Sint duis voluptate est voluptate eu eu.\r\nConsectetur eiusmod officia qui exercitation ad magna. Ipsum voluptate ex culpa qui fugiat irure magna mollit nisi duis. Non laboris sit adipisicing ipsum dolor eiusmod Lorem aliqua velit ea sit reprehenderit minim aliquip. Reprehenderit non esse voluptate non aute non. Exercitation ex cillum ex sunt incididunt reprehenderit ipsum deserunt ex aliquip. Consectetur esse ut minim duis tempor ex reprehenderit veniam in proident.\r\nLaboris magna labore sint irure. Sit amet cupidatat adipisicing exercitation deserunt sint ad incididunt. Fugiat culpa adipisicing magna est voluptate. Consequat consequat velit reprehenderit aliqua anim commodo fugiat adipisicing qui occaecat dolore sint proident. Ex et officia ullamco labore ipsum consequat magna labore laboris. Adipisicing laboris non non dolore magna tempor do dolore qui nostrud sint. Incididunt enim excepteur aliqua adipisicing culpa irure eiusmod ex ullamco aliquip id cillum commodo ex.\r\n", + "address": "2 Amber Street", + "city": "Masthope", + "state": "Ohio", + "zip": 34479, + "country": "Bulgaria", + "email": "wintersmoon@scentric.com", + "phone": "(812) 514-3427", + "color": "rgb(129,103,138)" + }, + { + "index": 493, + "name": "Sasha Kinney", + "first": "Nielsen", + "last": "Callahan", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/kikillo/73.jpg", + "expanded": false, + "guid": "8d605d34-eb11-4110-9917-e890666b46c9", + "integer": 25, + "date": "Sun Feb 25 1996 00:22:49 GMT-0800 (PST)", + "shortText": "dolor velit", + "mediumText": "Proident occaecat voluptate eiusmod nisi ea non duis. Nostrud fugiat aliquip est exercitation laboris ipsum in dolor nisi duis magna minim. Pariatur pariatur ipsum incididunt excepteur.", + "longText": "Ex duis tempor fugiat mollit sunt enim elit commodo. Laboris in velit magna dolor. Labore labore incididunt veniam eiusmod mollit irure proident voluptate incididunt quis deserunt ad. Eiusmod eiusmod non reprehenderit aute amet eiusmod consectetur magna ea.\r\nTempor ad in cupidatat sunt dolore consectetur sunt. Anim nostrud nulla nostrud consequat. Consequat ullamco enim reprehenderit eu eu ea do duis reprehenderit quis cillum laborum pariatur. Est laborum reprehenderit in commodo enim ullamco mollit. Aute laboris incididunt elit laborum incididunt id tempor.\r\nEt do nulla voluptate magna labore ea commodo ex deserunt. Nostrud pariatur ipsum voluptate do esse non aliqua sint elit laboris ad adipisicing Lorem. Ut fugiat officia nostrud reprehenderit nisi aliqua.\r\n", + "address": "3 Lorraine Street", + "city": "Kidder", + "state": "Nevada", + "zip": 69726, + "country": "American Samoa", + "email": "nielsencallahan@scentric.com", + "phone": "(897) 548-2921", + "color": "rgb(58,212,98)" + }, + { + "index": 494, + "name": "Justice Johnston", + "first": "Francis", + "last": "Walsh", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/hndragnwn/73.jpg", + "expanded": false, + "guid": "93cc4a8b-fe24-4849-a976-a91a2adabb91", + "integer": 60, + "date": "Fri Feb 24 2006 00:14:57 GMT-0800 (PST)", + "shortText": "mollit magna anim exercitation amet", + "mediumText": "Consectetur proident id adipisicing incididunt commodo fugiat tempor amet cupidatat enim nostrud laboris. Non do adipisicing proident id et voluptate enim magna exercitation ut est aliqua pariatur. Enim aute voluptate non elit id commodo commodo aliqua nisi.", + "longText": "Qui aute sunt sint mollit ullamco nisi sunt elit ut cupidatat quis reprehenderit. Amet ullamco sit esse fugiat aliqua proident ut. Nisi ea magna occaecat labore amet fugiat eiusmod cupidatat nulla nostrud mollit et laborum commodo. Lorem commodo anim magna anim in sunt cillum elit deserunt do exercitation labore nisi. Nostrud dolore consequat amet esse deserunt in fugiat non dolore magna laborum.\r\n", + "address": "3 Bethel Loop", + "city": "Williams", + "state": "Montana", + "zip": 30034, + "country": "Angola", + "email": "franciswalsh@scentric.com", + "phone": "(922) 539-3195", + "color": "rgb(80,154,75)" + }, + { + "index": 495, + "name": "Leonard Hess", + "first": "Kate", + "last": "Mccoy", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fc987/73.jpg", + "expanded": false, + "guid": "0ef972c8-2eaa-4e56-baca-ec8204dee737", + "integer": 89, + "date": "Thu May 26 1988 06:59:06 GMT-0700 (PDT)", + "shortText": "tempor", + "mediumText": "Sunt quis minim magna consectetur ullamco.", + "longText": "Cupidatat incididunt minim laboris eiusmod et ex ad laboris ut commodo ex aliqua. Ea fugiat consectetur sit ut occaecat non est nostrud id in pariatur. Est amet Lorem reprehenderit adipisicing consectetur culpa sit sunt nisi.\r\n", + "address": "4 Caton Avenue", + "city": "Biddle", + "state": "California", + "zip": 25530, + "country": "Bhutan", + "email": "katemccoy@scentric.com", + "phone": "(843) 483-2519", + "color": "rgb(132,225,73)" + }, + { + "index": 496, + "name": "Weiss Malone", + "first": "Buchanan", + "last": "Austin", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/lettershoppe/73.jpg", + "expanded": false, + "guid": "cfc771a6-aeb0-47ec-a5a2-c5240c1b6768", + "integer": 6, + "date": "Fri Feb 14 2014 14:08:10 GMT-0800 (PST)", + "shortText": "id ipsum culpa occaecat reprehenderit", + "mediumText": "Fugiat pariatur in Lorem ipsum ex id. Ex commodo magna enim non ullamco nulla officia velit. Et et ipsum deserunt ex pariatur laboris aliqua in elit sunt excepteur quis exercitation consequat. Fugiat est eiusmod esse amet anim ex aliquip ipsum id aliquip dolor. Qui proident veniam enim enim exercitation deserunt ex voluptate consequat.", + "longText": "Fugiat consequat incididunt aute Lorem aliquip labore tempor consequat quis cillum. Incididunt sunt ullamco proident pariatur ad incididunt. Labore pariatur reprehenderit mollit duis proident incididunt do. Excepteur ullamco cupidatat nisi culpa Lorem sit ea ea sint et sint eu. Aliqua dolore amet nulla sit amet irure nostrud nulla non ex. Lorem deserunt sint commodo amet amet incididunt irure aliqua reprehenderit ea minim adipisicing proident. Irure duis enim non commodo ut adipisicing anim ad fugiat amet qui voluptate fugiat.\r\nEiusmod voluptate nulla anim tempor nulla est excepteur ut. Tempor sunt cillum et mollit mollit anim dolore laboris aute et duis consectetur. Proident quis aliqua nisi incididunt minim voluptate eiusmod id ea. Est labore pariatur nulla incididunt anim. Anim eu mollit voluptate pariatur cillum officia exercitation. Dolor amet mollit officia exercitation minim tempor do eu.\r\nProident est do aliqua eiusmod aliquip ex veniam culpa et occaecat. Et reprehenderit ad et nulla ullamco duis pariatur labore duis ex ea minim laboris nulla. Ex cillum nostrud consectetur dolor et esse.\r\n", + "address": "2 Stockholm Street", + "city": "Darrtown", + "state": "Marshall Islands", + "zip": 54123, + "country": "Dominica", + "email": "buchananaustin@scentric.com", + "phone": "(875) 459-2571", + "color": "rgb(115,116,180)" + }, + { + "index": 497, + "name": "Hawkins Parrish", + "first": "Sandy", + "last": "Poole", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/akashsharma39/73.jpg", + "expanded": false, + "guid": "00fdef08-9189-40f0-9960-6a59ab906f66", + "integer": 70, + "date": "Sun Apr 24 1994 02:10:50 GMT-0700 (PDT)", + "shortText": "deserunt non ex", + "mediumText": "Do eiusmod nostrud sint consectetur nulla elit est amet et qui voluptate consectetur ullamco elit. Voluptate enim nostrud consequat elit laboris non consequat. Consequat nulla veniam ea eiusmod nulla sunt consequat mollit.", + "longText": "Irure quis duis sint fugiat ut sunt proident esse ut. Aliquip aliqua ea ex magna mollit duis elit non elit labore veniam laborum. Deserunt ex cillum culpa qui non elit culpa ad laboris est.\r\nCillum exercitation ullamco adipisicing cillum irure ipsum sunt dolor irure ullamco. Lorem cupidatat cupidatat occaecat proident dolor sit irure quis do est non reprehenderit. Lorem elit dolore ea fugiat elit dolor. Excepteur est anim velit qui in. Minim sint adipisicing quis ullamco ipsum excepteur. Ullamco Lorem exercitation aute laboris fugiat incididunt.\r\nTempor aliqua cupidatat mollit anim Lorem irure exercitation magna non ullamco eu labore dolore velit. Aliqua enim reprehenderit consectetur est sunt labore aliqua consequat deserunt proident proident tempor mollit ad. Cupidatat velit culpa consequat ea incididunt. Pariatur irure dolore cillum voluptate ut amet sunt labore cillum laboris. Esse id aliquip labore consequat adipisicing culpa amet proident. Laborum voluptate nisi velit qui consectetur. Minim cillum duis pariatur est.\r\nCupidatat sunt consectetur laborum ex cupidatat quis ea ad sint aliqua non. Adipisicing ullamco voluptate mollit ullamco id irure proident ex culpa qui incididunt sint nostrud. Amet mollit occaecat non adipisicing tempor aliqua irure ex id. Velit dolore ea mollit fugiat velit elit eiusmod do exercitation.\r\n", + "address": "3 Manor Court", + "city": "Naomi", + "state": "Indiana", + "zip": 12933, + "country": "Egypt", + "email": "sandypoole@scentric.com", + "phone": "(945) 488-2696", + "color": "rgb(79,165,87)" + }, + { + "index": 498, + "name": "Dena Sweeney", + "first": "Kaitlin", + "last": "Brooks", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/fgin69/73.jpg", + "expanded": false, + "guid": "805425f6-7a36-4326-a622-fbd1a52bccca", + "integer": 37, + "date": "Thu Aug 03 1989 21:21:57 GMT-0700 (PDT)", + "shortText": "non in", + "mediumText": "Irure ullamco excepteur commodo aute magna dolore in reprehenderit commodo deserunt quis officia. Anim incididunt velit anim adipisicing dolore reprehenderit voluptate est nisi in amet.", + "longText": "Ea exercitation ipsum aliquip excepteur cillum ipsum cupidatat fugiat in do nostrud. Non culpa irure officia qui dolor esse velit. Sint officia proident occaecat laborum quis non ullamco dolor consectetur ipsum do nisi. Commodo adipisicing quis proident culpa.\r\nCupidatat adipisicing ipsum incididunt sunt consequat Lorem dolore. Aliquip adipisicing reprehenderit pariatur occaecat anim incididunt ad cillum. Voluptate cupidatat nostrud aliquip laborum esse irure duis ex culpa laborum laboris incididunt magna duis. Velit do commodo aute pariatur sunt ut voluptate quis minim. Eu mollit tempor excepteur nulla anim officia est dolor deserunt minim duis nostrud.\r\n", + "address": "4 Harrison Avenue", + "city": "Fairacres", + "state": "Tennessee", + "zip": 70961, + "country": "Chile", + "email": "kaitlinbrooks@scentric.com", + "phone": "(894) 591-3716", + "color": "rgb(131,63,152)" + }, + { + "index": 499, + "name": "Saundra Mcbride", + "first": "Rosemary", + "last": "Grimes", + "image": "https://s3.amazonaws.com/uifaces/faces/twitter/pdugan19/73.jpg", + "expanded": false, + "guid": "824a5e8d-254c-4041-8370-00c4d28ce820", + "integer": 65, + "date": "Mon Aug 28 2006 02:30:47 GMT-0700 (PDT)", + "shortText": "laborum", + "mediumText": "Aliqua magna proident exercitation elit occaecat ut duis. Ad ipsum duis aliqua qui pariatur cupidatat sint pariatur eiusmod do.", + "longText": "Amet sint officia anim officia nisi reprehenderit. Incididunt magna esse nisi nostrud ipsum. Dolor qui eu enim ipsum commodo deserunt ex ad reprehenderit. Commodo commodo amet ullamco aliquip deserunt excepteur aliqua minim ipsum eu. Culpa minim sunt do dolor excepteur dolore id et culpa id aliquip.\r\nNon excepteur culpa nulla consequat velit amet id. Cupidatat qui id aute reprehenderit adipisicing. Duis consectetur nostrud voluptate laboris culpa ipsum labore irure magna.\r\nLorem mollit cillum velit non proident ex ea esse anim nulla sunt ad laboris. Officia nisi culpa exercitation qui pariatur adipisicing ea incididunt consectetur Lorem. Amet minim labore aliqua nostrud. Eu cillum nulla qui enim non occaecat. Laboris exercitation ea sint cillum velit officia velit officia adipisicing do esse dolore aliqua mollit.\r\nCommodo minim sint excepteur aliquip ex consequat veniam ea culpa reprehenderit consequat est amet dolore. Eu ex amet minim quis dolore voluptate deserunt aliquip consectetur consectetur aliqua officia consequat sunt. Duis ut ex consectetur fugiat laborum duis Lorem cupidatat cupidatat excepteur amet. Id consequat dolor mollit elit pariatur dolor occaecat. Consequat ullamco excepteur cillum eu veniam aliqua ex cupidatat labore ex veniam. Dolore ad et veniam sint eiusmod anim minim.\r\nSint pariatur est enim veniam laboris eu occaecat duis. Ad veniam voluptate occaecat aliquip nostrud culpa aliquip duis proident dolor. Consectetur esse ut laborum elit sunt irure ex duis. Ex laborum eu esse incididunt laborum dolore non aute anim elit deserunt. Non Lorem deserunt culpa do ea exercitation fugiat.\r\n", + "address": "4 Chestnut Street", + "city": "Joes", + "state": "Palau", + "zip": 62428, + "country": "Norfolk Island", + "email": "rosemarygrimes@scentric.com", + "phone": "(923) 453-2279", + "color": "rgb(171,145,136)" + } +] \ No newline at end of file diff --git a/react-app/img/blank.gif b/react-app/img/blank.gif new file mode 100644 index 0000000000..e565824aaf Binary files /dev/null and b/react-app/img/blank.gif differ diff --git a/react-app/img/logo_small.png b/react-app/img/logo_small.png new file mode 100644 index 0000000000..d4be890001 Binary files /dev/null and b/react-app/img/logo_small.png differ diff --git a/react-app/img/logo_small.svg b/react-app/img/logo_small.svg new file mode 100644 index 0000000000..9171a73c7b --- /dev/null +++ b/react-app/img/logo_small.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-app/index.html b/react-app/index.html new file mode 100644 index 0000000000..3cf3b59c6e --- /dev/null +++ b/react-app/index.html @@ -0,0 +1,74 @@ + + + + + SFS - React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + Share + Settings + Help + + + +
+ +
+
+ +
+ +
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/react-app/node_modules/.bin/babel b/react-app/node_modules/.bin/babel new file mode 120000 index 0000000000..d7ec8bcea9 --- /dev/null +++ b/react-app/node_modules/.bin/babel @@ -0,0 +1 @@ +../babel/cli.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/babel-external-helpers b/react-app/node_modules/.bin/babel-external-helpers new file mode 120000 index 0000000000..d7ec8bcea9 --- /dev/null +++ b/react-app/node_modules/.bin/babel-external-helpers @@ -0,0 +1 @@ +../babel/cli.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/babel-node b/react-app/node_modules/.bin/babel-node new file mode 120000 index 0000000000..d7ec8bcea9 --- /dev/null +++ b/react-app/node_modules/.bin/babel-node @@ -0,0 +1 @@ +../babel/cli.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/babylon b/react-app/node_modules/.bin/babylon new file mode 120000 index 0000000000..c2adc01b2b --- /dev/null +++ b/react-app/node_modules/.bin/babylon @@ -0,0 +1 @@ +../babylon/bin/babylon.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/detect-indent b/react-app/node_modules/.bin/detect-indent new file mode 120000 index 0000000000..637cd301ae --- /dev/null +++ b/react-app/node_modules/.bin/detect-indent @@ -0,0 +1 @@ +../detect-indent/cli.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/envify b/react-app/node_modules/.bin/envify new file mode 120000 index 0000000000..ee9099eeae --- /dev/null +++ b/react-app/node_modules/.bin/envify @@ -0,0 +1 @@ +../envify/bin/envify \ No newline at end of file diff --git a/react-app/node_modules/.bin/esparse b/react-app/node_modules/.bin/esparse new file mode 120000 index 0000000000..936ac782f2 --- /dev/null +++ b/react-app/node_modules/.bin/esparse @@ -0,0 +1 @@ +../esprima-fb/bin/esparse.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/esvalidate b/react-app/node_modules/.bin/esvalidate new file mode 120000 index 0000000000..8548715887 --- /dev/null +++ b/react-app/node_modules/.bin/esvalidate @@ -0,0 +1 @@ +../esprima-fb/bin/esvalidate.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/json5 b/react-app/node_modules/.bin/json5 new file mode 120000 index 0000000000..217f37981d --- /dev/null +++ b/react-app/node_modules/.bin/json5 @@ -0,0 +1 @@ +../json5/lib/cli.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/mkdirp b/react-app/node_modules/.bin/mkdirp new file mode 120000 index 0000000000..017896cebb --- /dev/null +++ b/react-app/node_modules/.bin/mkdirp @@ -0,0 +1 @@ +../mkdirp/bin/cmd.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/repeating b/react-app/node_modules/.bin/repeating new file mode 120000 index 0000000000..cdedec32eb --- /dev/null +++ b/react-app/node_modules/.bin/repeating @@ -0,0 +1 @@ +../repeating/cli.js \ No newline at end of file diff --git a/react-app/node_modules/.bin/user-home b/react-app/node_modules/.bin/user-home new file mode 120000 index 0000000000..d72d76bb49 --- /dev/null +++ b/react-app/node_modules/.bin/user-home @@ -0,0 +1 @@ +../user-home/cli.js \ No newline at end of file diff --git a/react-app/node_modules/amdefine/LICENSE b/react-app/node_modules/amdefine/LICENSE new file mode 100644 index 0000000000..af46c6df3a --- /dev/null +++ b/react-app/node_modules/amdefine/LICENSE @@ -0,0 +1,58 @@ +amdefine is released under two licenses: new BSD, and MIT. You may pick the +license that best suits your development needs. The text of both licenses are +provided below. + + +The "New" BSD License: +---------------------- + +Copyright (c) 2011-2015, The Dojo Foundation +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 the Dojo Foundation 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. + + + +MIT License +----------- + +Copyright (c) 2011-2015, The Dojo Foundation + +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. diff --git a/react-app/node_modules/amdefine/README.md b/react-app/node_modules/amdefine/README.md new file mode 100644 index 0000000000..037a6e817e --- /dev/null +++ b/react-app/node_modules/amdefine/README.md @@ -0,0 +1,171 @@ +# amdefine + +A module that can be used to implement AMD's define() in Node. This allows you +to code to the AMD API and have the module work in node programs without +requiring those other programs to use AMD. + +## Usage + +**1)** Update your package.json to indicate amdefine as a dependency: + +```javascript + "dependencies": { + "amdefine": ">=0.1.0" + } +``` + +Then run `npm install` to get amdefine into your project. + +**2)** At the top of each module that uses define(), place this code: + +```javascript +if (typeof define !== 'function') { var define = require('amdefine')(module) } +``` + +**Only use these snippets** when loading amdefine. If you preserve the basic structure, +with the braces, it will be stripped out when using the [RequireJS optimizer](#optimizer). + +You can add spaces, line breaks and even require amdefine with a local path, but +keep the rest of the structure to get the stripping behavior. + +As you may know, because `if` statements in JavaScript don't have their own scope, the var +declaration in the above snippet is made whether the `if` expression is truthy or not. If +RequireJS is loaded then the declaration is superfluous because `define` is already already +declared in the same scope in RequireJS. Fortunately JavaScript handles multiple `var` +declarations of the same variable in the same scope gracefully. + +If you want to deliver amdefine.js with your code rather than specifying it as a dependency +with npm, then just download the latest release and refer to it using a relative path: + +[Latest Version](https://github.com/jrburke/amdefine/raw/latest/amdefine.js) + +### amdefine/intercept + +Consider this very experimental. + +Instead of pasting the piece of text for the amdefine setup of a `define` +variable in each module you create or consume, you can use `amdefine/intercept` +instead. It will automatically insert the above snippet in each .js file loaded +by Node. + +**Warning**: you should only use this if you are creating an application that +is consuming AMD style defined()'d modules that are distributed via npm and want +to run that code in Node. + +For library code where you are not sure if it will be used by others in Node or +in the browser, then explicitly depending on amdefine and placing the code +snippet above is suggested path, instead of using `amdefine/intercept`. The +intercept module affects all .js files loaded in the Node app, and it is +inconsiderate to modify global state like that unless you are also controlling +the top level app. + +#### Why distribute AMD-style modules via npm? + +npm has a lot of weaknesses for front-end use (installed layout is not great, +should have better support for the `baseUrl + moduleID + '.js' style of loading, +single file JS installs), but some people want a JS package manager and are +willing to live with those constraints. If that is you, but still want to author +in AMD style modules to get dynamic require([]), better direct source usage and +powerful loader plugin support in the browser, then this tool can help. + +#### amdefine/intercept usage + +Just require it in your top level app module (for example index.js, server.js): + +```javascript +require('amdefine/intercept'); +``` + +The module does not return a value, so no need to assign the result to a local +variable. + +Then just require() code as you normally would with Node's require(). Any .js +loaded after the intercept require will have the amdefine check injected in +the .js source as it is loaded. It does not modify the source on disk, just +prepends some content to the text of the module as it is loaded by Node. + +#### How amdefine/intercept works + +It overrides the `Module._extensions['.js']` in Node to automatically prepend +the amdefine snippet above. So, it will affect any .js file loaded by your +app. + +## define() usage + +It is best if you use the anonymous forms of define() in your module: + +```javascript +define(function (require) { + var dependency = require('dependency'); +}); +``` + +or + +```javascript +define(['dependency'], function (dependency) { + +}); +``` + +## RequireJS optimizer integration. + +Version 1.0.3 of the [RequireJS optimizer](http://requirejs.org/docs/optimization.html) +will have support for stripping the `if (typeof define !== 'function')` check +mentioned above, so you can include this snippet for code that runs in the +browser, but avoid taking the cost of the if() statement once the code is +optimized for deployment. + +## Node 0.4 Support + +If you want to support Node 0.4, then add `require` as the second parameter to amdefine: + +```javascript +//Only if you want Node 0.4. If using 0.5 or later, use the above snippet. +if (typeof define !== 'function') { var define = require('amdefine')(module, require) } +``` + +## Limitations + +### Synchronous vs Asynchronous + +amdefine creates a define() function that is callable by your code. It will +execute and trace dependencies and call the factory function *synchronously*, +to keep the behavior in line with Node's synchronous dependency tracing. + +The exception: calling AMD's callback-style require() from inside a factory +function. The require callback is called on process.nextTick(): + +```javascript +define(function (require) { + require(['a'], function(a) { + //'a' is loaded synchronously, but + //this callback is called on process.nextTick(). + }); +}); +``` + +### Loader Plugins + +Loader plugins are supported as long as they call their load() callbacks +synchronously. So ones that do network requests will not work. However plugins +like [text](http://requirejs.org/docs/api.html#text) can load text files locally. + +The plugin API's `load.fromText()` is **not supported** in amdefine, so this means +transpiler plugins like the [CoffeeScript loader plugin](https://github.com/jrburke/require-cs) +will not work. This may be fixable, but it is a bit complex, and I do not have +enough node-fu to figure it out yet. See the source for amdefine.js if you want +to get an idea of the issues involved. + +## Tests + +To run the tests, cd to **tests** and run: + +``` +node all.js +node all-intercept.js +``` + +## License + +New BSD and MIT. Check the LICENSE file for all the details. diff --git a/react-app/node_modules/amdefine/amdefine.js b/react-app/node_modules/amdefine/amdefine.js new file mode 100644 index 0000000000..0c4a954a1d --- /dev/null +++ b/react-app/node_modules/amdefine/amdefine.js @@ -0,0 +1,301 @@ +/** vim: et:ts=4:sw=4:sts=4 + * @license amdefine 1.0.0 Copyright (c) 2011-2015, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/amdefine for details + */ + +/*jslint node: true */ +/*global module, process */ +'use strict'; + +/** + * Creates a define for node. + * @param {Object} module the "module" object that is defined by Node for the + * current module. + * @param {Function} [requireFn]. Node's require function for the current module. + * It only needs to be passed in Node versions before 0.5, when module.require + * did not exist. + * @returns {Function} a define function that is usable for the current node + * module. + */ +function amdefine(module, requireFn) { + 'use strict'; + var defineCache = {}, + loaderCache = {}, + alreadyCalled = false, + path = require('path'), + makeRequire, stringRequire; + + /** + * Trims the . and .. from an array of path segments. + * It will keep a leading path segment if a .. will become + * the first path segment, to help with module name lookups, + * which act like paths, but can be remapped. But the end result, + * all paths that use this function should look normalized. + * NOTE: this method MODIFIES the input array. + * @param {Array} ary the array of path segments. + */ + function trimDots(ary) { + var i, part; + for (i = 0; ary[i]; i+= 1) { + part = ary[i]; + if (part === '.') { + ary.splice(i, 1); + i -= 1; + } else if (part === '..') { + if (i === 1 && (ary[2] === '..' || ary[0] === '..')) { + //End of the line. Keep at least one non-dot + //path segment at the front so it can be mapped + //correctly to disk. Otherwise, there is likely + //no path mapping for a path starting with '..'. + //This can still fail, but catches the most reasonable + //uses of .. + break; + } else if (i > 0) { + ary.splice(i - 1, 2); + i -= 2; + } + } + } + } + + function normalize(name, baseName) { + var baseParts; + + //Adjust any relative paths. + if (name && name.charAt(0) === '.') { + //If have a base name, try to normalize against it, + //otherwise, assume it is a top-level require that will + //be relative to baseUrl in the end. + if (baseName) { + baseParts = baseName.split('/'); + baseParts = baseParts.slice(0, baseParts.length - 1); + baseParts = baseParts.concat(name.split('/')); + trimDots(baseParts); + name = baseParts.join('/'); + } + } + + return name; + } + + /** + * Create the normalize() function passed to a loader plugin's + * normalize method. + */ + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(id) { + function load(value) { + loaderCache[id] = value; + } + + load.fromText = function (id, text) { + //This one is difficult because the text can/probably uses + //define, and any relative paths and requires should be relative + //to that id was it would be found on disk. But this would require + //bootstrapping a module/require fairly deeply from node core. + //Not sure how best to go about that yet. + throw new Error('amdefine does not implement load.fromText'); + }; + + return load; + } + + makeRequire = function (systemRequire, exports, module, relId) { + function amdRequire(deps, callback) { + if (typeof deps === 'string') { + //Synchronous, single module require('') + return stringRequire(systemRequire, exports, module, deps, relId); + } else { + //Array of dependencies with a callback. + + //Convert the dependencies to modules. + deps = deps.map(function (depName) { + return stringRequire(systemRequire, exports, module, depName, relId); + }); + + //Wait for next tick to call back the require call. + if (callback) { + process.nextTick(function () { + callback.apply(null, deps); + }); + } + } + } + + amdRequire.toUrl = function (filePath) { + if (filePath.indexOf('.') === 0) { + return normalize(filePath, path.dirname(module.filename)); + } else { + return filePath; + } + }; + + return amdRequire; + }; + + //Favor explicit value, passed in if the module wants to support Node 0.4. + requireFn = requireFn || function req() { + return module.require.apply(module, arguments); + }; + + function runFactory(id, deps, factory) { + var r, e, m, result; + + if (id) { + e = loaderCache[id] = {}; + m = { + id: id, + uri: __filename, + exports: e + }; + r = makeRequire(requireFn, e, m, id); + } else { + //Only support one define call per file + if (alreadyCalled) { + throw new Error('amdefine with no module ID cannot be called more than once per file.'); + } + alreadyCalled = true; + + //Use the real variables from node + //Use module.exports for exports, since + //the exports in here is amdefine exports. + e = module.exports; + m = module; + r = makeRequire(requireFn, e, m, module.id); + } + + //If there are dependencies, they are strings, so need + //to convert them to dependency values. + if (deps) { + deps = deps.map(function (depName) { + return r(depName); + }); + } + + //Call the factory with the right dependencies. + if (typeof factory === 'function') { + result = factory.apply(m.exports, deps); + } else { + result = factory; + } + + if (result !== undefined) { + m.exports = result; + if (id) { + loaderCache[id] = m.exports; + } + } + } + + stringRequire = function (systemRequire, exports, module, id, relId) { + //Split the ID by a ! so that + var index = id.indexOf('!'), + originalId = id, + prefix, plugin; + + if (index === -1) { + id = normalize(id, relId); + + //Straight module lookup. If it is one of the special dependencies, + //deal with it, otherwise, delegate to node. + if (id === 'require') { + return makeRequire(systemRequire, exports, module, relId); + } else if (id === 'exports') { + return exports; + } else if (id === 'module') { + return module; + } else if (loaderCache.hasOwnProperty(id)) { + return loaderCache[id]; + } else if (defineCache[id]) { + runFactory.apply(null, defineCache[id]); + return loaderCache[id]; + } else { + if(systemRequire) { + return systemRequire(originalId); + } else { + throw new Error('No module with ID: ' + id); + } + } + } else { + //There is a plugin in play. + prefix = id.substring(0, index); + id = id.substring(index + 1, id.length); + + plugin = stringRequire(systemRequire, exports, module, prefix, relId); + + if (plugin.normalize) { + id = plugin.normalize(id, makeNormalize(relId)); + } else { + //Normalize the ID normally. + id = normalize(id, relId); + } + + if (loaderCache[id]) { + return loaderCache[id]; + } else { + plugin.load(id, makeRequire(systemRequire, exports, module, relId), makeLoad(id), {}); + + return loaderCache[id]; + } + } + }; + + //Create a define function specific to the module asking for amdefine. + function define(id, deps, factory) { + if (Array.isArray(id)) { + factory = deps; + deps = id; + id = undefined; + } else if (typeof id !== 'string') { + factory = id; + id = deps = undefined; + } + + if (deps && !Array.isArray(deps)) { + factory = deps; + deps = undefined; + } + + if (!deps) { + deps = ['require', 'exports', 'module']; + } + + //Set up properties for this module. If an ID, then use + //internal cache. If no ID, then use the external variables + //for this node module. + if (id) { + //Put the module in deep freeze until there is a + //require call for it. + defineCache[id] = [id, deps, factory]; + } else { + runFactory(id, deps, factory); + } + } + + //define.require, which has access to all the values in the + //cache. Useful for AMD modules that all have IDs in the file, + //but need to finally export a value to node based on one of those + //IDs. + define.require = function (id) { + if (loaderCache[id]) { + return loaderCache[id]; + } + + if (defineCache[id]) { + runFactory.apply(null, defineCache[id]); + return loaderCache[id]; + } + }; + + define.amd = {}; + + return define; +} + +module.exports = amdefine; diff --git a/react-app/node_modules/amdefine/intercept.js b/react-app/node_modules/amdefine/intercept.js new file mode 100644 index 0000000000..771a98301f --- /dev/null +++ b/react-app/node_modules/amdefine/intercept.js @@ -0,0 +1,36 @@ +/*jshint node: true */ +var inserted, + Module = require('module'), + fs = require('fs'), + existingExtFn = Module._extensions['.js'], + amdefineRegExp = /amdefine\.js/; + +inserted = "if (typeof define !== 'function') {var define = require('amdefine')(module)}"; + +//From the node/lib/module.js source: +function stripBOM(content) { + // Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + // because the buffer-to-string conversion in `fs.readFileSync()` + // translates it to FEFF, the UTF-16 BOM. + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +} + +//Also adapted from the node/lib/module.js source: +function intercept(module, filename) { + var content = stripBOM(fs.readFileSync(filename, 'utf8')); + + if (!amdefineRegExp.test(module.id)) { + content = inserted + content; + } + + module._compile(content, filename); +} + +intercept._id = 'amdefine/intercept'; + +if (!existingExtFn._id || existingExtFn._id !== intercept._id) { + Module._extensions['.js'] = intercept; +} diff --git a/react-app/node_modules/amdefine/package.json b/react-app/node_modules/amdefine/package.json new file mode 100644 index 0000000000..42fe203e21 --- /dev/null +++ b/react-app/node_modules/amdefine/package.json @@ -0,0 +1,75 @@ +{ + "_args": [ + [ + "amdefine@>=0.0.4", + "/Users/mromano/dev/react-sfs/node_modules/source-map-support/node_modules/source-map" + ] + ], + "_from": "amdefine@>=0.0.4", + "_id": "amdefine@1.0.0", + "_inCache": true, + "_installable": true, + "_location": "/amdefine", + "_nodeVersion": "0.10.36", + "_npmUser": { + "email": "jrburke@gmail.com", + "name": "jrburke" + }, + "_npmVersion": "2.12.1", + "_phantomChildren": {}, + "_requested": { + "name": "amdefine", + "raw": "amdefine@>=0.0.4", + "rawSpec": ">=0.0.4", + "scope": null, + "spec": ">=0.0.4", + "type": "range" + }, + "_requiredBy": [ + "/jstransform/source-map", + "/source-map-support/source-map" + ], + "_resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "_shasum": "fd17474700cb5cc9c2b709f0be9d23ce3c198c33", + "_shrinkwrap": null, + "_spec": "amdefine@>=0.0.4", + "_where": "/Users/mromano/dev/react-sfs/node_modules/source-map-support/node_modules/source-map", + "author": { + "email": "jrburke@gmail.com", + "name": "James Burke", + "url": "http://github.com/jrburke" + }, + "bugs": { + "url": "https://github.com/jrburke/amdefine/issues" + }, + "dependencies": {}, + "description": "Provide AMD's define() API for declaring modules in the AMD format", + "devDependencies": {}, + "directories": {}, + "dist": { + "shasum": "fd17474700cb5cc9c2b709f0be9d23ce3c198c33", + "tarball": "http://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + }, + "engines": { + "node": ">=0.4.2" + }, + "gitHead": "578bc4a3f7dede33f3f3e10edde0c1607005d761", + "homepage": "http://github.com/jrburke/amdefine", + "license": "BSD-3-Clause AND MIT", + "main": "./amdefine.js", + "maintainers": [ + { + "email": "jrburke@gmail.com", + "name": "jrburke" + } + ], + "name": "amdefine", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/jrburke/amdefine.git" + }, + "scripts": {}, + "version": "1.0.0" +} diff --git a/react-app/node_modules/ansi-regex/index.js b/react-app/node_modules/ansi-regex/index.js new file mode 100644 index 0000000000..4906755bc9 --- /dev/null +++ b/react-app/node_modules/ansi-regex/index.js @@ -0,0 +1,4 @@ +'use strict'; +module.exports = function () { + return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; +}; diff --git a/react-app/node_modules/ansi-regex/license b/react-app/node_modules/ansi-regex/license new file mode 100644 index 0000000000..654d0bfe94 --- /dev/null +++ b/react-app/node_modules/ansi-regex/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. diff --git a/react-app/node_modules/ansi-regex/package.json b/react-app/node_modules/ansi-regex/package.json new file mode 100644 index 0000000000..bffd2d7987 --- /dev/null +++ b/react-app/node_modules/ansi-regex/package.json @@ -0,0 +1,113 @@ +{ + "_args": [ + [ + "ansi-regex@^2.0.0", + "/Users/mromano/dev/react-sfs/node_modules/has-ansi" + ] + ], + "_from": "ansi-regex@>=2.0.0 <3.0.0", + "_id": "ansi-regex@2.0.0", + "_inCache": true, + "_installable": true, + "_location": "/ansi-regex", + "_nodeVersion": "0.12.5", + "_npmUser": { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + "_npmVersion": "2.11.2", + "_phantomChildren": {}, + "_requested": { + "name": "ansi-regex", + "raw": "ansi-regex@^2.0.0", + "rawSpec": "^2.0.0", + "scope": null, + "spec": ">=2.0.0 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "/has-ansi", + "/strip-ansi" + ], + "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107", + "_shrinkwrap": null, + "_spec": "ansi-regex@^2.0.0", + "_where": "/Users/mromano/dev/react-sfs/node_modules/has-ansi", + "author": { + "email": "sindresorhus@gmail.com", + "name": "Sindre Sorhus", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/ansi-regex/issues" + }, + "dependencies": {}, + "description": "Regular expression for matching ANSI escape codes", + "devDependencies": { + "mocha": "*" + }, + "directories": {}, + "dist": { + "shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107", + "tarball": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "gitHead": "57c3f2941a73079fa8b081e02a522e3d29913e2f", + "homepage": "https://github.com/sindresorhus/ansi-regex", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "license": "MIT", + "maintainers": [ + { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + { + "email": "jappelman@xebia.com", + "name": "jbnicolai" + } + ], + "name": "ansi-regex", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/ansi-regex.git" + }, + "scripts": { + "test": "mocha test/test.js", + "view-supported": "node test/viewCodes.js" + }, + "version": "2.0.0" +} diff --git a/react-app/node_modules/ansi-regex/readme.md b/react-app/node_modules/ansi-regex/readme.md new file mode 100644 index 0000000000..1a4894ec11 --- /dev/null +++ b/react-app/node_modules/ansi-regex/readme.md @@ -0,0 +1,31 @@ +# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex) + +> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install --save ansi-regex +``` + + +## Usage + +```js +var ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001b[4mcake\u001b[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001b[4mcake\u001b[0m'.match(ansiRegex()); +//=> ['\u001b[4m', '\u001b[0m'] +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/react-app/node_modules/ansi-styles/index.js b/react-app/node_modules/ansi-styles/index.js new file mode 100644 index 0000000000..78945278f7 --- /dev/null +++ b/react-app/node_modules/ansi-styles/index.js @@ -0,0 +1,65 @@ +'use strict'; + +function assembleStyles () { + var styles = { + modifiers: { + reset: [0, 0], + bold: [1, 22], // 21 isn't widely supported and 22 does the same thing + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + colors: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39] + }, + bgColors: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49] + } + }; + + // fix humans + styles.colors.grey = styles.colors.gray; + + Object.keys(styles).forEach(function (groupName) { + var group = styles[groupName]; + + Object.keys(group).forEach(function (styleName) { + var style = group[styleName]; + + styles[styleName] = group[styleName] = { + open: '\u001b[' + style[0] + 'm', + close: '\u001b[' + style[1] + 'm' + }; + }); + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + }); + + return styles; +} + +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/react-app/node_modules/ansi-styles/license b/react-app/node_modules/ansi-styles/license new file mode 100644 index 0000000000..654d0bfe94 --- /dev/null +++ b/react-app/node_modules/ansi-styles/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. diff --git a/react-app/node_modules/ansi-styles/package.json b/react-app/node_modules/ansi-styles/package.json new file mode 100644 index 0000000000..1bfd4332b5 --- /dev/null +++ b/react-app/node_modules/ansi-styles/package.json @@ -0,0 +1,106 @@ +{ + "_args": [ + [ + "ansi-styles@^2.2.1", + "/Users/mromano/dev/react-sfs/node_modules/chalk" + ] + ], + "_from": "ansi-styles@>=2.2.1 <3.0.0", + "_id": "ansi-styles@2.2.1", + "_inCache": true, + "_installable": true, + "_location": "/ansi-styles", + "_nodeVersion": "4.3.0", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/ansi-styles-2.2.1.tgz_1459197317833_0.9694824463222176" + }, + "_npmUser": { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + "_npmVersion": "3.8.3", + "_phantomChildren": {}, + "_requested": { + "name": "ansi-styles", + "raw": "ansi-styles@^2.2.1", + "rawSpec": "^2.2.1", + "scope": null, + "spec": ">=2.2.1 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "/chalk" + ], + "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "_shasum": "b432dd3358b634cf75e1e4664368240533c1ddbe", + "_shrinkwrap": null, + "_spec": "ansi-styles@^2.2.1", + "_where": "/Users/mromano/dev/react-sfs/node_modules/chalk", + "author": { + "email": "sindresorhus@gmail.com", + "name": "Sindre Sorhus", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/ansi-styles/issues" + }, + "dependencies": {}, + "description": "ANSI escape codes for styling strings in the terminal", + "devDependencies": { + "mocha": "*" + }, + "directories": {}, + "dist": { + "shasum": "b432dd3358b634cf75e1e4664368240533c1ddbe", + "tarball": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "gitHead": "95c59b23be760108b6530ca1c89477c21b258032", + "homepage": "https://github.com/chalk/ansi-styles#readme", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "maintainers": [ + { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + } + ], + "name": "ansi-styles", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/ansi-styles.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "2.2.1" +} diff --git a/react-app/node_modules/ansi-styles/readme.md b/react-app/node_modules/ansi-styles/readme.md new file mode 100644 index 0000000000..3f933f6162 --- /dev/null +++ b/react-app/node_modules/ansi-styles/readme.md @@ -0,0 +1,86 @@ +# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) + +> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + +![](screenshot.png) + + +## Install + +``` +$ npm install --save ansi-styles +``` + + +## Usage + +```js +var ansi = require('ansi-styles'); + +console.log(ansi.green.open + 'Hello world!' + ansi.green.close); +``` + + +## API + +Each style has an `open` and `close` property. + + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(not widely supported)* +- `underline` +- `inverse` +- `hidden` +- `strikethrough` *(not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `gray` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` + + +## Advanced usage + +By default you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `ansi.modifiers` +- `ansi.colors` +- `ansi.bgColors` + + +###### Example + +```js +console.log(ansi.colors.green.open); +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/react-app/node_modules/babel-code-frame/.npmignore b/react-app/node_modules/babel-code-frame/.npmignore new file mode 100644 index 0000000000..47cdd2c655 --- /dev/null +++ b/react-app/node_modules/babel-code-frame/.npmignore @@ -0,0 +1,3 @@ +src +test +node_modules diff --git a/react-app/node_modules/babel-code-frame/README.md b/react-app/node_modules/babel-code-frame/README.md new file mode 100644 index 0000000000..b9a5c6ca34 --- /dev/null +++ b/react-app/node_modules/babel-code-frame/README.md @@ -0,0 +1,32 @@ +# babel-code-frame + +> Generate errors that contain a code frame that point to source locations. + +## Install + +```sh +$ npm install babel-code-frame +``` + +## Usage + +```js +import codeFrame from 'babel-code-frame'; + +const rawLines = `class Foo { + constructor() +}`; +const lineNumber = 2; +const colNumber = 16; + +const result = codeFrame(rawLines, lineNumber, colNumber, { /* options */ }); + +console.log(result); +``` + +```sh + 1 | class Foo { +> 2 | constructor() + | ^ + 3 | } +``` diff --git a/react-app/node_modules/babel-code-frame/lib/index.js b/react-app/node_modules/babel-code-frame/lib/index.js new file mode 100644 index 0000000000..fe2d4bbb6d --- /dev/null +++ b/react-app/node_modules/babel-code-frame/lib/index.js @@ -0,0 +1,148 @@ +/* eslint indent: 0 */ +/* eslint max-len: 0 */ + +//import lineNumbers from "line-numbers"; +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _repeating = require("repeating"); + +var _repeating2 = _interopRequireDefault(_repeating); + +var _jsTokens = require("js-tokens"); + +var _jsTokens2 = _interopRequireDefault(_jsTokens); + +var _esutils = require("esutils"); + +var _esutils2 = _interopRequireDefault(_esutils); + +var _chalk = require("chalk"); + +var _chalk2 = _interopRequireDefault(_chalk); + +function lineNumbers(lines) { + return lines; +} + +/** + * Chalk styles for token types. + */ + +var defs = { + string: _chalk2["default"].red, + punctuator: _chalk2["default"].bold, + curly: _chalk2["default"].green, + parens: _chalk2["default"].blue.bold, + square: _chalk2["default"].yellow, + keyword: _chalk2["default"].cyan, + number: _chalk2["default"].magenta, + regex: _chalk2["default"].magenta, + comment: _chalk2["default"].grey, + invalid: _chalk2["default"].inverse +}; + +/** + * RegExp to test for newlines in terminal. + */ + +var NEWLINE = /\r\n|[\n\r\u2028\u2029]/; + +/** + * Get the type of token, specifying punctuator type. + */ + +function getTokenType(match) { + var token = _jsTokens2["default"].matchToToken(match); + if (token.type === "name" && _esutils2["default"].keyword.isReservedWordES6(token.value)) { + return "keyword"; + } + + if (token.type === "punctuator") { + switch (token.value) { + case "{": + case "}": + return "curly"; + case "(": + case ")": + return "parens"; + case "[": + case "]": + return "square"; + } + } + + return token.type; +} + +/** + * Highlight `text`. + */ + +function highlight(text) { + return text.replace(_jsTokens2["default"], function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var type = getTokenType(args); + var colorize = defs[type]; + if (colorize) { + return args[0].split(NEWLINE).map(function (str) { + return colorize(str); + }).join("\n"); + } else { + return args[0]; + } + }); +} + +/** + * Create a code frame, adding line numbers, code highlighting, and pointing to a given position. + */ + +exports["default"] = function (rawLines, lineNumber, colNumber) { + var opts = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; + + colNumber = Math.max(colNumber, 0); + + var highlighted = opts.highlightCode && _chalk2["default"].supportsColor; + if (highlighted) rawLines = highlight(rawLines); + + var lines = rawLines.split(NEWLINE); + var start = Math.max(lineNumber - 3, 0); + var end = Math.min(lines.length, lineNumber + 3); + + if (!lineNumber && !colNumber) { + start = 0; + end = lines.length; + } + + var frame = lineNumbers(lines.slice(start, end), { + start: start + 1, + before: " ", + after: " | ", + transform: function transform(params) { + if (params.number !== lineNumber) { + return; + } + + if (colNumber) { + params.line += "\n" + params.before + _repeating2["default"](" ", params.width) + params.after + _repeating2["default"](" ", colNumber - 1) + "^"; + } + + params.before = params.before.replace(/^./, ">"); + } + }).join("\n"); + + if (highlighted) { + return _chalk2["default"].reset(frame); + } else { + return frame; + } +}; + +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-code-frame/package.json b/react-app/node_modules/babel-code-frame/package.json new file mode 100644 index 0000000000..4f126c5159 --- /dev/null +++ b/react-app/node_modules/babel-code-frame/package.json @@ -0,0 +1,97 @@ +{ + "_args": [ + [ + "babel-code-frame@^6.7.4", + "/Users/mromano/dev/react-sfs/node_modules/babel-traverse" + ] + ], + "_from": "babel-code-frame@>=6.7.4 <7.0.0", + "_id": "babel-code-frame@6.7.4", + "_inCache": true, + "_installable": true, + "_location": "/babel-code-frame", + "_nodeVersion": "5.9.0", + "_npmOperationalInternal": { + "host": "packages-13-west.internal.npmjs.com", + "tmp": "tmp/babel-code-frame-6.7.4.tgz_1458704268242_0.11339025967754424" + }, + "_npmUser": { + "email": "loganfsmyth@gmail.com", + "name": "loganfsmyth" + }, + "_npmVersion": "3.7.3", + "_phantomChildren": {}, + "_requested": { + "name": "babel-code-frame", + "raw": "babel-code-frame@^6.7.4", + "rawSpec": "^6.7.4", + "scope": null, + "spec": ">=6.7.4 <7.0.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-core", + "/babel-traverse" + ], + "_resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.4.tgz", + "_shasum": "9ce81b410d696bc59e8261c8e2a59f91d8e126d4", + "_shrinkwrap": null, + "_spec": "babel-code-frame@^6.7.4", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babel-traverse", + "author": { + "email": "sebmck@gmail.com", + "name": "Sebastian McKenzie" + }, + "dependencies": { + "babel-runtime": "^5.0.0", + "chalk": "^1.1.0", + "esutils": "^2.0.2", + "js-tokens": "^1.0.1", + "repeating": "^1.1.3" + }, + "description": "Generate errors that contain a code frame that point to source locations.", + "devDependencies": {}, + "directories": {}, + "dist": { + "shasum": "9ce81b410d696bc59e8261c8e2a59f91d8e126d4", + "tarball": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.7.4.tgz" + }, + "homepage": "https://babeljs.io/", + "license": "MIT", + "main": "lib/index.js", + "maintainers": [ + { + "email": "amjad.masad@gmail.com", + "name": "amasad" + }, + { + "email": "hi@henryzoo.com", + "name": "hzoo" + }, + { + "email": "npm-public@jessemccarthy.net", + "name": "jmm" + }, + { + "email": "loganfsmyth@gmail.com", + "name": "loganfsmyth" + }, + { + "email": "sebmck@gmail.com", + "name": "sebmck" + }, + { + "email": "me@thejameskyle.com", + "name": "thejameskyle" + } + ], + "name": "babel-code-frame", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel/tree/master/packages/babel-code-frame" + }, + "scripts": {}, + "version": "6.7.4" +} diff --git a/react-app/node_modules/babel-core/README.md b/react-app/node_modules/babel-core/README.md new file mode 100644 index 0000000000..2a039557b5 --- /dev/null +++ b/react-app/node_modules/babel-core/README.md @@ -0,0 +1,24 @@ +# babel-core + +> Babel compiler core. + +## Install + +``` +$ npm install babel-core +``` + +## Usage + +```js +import babel from 'babel-core'; + +const code = `class Example {}`; +const result = babel.transform(code, { /* options */ }); + +result.code; // Generated code +result.map; // Sourcemap +result.ast; // AST +``` + +For more in depth documentation see: http://babeljs.io/docs/usage/api/ diff --git a/react-app/node_modules/babel-core/index.js b/react-app/node_modules/babel-core/index.js new file mode 100644 index 0000000000..e8f04775a2 --- /dev/null +++ b/react-app/node_modules/babel-core/index.js @@ -0,0 +1 @@ +module.exports = require("./lib/api/node.js"); diff --git a/react-app/node_modules/babel-core/lib/api/browser.js b/react-app/node_modules/babel-core/lib/api/browser.js new file mode 100644 index 0000000000..81a37d5e8f --- /dev/null +++ b/react-app/node_modules/babel-core/lib/api/browser.js @@ -0,0 +1,109 @@ +/* eslint max-len: 0 */ +/* eslint no-new-func: 0 */ + +"use strict"; + +var _defaults = require("babel-runtime/helpers/defaults")["default"]; + +var _interopExportWildcard = require("babel-runtime/helpers/interop-export-wildcard")["default"]; + +exports.__esModule = true; +exports.run = run; +exports.load = load; + +var _node = require("./node"); + +_defaults(exports, _interopExportWildcard(_node, _defaults)); + +function run(code) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + return new Function(_node.transform(code, opts).code)(); +} + +function load(url, callback, opts, hold) { + if (opts === undefined) opts = {}; + + opts.filename = opts.filename || url; + + var xhr = global.ActiveXObject ? new global.ActiveXObject("Microsoft.XMLHTTP") : new global.XMLHttpRequest(); + xhr.open("GET", url, true); + if ("overrideMimeType" in xhr) xhr.overrideMimeType("text/plain"); + + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) return; + + var status = xhr.status; + if (status === 0 || status === 200) { + var param = [xhr.responseText, opts]; + if (!hold) run(param); + if (callback) callback(param); + } else { + throw new Error("Could not load " + url); + } + }; + + xhr.send(null); +} + +function runScripts() { + var scripts = []; + var types = ["text/ecmascript-6", "text/6to5", "text/babel", "module"]; + var index = 0; + + /** + * Transform and execute script. Ensures correct load order. + */ + + function exec() { + var param = scripts[index]; + if (param instanceof Array) { + run(param, index); + index++; + exec(); + } + } + + /** + * Load, transform, and execute all scripts. + */ + + function run(script, i) { + var opts = {}; + + if (script.src) { + load(script.src, function (param) { + scripts[i] = param; + exec(); + }, opts, true); + } else { + opts.filename = "embedded"; + scripts[i] = [script.innerHTML, opts]; + } + } + + // Collect scripts with Babel `types`. + + var _scripts = global.document.getElementsByTagName("script"); + + for (var i = 0; i < _scripts.length; ++i) { + var _script = _scripts[i]; + if (types.indexOf(_script.type) >= 0) scripts.push(_script); + } + + for (var i = 0; i < scripts.length; i++) { + run(scripts[i], i); + } + + exec(); +} + +/** + * Register load event to transform and execute scripts. + */ + +if (global.addEventListener) { + global.addEventListener("DOMContentLoaded", runScripts, false); +} else if (global.attachEvent) { + global.attachEvent("onload", runScripts); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/api/node.js b/react-app/node_modules/babel-core/lib/api/node.js new file mode 100644 index 0000000000..ad359361e5 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/api/node.js @@ -0,0 +1,125 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +var _interopRequire = require("babel-runtime/helpers/interop-require")["default"]; + +exports.__esModule = true; +exports.Plugin = Plugin; +exports.transformFile = transformFile; +exports.transformFileSync = transformFileSync; + +var _lodashLangIsFunction = require("lodash/lang/isFunction"); + +var _lodashLangIsFunction2 = _interopRequireDefault(_lodashLangIsFunction); + +var _fs = require("fs"); + +var _fs2 = _interopRequireDefault(_fs); + +// + +// + +var _util = require("../util"); + +var util = _interopRequireWildcard(_util); + +var _babelMessages = require("babel-messages"); + +var messages = _interopRequireWildcard(_babelMessages); + +var _babelTypes = require("babel-types"); + +var t = _interopRequireWildcard(_babelTypes); + +var _babelTraverse = require("babel-traverse"); + +var _babelTraverse2 = _interopRequireDefault(_babelTraverse); + +var _transformationFileOptionsOptionManager = require("../transformation/file/options/option-manager"); + +var _transformationFileOptionsOptionManager2 = _interopRequireDefault(_transformationFileOptionsOptionManager); + +// + +var _transformationPipeline = require("../transformation/pipeline"); + +var _transformationPipeline2 = _interopRequireDefault(_transformationPipeline); + +var _transformationFile = require("../transformation/file"); + +exports.File = _interopRequire(_transformationFile); + +var _transformationFileOptionsConfig = require("../transformation/file/options/config"); + +exports.options = _interopRequire(_transformationFileOptionsConfig); + +var _toolsBuildExternalHelpers = require("../tools/build-external-helpers"); + +exports.buildExternalHelpers = _interopRequire(_toolsBuildExternalHelpers); + +var _babelTemplate = require("babel-template"); + +exports.template = _interopRequire(_babelTemplate); + +var _package = require("../../package"); + +exports.version = _package.version; +exports.util = util; +exports.messages = messages; +exports.types = t; +exports.traverse = _babelTraverse2["default"]; +exports.OptionManager = _transformationFileOptionsOptionManager2["default"]; + +function Plugin(alias) { + throw new Error("The (" + alias + ") Babel 5 plugin is being run with Babel 6."); +} + +exports.Pipeline = _transformationPipeline2["default"]; + +var pipeline = new _transformationPipeline2["default"](); +var analyse = pipeline.analyse.bind(pipeline); +exports.analyse = analyse; +var transform = pipeline.transform.bind(pipeline); +exports.transform = transform; +var transformFromAst = pipeline.transformFromAst.bind(pipeline); + +exports.transformFromAst = transformFromAst; +// + +function transformFile(filename, opts, callback) { + if (_lodashLangIsFunction2["default"](opts)) { + callback = opts; + opts = {}; + } + + opts.filename = filename; + + _fs2["default"].readFile(filename, function (err, code) { + var result = undefined; + + if (!err) { + try { + result = transform(code, opts); + } catch (_err) { + err = _err; + } + } + + if (err) { + callback(err); + } else { + callback(null, result); + } + }); +} + +function transformFileSync(filename) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + opts.filename = filename; + return transform(_fs2["default"].readFileSync(filename, "utf8"), opts); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/helpers/merge.js b/react-app/node_modules/babel-core/lib/helpers/merge.js new file mode 100644 index 0000000000..7584d43659 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/helpers/merge.js @@ -0,0 +1,44 @@ +"use strict"; + +var _getIterator = require("babel-runtime/core-js/get-iterator")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _lodashObjectMerge = require("lodash/object/merge"); + +var _lodashObjectMerge2 = _interopRequireDefault(_lodashObjectMerge); + +exports["default"] = function (dest, src) { + if (!dest || !src) return; + + return _lodashObjectMerge2["default"](dest, src, function (a, b) { + if (b && Array.isArray(a)) { + var newArray = b.slice(0); + + for (var _iterator = a, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var item = _ref; + + if (newArray.indexOf(item) < 0) { + newArray.push(item); + } + } + + return newArray; + } + }); +}; + +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/helpers/normalize-ast.js b/react-app/node_modules/babel-core/lib/helpers/normalize-ast.js new file mode 100644 index 0000000000..e4e138419e --- /dev/null +++ b/react-app/node_modules/babel-core/lib/helpers/normalize-ast.js @@ -0,0 +1,29 @@ +"use strict"; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; + +var _babelTypes = require("babel-types"); + +var t = _interopRequireWildcard(_babelTypes); + +/** + * Normalize an AST. + * + * - Wrap `Program` node with a `File` node. + */ + +exports["default"] = function (ast, comments, tokens) { + if (ast) { + if (ast.type === "Program") { + return t.file(ast, comments || [], tokens || []); + } else if (ast.type === "File") { + return ast; + } + } + + throw new Error("Not a valid ast?"); +}; + +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/helpers/resolve.js b/react-app/node_modules/babel-core/lib/helpers/resolve.js new file mode 100644 index 0000000000..a329e59ef1 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/helpers/resolve.js @@ -0,0 +1,49 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _module2 = require("module"); + +var _module3 = _interopRequireDefault(_module2); + +var _path = require("path"); + +var _path2 = _interopRequireDefault(_path); + +var relativeModules = {}; + +exports["default"] = function (loc) { + var relative = arguments.length <= 1 || arguments[1] === undefined ? process.cwd() : arguments[1]; + + // we're in the browser, probably + if (typeof _module3["default"] === "object") return null; + + var relativeMod = relativeModules[relative]; + + if (!relativeMod) { + relativeMod = new _module3["default"](); + + // We need to define an id and filename on our "fake" relative` module so that + // Node knows what "." means in the case of us trying to resolve a plugin + // such as "./myPlugins/somePlugin.js". If we don't specify id and filename here, + // Node presumes "." is process.cwd(), not our relative path. + // Since this fake module is never "loaded", we don't have to worry about mutating + // any global Node module cache state here. + var filename = _path2["default"].join(relative, ".babelrc"); + relativeMod.id = filename; + relativeMod.filename = filename; + + relativeMod.paths = _module3["default"]._nodeModulePaths(relative); + relativeModules[relative] = relativeMod; + } + + try { + return _module3["default"]._resolveFilename(loc, relativeMod); + } catch (err) { + return null; + } +}; + +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/store.js b/react-app/node_modules/babel-core/lib/store.js new file mode 100644 index 0000000000..be50e53a23 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/store.js @@ -0,0 +1,41 @@ +"use strict"; + +var _inherits = require("babel-runtime/helpers/inherits")["default"]; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _Map2 = require("babel-runtime/core-js/map")["default"]; + +exports.__esModule = true; + +var Store = (function (_Map) { + _inherits(Store, _Map); + + function Store() { + _classCallCheck(this, Store); + + _Map.call(this); + this.dynamicData = {}; + } + + Store.prototype.setDynamic = function setDynamic(key, fn) { + this.dynamicData[key] = fn; + }; + + Store.prototype.get = function get(key) { + if (this.has(key)) { + return _Map.prototype.get.call(this, key); + } else { + if (Object.prototype.hasOwnProperty.call(this.dynamicData, key)) { + var val = this.dynamicData[key](); + this.set(key, val); + return val; + } + } + }; + + return Store; +})(_Map2); + +exports["default"] = Store; +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/tools/build-external-helpers.js b/react-app/node_modules/babel-core/lib/tools/build-external-helpers.js new file mode 100644 index 0000000000..a886a5f2c0 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/tools/build-external-helpers.js @@ -0,0 +1,108 @@ +/* eslint max-len: 0 */ + +"use strict"; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _babelHelpers = require("babel-helpers"); + +var helpers = _interopRequireWildcard(_babelHelpers); + +var _babelGenerator = require("babel-generator"); + +var _babelGenerator2 = _interopRequireDefault(_babelGenerator); + +var _babelMessages = require("babel-messages"); + +var messages = _interopRequireWildcard(_babelMessages); + +var _babelTemplate = require("babel-template"); + +var _babelTemplate2 = _interopRequireDefault(_babelTemplate); + +var _lodashCollectionEach = require("lodash/collection/each"); + +var _lodashCollectionEach2 = _interopRequireDefault(_lodashCollectionEach); + +var _babelTypes = require("babel-types"); + +var t = _interopRequireWildcard(_babelTypes); + +var buildUmdWrapper = _babelTemplate2["default"]("\n (function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(AMD_ARGUMENTS, factory);\n } else if (typeof exports === \"object\") {\n factory(COMMON_ARGUMENTS);\n } else {\n factory(BROWSER_ARGUMENTS);\n }\n })(UMD_ROOT, function (FACTORY_PARAMETERS) {\n FACTORY_BODY\n });\n"); + +function buildGlobal(namespace, builder) { + var body = []; + var container = t.functionExpression(null, [t.identifier("global")], t.blockStatement(body)); + var tree = t.program([t.expressionStatement(t.callExpression(container, [helpers.get("selfGlobal")]))]); + + body.push(t.variableDeclaration("var", [t.variableDeclarator(namespace, t.assignmentExpression("=", t.memberExpression(t.identifier("global"), namespace), t.objectExpression([])))])); + + builder(body); + + return tree; +} + +function buildUmd(namespace, builder) { + var body = []; + body.push(t.variableDeclaration("var", [t.variableDeclarator(namespace, t.identifier("global"))])); + + builder(body); + + return t.program([buildUmdWrapper({ + FACTORY_PARAMETERS: t.identifier("global"), + BROWSER_ARGUMENTS: t.assignmentExpression("=", t.memberExpression(t.identifier("root"), namespace), t.objectExpression([])), + COMMON_ARGUMENTS: t.identifier("exports"), + AMD_ARGUMENTS: t.arrayExpression([t.stringLiteral("exports")]), + FACTORY_BODY: body, + UMD_ROOT: t.identifier("this") + })]); +} + +function buildVar(namespace, builder) { + var body = []; + body.push(t.variableDeclaration("var", [t.variableDeclarator(namespace, t.objectExpression([]))])); + builder(body); + body.push(t.expressionStatement(namespace)); + return t.program(body); +} + +function buildHelpers(body, namespace, whitelist) { + _lodashCollectionEach2["default"](helpers.list, function (name) { + if (whitelist && whitelist.indexOf(name) < 0) return; + + var key = t.identifier(name); + body.push(t.expressionStatement(t.assignmentExpression("=", t.memberExpression(namespace, key), helpers.get(name)))); + }); +} + +exports["default"] = function (whitelist) { + var outputType = arguments.length <= 1 || arguments[1] === undefined ? "global" : arguments[1]; + + var namespace = t.identifier("babelHelpers"); + + var builder = function builder(body) { + return buildHelpers(body, namespace, whitelist); + }; + + var tree = undefined; + + var build = ({ + global: buildGlobal, + umd: buildUmd, + "var": buildVar + })[outputType]; + + if (build) { + tree = build(namespace, builder); + } else { + throw new Error(messages.get("unsupportedOutputType", outputType)); + } + + return _babelGenerator2["default"](tree).code; +}; + +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/index.js b/react-app/node_modules/babel-core/lib/transformation/file/index.js new file mode 100644 index 0000000000..67f9322c44 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/index.js @@ -0,0 +1,677 @@ +/* global BabelFileResult, BabelParserOptions, BabelFileMetadata */ +/* eslint max-len: 0 */ + +"use strict"; + +var _inherits = require("babel-runtime/helpers/inherits")["default"]; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _Object$assign = require("babel-runtime/core-js/object/assign")["default"]; + +var _Object$create = require("babel-runtime/core-js/object/create")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; + +var _babelHelpers = require("babel-helpers"); + +var _babelHelpers2 = _interopRequireDefault(_babelHelpers); + +var _metadata = require("./metadata"); + +var metadataVisitor = _interopRequireWildcard(_metadata); + +var _convertSourceMap = require("convert-source-map"); + +var _convertSourceMap2 = _interopRequireDefault(_convertSourceMap); + +var _optionsOptionManager = require("./options/option-manager"); + +var _optionsOptionManager2 = _interopRequireDefault(_optionsOptionManager); + +var _pluginPass = require("../plugin-pass"); + +var _pluginPass2 = _interopRequireDefault(_pluginPass); + +var _shebangRegex = require("shebang-regex"); + +var _shebangRegex2 = _interopRequireDefault(_shebangRegex); + +var _babelTraverse = require("babel-traverse"); + +var _sourceMap = require("source-map"); + +var _sourceMap2 = _interopRequireDefault(_sourceMap); + +var _babelGenerator = require("babel-generator"); + +var _babelGenerator2 = _interopRequireDefault(_babelGenerator); + +var _babelCodeFrame = require("babel-code-frame"); + +var _babelCodeFrame2 = _interopRequireDefault(_babelCodeFrame); + +var _lodashObjectDefaults = require("lodash/object/defaults"); + +var _lodashObjectDefaults2 = _interopRequireDefault(_lodashObjectDefaults); + +var _babelTraverse2 = _interopRequireDefault(_babelTraverse); + +var _logger = require("./logger"); + +var _logger2 = _interopRequireDefault(_logger); + +var _store = require("../../store"); + +var _store2 = _interopRequireDefault(_store); + +var _babylon = require("babylon"); + +var _util = require("../../util"); + +var util = _interopRequireWildcard(_util); + +var _path = require("path"); + +var _path2 = _interopRequireDefault(_path); + +var _babelTypes = require("babel-types"); + +var t = _interopRequireWildcard(_babelTypes); + +var _internalPluginsBlockHoist = require("../internal-plugins/block-hoist"); + +var _internalPluginsBlockHoist2 = _interopRequireDefault(_internalPluginsBlockHoist); + +var _internalPluginsShadowFunctions = require("../internal-plugins/shadow-functions"); + +var _internalPluginsShadowFunctions2 = _interopRequireDefault(_internalPluginsShadowFunctions); + +var INTERNAL_PLUGINS = [[_internalPluginsBlockHoist2["default"]], [_internalPluginsShadowFunctions2["default"]]]; + +var errorVisitor = { + enter: function enter(path, state) { + var loc = path.node.loc; + if (loc) { + state.loc = loc; + path.stop(); + } + } +}; + +var File = (function (_Store) { + _inherits(File, _Store); + + function File(opts, pipeline) { + // istanbul ignore next + + var _this = this; + + if (opts === undefined) opts = {}; + + _classCallCheck(this, File); + + _Store.call(this); + + this.pipeline = pipeline; + + this.log = new _logger2["default"](this, opts.filename || "unknown"); + this.opts = this.initOptions(opts); + + this.parserOpts = { + highlightCode: this.opts.highlightCode, + nonStandard: this.opts.nonStandard, + sourceType: this.opts.sourceType, + filename: this.opts.filename, + plugins: [] + }; + + this.pluginVisitors = []; + this.pluginPasses = []; + + // Plugins for top-level options. + this.buildPluginsForOptions(this.opts); + + // If we are in the "pass per preset" mode, build + // also plugins for each preset. + if (this.opts.passPerPreset) { + // All the "per preset" options are inherited from the main options. + this.perPresetOpts = []; + this.opts.presets.forEach(function (presetOpts) { + var perPresetOpts = _Object$assign(_Object$create(_this.opts), presetOpts); + _this.perPresetOpts.push(perPresetOpts); + _this.buildPluginsForOptions(perPresetOpts); + }); + } + + this.metadata = { + usedHelpers: [], + marked: [], + modules: { + imports: [], + exports: { + exported: [], + specifiers: [] + } + } + }; + + this.dynamicImportTypes = {}; + this.dynamicImportIds = {}; + this.dynamicImports = []; + this.declarations = {}; + this.usedHelpers = {}; + + this.path = null; + this.ast = {}; + + this.code = ""; + this.shebang = ""; + + this.hub = new _babelTraverse.Hub(this); + } + + File.prototype.getMetadata = function getMetadata() { + var has = false; + var _arr = this.ast.program.body; + for (var _i = 0; _i < _arr.length; _i++) { + var node = _arr[_i]; + if (t.isModuleDeclaration(node)) { + has = true; + break; + } + } + if (has) { + this.path.traverse(metadataVisitor, this); + } + }; + + File.prototype.initOptions = function initOptions(opts) { + opts = new _optionsOptionManager2["default"](this.log, this.pipeline).init(opts); + + if (opts.inputSourceMap) { + opts.sourceMaps = true; + } + + if (opts.moduleId) { + opts.moduleIds = true; + } + + opts.basename = _path2["default"].basename(opts.filename, _path2["default"].extname(opts.filename)); + + opts.ignore = util.arrayify(opts.ignore, util.regexify); + + if (opts.only) opts.only = util.arrayify(opts.only, util.regexify); + + _lodashObjectDefaults2["default"](opts, { + moduleRoot: opts.sourceRoot + }); + + _lodashObjectDefaults2["default"](opts, { + sourceRoot: opts.moduleRoot + }); + + _lodashObjectDefaults2["default"](opts, { + filenameRelative: opts.filename + }); + + var basenameRelative = _path2["default"].basename(opts.filenameRelative); + + _lodashObjectDefaults2["default"](opts, { + sourceFileName: basenameRelative, + sourceMapTarget: basenameRelative + }); + + return opts; + }; + + File.prototype.buildPluginsForOptions = function buildPluginsForOptions(opts) { + if (!Array.isArray(opts.plugins)) { + return; + } + + var plugins = opts.plugins.concat(INTERNAL_PLUGINS); + var currentPluginVisitors = []; + var currentPluginPasses = []; + + // init plugins! + for (var _i2 = 0; _i2 < plugins.length; _i2++) { + var ref = plugins[_i2];var plugin = ref[0]; + var pluginOpts = ref[1]; + // todo: fix - can't embed in loop head because of flow bug + + currentPluginVisitors.push(plugin.visitor); + currentPluginPasses.push(new _pluginPass2["default"](this, plugin, pluginOpts)); + + if (plugin.manipulateOptions) { + plugin.manipulateOptions(opts, this.parserOpts, this); + } + } + + this.pluginVisitors.push(currentPluginVisitors); + this.pluginPasses.push(currentPluginPasses); + }; + + File.prototype.getModuleName = function getModuleName() { + var opts = this.opts; + if (!opts.moduleIds) { + return null; + } + + // moduleId is n/a if a `getModuleId()` is provided + if (opts.moduleId != null && !opts.getModuleId) { + return opts.moduleId; + } + + var filenameRelative = opts.filenameRelative; + var moduleName = ""; + + if (opts.moduleRoot != null) { + moduleName = opts.moduleRoot + "/"; + } + + if (!opts.filenameRelative) { + return moduleName + opts.filename.replace(/^\//, ""); + } + + if (opts.sourceRoot != null) { + // remove sourceRoot from filename + var sourceRootRegEx = new RegExp("^" + opts.sourceRoot + "\/?"); + filenameRelative = filenameRelative.replace(sourceRootRegEx, ""); + } + + // remove extension + filenameRelative = filenameRelative.replace(/\.(\w*?)$/, ""); + + moduleName += filenameRelative; + + // normalize path separators + moduleName = moduleName.replace(/\\/g, "/"); + + if (opts.getModuleId) { + // If return is falsy, assume they want us to use our generated default name + return opts.getModuleId(moduleName) || moduleName; + } else { + return moduleName; + } + }; + + File.prototype.resolveModuleSource = function resolveModuleSource(source) { + var resolveModuleSource = this.opts.resolveModuleSource; + if (resolveModuleSource) source = resolveModuleSource(source, this.opts.filename); + return source; + }; + + File.prototype.addImport = function addImport(source, imported) { + var name = arguments.length <= 2 || arguments[2] === undefined ? imported : arguments[2]; + return (function () { + var alias = source + ":" + imported; + var id = this.dynamicImportIds[alias]; + + if (!id) { + source = this.resolveModuleSource(source); + id = this.dynamicImportIds[alias] = this.scope.generateUidIdentifier(name); + + var specifiers = []; + + if (imported === "*") { + specifiers.push(t.importNamespaceSpecifier(id)); + } else if (imported === "default") { + specifiers.push(t.importDefaultSpecifier(id)); + } else { + specifiers.push(t.importSpecifier(id, t.identifier(imported))); + } + + var declar = t.importDeclaration(specifiers, t.stringLiteral(source)); + declar._blockHoist = 3; + + this.path.unshiftContainer("body", declar); + } + + return id; + }).apply(this, arguments); + }; + + File.prototype.addHelper = function addHelper(name) { + var declar = this.declarations[name]; + if (declar) return declar; + + if (!this.usedHelpers[name]) { + this.metadata.usedHelpers.push(name); + this.usedHelpers[name] = true; + } + + var generator = this.get("helperGenerator"); + var runtime = this.get("helpersNamespace"); + if (generator) { + var res = generator(name); + if (res) return res; + } else if (runtime) { + return t.memberExpression(runtime, t.identifier(name)); + } + + var ref = _babelHelpers2["default"](name); + var uid = this.declarations[name] = this.scope.generateUidIdentifier(name); + + if (t.isFunctionExpression(ref) && !ref.id) { + ref.body._compact = true; + ref._generated = true; + ref.id = uid; + ref.type = "FunctionDeclaration"; + this.path.unshiftContainer("body", ref); + } else { + ref._compact = true; + this.scope.push({ + id: uid, + init: ref, + unique: true + }); + } + + return uid; + }; + + File.prototype.addTemplateObject = function addTemplateObject(helperName, strings, raw) { + // Generate a unique name based on the string literals so we dedupe + // identical strings used in the program. + var stringIds = raw.elements.map(function (string) { + return string.value; + }); + var name = helperName + "_" + raw.elements.length + "_" + stringIds.join(","); + + var declar = this.declarations[name]; + if (declar) return declar; + + var uid = this.declarations[name] = this.scope.generateUidIdentifier("templateObject"); + + var helperId = this.addHelper(helperName); + var init = t.callExpression(helperId, [strings, raw]); + init._compact = true; + this.scope.push({ + id: uid, + init: init, + _blockHoist: 1.9 // This ensures that we don't fail if not using function expression helpers + }); + return uid; + }; + + File.prototype.buildCodeFrameError = function buildCodeFrameError(node, msg) { + var Error = arguments.length <= 2 || arguments[2] === undefined ? SyntaxError : arguments[2]; + + var loc = node && (node.loc || node._loc); + + var err = new Error(msg); + + if (loc) { + err.loc = loc.start; + } else { + _babelTraverse2["default"](node, errorVisitor, this.scope, err); + + err.message += " (This is an error on an internal node. Probably an internal error"; + + if (err.loc) { + err.message += ". Location has been estimated."; + } + + err.message += ")"; + } + + return err; + }; + + File.prototype.mergeSourceMap = function mergeSourceMap(map) { + var inputMap = this.opts.inputSourceMap; + + if (inputMap) { + var _ret = (function () { + var inputMapConsumer = new _sourceMap2["default"].SourceMapConsumer(inputMap); + var outputMapConsumer = new _sourceMap2["default"].SourceMapConsumer(map); + + var mergedGenerator = new _sourceMap2["default"].SourceMapGenerator({ + file: inputMapConsumer.file, + sourceRoot: inputMapConsumer.sourceRoot + }); + + // This assumes the output map always has a single source, since Babel always compiles a single source file to a + // single output file. + var source = outputMapConsumer.sources[0]; + + inputMapConsumer.eachMapping(function (mapping) { + var generatedPosition = outputMapConsumer.generatedPositionFor({ + line: mapping.generatedLine, + column: mapping.generatedColumn, + source: source + }); + if (generatedPosition.column != null) { + mergedGenerator.addMapping({ + source: mapping.source, + + original: { + line: mapping.originalLine, + column: mapping.originalColumn + }, + + generated: generatedPosition + }); + } + }); + + var mergedMap = mergedGenerator.toJSON(); + inputMap.mappings = mergedMap.mappings; + return { + v: inputMap + }; + })(); + + // istanbul ignore next + if (typeof _ret === "object") return _ret.v; + } else { + return map; + } + }; + + File.prototype.parse = function parse(code) { + this.log.debug("Parse start"); + var ast = _babylon.parse(code, this.parserOpts); + this.log.debug("Parse stop"); + return ast; + }; + + File.prototype._addAst = function _addAst(ast) { + this.path = _babelTraverse.NodePath.get({ + hub: this.hub, + parentPath: null, + parent: ast, + container: ast, + key: "program" + }).setContext(); + this.scope = this.path.scope; + this.ast = ast; + this.getMetadata(); + }; + + File.prototype.addAst = function addAst(ast) { + this.log.debug("Start set AST"); + this._addAst(ast); + this.log.debug("End set AST"); + }; + + File.prototype.transform = function transform() { + // istanbul ignore next + + var _this2 = this; + + // In the "pass per preset" mode, we have grouped passes. + // Otherwise, there is only one plain pluginPasses array. + this.pluginPasses.forEach(function (pluginPasses, index) { + _this2.call("pre", pluginPasses); + _this2.log.debug("Start transform traverse"); + _babelTraverse2["default"](_this2.ast, _babelTraverse2["default"].visitors.merge(_this2.pluginVisitors[index], pluginPasses), _this2.scope); + _this2.log.debug("End transform traverse"); + _this2.call("post", pluginPasses); + }); + + return this.generate(); + }; + + File.prototype.wrap = function wrap(code, callback) { + code = code + ""; + + try { + if (this.shouldIgnore()) { + return this.makeResult({ code: code, ignored: true }); + } else { + return callback(); + } + } catch (err) { + if (err._babel) { + throw err; + } else { + err._babel = true; + } + + var message = err.message = this.opts.filename + ": " + err.message; + + var loc = err.loc; + if (loc) { + err.codeFrame = _babelCodeFrame2["default"](code, loc.line, loc.column + 1, this.opts); + message += "\n" + err.codeFrame; + } + + if (process.browser) { + // chrome has it's own pretty stringifier which doesn't use the stack property + // https://github.com/babel/babel/issues/2175 + err.message = message; + } + + if (err.stack) { + var newStack = err.stack.replace(err.message, message); + err.stack = newStack; + } + + throw err; + } + }; + + File.prototype.addCode = function addCode(code) { + code = (code || "") + ""; + code = this.parseInputSourceMap(code); + this.code = code; + }; + + File.prototype.parseCode = function parseCode() { + this.parseShebang(); + var ast = this.parse(this.code); + this.addAst(ast); + }; + + File.prototype.shouldIgnore = function shouldIgnore() { + var opts = this.opts; + return util.shouldIgnore(opts.filename, opts.ignore, opts.only); + }; + + File.prototype.call = function call(key, pluginPasses) { + for (var _i3 = 0; _i3 < pluginPasses.length; _i3++) { + var pass = pluginPasses[_i3]; + var plugin = pass.plugin; + var fn = plugin[key]; + if (fn) fn.call(pass, this); + } + }; + + File.prototype.parseInputSourceMap = function parseInputSourceMap(code) { + var opts = this.opts; + + if (opts.inputSourceMap !== false) { + var inputMap = _convertSourceMap2["default"].fromSource(code); + if (inputMap) { + opts.inputSourceMap = inputMap.toObject(); + code = _convertSourceMap2["default"].removeComments(code); + } + } + + return code; + }; + + File.prototype.parseShebang = function parseShebang() { + var shebangMatch = _shebangRegex2["default"].exec(this.code); + if (shebangMatch) { + this.shebang = shebangMatch[0]; + this.code = this.code.replace(_shebangRegex2["default"], ""); + } + }; + + File.prototype.makeResult = function makeResult(_ref) { + var code = _ref.code; + var map = _ref.map; + var ast = _ref.ast; + var ignored = _ref.ignored; + + var result = { + metadata: null, + options: this.opts, + ignored: !!ignored, + code: null, + ast: null, + map: map || null + }; + + if (this.opts.code) { + result.code = code; + } + + if (this.opts.ast) { + result.ast = ast; + } + + if (this.opts.metadata) { + result.metadata = this.metadata; + } + + return result; + }; + + File.prototype.generate = function generate() { + var opts = this.opts; + var ast = this.ast; + + var result = { ast: ast }; + if (!opts.code) return this.makeResult(result); + + this.log.debug("Generation start"); + + var _result = _babelGenerator2["default"](ast, opts, this.code); + result.code = _result.code; + result.map = _result.map; + + this.log.debug("Generation end"); + + if (this.shebang) { + // add back shebang + result.code = this.shebang + "\n" + result.code; + } + + if (result.map) { + result.map = this.mergeSourceMap(result.map); + } + + if (opts.sourceMaps === "inline" || opts.sourceMaps === "both") { + result.code += "\n" + _convertSourceMap2["default"].fromObject(result.map).toComment(); + } + + if (opts.sourceMaps === "inline") { + result.map = null; + } + + return this.makeResult(result); + }; + + return File; +})(_store2["default"]); + +exports["default"] = File; +exports.File = File; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/logger.js b/react-app/node_modules/babel-core/lib/transformation/file/logger.js new file mode 100644 index 0000000000..69ab103d33 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/logger.js @@ -0,0 +1,72 @@ +"use strict"; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _debugNode = require("debug/node"); + +var _debugNode2 = _interopRequireDefault(_debugNode); + +var verboseDebug = _debugNode2["default"]("babel:verbose"); +var generalDebug = _debugNode2["default"]("babel"); + +var seenDeprecatedMessages = []; + +var Logger = (function () { + function Logger(file, filename) { + _classCallCheck(this, Logger); + + this.filename = filename; + this.file = file; + } + + Logger.prototype._buildMessage = function _buildMessage(msg) { + var parts = "[BABEL] " + this.filename; + if (msg) parts += ": " + msg; + return parts; + }; + + Logger.prototype.warn = function warn(msg) { + console.warn(this._buildMessage(msg)); + }; + + Logger.prototype.error = function error(msg) { + var Constructor = arguments.length <= 1 || arguments[1] === undefined ? Error : arguments[1]; + + throw new Constructor(this._buildMessage(msg)); + }; + + Logger.prototype.deprecate = function deprecate(msg) { + if (this.file.opts && this.file.opts.suppressDeprecationMessages) return; + + msg = this._buildMessage(msg); + + // already seen this message + if (seenDeprecatedMessages.indexOf(msg) >= 0) return; + + // make sure we don't see it again + seenDeprecatedMessages.push(msg); + + console.error(msg); + }; + + Logger.prototype.verbose = function verbose(msg) { + if (verboseDebug.enabled) verboseDebug(this._buildMessage(msg)); + }; + + Logger.prototype.debug = function debug(msg) { + if (generalDebug.enabled) generalDebug(this._buildMessage(msg)); + }; + + Logger.prototype.deopt = function deopt(node, msg) { + this.debug(msg); + }; + + return Logger; +})(); + +exports["default"] = Logger; +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/metadata.js b/react-app/node_modules/babel-core/lib/transformation/file/metadata.js new file mode 100644 index 0000000000..4e0f484ca0 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/metadata.js @@ -0,0 +1,160 @@ +"use strict"; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.ExportDeclaration = ExportDeclaration; +exports.Scope = Scope; + +var _babelTypes = require("babel-types"); + +var t = _interopRequireWildcard(_babelTypes); + +var ModuleDeclaration = { + enter: function enter(path, file) { + var node = path.node; + + if (node.source) { + node.source.value = file.resolveModuleSource(node.source.value); + } + } +}; + +exports.ModuleDeclaration = ModuleDeclaration; +var ImportDeclaration = { + exit: function exit(path, file) { + var node = path.node; + + var specifiers = []; + var imported = []; + file.metadata.modules.imports.push({ + source: node.source.value, + imported: imported, + specifiers: specifiers + }); + + var _arr = path.get("specifiers"); + + for (var _i = 0; _i < _arr.length; _i++) { + var specifier = _arr[_i]; + var local = specifier.node.local.name; + + if (specifier.isImportDefaultSpecifier()) { + imported.push("default"); + specifiers.push({ + kind: "named", + imported: "default", + local: local + }); + } + + if (specifier.isImportSpecifier()) { + var importedName = specifier.node.imported.name; + imported.push(importedName); + specifiers.push({ + kind: "named", + imported: importedName, + local: local + }); + } + + if (specifier.isImportNamespaceSpecifier()) { + imported.push("*"); + specifiers.push({ + kind: "namespace", + local: local + }); + } + } + } +}; + +exports.ImportDeclaration = ImportDeclaration; + +function ExportDeclaration(path, file) { + var node = path.node; + + var source = node.source ? node.source.value : null; + var exports = file.metadata.modules.exports; + + // export function foo() {} + // export let foo = "bar"; + var declar = path.get("declaration"); + if (declar.isStatement()) { + var bindings = declar.getBindingIdentifiers(); + + for (var _name in bindings) { + exports.exported.push(_name); + exports.specifiers.push({ + kind: "local", + local: _name, + exported: path.isExportDefaultDeclaration() ? "default" : _name + }); + } + } + + if (path.isExportNamedDeclaration() && node.specifiers) { + var _arr2 = node.specifiers; + + for (var _i2 = 0; _i2 < _arr2.length; _i2++) { + var specifier = _arr2[_i2]; + var exported = specifier.exported.name; + exports.exported.push(exported); + + // export foo from "bar"; + if (t.isExportDefaultSpecifier(specifier)) { + exports.specifiers.push({ + kind: "external", + local: exported, + exported: exported, + source: source + }); + } + + // export * as foo from "bar"; + if (t.isExportNamespaceSpecifier(specifier)) { + exports.specifiers.push({ + kind: "external-namespace", + exported: exported, + source: source + }); + } + + var local = specifier.local; + if (!local) continue; + + // export { foo } from "bar"; + // export { foo as bar } from "bar"; + if (source) { + exports.specifiers.push({ + kind: "external", + local: local.name, + exported: exported, + source: source + }); + } + + // export { foo }; + // export { foo as bar }; + if (!source) { + exports.specifiers.push({ + kind: "local", + local: local.name, + exported: exported + }); + } + } + } + + // export * from "bar"; + if (path.isExportAllDeclaration()) { + exports.specifiers.push({ + kind: "external-all", + source: source + }); + } +} + +function Scope(path) { + path.skip(); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/options/config.js b/react-app/node_modules/babel-core/lib/transformation/file/options/config.js new file mode 100644 index 0000000000..14ee98b7d0 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/options/config.js @@ -0,0 +1,198 @@ +/* eslint max-len: 0 */ + +"use strict"; + +module.exports = { + filename: { + type: "filename", + description: "filename to use when reading from stdin - this will be used in source-maps, errors etc", + "default": "unknown", + shorthand: "f" + }, + + filenameRelative: { + hidden: true, + type: "string" + }, + + inputSourceMap: { + hidden: true + }, + + env: { + hidden: true, + "default": {} + }, + + mode: { + description: "", + hidden: true + }, + + retainLines: { + type: "boolean", + "default": false, + description: "retain line numbers - will result in really ugly code" + }, + + highlightCode: { + description: "enable/disable ANSI syntax highlighting of code frames (on by default)", + type: "boolean", + "default": true + }, + + suppressDeprecationMessages: { + type: "boolean", + "default": false, + hidden: true + }, + + presets: { + type: "list", + description: "", + "default": [] + }, + + plugins: { + type: "list", + "default": [], + description: "" + }, + + ignore: { + type: "list", + description: "list of glob paths to **not** compile", + "default": [] + }, + + only: { + type: "list", + description: "list of glob paths to **only** compile" + }, + + code: { + hidden: true, + "default": true, + type: "boolean" + }, + + metadata: { + hidden: true, + "default": true, + type: "boolean" + }, + + ast: { + hidden: true, + "default": true, + type: "boolean" + }, + + "extends": { + type: "string", + hidden: true + }, + + comments: { + type: "boolean", + "default": true, + description: "write comments to generated output (true by default)" + }, + + shouldPrintComment: { + hidden: true, + description: "optional callback to control whether a comment should be inserted, when this is used the comments option is ignored" + }, + + compact: { + type: "booleanString", + "default": "auto", + description: "do not include superfluous whitespace characters and line terminators [true|false|auto]" + }, + + minified: { + type: "boolean", + "default": false, + description: "save as much bytes when printing [true|false]" + }, + + sourceMap: { + alias: "sourceMaps", + hidden: true + }, + + sourceMaps: { + type: "booleanString", + description: "[true|false|inline]", + "default": false, + shorthand: "s" + }, + + sourceMapTarget: { + type: "string", + description: "set `file` on returned source map" + }, + + sourceFileName: { + type: "string", + description: "set `sources[0]` on returned source map" + }, + + sourceRoot: { + type: "filename", + description: "the root from which all sources are relative" + }, + + babelrc: { + description: "Whether or not to look up .babelrc and .babelignore files", + type: "boolean", + "default": true + }, + + sourceType: { + description: "", + "default": "module" + }, + + auxiliaryCommentBefore: { + type: "string", + description: "print a comment before any injected non-user code" + }, + + auxiliaryCommentAfter: { + type: "string", + description: "print a comment after any injected non-user code" + }, + + resolveModuleSource: { + hidden: true + }, + + getModuleId: { + hidden: true + }, + + moduleRoot: { + type: "filename", + description: "optional prefix for the AMD module formatter that will be prepend to the filename on module definitions" + }, + + moduleIds: { + type: "boolean", + "default": false, + shorthand: "M", + description: "insert an explicit id for modules" + }, + + moduleId: { + description: "specify a custom name for module ids", + type: "string" + }, + + passPerPreset: { + description: "Whether to spawn a traversal pass per a preset. By default all presets are merged.", + type: "boolean", + "default": false, + hidden: true + } +}; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/options/index.js b/react-app/node_modules/babel-core/lib/transformation/file/options/index.js new file mode 100644 index 0000000000..403eacca43 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/options/index.js @@ -0,0 +1,38 @@ +"use strict"; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; +exports.normaliseOptions = normaliseOptions; + +var _parsers = require("./parsers"); + +var parsers = _interopRequireWildcard(_parsers); + +var _config = require("./config"); + +var _config2 = _interopRequireDefault(_config); + +exports.config = _config2["default"]; + +function normaliseOptions() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + for (var key in options) { + var val = options[key]; + if (val == null) continue; + + var opt = _config2["default"][key]; + if (opt && opt.alias) opt = _config2["default"][opt.alias]; + if (!opt) continue; + + var parser = parsers[opt.type]; + if (parser) val = parser(val); + + options[key] = val; + } + + return options; +} \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js b/react-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js new file mode 100644 index 0000000000..5469c54ee1 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js @@ -0,0 +1,483 @@ +/* eslint max-len: 0 */ + +"use strict"; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _Object$assign = require("babel-runtime/core-js/object/assign")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _apiNode = require("../../../api/node"); + +var context = _interopRequireWildcard(_apiNode); + +var _plugin2 = require("../../plugin"); + +var _plugin3 = _interopRequireDefault(_plugin2); + +var _babelMessages = require("babel-messages"); + +var messages = _interopRequireWildcard(_babelMessages); + +var _index = require("./index"); + +var _helpersResolve = require("../../../helpers/resolve"); + +var _helpersResolve2 = _interopRequireDefault(_helpersResolve); + +var _json5 = require("json5"); + +var _json52 = _interopRequireDefault(_json5); + +var _pathIsAbsolute = require("path-is-absolute"); + +var _pathIsAbsolute2 = _interopRequireDefault(_pathIsAbsolute); + +var _pathExists = require("path-exists"); + +var _pathExists2 = _interopRequireDefault(_pathExists); + +var _lodashLangCloneDeep = require("lodash/lang/cloneDeep"); + +var _lodashLangCloneDeep2 = _interopRequireDefault(_lodashLangCloneDeep); + +var _lodashLangClone = require("lodash/lang/clone"); + +var _lodashLangClone2 = _interopRequireDefault(_lodashLangClone); + +var _helpersMerge = require("../../../helpers/merge"); + +var _helpersMerge2 = _interopRequireDefault(_helpersMerge); + +var _config = require("./config"); + +var _config2 = _interopRequireDefault(_config); + +var _removed = require("./removed"); + +var _removed2 = _interopRequireDefault(_removed); + +var _path = require("path"); + +var _path2 = _interopRequireDefault(_path); + +var _fs = require("fs"); + +var _fs2 = _interopRequireDefault(_fs); + +var existsCache = {}; +var jsonCache = {}; + +var BABELIGNORE_FILENAME = ".babelignore"; +var BABELRC_FILENAME = ".babelrc"; +var PACKAGE_FILENAME = "package.json"; + +function exists(filename) { + var cached = existsCache[filename]; + if (cached == null) { + return existsCache[filename] = _pathExists2["default"].sync(filename); + } else { + return cached; + } +} + +var OptionManager = (function () { + function OptionManager(log) { + _classCallCheck(this, OptionManager); + + this.resolvedConfigs = []; + this.options = OptionManager.createBareOptions(); + this.log = log; + } + + OptionManager.memoisePluginContainer = function memoisePluginContainer(fn, loc, i, alias) { + var _arr = OptionManager.memoisedPlugins; + + for (var _i = 0; _i < _arr.length; _i++) { + var cache = _arr[_i]; + if (cache.container === fn) return cache.plugin; + } + + var obj = undefined; + + if (typeof fn === "function") { + obj = fn(context); + } else { + obj = fn; + } + + if (typeof obj === "object") { + var _plugin = new _plugin3["default"](obj, alias); + OptionManager.memoisedPlugins.push({ + container: fn, + plugin: _plugin + }); + return _plugin; + } else { + throw new TypeError(messages.get("pluginNotObject", loc, i, typeof obj) + loc + i); + } + }; + + OptionManager.createBareOptions = function createBareOptions() { + var opts = {}; + + for (var _key in _config2["default"]) { + var opt = _config2["default"][_key]; + opts[_key] = _lodashLangClone2["default"](opt["default"]); + } + + return opts; + }; + + OptionManager.normalisePlugin = function normalisePlugin(plugin, loc, i, alias) { + plugin = plugin.__esModule ? plugin["default"] : plugin; + + if (!(plugin instanceof _plugin3["default"])) { + // allow plugin containers to be specified so they don't have to manually require + if (typeof plugin === "function" || typeof plugin === "object") { + plugin = OptionManager.memoisePluginContainer(plugin, loc, i, alias); + } else { + throw new TypeError(messages.get("pluginNotFunction", loc, i, typeof plugin)); + } + } + + plugin.init(loc, i); + + return plugin; + }; + + OptionManager.normalisePlugins = function normalisePlugins(loc, dirname, plugins) { + return plugins.map(function (val, i) { + var plugin = undefined, + options = undefined; + + if (!val) { + throw new TypeError("Falsy value found in plugins"); + } + + // destructure plugins + if (Array.isArray(val)) { + plugin = val[0]; + options = val[1]; + } else { + plugin = val; + } + + var alias = typeof plugin === "string" ? plugin : loc + "$" + i; + + // allow plugins to be specified as strings + if (typeof plugin === "string") { + var pluginLoc = _helpersResolve2["default"]("babel-plugin-" + plugin, dirname) || _helpersResolve2["default"](plugin, dirname); + if (pluginLoc) { + plugin = require(pluginLoc); + } else { + throw new ReferenceError(messages.get("pluginUnknown", plugin, loc, i, dirname)); + } + } + + plugin = OptionManager.normalisePlugin(plugin, loc, i, alias); + + return [plugin, options]; + }); + }; + + OptionManager.prototype.addConfig = function addConfig(loc, key) { + var json = arguments.length <= 2 || arguments[2] === undefined ? _json52["default"] : arguments[2]; + + if (this.resolvedConfigs.indexOf(loc) >= 0) { + return false; + } + + var content = _fs2["default"].readFileSync(loc, "utf8"); + var opts = undefined; + + try { + opts = jsonCache[content] = jsonCache[content] || json.parse(content); + if (key) opts = opts[key]; + } catch (err) { + err.message = loc + ": Error while parsing JSON - " + err.message; + throw err; + } + + this.mergeOptions({ + options: opts, + alias: loc, + dirname: _path2["default"].dirname(loc) + }); + this.resolvedConfigs.push(loc); + + return !!opts; + }; + + /** + * This is called when we want to merge the input `opts` into the + * base options (passed as the `extendingOpts`: at top-level it's the + * main options, at presets level it's presets options). + * + * - `alias` is used to output pretty traces back to the original source. + * - `loc` is used to point to the original config. + * - `dirname` is used to resolve plugins relative to it. + */ + + OptionManager.prototype.mergeOptions = function mergeOptions(_ref) { + // istanbul ignore next + + var _this = this; + + var rawOpts = _ref.options; + var extendingOpts = _ref.extending; + var alias = _ref.alias; + var loc = _ref.loc; + var dirname = _ref.dirname; + + alias = alias || "foreign"; + if (!rawOpts) return; + + // + if (typeof rawOpts !== "object" || Array.isArray(rawOpts)) { + this.log.error("Invalid options type for " + alias, TypeError); + } + + // + var opts = _lodashLangCloneDeep2["default"](rawOpts, function (val) { + if (val instanceof _plugin3["default"]) { + return val; + } + }); + + // + dirname = dirname || process.cwd(); + loc = loc || alias; + + for (var _key2 in opts) { + var option = _config2["default"][_key2]; + + // check for an unknown option + if (!option && this.log) { + var pluginOptsInfo = "Check out http://babeljs.io/docs/usage/options/ for more info"; + + if (_removed2["default"][_key2]) { + this.log.error("Using removed Babel 5 option: " + alias + "." + _key2 + " - " + _removed2["default"][_key2].message, ReferenceError); + } else { + this.log.error("Unknown option: " + alias + "." + _key2 + ". " + pluginOptsInfo, ReferenceError); + } + } + } + + // normalise options + _index.normaliseOptions(opts); + + // resolve plugins + if (opts.plugins) { + opts.plugins = OptionManager.normalisePlugins(loc, dirname, opts.plugins); + } + + // add extends clause + if (opts["extends"]) { + var extendsLoc = _helpersResolve2["default"](opts["extends"], dirname); + if (extendsLoc) { + this.addConfig(extendsLoc); + } else { + if (this.log) this.log.error("Couldn't resolve extends clause of " + opts["extends"] + " in " + alias); + } + delete opts["extends"]; + } + + // resolve presets + if (opts.presets) { + // If we're in the "pass per preset" mode, we resolve the presets + // and keep them for further execution to calculate the options. + if (opts.passPerPreset) { + opts.presets = this.resolvePresets(opts.presets, dirname, function (preset, presetLoc) { + _this.mergeOptions({ + options: preset, + extending: preset, + alias: presetLoc, + loc: presetLoc, + dirname: dirname + }); + }); + } else { + // Otherwise, just merge presets options into the main options. + this.mergePresets(opts.presets, dirname); + delete opts.presets; + } + } + + // env + var envOpts = undefined; + var envKey = process.env.BABEL_ENV || process.env.NODE_ENV || "development"; + if (opts.env) { + envOpts = opts.env[envKey]; + delete opts.env; + } + + // Merge them into current extending options in case of top-level + // options. In case of presets, just re-assign options which are got + // normalized during the `mergeOptions`. + if (rawOpts === extendingOpts) { + _Object$assign(extendingOpts, opts); + } else { + _helpersMerge2["default"](extendingOpts || this.options, opts); + } + + // merge in env options + this.mergeOptions({ + options: envOpts, + extending: extendingOpts, + alias: alias + ".env." + envKey, + dirname: dirname + }); + }; + + /** + * Merges all presets into the main options in case we are not in the + * "pass per preset" mode. Otherwise, options are calculated per preset. + */ + + OptionManager.prototype.mergePresets = function mergePresets(presets, dirname) { + // istanbul ignore next + + var _this2 = this; + + this.resolvePresets(presets, dirname, function (presetOpts, presetLoc) { + _this2.mergeOptions({ + options: presetOpts, + alias: presetLoc, + loc: presetLoc, + dirname: _path2["default"].dirname(presetLoc) + }); + }); + }; + + /** + * Resolves presets options which can be either direct object data, + * or a module name to require. + */ + + OptionManager.prototype.resolvePresets = function resolvePresets(presets, dirname, onResolve) { + return presets.map(function (val) { + if (typeof val === "string") { + var presetLoc = _helpersResolve2["default"]("babel-preset-" + val, dirname) || _helpersResolve2["default"](val, dirname); + if (presetLoc) { + var _val = require(presetLoc); + onResolve && onResolve(_val, presetLoc); + return _val; + } else { + throw new Error("Couldn't find preset " + JSON.stringify(val) + " relative to directory " + JSON.stringify(dirname)); + } + } else if (typeof val === "object") { + onResolve && onResolve(val); + return val; + } else { + throw new Error("Unsupported preset format: " + val + "."); + } + }); + }; + + OptionManager.prototype.addIgnoreConfig = function addIgnoreConfig(loc) { + var file = _fs2["default"].readFileSync(loc, "utf8"); + var lines = file.split("\n"); + + lines = lines.map(function (line) { + return line.replace(/#(.*?)$/, "").trim(); + }).filter(function (line) { + return !!line; + }); + + this.mergeOptions({ + options: { ignore: lines }, + loc: loc + }); + }; + + OptionManager.prototype.findConfigs = function findConfigs(loc) { + if (!loc) return; + + if (!_pathIsAbsolute2["default"](loc)) { + loc = _path2["default"].join(process.cwd(), loc); + } + + var foundConfig = false; + var foundIgnore = false; + + while (loc !== (loc = _path2["default"].dirname(loc))) { + if (!foundConfig) { + var configLoc = _path2["default"].join(loc, BABELRC_FILENAME); + if (exists(configLoc)) { + this.addConfig(configLoc); + foundConfig = true; + } + + var pkgLoc = _path2["default"].join(loc, PACKAGE_FILENAME); + if (!foundConfig && exists(pkgLoc)) { + foundConfig = this.addConfig(pkgLoc, "babel", JSON); + } + } + + if (!foundIgnore) { + var ignoreLoc = _path2["default"].join(loc, BABELIGNORE_FILENAME); + if (exists(ignoreLoc)) { + this.addIgnoreConfig(ignoreLoc); + foundIgnore = true; + } + } + + if (foundIgnore && foundConfig) return; + } + }; + + OptionManager.prototype.normaliseOptions = function normaliseOptions() { + var opts = this.options; + + for (var _key3 in _config2["default"]) { + var option = _config2["default"][_key3]; + var val = opts[_key3]; + + // optional + if (!val && option.optional) continue; + + // aliases + if (option.alias) { + opts[option.alias] = opts[option.alias] || val; + } else { + opts[_key3] = val; + } + } + }; + + OptionManager.prototype.init = function init() { + var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + var filename = opts.filename; + + // resolve all .babelrc files + if (opts.babelrc !== false) { + this.findConfigs(filename); + } + + // merge in base options + this.mergeOptions({ + options: opts, + alias: "base", + dirname: filename && _path2["default"].dirname(filename) + }); + + // normalise + this.normaliseOptions(opts); + + return this.options; + }; + + return OptionManager; +})(); + +exports["default"] = OptionManager; + +OptionManager.memoisedPlugins = []; +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/options/parsers.js b/react-app/node_modules/babel-core/lib/transformation/file/options/parsers.js new file mode 100644 index 0000000000..b45453edc9 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/options/parsers.js @@ -0,0 +1,34 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.boolean = boolean; +exports.booleanString = booleanString; +exports.list = list; + +var _slash = require("slash"); + +var _slash2 = _interopRequireDefault(_slash); + +var _util = require("../../../util"); + +var util = _interopRequireWildcard(_util); + +var filename = _slash2["default"]; + +exports.filename = filename; + +function boolean(val) { + return !!val; +} + +function booleanString(val) { + return util.booleanify(val); +} + +function list(val) { + return util.list(val); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/file/options/removed.js b/react-app/node_modules/babel-core/lib/transformation/file/options/removed.js new file mode 100644 index 0000000000..d643df8cff --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/file/options/removed.js @@ -0,0 +1,54 @@ +/* eslint max-len: 0 */ + +"use strict"; + +module.exports = { + "auxiliaryComment": { + "message": "Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`" + }, + "blacklist": { + "message": "Put the specific transforms you want in the `plugins` option" + }, + "breakConfig": { + "message": "This is not a necessary option in Babel 6" + }, + "experimental": { + "message": "Put the specific transforms you want in the `plugins` option" + }, + "externalHelpers": { + "message": "Use the `external-helpers` plugin instead. Check out http://babeljs.io/docs/plugins/external-helpers/" + }, + "extra": { + "message": "" + }, + "jsxPragma": { + "message": "use the `pragma` option in the `react-jsx` plugin . Check out http://babeljs.io/docs/plugins/transform-react-jsx/" + }, + // "keepModuleIdExtensions": { + // "message": "" + // }, + "loose": { + "message": "Specify the `loose` option for the relevant plugin you are using or use a preset that sets the option." + }, + "metadataUsedHelpers": { + "message": "Not required anymore as this is enabled by default" + }, + "modules": { + "message": "Use the corresponding module transform plugin in the `plugins` option. Check out http://babeljs.io/docs/plugins/#modules" + }, + "nonStandard": { + "message": "Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. Also check out the react preset http://babeljs.io/docs/plugins/preset-react/" + }, + "optional": { + "message": "Put the specific transforms you want in the `plugins` option" + }, + "sourceMapName": { + "message": "Use the `sourceMapTarget` option" + }, + "stage": { + "message": "Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets" + }, + "whitelist": { + "message": "Put the specific transforms you want in the `plugins` option" + } +}; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/internal-plugins/block-hoist.js b/react-app/node_modules/babel-core/lib/transformation/internal-plugins/block-hoist.js new file mode 100644 index 0000000000..c007573786 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/internal-plugins/block-hoist.js @@ -0,0 +1,54 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _plugin = require("../plugin"); + +var _plugin2 = _interopRequireDefault(_plugin); + +var _lodashCollectionSortBy = require("lodash/collection/sortBy"); + +var _lodashCollectionSortBy2 = _interopRequireDefault(_lodashCollectionSortBy); + +exports["default"] = new _plugin2["default"]({ + /** + * [Please add a description.] + * + * Priority: + * + * - 0 We want this to be at the **very** bottom + * - 1 Default node position + * - 2 Priority over normal nodes + * - 3 We want this to be at the **very** top + */ + + visitor: { + Block: { + exit: function exit(_ref) { + var node = _ref.node; + + var hasChange = false; + for (var i = 0; i < node.body.length; i++) { + var bodyNode = node.body[i]; + if (bodyNode && bodyNode._blockHoist != null) { + hasChange = true; + break; + } + } + if (!hasChange) return; + + node.body = _lodashCollectionSortBy2["default"](node.body, function (bodyNode) { + var priority = bodyNode && bodyNode._blockHoist; + if (priority == null) priority = 1; + if (priority === true) priority = 2; + + // Higher priorities should move toward the top. + return -1 * priority; + }); + } + } + } +}); +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/internal-plugins/shadow-functions.js b/react-app/node_modules/babel-core/lib/transformation/internal-plugins/shadow-functions.js new file mode 100644 index 0000000000..ae78879fc9 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/internal-plugins/shadow-functions.js @@ -0,0 +1,104 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; + +var _plugin = require("../plugin"); + +var _plugin2 = _interopRequireDefault(_plugin); + +var _babelTypes = require("babel-types"); + +var t = _interopRequireWildcard(_babelTypes); + +exports["default"] = new _plugin2["default"]({ + visitor: { + ThisExpression: function ThisExpression(path) { + remap(path, "this", function () { + return t.thisExpression(); + }); + }, + + ReferencedIdentifier: function ReferencedIdentifier(path) { + if (path.node.name === "arguments") { + remap(path, "arguments", function () { + return t.identifier("arguments"); + }); + } + } + } +}); + +function shouldShadow(path, shadowPath) { + if (path.is("_forceShadow")) { + return true; + } else { + return shadowPath; + } +} + +function remap(path, key, create) { + // ensure that we're shadowed + var shadowPath = path.inShadow(key); + if (!shouldShadow(path, shadowPath)) return; + + var shadowFunction = path.node._shadowedFunctionLiteral; + + var currentFunction = undefined; + var passedShadowFunction = false; + + var fnPath = path.findParent(function (path) { + if (path.isProgram() || path.isFunction()) { + // catch current function in case this is the shadowed one and we can ignore it + currentFunction = currentFunction || path; + } + + if (path.isProgram()) { + passedShadowFunction = true; + + return true; + } else if (path.isFunction() && !path.isArrowFunctionExpression()) { + if (shadowFunction) { + if (path === shadowFunction || path.node === shadowFunction.node) return true; + } else { + if (!path.is("shadow")) return true; + } + + passedShadowFunction = true; + return false; + } + + return false; + }); + + if (shadowFunction && fnPath.isProgram() && !shadowFunction.isProgram()) { + // If the shadow wasn't found, take the closest function as a backup. + // This is a bit of a hack, but it will allow the parameter transforms to work properly + // without introducing yet another shadow-controlling flag. + fnPath = path.findParent(function (p) { + return p.isProgram() || p.isFunction(); + }); + } + + // no point in realiasing if we're in this function + if (fnPath === currentFunction) return; + + // If the only functions that were encountered are arrow functions, skip remapping the + // binding since arrow function syntax already does that. + if (!passedShadowFunction) return; + + var cached = fnPath.getData(key); + if (cached) return path.replaceWith(cached); + + var init = create(); + var id = path.scope.generateUidIdentifier(key); + + fnPath.setData(key, id); + fnPath.scope.push({ id: id, init: init }); + + return path.replaceWith(id); +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/pipeline.js b/react-app/node_modules/babel-core/lib/transformation/pipeline.js new file mode 100644 index 0000000000..b58dcd6cf0 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/pipeline.js @@ -0,0 +1,79 @@ +/* global BabelFileResult, BabelFileMetadata */ +"use strict"; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _helpersNormalizeAst = require("../helpers/normalize-ast"); + +var _helpersNormalizeAst2 = _interopRequireDefault(_helpersNormalizeAst); + +var _plugin = require("./plugin"); + +var _plugin2 = _interopRequireDefault(_plugin); + +var _file = require("./file"); + +var _file2 = _interopRequireDefault(_file); + +var Pipeline = (function () { + function Pipeline() { + _classCallCheck(this, Pipeline); + } + + Pipeline.prototype.lint = function lint(code) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + opts.code = false; + opts.mode = "lint"; + return this.transform(code, opts); + }; + + Pipeline.prototype.pretransform = function pretransform(code, opts) { + var file = new _file2["default"](opts, this); + return file.wrap(code, function () { + file.addCode(code); + file.parseCode(code); + return file; + }); + }; + + Pipeline.prototype.transform = function transform(code, opts) { + var file = new _file2["default"](opts, this); + return file.wrap(code, function () { + file.addCode(code); + file.parseCode(code); + return file.transform(); + }); + }; + + Pipeline.prototype.analyse = function analyse(code, opts, visitor) { + if (opts === undefined) opts = {}; + + opts.code = false; + if (visitor) { + opts.plugins = opts.plugins || []; + opts.plugins.push(new _plugin2["default"]({ visitor: visitor })); + } + return this.transform(code, opts).metadata; + }; + + Pipeline.prototype.transformFromAst = function transformFromAst(ast, code, opts) { + ast = _helpersNormalizeAst2["default"](ast); + + var file = new _file2["default"](opts, this); + return file.wrap(code, function () { + file.addCode(code); + file.addAst(ast); + return file.transform(); + }); + }; + + return Pipeline; +})(); + +exports["default"] = Pipeline; +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/plugin-pass.js b/react-app/node_modules/babel-core/lib/transformation/plugin-pass.js new file mode 100644 index 0000000000..cf212e7a80 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/plugin-pass.js @@ -0,0 +1,80 @@ +"use strict"; + +var _inherits = require("babel-runtime/helpers/inherits")["default"]; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _store = require("../store"); + +var _store2 = _interopRequireDefault(_store); + +var _babelTraverse = require("babel-traverse"); + +var _babelTraverse2 = _interopRequireDefault(_babelTraverse); + +var _file5 = require("./file"); + +var _file6 = _interopRequireDefault(_file5); + +var PluginPass = (function (_Store) { + _inherits(PluginPass, _Store); + + function PluginPass(file, plugin) { + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + + _classCallCheck(this, PluginPass); + + _Store.call(this); + this.plugin = plugin; + this.file = file; + this.opts = options; + } + + PluginPass.prototype.transform = function transform() { + var file = this.file; + file.log.debug("Start transformer " + this.key); + _babelTraverse2["default"](file.ast, this.plugin.visitor, file.scope, file); + file.log.debug("Finish transformer " + this.key); + }; + + PluginPass.prototype.addHelper = function addHelper() { + // istanbul ignore next + + var _file; + + return (_file = this.file).addHelper.apply(_file, arguments); + }; + + PluginPass.prototype.addImport = function addImport() { + // istanbul ignore next + + var _file2; + + return (_file2 = this.file).addImport.apply(_file2, arguments); + }; + + PluginPass.prototype.getModuleName = function getModuleName() { + // istanbul ignore next + + var _file3; + + return (_file3 = this.file).getModuleName.apply(_file3, arguments); + }; + + PluginPass.prototype.buildCodeFrameError = function buildCodeFrameError() { + // istanbul ignore next + + var _file4; + + return (_file4 = this.file).buildCodeFrameError.apply(_file4, arguments); + }; + + return PluginPass; +})(_store2["default"]); + +exports["default"] = PluginPass; +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/transformation/plugin.js b/react-app/node_modules/babel-core/lib/transformation/plugin.js new file mode 100644 index 0000000000..c82b041f3c --- /dev/null +++ b/react-app/node_modules/babel-core/lib/transformation/plugin.js @@ -0,0 +1,147 @@ +/* eslint max-len: 0 */ + +"use strict"; + +var _inherits = require("babel-runtime/helpers/inherits")["default"]; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _getIterator = require("babel-runtime/core-js/get-iterator")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; + +var _fileOptionsOptionManager = require("./file/options/option-manager"); + +var _fileOptionsOptionManager2 = _interopRequireDefault(_fileOptionsOptionManager); + +var _babelMessages = require("babel-messages"); + +var messages = _interopRequireWildcard(_babelMessages); + +var _store = require("../store"); + +var _store2 = _interopRequireDefault(_store); + +var _babelTraverse = require("babel-traverse"); + +var _babelTraverse2 = _interopRequireDefault(_babelTraverse); + +var _lodashObjectAssign = require("lodash/object/assign"); + +var _lodashObjectAssign2 = _interopRequireDefault(_lodashObjectAssign); + +var _lodashLangClone = require("lodash/lang/clone"); + +var _lodashLangClone2 = _interopRequireDefault(_lodashLangClone); + +var GLOBAL_VISITOR_PROPS = ["enter", "exit"]; + +var Plugin = (function (_Store) { + _inherits(Plugin, _Store); + + function Plugin(plugin, key) { + _classCallCheck(this, Plugin); + + _Store.call(this); + + this.initialized = false; + this.raw = _lodashObjectAssign2["default"]({}, plugin); + this.key = key; + + this.manipulateOptions = this.take("manipulateOptions"); + this.post = this.take("post"); + this.pre = this.take("pre"); + this.visitor = this.normaliseVisitor(_lodashLangClone2["default"](this.take("visitor")) || {}); + } + + Plugin.prototype.take = function take(key) { + var val = this.raw[key]; + delete this.raw[key]; + return val; + }; + + Plugin.prototype.chain = function chain(target, key) { + if (!target[key]) return this[key]; + if (!this[key]) return target[key]; + + var fns = [target[key], this[key]]; + + return function () { + var val = undefined; + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + for (var _i = 0; _i < fns.length; _i++) { + var fn = fns[_i]; + if (fn) { + var ret = fn.apply(this, args); + if (ret != null) val = ret; + } + } + return val; + }; + }; + + Plugin.prototype.maybeInherit = function maybeInherit(loc) { + var inherits = this.take("inherits"); + if (!inherits) return; + + inherits = _fileOptionsOptionManager2["default"].normalisePlugin(inherits, loc, "inherits"); + + this.manipulateOptions = this.chain(inherits, "manipulateOptions"); + this.post = this.chain(inherits, "post"); + this.pre = this.chain(inherits, "pre"); + this.visitor = _babelTraverse2["default"].visitors.merge([inherits.visitor, this.visitor]); + }; + + /** + * We lazy initialise parts of a plugin that rely on contextual information such as + * position on disk and how it was specified. + */ + + Plugin.prototype.init = function init(loc, i) { + if (this.initialized) return; + this.initialized = true; + + this.maybeInherit(loc); + + for (var key in this.raw) { + throw new Error(messages.get("pluginInvalidProperty", loc, i, key)); + } + }; + + Plugin.prototype.normaliseVisitor = function normaliseVisitor(visitor) { + for (var _iterator = GLOBAL_VISITOR_PROPS, _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) { + var _ref; + + if (_isArray) { + if (_i2 >= _iterator.length) break; + _ref = _iterator[_i2++]; + } else { + _i2 = _iterator.next(); + if (_i2.done) break; + _ref = _i2.value; + } + + var key = _ref; + + if (visitor[key]) { + throw new Error("Plugins aren't allowed to specify catch-all enter/exit handlers. Please target individual nodes."); + } + } + + _babelTraverse2["default"].explode(visitor); + return visitor; + }; + + return Plugin; +})(_store2["default"]); + +exports["default"] = Plugin; +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-core/lib/util.js b/react-app/node_modules/babel-core/lib/util.js new file mode 100644 index 0000000000..f6b58b81d4 --- /dev/null +++ b/react-app/node_modules/babel-core/lib/util.js @@ -0,0 +1,187 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; +exports.canCompile = canCompile; +exports.list = list; +exports.regexify = regexify; +exports.arrayify = arrayify; +exports.booleanify = booleanify; +exports.shouldIgnore = shouldIgnore; + +var _lodashStringEscapeRegExp = require("lodash/string/escapeRegExp"); + +var _lodashStringEscapeRegExp2 = _interopRequireDefault(_lodashStringEscapeRegExp); + +var _lodashStringStartsWith = require("lodash/string/startsWith"); + +var _lodashStringStartsWith2 = _interopRequireDefault(_lodashStringStartsWith); + +var _lodashLangIsBoolean = require("lodash/lang/isBoolean"); + +var _lodashLangIsBoolean2 = _interopRequireDefault(_lodashLangIsBoolean); + +var _minimatch = require("minimatch"); + +var _minimatch2 = _interopRequireDefault(_minimatch); + +var _lodashCollectionContains = require("lodash/collection/contains"); + +var _lodashCollectionContains2 = _interopRequireDefault(_lodashCollectionContains); + +var _lodashLangIsString = require("lodash/lang/isString"); + +var _lodashLangIsString2 = _interopRequireDefault(_lodashLangIsString); + +var _lodashLangIsRegExp = require("lodash/lang/isRegExp"); + +var _lodashLangIsRegExp2 = _interopRequireDefault(_lodashLangIsRegExp); + +var _path = require("path"); + +var _path2 = _interopRequireDefault(_path); + +var _slash = require("slash"); + +var _slash2 = _interopRequireDefault(_slash); + +var _util = require("util"); + +exports.inherits = _util.inherits; +exports.inspect = _util.inspect; + +/** + * Test if a filename ends with a compilable extension. + */ + +function canCompile(filename, altExts) { + var exts = altExts || canCompile.EXTENSIONS; + var ext = _path2["default"].extname(filename); + return _lodashCollectionContains2["default"](exts, ext); +} + +/** + * Default set of compilable extensions. + */ + +canCompile.EXTENSIONS = [".js", ".jsx", ".es6", ".es"]; + +/** + * Create an array from any value, splitting strings by ",". + */ + +function list(val) { + if (!val) { + return []; + } else if (Array.isArray(val)) { + return val; + } else if (typeof val === "string") { + return val.split(","); + } else { + return [val]; + } +} + +/** + * Create a RegExp from a string, array, or regexp. + */ + +function regexify(val) { + if (!val) { + return new RegExp(/.^/); + } + + if (Array.isArray(val)) { + val = new RegExp(val.map(_lodashStringEscapeRegExp2["default"]).join("|"), "i"); + } + + if (typeof val === "string") { + // normalise path separators + val = _slash2["default"](val); + + // remove starting wildcards or relative separator if present + if (_lodashStringStartsWith2["default"](val, "./") || _lodashStringStartsWith2["default"](val, "*/")) val = val.slice(2); + if (_lodashStringStartsWith2["default"](val, "**/")) val = val.slice(3); + + var regex = _minimatch2["default"].makeRe(val, { nocase: true }); + return new RegExp(regex.source.slice(1, -1), "i"); + } + + if (_lodashLangIsRegExp2["default"](val)) { + return val; + } + + throw new TypeError("illegal type for regexify"); +} + +/** + * Create an array from a boolean, string, or array, mapped by and optional function. + */ + +function arrayify(val, mapFn) { + if (!val) return []; + if (_lodashLangIsBoolean2["default"](val)) return arrayify([val], mapFn); + if (_lodashLangIsString2["default"](val)) return arrayify(list(val), mapFn); + + if (Array.isArray(val)) { + if (mapFn) val = val.map(mapFn); + return val; + } + + return [val]; +} + +/** + * Makes boolean-like strings into booleans. + */ + +function booleanify(val) { + if (val === "true" || val == 1) { + return true; + } + + if (val === "false" || val == 0 || !val) { + return false; + } + + return val; +} + +/** + * Tests if a filename should be ignored based on "ignore" and "only" options. + */ + +function shouldIgnore(filename, ignore, only) { + if (ignore === undefined) ignore = []; + + filename = _slash2["default"](filename); + + if (only) { + for (var _i = 0; _i < only.length; _i++) { + var pattern = only[_i]; + if (_shouldIgnore(pattern, filename)) return false; + } + return true; + } else if (ignore.length) { + for (var _i2 = 0; _i2 < ignore.length; _i2++) { + var pattern = ignore[_i2]; + if (_shouldIgnore(pattern, filename)) return true; + } + } + + return false; +} + +/** + * Returns result of calling function with filename if pattern is a function. + * Otherwise returns result of matching pattern Regex with filename. + */ + +function _shouldIgnore(pattern, filename) { + if (typeof pattern === "function") { + return pattern(filename); + } else { + return pattern.test(filename); + } +} \ No newline at end of file diff --git a/react-app/node_modules/babel-core/package.json b/react-app/node_modules/babel-core/package.json new file mode 100644 index 0000000000..a7c042b141 --- /dev/null +++ b/react-app/node_modules/babel-core/package.json @@ -0,0 +1,132 @@ +{ + "_args": [ + [ + "babel-core@^6.0.14", + "/Users/mromano/dev/react-sfs/node_modules/babelify" + ] + ], + "_from": "babel-core@>=6.0.14 <7.0.0", + "_id": "babel-core@6.7.4", + "_inCache": true, + "_installable": true, + "_location": "/babel-core", + "_nodeVersion": "5.9.0", + "_npmOperationalInternal": { + "host": "packages-13-west.internal.npmjs.com", + "tmp": "tmp/babel-core-6.7.4.tgz_1458704268353_0.5215817883145064" + }, + "_npmUser": { + "email": "loganfsmyth@gmail.com", + "name": "loganfsmyth" + }, + "_npmVersion": "3.7.3", + "_phantomChildren": {}, + "_requested": { + "name": "babel-core", + "raw": "babel-core@^6.0.14", + "rawSpec": "^6.0.14", + "scope": null, + "spec": ">=6.0.14 <7.0.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-register", + "/babelify" + ], + "_resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.7.4.tgz", + "_shasum": "aeeea5da586c043e1a1b61dea2c57652df03ee49", + "_shrinkwrap": null, + "_spec": "babel-core@^6.0.14", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babelify", + "author": { + "email": "sebmck@gmail.com", + "name": "Sebastian McKenzie" + }, + "dependencies": { + "babel-code-frame": "^6.7.4", + "babel-generator": "^6.7.2", + "babel-helpers": "^6.6.0", + "babel-messages": "^6.7.2", + "babel-register": "^6.7.2", + "babel-runtime": "^5.0.0", + "babel-template": "^6.7.0", + "babel-traverse": "^6.7.4", + "babel-types": "^6.7.2", + "babylon": "^6.7.0", + "convert-source-map": "^1.1.0", + "debug": "^2.1.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0" + }, + "description": "Babel compiler core.", + "devDependencies": { + "babel-helper-fixtures": "^6.6.5", + "babel-helper-transform-fixture-test-runner": "^6.6.5", + "babel-polyfill": "^6.7.4" + }, + "directories": {}, + "dist": { + "shasum": "aeeea5da586c043e1a1b61dea2c57652df03ee49", + "tarball": "https://registry.npmjs.org/babel-core/-/babel-core-6.7.4.tgz" + }, + "homepage": "https://babeljs.io/", + "keywords": [ + "6to5", + "babel", + "classes", + "const", + "es6", + "harmony", + "let", + "modules", + "transpile", + "transpiler", + "var" + ], + "license": "MIT", + "maintainers": [ + { + "email": "amjad.masad@gmail.com", + "name": "amasad" + }, + { + "email": "hi@henryzoo.com", + "name": "hzoo" + }, + { + "email": "npm-public@jessemccarthy.net", + "name": "jmm" + }, + { + "email": "loganfsmyth@gmail.com", + "name": "loganfsmyth" + }, + { + "email": "sebmck@gmail.com", + "name": "sebmck" + }, + { + "email": "me@thejameskyle.com", + "name": "thejameskyle" + } + ], + "name": "babel-core", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel/tree/master/packages/babel-core" + }, + "scripts": { + "bench": "make bench", + "test": "make test" + }, + "version": "6.7.4" +} diff --git a/react-app/node_modules/babel-core/register.js b/react-app/node_modules/babel-core/register.js new file mode 100644 index 0000000000..97d35f276e --- /dev/null +++ b/react-app/node_modules/babel-core/register.js @@ -0,0 +1,3 @@ +/* eslint max-len: 0 */ +// TODO: eventually deprecate this console.trace("use the `babel-register` package instead of `babel-core/register`"); +module.exports = require("babel-register"); diff --git a/react-app/node_modules/babel-generator/README.md b/react-app/node_modules/babel-generator/README.md new file mode 100644 index 0000000000..aeab598579 --- /dev/null +++ b/react-app/node_modules/babel-generator/README.md @@ -0,0 +1,84 @@ +# babel-generator + +> Turns an AST into code. + +## Install + +```sh +$ npm install babel-generator +``` + +## Usage + +```js +import {parse} from 'babylon'; +import generate from 'babel-generator'; + +const code = 'class Example {}'; +const ast = parse(code); + +const output = generate(ast, { /* options */ }, code); +``` + +## Options + +Options for formatting output: + +name | type | default | description +-----------------------|----------|-----------------|-------------------------------------------------------------------------- +auxiliaryCommentBefore | string | | Optional string to add as a block comment at the start of the output file +auxiliaryCommentAfter | string | | Optional string to add as a block comment at the end of the output file +shouldPrintComment | function | `opts.comments` | Function that takes a comment (as a string) and returns `true` if the comment should be included in the output. By default, comments are included if `opts.comments` is `true` or if `opts.minifed` is `false` and the comment contains `@preserve` or `@license` +retainLines | boolean | `false` | Attempt to use the same line numbers in the output code as in the source code (helps preserve stack traces) +comments | boolean | `true` | Should comments be included in output +compact | boolean or `'auto'` | `opts.minified` | Set to `true` to avoid adding whitespace for formatting +minified | boolean | `false` | Should the output be minified +concise | boolean | `false` | Set to `true` to reduce whitespace (but not as much as `opts.compact`) +quotes | `'single'` or `'double'` | autodetect based on `ast.tokens` | The type of quote to use in the output +filename | string | | Used in warning messages + +Options for source maps: + +name | type | default | description +-----------------------|----------|-----------------|-------------------------------------------------------------------------- +sourceMaps | boolean | `false` | Enable generating source maps +sourceMapTarget | string | | The filename of the generated code that the source map will be associated with +sourceRoot | string | | A root for all relative URLs in the source map +sourceFileName | string | | The filename for the source code (i.e. the code in the `code` argument). This will only be used if `code` is a string. + +## AST from Multiple Sources + +In most cases, Babel does a 1:1 transformation of input-file to output-file. However, +you may be dealing with AST constructed from multiple sources - JS files, templates, etc. +If this is the case, and you want the sourcemaps to reflect the correct sources, you'll need +to make some changes to your code. + +First, each node with a `loc` property (which indicates that node's original placement in the +source document) must also include a `loc.filename` property, set to the source filename. + +Second, you should pass an object to `generate` as the `code` parameter. Keys +should be the source filenames, and values should be the source content. + +Here's an example of what that might look like: + +```js +import {parse} from 'babylon'; +import traverse from "babel-traverse"; +import generate from 'babel-generator'; + +const a = 'var a = 1;'; +const b = 'var b = 2;'; +const astA = parse(a, { filename: 'a.js' }); +const astB = parse(b, { filename: 'b.js' }); +const ast = { + type: 'Program', + body: [].concat(astA.body, ast2.body) +}; + +const { code, map } = generate(ast, { /* options */ }, { + 'a.js': a, + 'b.js': b +}); + +// Sourcemap will point to both a.js and b.js where appropriate. +``` diff --git a/react-app/node_modules/babel-generator/lib/buffer.js b/react-app/node_modules/babel-generator/lib/buffer.js new file mode 100644 index 0000000000..d340c8591f --- /dev/null +++ b/react-app/node_modules/babel-generator/lib/buffer.js @@ -0,0 +1,326 @@ +"use strict"; + +var _classCallCheck = require("babel-runtime/helpers/class-call-check")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +exports.__esModule = true; + +var _repeating = require("repeating"); + +var _repeating2 = _interopRequireDefault(_repeating); + +var _trimRight = require("trim-right"); + +var _trimRight2 = _interopRequireDefault(_trimRight); + +/** + * Buffer for collecting generated output. + */ + +var Buffer = (function () { + function Buffer(position, format) { + _classCallCheck(this, Buffer); + + this.printedCommentStarts = {}; + this.parenPushNewlineState = null; + this.position = position; + this._indent = format.indent.base; + this.format = format; + this.buf = ""; + + // Maintaining a reference to the last char in the buffer is an optimization + // to make sure that v8 doesn't "flatten" the string more often than needed + // see https://github.com/babel/babel/pull/3283 for details. + this.last = ""; + } + + /** + * Description + */ + + Buffer.prototype.catchUp = function catchUp(node) { + // catch up to this nodes newline if we're behind + if (node.loc && this.format.retainLines && this.buf) { + while (this.position.line < node.loc.start.line) { + this._push("\n"); + } + } + }; + + /** + * Get the current trimmed buffer. + */ + + Buffer.prototype.get = function get() { + return _trimRight2["default"](this.buf); + }; + + /** + * Get the current indent. + */ + + Buffer.prototype.getIndent = function getIndent() { + if (this.format.compact || this.format.concise) { + return ""; + } else { + return _repeating2["default"](this.format.indent.style, this._indent); + } + }; + + /** + * Get the current indent size. + */ + + Buffer.prototype.indentSize = function indentSize() { + return this.getIndent().length; + }; + + /** + * Increment indent size. + */ + + Buffer.prototype.indent = function indent() { + this._indent++; + }; + + /** + * Decrement indent size. + */ + + Buffer.prototype.dedent = function dedent() { + this._indent--; + }; + + /** + * Add a semicolon to the buffer. + */ + + Buffer.prototype.semicolon = function semicolon() { + this.push(";"); + }; + + /** + * Ensure last character is a semicolon. + */ + + Buffer.prototype.ensureSemicolon = function ensureSemicolon() { + if (!this.isLast(";")) this.semicolon(); + }; + + /** + * Add a right brace to the buffer. + */ + + Buffer.prototype.rightBrace = function rightBrace() { + this.newline(true); + if (this.format.minified && !this._lastPrintedIsEmptyStatement) { + this._removeLast(";"); + } + this.push("}"); + }; + + /** + * Add a keyword to the buffer. + */ + + Buffer.prototype.keyword = function keyword(name) { + this.push(name); + this.space(); + }; + + /** + * Add a space to the buffer unless it is compact (override with force). + */ + + Buffer.prototype.space = function space(force) { + if (!force && this.format.compact) return; + + if (force || this.buf && !this.isLast(" ") && !this.isLast("\n")) { + this.push(" "); + } + }; + + /** + * Remove the last character. + */ + + Buffer.prototype.removeLast = function removeLast(cha) { + if (this.format.compact) return; + return this._removeLast(cha); + }; + + Buffer.prototype._removeLast = function _removeLast(cha) { + if (!this._isLast(cha)) return; + this.buf = this.buf.slice(0, -1); + this.last = this.buf[this.buf.length - 1]; + this.position.unshift(cha); + }; + + /** + * Set some state that will be modified if a newline has been inserted before any + * non-space characters. + * + * This is to prevent breaking semantics for terminatorless separator nodes. eg: + * + * return foo; + * + * returns `foo`. But if we do: + * + * return + * foo; + * + * `undefined` will be returned and not `foo` due to the terminator. + */ + + Buffer.prototype.startTerminatorless = function startTerminatorless() { + return this.parenPushNewlineState = { + printed: false + }; + }; + + /** + * Print an ending parentheses if a starting one has been printed. + */ + + Buffer.prototype.endTerminatorless = function endTerminatorless(state) { + if (state.printed) { + this.dedent(); + this.newline(); + this.push(")"); + } + }; + + /** + * Add a newline (or many newlines), maintaining formatting. + * Strips multiple newlines if removeLast is true. + */ + + Buffer.prototype.newline = function newline(i, removeLast) { + if (this.format.retainLines || this.format.compact) return; + + if (this.format.concise) { + this.space(); + return; + } + + // never allow more than two lines + if (this.endsWith("\n\n")) return; + + if (typeof i === "boolean") removeLast = i; + if (typeof i !== "number") i = 1; + + i = Math.min(2, i); + if (this.endsWith("{\n") || this.endsWith(":\n")) i--; + if (i <= 0) return; + + // remove the last newline + if (removeLast) { + this.removeLast("\n"); + } + + this.removeLast(" "); + this._removeSpacesAfterLastNewline(); + this._push(_repeating2["default"]("\n", i)); + }; + + /** + * If buffer ends with a newline and some spaces after it, trim those spaces. + */ + + Buffer.prototype._removeSpacesAfterLastNewline = function _removeSpacesAfterLastNewline() { + var lastNewlineIndex = this.buf.lastIndexOf("\n"); + if (lastNewlineIndex >= 0 && this.get().length <= lastNewlineIndex) { + this.buf = this.buf.substring(0, lastNewlineIndex + 1); + this.last = "\n"; + } + }; + + /** + * Push a string to the buffer, maintaining indentation and newlines. + */ + + Buffer.prototype.push = function push(str, noIndent) { + if (!this.format.compact && this._indent && !noIndent && str !== "\n") { + // we have an indent level and we aren't pushing a newline + var indent = this.getIndent(); + + // replace all newlines with newlines with the indentation + str = str.replace(/\n/g, "\n" + indent); + + // we've got a newline before us so prepend on the indentation + if (this.isLast("\n")) this._push(indent); + } + + this._push(str); + }; + + /** + * Push a string to the buffer. + */ + + Buffer.prototype._push = function _push(str) { + // see startTerminatorless() instance method + var parenPushNewlineState = this.parenPushNewlineState; + if (parenPushNewlineState) { + for (var i = 0; i < str.length; i++) { + var cha = str[i]; + + // we can ignore spaces since they wont interupt a terminatorless separator + if (cha === " ") continue; + + this.parenPushNewlineState = null; + + if (cha === "\n" || cha === "/") { + // we're going to break this terminator expression so we need to add a parentheses + this._push("("); + this.indent(); + parenPushNewlineState.printed = true; + } + + break; + } + } + + // + this.position.push(str); + this.buf += str; + this.last = str[str.length - 1]; + }; + + /** + * Test if the buffer ends with a string. + */ + + Buffer.prototype.endsWith = function endsWith(str) { + if (str.length === 1) { + return this.last === str; + } else { + return this.buf.slice(-str.length) === str; + } + }; + + /** + * Test if a character is last in the buffer. + */ + + Buffer.prototype.isLast = function isLast(cha) { + if (this.format.compact) return false; + return this._isLast(cha); + }; + + Buffer.prototype._isLast = function _isLast(cha) { + var last = this.last; + + if (Array.isArray(cha)) { + return cha.indexOf(last) >= 0; + } else { + return cha === last; + } + }; + + return Buffer; +})(); + +exports["default"] = Buffer; +module.exports = exports["default"]; \ No newline at end of file diff --git a/react-app/node_modules/babel-generator/lib/generators/base.js b/react-app/node_modules/babel-generator/lib/generators/base.js new file mode 100644 index 0000000000..31eb15fd9d --- /dev/null +++ b/react-app/node_modules/babel-generator/lib/generators/base.js @@ -0,0 +1,50 @@ +"use strict"; + +exports.__esModule = true; +exports.File = File; +exports.Program = Program; +exports.BlockStatement = BlockStatement; +exports.Noop = Noop; +exports.Directive = Directive; +exports.DirectiveLiteral = DirectiveLiteral; + +function File(node) { + this.print(node.program, node); +} + +function Program(node) { + this.printInnerComments(node, false); + + this.printSequence(node.directives, node); + if (node.directives && node.directives.length) this.newline(); + + this.printSequence(node.body, node); +} + +function BlockStatement(node) { + this.push("{"); + this.printInnerComments(node); + if (node.body.length) { + this.newline(); + + this.printSequence(node.directives, node, { indent: true }); + if (node.directives && node.directives.length) this.newline(); + + this.printSequence(node.body, node, { indent: true }); + if (!this.format.retainLines && !this.format.concise) this.removeLast("\n"); + this.rightBrace(); + } else { + this.push("}"); + } +} + +function Noop() {} + +function Directive(node) { + this.print(node.value, node); + this.semicolon(); +} + +function DirectiveLiteral(node) { + this.push(this._stringLiteral(node.value)); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-generator/lib/generators/classes.js b/react-app/node_modules/babel-generator/lib/generators/classes.js new file mode 100644 index 0000000000..de24408e61 --- /dev/null +++ b/react-app/node_modules/babel-generator/lib/generators/classes.js @@ -0,0 +1,80 @@ +"use strict"; + +exports.__esModule = true; +exports.ClassDeclaration = ClassDeclaration; +exports.ClassBody = ClassBody; +exports.ClassProperty = ClassProperty; +exports.ClassMethod = ClassMethod; + +function ClassDeclaration(node) { + this.printJoin(node.decorators, node, { separator: "" }); + this.push("class"); + + if (node.id) { + this.push(" "); + this.print(node.id, node); + } + + this.print(node.typeParameters, node); + + if (node.superClass) { + this.push(" extends "); + this.print(node.superClass, node); + this.print(node.superTypeParameters, node); + } + + if (node["implements"]) { + this.push(" implements "); + this.printJoin(node["implements"], node, { separator: ", " }); + } + + this.space(); + this.print(node.body, node); +} + +exports.ClassExpression = ClassDeclaration; + +function ClassBody(node) { + this.push("{"); + this.printInnerComments(node); + if (node.body.length === 0) { + this.push("}"); + } else { + this.newline(); + + this.indent(); + this.printSequence(node.body, node); + this.dedent(); + + this.rightBrace(); + } +} + +function ClassProperty(node) { + this.printJoin(node.decorators, node, { separator: "" }); + + if (node["static"]) this.push("static "); + this.print(node.key, node); + this.print(node.typeAnnotation, node); + if (node.value) { + this.space(); + this.push("="); + this.space(); + this.print(node.value, node); + } + this.semicolon(); +} + +function ClassMethod(node) { + this.printJoin(node.decorators, node, { separator: "" }); + + if (node["static"]) { + this.push("static "); + } + + if (node.kind === "constructorCall") { + this.push("call "); + } + + this._method(node); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-generator/lib/generators/expressions.js b/react-app/node_modules/babel-generator/lib/generators/expressions.js new file mode 100644 index 0000000000..e72c514a9d --- /dev/null +++ b/react-app/node_modules/babel-generator/lib/generators/expressions.js @@ -0,0 +1,280 @@ +/* eslint max-len: 0 */ + +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.UnaryExpression = UnaryExpression; +exports.DoExpression = DoExpression; +exports.ParenthesizedExpression = ParenthesizedExpression; +exports.UpdateExpression = UpdateExpression; +exports.ConditionalExpression = ConditionalExpression; +exports.NewExpression = NewExpression; +exports.SequenceExpression = SequenceExpression; +exports.ThisExpression = ThisExpression; +exports.Super = Super; +exports.Decorator = Decorator; +exports.CallExpression = CallExpression; +exports.EmptyStatement = EmptyStatement; +exports.ExpressionStatement = ExpressionStatement; +exports.AssignmentPattern = AssignmentPattern; +exports.AssignmentExpression = AssignmentExpression; +exports.BindExpression = BindExpression; +exports.MemberExpression = MemberExpression; +exports.MetaProperty = MetaProperty; + +var _isInteger = require("is-integer"); + +var _isInteger2 = _interopRequireDefault(_isInteger); + +var _lodashLangIsNumber = require("lodash/lang/isNumber"); + +var _lodashLangIsNumber2 = _interopRequireDefault(_lodashLangIsNumber); + +var _babelTypes = require("babel-types"); + +var t = _interopRequireWildcard(_babelTypes); + +var _node = require("../node"); + +var n = _interopRequireWildcard(_node); + +var SCIENTIFIC_NOTATION = /e/i; +var ZERO_DECIMAL_INTEGER = /\.0+$/; +var NON_DECIMAL_LITERAL = /^0[box]/; + +function UnaryExpression(node) { + var needsSpace = /[a-z]$/.test(node.operator); + var arg = node.argument; + + if (t.isUpdateExpression(arg) || t.isUnaryExpression(arg)) { + needsSpace = true; + } + + if (t.isUnaryExpression(arg) && arg.operator === "!") { + needsSpace = false; + } + + this.push(node.operator); + if (needsSpace) this.push(" "); + this.print(node.argument, node); +} + +function DoExpression(node) { + this.push("do"); + this.space(); + this.print(node.body, node); +} + +function ParenthesizedExpression(node) { + this.push("("); + this.print(node.expression, node); + this.push(")"); +} + +function UpdateExpression(node) { + if (node.prefix) { + this.push(node.operator); + this.print(node.argument, node); + } else { + this.print(node.argument, node); + this.push(node.operator); + } +} + +function ConditionalExpression(node) { + this.print(node.test, node); + this.space(); + this.push("?"); + this.space(); + this.print(node.consequent, node); + this.space(); + this.push(":"); + this.space(); + this.print(node.alternate, node); +} + +function NewExpression(node, parent) { + this.push("new "); + this.print(node.callee, node); + if (node.arguments.length === 0 && this.format.minified && !t.isCallExpression(parent, { callee: node }) && !t.isMemberExpression(parent) && !t.isNewExpression(parent)) return; + + this.push("("); + this.printList(node.arguments, node); + this.push(")"); +} + +function SequenceExpression(node) { + this.printList(node.expressions, node); +} + +function ThisExpression() { + this.push("this"); +} + +function Super() { + this.push("super"); +} + +function Decorator(node) { + this.push("@"); + this.print(node.expression, node); + this.newline(); +} + +function CallExpression(node) { + this.print(node.callee, node); + if (node.loc) this.printAuxAfterComment(); + + this.push("("); + + var isPrettyCall = node._prettyCall && !this.format.retainLines && !this.format.compact; + + var separator = undefined; + if (isPrettyCall) { + separator = ",\n"; + this.newline(); + this.indent(); + } + + this.printList(node.arguments, node, { separator: separator }); + + if (isPrettyCall) { + this.newline(); + this.dedent(); + } + + this.push(")"); +} + +function buildYieldAwait(keyword) { + return function (node) { + this.push(keyword); + + if (node.delegate) { + this.push("*"); + } + + if (node.argument) { + this.push(" "); + var terminatorState = this.startTerminatorless(); + this.print(node.argument, node); + this.endTerminatorless(terminatorState); + } + }; +} + +var YieldExpression = buildYieldAwait("yield"); +exports.YieldExpression = YieldExpression; +var AwaitExpression = buildYieldAwait("await"); + +exports.AwaitExpression = AwaitExpression; + +function EmptyStatement() { + this._lastPrintedIsEmptyStatement = true; + this.semicolon(); +} + +function ExpressionStatement(node) { + this.print(node.expression, node); + this.semicolon(); +} + +function AssignmentPattern(node) { + this.print(node.left, node); + this.space(); + this.push("="); + this.space(); + this.print(node.right, node); +} + +function AssignmentExpression(node, parent) { + // Somewhere inside a for statement `init` node but doesn't usually + // needs a paren except for `in` expressions: `for (a in b ? a : b;;)` + var parens = this._inForStatementInitCounter && node.operator === "in" && !n.needsParens(node, parent); + + if (parens) { + this.push("("); + } + + this.print(node.left, node); + + var spaces = !this.format.compact || node.operator === "in" || node.operator === "instanceof"; + if (spaces) this.push(" "); + + this.push(node.operator); + + if (!spaces) { + // space is mandatory to avoid outputting + +### t.anyTypeAnnotation() + +See also `t.isAnyTypeAnnotation(node, opts)` and `t.assertAnyTypeAnnotation(node, opts)`. + +Aliases: `Flow`, `FlowBaseAnnotation` + + +### t.arrayExpression(elements) + +See also `t.isArrayExpression(node, opts)` and `t.assertArrayExpression(node, opts)`. + +Aliases: `Expression` + + - `elements`: `array` (required) + +### t.arrayPattern(elements, typeAnnotation) + +See also `t.isArrayPattern(node, opts)` and `t.assertArrayPattern(node, opts)`. + +Aliases: `Pattern`, `LVal` + + - `elements`: `Array` (required) + - `typeAnnotation` (required) + +### t.arrayTypeAnnotation(elementType) + +See also `t.isArrayTypeAnnotation(node, opts)` and `t.assertArrayTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `elementType` (required) + +### t.arrowFunctionExpression(params, body, async) + +See also `t.isArrowFunctionExpression(node, opts)` and `t.assertArrowFunctionExpression(node, opts)`. + +Aliases: `Scopable`, `Function`, `BlockParent`, `FunctionParent`, `Expression`, `Pureish` + + - `params`: `Array` (required) + - `body`: `BlockStatement | Expression` (required) + - `async`: `boolean` (default: `false`) + +### t.assignmentExpression(operator, left, right) + +See also `t.isAssignmentExpression(node, opts)` and `t.assertAssignmentExpression(node, opts)`. + +Aliases: `Expression` + + - `operator`: `string` (required) + - `left`: `LVal` (required) + - `right`: `Expression` (required) + +### t.assignmentPattern(left, right) + +See also `t.isAssignmentPattern(node, opts)` and `t.assertAssignmentPattern(node, opts)`. + +Aliases: `Pattern`, `LVal` + + - `left`: `Identifier` (required) + - `right`: `Expression` (required) + +### t.awaitExpression(argument) + +See also `t.isAwaitExpression(node, opts)` and `t.assertAwaitExpression(node, opts)`. + +Aliases: `Expression`, `Terminatorless` + + - `argument`: `Expression` (required) + +### t.binaryExpression(operator, left, right) + +See also `t.isBinaryExpression(node, opts)` and `t.assertBinaryExpression(node, opts)`. + +Aliases: `Binary`, `Expression` + + - `operator`: `string` (required) + - `left`: `Expression` (required) + - `right`: `Expression` (required) + +### t.bindExpression(object, callee) + +See also `t.isBindExpression(node, opts)` and `t.assertBindExpression(node, opts)`. + + - `object` (required) + - `callee` (required) + +### t.blockStatement(body, directives) + +See also `t.isBlockStatement(node, opts)` and `t.assertBlockStatement(node, opts)`. + +Aliases: `Scopable`, `BlockParent`, `Block`, `Statement` + + - `body`: `Array` (required) + - `directives`: `Array` (default: `[]`) + +### t.booleanLiteral(value) + +See also `t.isBooleanLiteral(node, opts)` and `t.assertBooleanLiteral(node, opts)`. + +Aliases: `Expression`, `Pureish`, `Literal`, `Immutable` + + - `value`: `boolean` (required) + +### t.booleanLiteralTypeAnnotation() + +See also `t.isBooleanLiteralTypeAnnotation(node, opts)` and `t.assertBooleanLiteralTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + +### t.booleanTypeAnnotation() + +See also `t.isBooleanTypeAnnotation(node, opts)` and `t.assertBooleanTypeAnnotation(node, opts)`. + +Aliases: `Flow`, `FlowBaseAnnotation` + + +### t.breakStatement(label) + +See also `t.isBreakStatement(node, opts)` and `t.assertBreakStatement(node, opts)`. + +Aliases: `Statement`, `Terminatorless`, `CompletionStatement` + + - `label`: `Identifier` (default: `null`) + +### t.callExpression(callee, arguments) + +See also `t.isCallExpression(node, opts)` and `t.assertCallExpression(node, opts)`. + +Aliases: `Expression` + + - `callee`: `Expression` (required) + - `arguments`: `array` (required) + +### t.catchClause(param, body) + +See also `t.isCatchClause(node, opts)` and `t.assertCatchClause(node, opts)`. + +Aliases: `Scopable` + + - `param`: `Identifier` (required) + - `body`: `BlockStatement` (required) + +### t.classBody(body) + +See also `t.isClassBody(node, opts)` and `t.assertClassBody(node, opts)`. + + - `body`: `Array` (required) + +### t.classDeclaration(id, superClass, body, decorators) + +See also `t.isClassDeclaration(node, opts)` and `t.assertClassDeclaration(node, opts)`. + +Aliases: `Scopable`, `Class`, `Statement`, `Declaration`, `Pureish` + + - `id`: `Identifier` (required) + - `superClass`: `Expression` (default: `null`) + - `body`: `ClassBody` (required) + - `decorators`: `Array` (required) + +### t.classExpression(id, superClass, body, decorators) + +See also `t.isClassExpression(node, opts)` and `t.assertClassExpression(node, opts)`. + +Aliases: `Scopable`, `Class`, `Expression`, `Pureish` + + - `id`: `Identifier` (default: `null`) + - `superClass`: `Expression` (default: `null`) + - `body`: `ClassBody` (required) + - `decorators`: `Array` (required) + +### t.classImplements(id, typeParameters) + +See also `t.isClassImplements(node, opts)` and `t.assertClassImplements(node, opts)`. + +Aliases: `Flow` + + - `id` (required) + - `typeParameters` (required) + +### t.classMethod(kind, key, params, body, computed, static) + +See also `t.isClassMethod(node, opts)` and `t.assertClassMethod(node, opts)`. + +Aliases: `Function`, `Scopable`, `BlockParent`, `FunctionParent`, `Method` + + - `kind`: `"get" | "set" | "method" | "constructor"` (default: `'method'`) + - `key`if computed then `Expression` else `Identifier | Literal` (required) + - `params`: `Array` (required) + - `body`: `BlockStatement` (required) + - `computed`: `boolean` (default: `false`) + - `static`: `boolean` (default: `false`) + +### t.classProperty(key, value, typeAnnotation, decorators) + +See also `t.isClassProperty(node, opts)` and `t.assertClassProperty(node, opts)`. + +Aliases: `Flow`, `Property` + + - `key` (required) + - `value` (required) + - `typeAnnotation` (required) + - `decorators` (required) + +### t.conditionalExpression(test, consequent, alternate) + +See also `t.isConditionalExpression(node, opts)` and `t.assertConditionalExpression(node, opts)`. + +Aliases: `Expression`, `Conditional` + + - `test`: `Expression` (required) + - `consequent`: `Expression` (required) + - `alternate`: `Expression` (required) + +### t.continueStatement(label) + +See also `t.isContinueStatement(node, opts)` and `t.assertContinueStatement(node, opts)`. + +Aliases: `Statement`, `Terminatorless`, `CompletionStatement` + + - `label`: `Identifier` (default: `null`) + +### t.debuggerStatement() + +See also `t.isDebuggerStatement(node, opts)` and `t.assertDebuggerStatement(node, opts)`. + +Aliases: `Statement` + + +### t.declareClass(id, typeParameters, extends, body) + +See also `t.isDeclareClass(node, opts)` and `t.assertDeclareClass(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + - `typeParameters` (required) + - `extends` (required) + - `body` (required) + +### t.declareFunction(id) + +See also `t.isDeclareFunction(node, opts)` and `t.assertDeclareFunction(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + +### t.declareModule(id, body) + +See also `t.isDeclareModule(node, opts)` and `t.assertDeclareModule(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + - `body` (required) + +### t.declareVariable(id) + +See also `t.isDeclareVariable(node, opts)` and `t.assertDeclareVariable(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + +### t.decorator(expression) + +See also `t.isDecorator(node, opts)` and `t.assertDecorator(node, opts)`. + + - `expression`: `Expression` (required) + +### t.directive(value) + +See also `t.isDirective(node, opts)` and `t.assertDirective(node, opts)`. + + - `value`: `DirectiveLiteral` (required) + +### t.directiveLiteral(value) + +See also `t.isDirectiveLiteral(node, opts)` and `t.assertDirectiveLiteral(node, opts)`. + + - `value`: `string` (required) + +### t.doExpression(body) + +See also `t.isDoExpression(node, opts)` and `t.assertDoExpression(node, opts)`. + +Aliases: `Expression` + + - `body`: `BlockStatement` (required) + +### t.doWhileStatement(test, body) + +See also `t.isDoWhileStatement(node, opts)` and `t.assertDoWhileStatement(node, opts)`. + +Aliases: `Statement`, `BlockParent`, `Loop`, `While`, `Scopable` + + - `test`: `Expression` (required) + - `body`: `BlockStatement` (required) + +### t.emptyStatement() + +See also `t.isEmptyStatement(node, opts)` and `t.assertEmptyStatement(node, opts)`. + +Aliases: `Statement` + + +### t.existentialTypeParam() + +See also `t.isExistentialTypeParam(node, opts)` and `t.assertExistentialTypeParam(node, opts)`. + +Aliases: `Flow` + + +### t.exportAllDeclaration(source) + +See also `t.isExportAllDeclaration(node, opts)` and `t.assertExportAllDeclaration(node, opts)`. + +Aliases: `Statement`, `Declaration`, `ModuleDeclaration`, `ExportDeclaration` + + - `source` (required) + +### t.exportDefaultDeclaration(declaration) + +See also `t.isExportDefaultDeclaration(node, opts)` and `t.assertExportDefaultDeclaration(node, opts)`. + +Aliases: `Statement`, `Declaration`, `ModuleDeclaration`, `ExportDeclaration` + + - `declaration` (required) + +### t.exportDefaultSpecifier(exported) + +See also `t.isExportDefaultSpecifier(node, opts)` and `t.assertExportDefaultSpecifier(node, opts)`. + +Aliases: `ModuleSpecifier` + + - `exported`: `Identifier` (required) + +### t.exportNamedDeclaration(declaration, specifiers, source) + +See also `t.isExportNamedDeclaration(node, opts)` and `t.assertExportNamedDeclaration(node, opts)`. + +Aliases: `Statement`, `Declaration`, `ModuleDeclaration`, `ExportDeclaration` + + - `declaration` (required) + - `specifiers` (required) + - `source` (required) + +### t.exportNamespaceSpecifier(exported) + +See also `t.isExportNamespaceSpecifier(node, opts)` and `t.assertExportNamespaceSpecifier(node, opts)`. + +Aliases: `ModuleSpecifier` + + - `exported`: `Identifier` (required) + +### t.exportSpecifier(local, exported) + +See also `t.isExportSpecifier(node, opts)` and `t.assertExportSpecifier(node, opts)`. + +Aliases: `ModuleSpecifier` + + - `local`: `Identifier` (required) + - `exported` (required) + +### t.expressionStatement(expression) + +See also `t.isExpressionStatement(node, opts)` and `t.assertExpressionStatement(node, opts)`. + +Aliases: `Statement`, `ExpressionWrapper` + + - `expression`: `Expression` (required) + +### t.file(program, comments, tokens) + +See also `t.isFile(node, opts)` and `t.assertFile(node, opts)`. + + - `program`: `Program` (required) + - `comments` (required) + - `tokens` (required) + +### t.forInStatement(left, right, body) + +See also `t.isForInStatement(node, opts)` and `t.assertForInStatement(node, opts)`. + +Aliases: `Scopable`, `Statement`, `For`, `BlockParent`, `Loop`, `ForXStatement` + + - `left`: `VariableDeclaration | LVal` (required) + - `right`: `Expression` (required) + - `body`: `Statement` (required) + +### t.forOfStatement(left, right, body) + +See also `t.isForOfStatement(node, opts)` and `t.assertForOfStatement(node, opts)`. + +Aliases: `Scopable`, `Statement`, `For`, `BlockParent`, `Loop`, `ForXStatement` + + - `left`: `VariableDeclaration | LVal` (required) + - `right`: `Expression` (required) + - `body`: `Statement` (required) + +### t.forStatement(init, test, update, body) + +See also `t.isForStatement(node, opts)` and `t.assertForStatement(node, opts)`. + +Aliases: `Scopable`, `Statement`, `For`, `BlockParent`, `Loop` + + - `init`: `VariableDeclaration | Expression` (default: `null`) + - `test`: `Expression` (default: `null`) + - `update`: `Expression` (default: `null`) + - `body`: `Statement` (required) + +### t.functionDeclaration(id, params, body, generator, async) + +See also `t.isFunctionDeclaration(node, opts)` and `t.assertFunctionDeclaration(node, opts)`. + +Aliases: `Scopable`, `Function`, `BlockParent`, `FunctionParent`, `Statement`, `Pureish`, `Declaration` + + - `id`: `Identifier` (required) + - `params`: `Array` (required) + - `body`: `BlockStatement` (required) + - `generator`: `boolean` (default: `false`) + - `async`: `boolean` (default: `false`) + +### t.functionExpression(id, params, body, generator, async) + +See also `t.isFunctionExpression(node, opts)` and `t.assertFunctionExpression(node, opts)`. + +Aliases: `Scopable`, `Function`, `BlockParent`, `FunctionParent`, `Expression`, `Pureish` + + - `id`: `Identifier` (default: `null`) + - `params`: `Array` (required) + - `body`: `BlockStatement` (required) + - `generator`: `boolean` (default: `false`) + - `async`: `boolean` (default: `false`) + +### t.functionTypeAnnotation(typeParameters, params, rest, returnType) + +See also `t.isFunctionTypeAnnotation(node, opts)` and `t.assertFunctionTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `typeParameters` (required) + - `params` (required) + - `rest` (required) + - `returnType` (required) + +### t.functionTypeParam(name, typeAnnotation) + +See also `t.isFunctionTypeParam(node, opts)` and `t.assertFunctionTypeParam(node, opts)`. + +Aliases: `Flow` + + - `name` (required) + - `typeAnnotation` (required) + +### t.genericTypeAnnotation(id, typeParameters) + +See also `t.isGenericTypeAnnotation(node, opts)` and `t.assertGenericTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `id` (required) + - `typeParameters` (required) + +### t.identifier(name) + +See also `t.isIdentifier(node, opts)` and `t.assertIdentifier(node, opts)`. + +Aliases: `Expression`, `LVal` + + - `name``string` (required) + +### t.ifStatement(test, consequent, alternate) + +See also `t.isIfStatement(node, opts)` and `t.assertIfStatement(node, opts)`. + +Aliases: `Statement`, `Conditional` + + - `test`: `Expression` (required) + - `consequent`: `Statement` (default: `null`) + - `alternate`: `Statement` (default: `null`) + +### t.importDeclaration(specifiers, source) + +See also `t.isImportDeclaration(node, opts)` and `t.assertImportDeclaration(node, opts)`. + +Aliases: `Statement`, `Declaration`, `ModuleDeclaration` + + - `specifiers`: `Array` (required) + - `source`: `StringLiteral` (required) + +### t.importDefaultSpecifier(local) + +See also `t.isImportDefaultSpecifier(node, opts)` and `t.assertImportDefaultSpecifier(node, opts)`. + +Aliases: `ModuleSpecifier` + + - `local`: `Identifier` (required) + +### t.importNamespaceSpecifier(local) + +See also `t.isImportNamespaceSpecifier(node, opts)` and `t.assertImportNamespaceSpecifier(node, opts)`. + +Aliases: `ModuleSpecifier` + + - `local`: `Identifier` (required) + +### t.importSpecifier(local, imported) + +See also `t.isImportSpecifier(node, opts)` and `t.assertImportSpecifier(node, opts)`. + +Aliases: `ModuleSpecifier` + + - `local`: `Identifier` (required) + - `imported`: `Identifier` (required) + +### t.interfaceDeclaration(id, typeParameters, extends, body) + +See also `t.isInterfaceDeclaration(node, opts)` and `t.assertInterfaceDeclaration(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + - `typeParameters` (required) + - `extends` (required) + - `body` (required) + +### t.interfaceExtends(id, typeParameters) + +See also `t.isInterfaceExtends(node, opts)` and `t.assertInterfaceExtends(node, opts)`. + +Aliases: `Flow` + + - `id` (required) + - `typeParameters` (required) + +### t.intersectionTypeAnnotation(types) + +See also `t.isIntersectionTypeAnnotation(node, opts)` and `t.assertIntersectionTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `types` (required) + +### t.jSXAttribute(name, value) + +See also `t.isJSXAttribute(node, opts)` and `t.assertJSXAttribute(node, opts)`. + +Aliases: `JSX`, `Immutable` + + - `name`: `JSXIdentifier | JSXMemberExpression` (required) + - `value`: `JSXElement | StringLiteral | JSXExpressionContainer` (default: `null`) + +### t.jSXClosingElement(name) + +See also `t.isJSXClosingElement(node, opts)` and `t.assertJSXClosingElement(node, opts)`. + +Aliases: `JSX`, `Immutable` + + - `name`: `JSXIdentifier | JSXMemberExpression` (required) + +### t.jSXElement(openingElement, closingElement, children, selfClosing) + +See also `t.isJSXElement(node, opts)` and `t.assertJSXElement(node, opts)`. + +Aliases: `JSX`, `Immutable`, `Expression` + + - `openingElement`: `JSXOpeningElement` (required) + - `closingElement`: `JSXClosingElement` (default: `null`) + - `children` (required) + - `selfClosing` (required) + +### t.jSXEmptyExpression() + +See also `t.isJSXEmptyExpression(node, opts)` and `t.assertJSXEmptyExpression(node, opts)`. + +Aliases: `JSX`, `Expression` + + +### t.jSXExpressionContainer(expression) + +See also `t.isJSXExpressionContainer(node, opts)` and `t.assertJSXExpressionContainer(node, opts)`. + +Aliases: `JSX`, `Immutable` + + - `expression`: `Expression` (required) + +### t.jSXIdentifier(name) + +See also `t.isJSXIdentifier(node, opts)` and `t.assertJSXIdentifier(node, opts)`. + +Aliases: `JSX`, `Expression` + + - `name`: `string` (required) + +### t.jSXMemberExpression(object, property) + +See also `t.isJSXMemberExpression(node, opts)` and `t.assertJSXMemberExpression(node, opts)`. + +Aliases: `JSX`, `Expression` + + - `object`: `JSXIdentifier` (required) + - `property`: `JSXIdentifier` (required) + +### t.jSXNamespacedName(namespace, name) + +See also `t.isJSXNamespacedName(node, opts)` and `t.assertJSXNamespacedName(node, opts)`. + +Aliases: `JSX` + + - `namespace`: `JSXIdentifier` (required) + - `name`: `JSXIdentifier` (required) + +### t.jSXOpeningElement(name, attributes, selfClosing) + +See also `t.isJSXOpeningElement(node, opts)` and `t.assertJSXOpeningElement(node, opts)`. + +Aliases: `JSX`, `Immutable` + + - `name`: `JSXIdentifier | JSXMemberExpression` (required) + - `attributes`: `Array` (required) + - `selfClosing`: `boolean` (default: `false`) + +### t.jSXSpreadAttribute(argument) + +See also `t.isJSXSpreadAttribute(node, opts)` and `t.assertJSXSpreadAttribute(node, opts)`. + +Aliases: `JSX` + + - `argument`: `Expression` (required) + +### t.jSXText(value) + +See also `t.isJSXText(node, opts)` and `t.assertJSXText(node, opts)`. + +Aliases: `JSX` + + - `value`: `string` (required) + +### t.labeledStatement(label, body) + +See also `t.isLabeledStatement(node, opts)` and `t.assertLabeledStatement(node, opts)`. + +Aliases: `Statement` + + - `label`: `Identifier` (required) + - `body`: `Statement` (required) + +### t.logicalExpression(operator, left, right) + +See also `t.isLogicalExpression(node, opts)` and `t.assertLogicalExpression(node, opts)`. + +Aliases: `Binary`, `Expression` + + - `operator` (required) + - `left`: `Expression` (required) + - `right`: `Expression` (required) + +### t.memberExpression(object, property, computed) + +See also `t.isMemberExpression(node, opts)` and `t.assertMemberExpression(node, opts)`. + +Aliases: `Expression`, `LVal` + + - `object`: `Expression` (required) + - `property`if computed then `Expression` else `Identifier` (required) + - `computed`: `boolean` (default: `false`) + +### t.metaProperty(meta, property) + +See also `t.isMetaProperty(node, opts)` and `t.assertMetaProperty(node, opts)`. + +Aliases: `Expression` + + - `meta`: `string` (required) + - `property`: `string` (required) + +### t.mixedTypeAnnotation() + +See also `t.isMixedTypeAnnotation(node, opts)` and `t.assertMixedTypeAnnotation(node, opts)`. + +Aliases: `Flow`, `FlowBaseAnnotation` + + +### t.newExpression(callee, arguments) + +See also `t.isNewExpression(node, opts)` and `t.assertNewExpression(node, opts)`. + +Aliases: `Expression` + + - `callee`: `Expression` (required) + - `arguments`: `Array` (required) + +### t.noop() + +See also `t.isNoop(node, opts)` and `t.assertNoop(node, opts)`. + + +### t.nullLiteral() + +See also `t.isNullLiteral(node, opts)` and `t.assertNullLiteral(node, opts)`. + +Aliases: `Expression`, `Pureish`, `Literal`, `Immutable` + + +### t.nullableTypeAnnotation(typeAnnotation) + +See also `t.isNullableTypeAnnotation(node, opts)` and `t.assertNullableTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `typeAnnotation` (required) + +### t.numberTypeAnnotation() + +See also `t.isNumberTypeAnnotation(node, opts)` and `t.assertNumberTypeAnnotation(node, opts)`. + +Aliases: `Flow`, `FlowBaseAnnotation` + + +### t.numericLiteral(value) + +See also `t.isNumericLiteral(node, opts)` and `t.assertNumericLiteral(node, opts)`. + +Aliases: `Expression`, `Pureish`, `Literal`, `Immutable` + + - `value`: `number` (required) + +### t.numericLiteralTypeAnnotation() + +See also `t.isNumericLiteralTypeAnnotation(node, opts)` and `t.assertNumericLiteralTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + +### t.objectExpression(properties) + +See also `t.isObjectExpression(node, opts)` and `t.assertObjectExpression(node, opts)`. + +Aliases: `Expression` + + - `properties`: `Array` (required) + +### t.objectMethod(kind, key, params, body, computed) + +See also `t.isObjectMethod(node, opts)` and `t.assertObjectMethod(node, opts)`. + +Aliases: `UserWhitespacable`, `Function`, `Scopable`, `BlockParent`, `FunctionParent`, `Method` + + - `kind`: `"method" | "get" | "set"` (default: `'method'`) + - `key`if computed then `Expression` else `Identifier | Literal` (required) + - `params` (required) + - `body`: `BlockStatement` (required) + - `computed`: `boolean` (default: `false`) + +### t.objectPattern(properties, typeAnnotation) + +See also `t.isObjectPattern(node, opts)` and `t.assertObjectPattern(node, opts)`. + +Aliases: `Pattern`, `LVal` + + - `properties`: `Array` (required) + - `typeAnnotation` (required) + +### t.objectProperty(key, value, computed, shorthand, decorators) + +See also `t.isObjectProperty(node, opts)` and `t.assertObjectProperty(node, opts)`. + +Aliases: `UserWhitespacable`, `Property` + + - `key`if computed then `Expression` else `Identifier | Literal` (required) + - `value`: `Expression` (required) + - `computed`: `boolean` (default: `false`) + - `shorthand`: `boolean` (default: `false`) + - `decorators`: `Array` (default: `null`) + +### t.objectTypeAnnotation(properties, indexers, callProperties) + +See also `t.isObjectTypeAnnotation(node, opts)` and `t.assertObjectTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `properties` (required) + - `indexers` (required) + - `callProperties` (required) + +### t.objectTypeCallProperty(value) + +See also `t.isObjectTypeCallProperty(node, opts)` and `t.assertObjectTypeCallProperty(node, opts)`. + +Aliases: `Flow`, `UserWhitespacable` + + - `value` (required) + +### t.objectTypeIndexer(id, key, value) + +See also `t.isObjectTypeIndexer(node, opts)` and `t.assertObjectTypeIndexer(node, opts)`. + +Aliases: `Flow`, `UserWhitespacable` + + - `id` (required) + - `key` (required) + - `value` (required) + +### t.objectTypeProperty(key, value) + +See also `t.isObjectTypeProperty(node, opts)` and `t.assertObjectTypeProperty(node, opts)`. + +Aliases: `Flow`, `UserWhitespacable` + + - `key` (required) + - `value` (required) + +### t.parenthesizedExpression(expression) + +See also `t.isParenthesizedExpression(node, opts)` and `t.assertParenthesizedExpression(node, opts)`. + +Aliases: `Expression`, `ExpressionWrapper` + + - `expression`: `Expression` (required) + +### t.program(body, directives) + +See also `t.isProgram(node, opts)` and `t.assertProgram(node, opts)`. + +Aliases: `Scopable`, `BlockParent`, `Block`, `FunctionParent` + + - `body`: `Array` (required) + - `directives`: `Array` (default: `[]`) + +### t.qualifiedTypeIdentifier(id, qualification) + +See also `t.isQualifiedTypeIdentifier(node, opts)` and `t.assertQualifiedTypeIdentifier(node, opts)`. + +Aliases: `Flow` + + - `id` (required) + - `qualification` (required) + +### t.regExpLiteral(pattern, flags) + +See also `t.isRegExpLiteral(node, opts)` and `t.assertRegExpLiteral(node, opts)`. + +Aliases: `Expression`, `Literal` + + - `pattern`: `string` (required) + - `flags`: `string` (default: `''`) + +### t.restElement(argument, typeAnnotation) + +See also `t.isRestElement(node, opts)` and `t.assertRestElement(node, opts)`. + +Aliases: `LVal` + + - `argument`: `LVal` (required) + - `typeAnnotation` (required) + +### t.restProperty(argument) + +See also `t.isRestProperty(node, opts)` and `t.assertRestProperty(node, opts)`. + +Aliases: `UnaryLike` + + - `argument`: `LVal` (required) + +### t.returnStatement(argument) + +See also `t.isReturnStatement(node, opts)` and `t.assertReturnStatement(node, opts)`. + +Aliases: `Statement`, `Terminatorless`, `CompletionStatement` + + - `argument`: `Expression` (default: `null`) + +### t.sequenceExpression(expressions) + +See also `t.isSequenceExpression(node, opts)` and `t.assertSequenceExpression(node, opts)`. + +Aliases: `Expression` + + - `expressions`: `array` (required) + +### t.spreadElement(argument) + +See also `t.isSpreadElement(node, opts)` and `t.assertSpreadElement(node, opts)`. + +Aliases: `UnaryLike` + + - `argument`: `Expression` (required) + +### t.spreadProperty(argument) + +See also `t.isSpreadProperty(node, opts)` and `t.assertSpreadProperty(node, opts)`. + +Aliases: `UnaryLike` + + - `argument`: `Expression` (required) + +### t.stringLiteral(value) + +See also `t.isStringLiteral(node, opts)` and `t.assertStringLiteral(node, opts)`. + +Aliases: `Expression`, `Pureish`, `Literal`, `Immutable` + + - `value`: `string` (required) + +### t.stringLiteralTypeAnnotation() + +See also `t.isStringLiteralTypeAnnotation(node, opts)` and `t.assertStringLiteralTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + +### t.stringTypeAnnotation() + +See also `t.isStringTypeAnnotation(node, opts)` and `t.assertStringTypeAnnotation(node, opts)`. + +Aliases: `Flow`, `FlowBaseAnnotation` + + +### t.super() + +See also `t.isSuper(node, opts)` and `t.assertSuper(node, opts)`. + +Aliases: `Expression` + + +### t.switchCase(test, consequent) + +See also `t.isSwitchCase(node, opts)` and `t.assertSwitchCase(node, opts)`. + + - `test` (required) + - `consequent` (required) + +### t.switchStatement(discriminant, cases) + +See also `t.isSwitchStatement(node, opts)` and `t.assertSwitchStatement(node, opts)`. + +Aliases: `Statement`, `BlockParent`, `Scopable` + + - `discriminant` (required) + - `cases` (required) + +### t.taggedTemplateExpression(tag, quasi) + +See also `t.isTaggedTemplateExpression(node, opts)` and `t.assertTaggedTemplateExpression(node, opts)`. + +Aliases: `Expression` + + - `tag`: `Expression` (required) + - `quasi`: `TemplateLiteral` (required) + +### t.templateElement(value, tail) + +See also `t.isTemplateElement(node, opts)` and `t.assertTemplateElement(node, opts)`. + + - `value` (required) + - `tail`: `boolean` (default: `false`) + +### t.templateLiteral(quasis, expressions) + +See also `t.isTemplateLiteral(node, opts)` and `t.assertTemplateLiteral(node, opts)`. + +Aliases: `Expression`, `Literal` + + - `quasis` (required) + - `expressions` (required) + +### t.thisExpression() + +See also `t.isThisExpression(node, opts)` and `t.assertThisExpression(node, opts)`. + +Aliases: `Expression` + + +### t.throwStatement(argument) + +See also `t.isThrowStatement(node, opts)` and `t.assertThrowStatement(node, opts)`. + +Aliases: `Statement`, `Terminatorless`, `CompletionStatement` + + - `argument`: `Expression` (required) + +### t.tryStatement(block, handler, finalizer) + +See also `t.isTryStatement(node, opts)` and `t.assertTryStatement(node, opts)`. + +Aliases: `Statement` + + - `block` (required) + - `handler` (default: `null`) + - `finalizer`: `BlockStatement` (default: `null`) + +### t.tupleTypeAnnotation(types) + +See also `t.isTupleTypeAnnotation(node, opts)` and `t.assertTupleTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `types` (required) + +### t.typeAlias(id, typeParameters, right) + +See also `t.isTypeAlias(node, opts)` and `t.assertTypeAlias(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + - `typeParameters` (required) + - `right` (required) + +### t.typeAnnotation(typeAnnotation) + +See also `t.isTypeAnnotation(node, opts)` and `t.assertTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `typeAnnotation` (required) + +### t.typeCastExpression(expression, typeAnnotation) + +See also `t.isTypeCastExpression(node, opts)` and `t.assertTypeCastExpression(node, opts)`. + +Aliases: `Flow`, `ExpressionWrapper` + + - `expression` (required) + - `typeAnnotation` (required) + +### t.typeParameterDeclaration(params) + +See also `t.isTypeParameterDeclaration(node, opts)` and `t.assertTypeParameterDeclaration(node, opts)`. + +Aliases: `Flow` + + - `params` (required) + +### t.typeParameterInstantiation(params) + +See also `t.isTypeParameterInstantiation(node, opts)` and `t.assertTypeParameterInstantiation(node, opts)`. + +Aliases: `Flow` + + - `params` (required) + +### t.typeofTypeAnnotation(argument) + +See also `t.isTypeofTypeAnnotation(node, opts)` and `t.assertTypeofTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `argument` (required) + +### t.unaryExpression(operator, argument, prefix) + +See also `t.isUnaryExpression(node, opts)` and `t.assertUnaryExpression(node, opts)`. + +Aliases: `UnaryLike`, `Expression` + + - `operator` (required) + - `argument`: `Expression` (required) + - `prefix`: `boolean` (default: `false`) + +### t.unionTypeAnnotation(types) + +See also `t.isUnionTypeAnnotation(node, opts)` and `t.assertUnionTypeAnnotation(node, opts)`. + +Aliases: `Flow` + + - `types` (required) + +### t.updateExpression(operator, argument, prefix) + +See also `t.isUpdateExpression(node, opts)` and `t.assertUpdateExpression(node, opts)`. + +Aliases: `Expression` + + - `operator` (required) + - `argument`: `Expression` (required) + - `prefix`: `boolean` (default: `false`) + +### t.variableDeclaration(kind, declarations) + +See also `t.isVariableDeclaration(node, opts)` and `t.assertVariableDeclaration(node, opts)`. + +Aliases: `Statement`, `Declaration` + + - `kind`: `"var" | "let" | "const"` (required) + - `declarations`: `Array` (required) + +### t.variableDeclarator(id, init) + +See also `t.isVariableDeclarator(node, opts)` and `t.assertVariableDeclarator(node, opts)`. + + - `id`: `LVal` (required) + - `init`: `Expression` (default: `null`) + +### t.voidTypeAnnotation() + +See also `t.isVoidTypeAnnotation(node, opts)` and `t.assertVoidTypeAnnotation(node, opts)`. + +Aliases: `Flow`, `FlowBaseAnnotation` + + +### t.whileStatement(test, body) + +See also `t.isWhileStatement(node, opts)` and `t.assertWhileStatement(node, opts)`. + +Aliases: `Statement`, `BlockParent`, `Loop`, `While`, `Scopable` + + - `test`: `Expression` (required) + - `body`: `BlockStatement | Statement` (required) + +### t.withStatement(object, body) + +See also `t.isWithStatement(node, opts)` and `t.assertWithStatement(node, opts)`. + +Aliases: `Statement` + + - `object` (required) + - `body`: `BlockStatement` (required) + +### t.yieldExpression(argument, delegate) + +See also `t.isYieldExpression(node, opts)` and `t.assertYieldExpression(node, opts)`. + +Aliases: `Expression`, `Terminatorless` + + - `argument`: `Expression` (default: `null`) + - `delegate`: `boolean` (default: `false`) + + + + diff --git a/react-app/node_modules/babel-types/lib/constants.js b/react-app/node_modules/babel-types/lib/constants.js new file mode 100644 index 0000000000..ad6380f4ca --- /dev/null +++ b/react-app/node_modules/babel-types/lib/constants.js @@ -0,0 +1,53 @@ +/* eslint max-len: 0 */ + +"use strict"; + +var _Symbol$for = require("babel-runtime/core-js/symbol/for")["default"]; + +exports.__esModule = true; +var STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"]; +exports.STATEMENT_OR_BLOCK_KEYS = STATEMENT_OR_BLOCK_KEYS; +var FLATTENABLE_KEYS = ["body", "expressions"]; +exports.FLATTENABLE_KEYS = FLATTENABLE_KEYS; +var FOR_INIT_KEYS = ["left", "init"]; +exports.FOR_INIT_KEYS = FOR_INIT_KEYS; +var COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"]; + +exports.COMMENT_KEYS = COMMENT_KEYS; +var LOGICAL_OPERATORS = ["||", "&&"]; +exports.LOGICAL_OPERATORS = LOGICAL_OPERATORS; +var UPDATE_OPERATORS = ["++", "--"]; + +exports.UPDATE_OPERATORS = UPDATE_OPERATORS; +var BOOLEAN_NUMBER_BINARY_OPERATORS = [">", "<", ">=", "<="]; +exports.BOOLEAN_NUMBER_BINARY_OPERATORS = BOOLEAN_NUMBER_BINARY_OPERATORS; +var EQUALITY_BINARY_OPERATORS = ["==", "===", "!=", "!=="]; +exports.EQUALITY_BINARY_OPERATORS = EQUALITY_BINARY_OPERATORS; +var COMPARISON_BINARY_OPERATORS = [].concat(EQUALITY_BINARY_OPERATORS, ["in", "instanceof"]); +exports.COMPARISON_BINARY_OPERATORS = COMPARISON_BINARY_OPERATORS; +var BOOLEAN_BINARY_OPERATORS = [].concat(COMPARISON_BINARY_OPERATORS, BOOLEAN_NUMBER_BINARY_OPERATORS); +exports.BOOLEAN_BINARY_OPERATORS = BOOLEAN_BINARY_OPERATORS; +var NUMBER_BINARY_OPERATORS = ["-", "/", "%", "*", "**", "&", "|", ">>", ">>>", "<<", "^"]; +exports.NUMBER_BINARY_OPERATORS = NUMBER_BINARY_OPERATORS; +var BINARY_OPERATORS = ["+"].concat(NUMBER_BINARY_OPERATORS, BOOLEAN_BINARY_OPERATORS); + +exports.BINARY_OPERATORS = BINARY_OPERATORS; +var BOOLEAN_UNARY_OPERATORS = ["delete", "!"]; +exports.BOOLEAN_UNARY_OPERATORS = BOOLEAN_UNARY_OPERATORS; +var NUMBER_UNARY_OPERATORS = ["+", "-", "++", "--", "~"]; +exports.NUMBER_UNARY_OPERATORS = NUMBER_UNARY_OPERATORS; +var STRING_UNARY_OPERATORS = ["typeof"]; +exports.STRING_UNARY_OPERATORS = STRING_UNARY_OPERATORS; +var UNARY_OPERATORS = ["void"].concat(BOOLEAN_UNARY_OPERATORS, NUMBER_UNARY_OPERATORS, STRING_UNARY_OPERATORS); + +exports.UNARY_OPERATORS = UNARY_OPERATORS; +var INHERIT_KEYS = { + optional: ["typeAnnotation", "typeParameters", "returnType"], + force: ["start", "loc", "end"] +}; + +exports.INHERIT_KEYS = INHERIT_KEYS; +var BLOCK_SCOPED_SYMBOL = _Symbol$for("var used to be block scoped"); +exports.BLOCK_SCOPED_SYMBOL = BLOCK_SCOPED_SYMBOL; +var NOT_LOCAL_BINDING = _Symbol$for("should not be considered a local binding"); +exports.NOT_LOCAL_BINDING = NOT_LOCAL_BINDING; \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/converters.js b/react-app/node_modules/babel-types/lib/converters.js new file mode 100644 index 0000000000..bb5de09dd1 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/converters.js @@ -0,0 +1,344 @@ +"use strict"; + +var _Number$MAX_SAFE_INTEGER = require("babel-runtime/core-js/number/max-safe-integer")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.toComputedKey = toComputedKey; +exports.toSequenceExpression = toSequenceExpression; +exports.toKeyAlias = toKeyAlias; +exports.toIdentifier = toIdentifier; +exports.toBindingIdentifierName = toBindingIdentifierName; +exports.toStatement = toStatement; +exports.toExpression = toExpression; +exports.toBlock = toBlock; +exports.valueToNode = valueToNode; + +var _lodashLangIsPlainObject = require("lodash/lang/isPlainObject"); + +var _lodashLangIsPlainObject2 = _interopRequireDefault(_lodashLangIsPlainObject); + +var _lodashLangIsNumber = require("lodash/lang/isNumber"); + +var _lodashLangIsNumber2 = _interopRequireDefault(_lodashLangIsNumber); + +var _lodashLangIsRegExp = require("lodash/lang/isRegExp"); + +var _lodashLangIsRegExp2 = _interopRequireDefault(_lodashLangIsRegExp); + +var _lodashLangIsString = require("lodash/lang/isString"); + +var _lodashLangIsString2 = _interopRequireDefault(_lodashLangIsString); + +var _babelTraverse = require("babel-traverse"); + +var _babelTraverse2 = _interopRequireDefault(_babelTraverse); + +var _index = require("./index"); + +var t = _interopRequireWildcard(_index); + +function toComputedKey(node) { + var key = arguments.length <= 1 || arguments[1] === undefined ? node.key || node.property : arguments[1]; + return (function () { + if (!node.computed) { + if (t.isIdentifier(key)) key = t.stringLiteral(key.name); + } + return key; + })(); +} + +/** + * Turn an array of statement `nodes` into a `SequenceExpression`. + * + * Variable declarations are turned into simple assignments and their + * declarations hoisted to the top of the current scope. + * + * Expression statements are just resolved to their expression. + */ + +function toSequenceExpression(nodes, scope) { + if (!nodes || !nodes.length) return; + + var declars = []; + var bailed = false; + + var result = convert(nodes); + if (bailed) return; + + for (var i = 0; i < declars.length; i++) { + scope.push(declars[i]); + } + + return result; + + function convert(nodes) { + var ensureLastUndefined = false; + var exprs = []; + + var _arr = nodes; + for (var _i = 0; _i < _arr.length; _i++) { + var node = _arr[_i]; + if (t.isExpression(node)) { + exprs.push(node); + } else if (t.isExpressionStatement(node)) { + exprs.push(node.expression); + } else if (t.isVariableDeclaration(node)) { + if (node.kind !== "var") return bailed = true; // bailed + + var _arr2 = node.declarations; + for (var _i2 = 0; _i2 < _arr2.length; _i2++) { + var declar = _arr2[_i2]; + var bindings = t.getBindingIdentifiers(declar); + for (var key in bindings) { + declars.push({ + kind: node.kind, + id: bindings[key] + }); + } + + if (declar.init) { + exprs.push(t.assignmentExpression("=", declar.id, declar.init)); + } + } + + ensureLastUndefined = true; + continue; + } else if (t.isIfStatement(node)) { + var consequent = node.consequent ? convert([node.consequent]) : scope.buildUndefinedNode(); + var alternate = node.alternate ? convert([node.alternate]) : scope.buildUndefinedNode(); + if (!consequent || !alternate) return bailed = true; + + exprs.push(t.conditionalExpression(node.test, consequent, alternate)); + } else if (t.isBlockStatement(node)) { + exprs.push(convert(node.body)); + } else if (t.isEmptyStatement(node)) { + // empty statement so ensure the last item is undefined if we're last + ensureLastUndefined = true; + continue; + } else { + // bailed, we can't turn this statement into an expression + return bailed = true; + } + + ensureLastUndefined = false; + } + + if (ensureLastUndefined || exprs.length === 0) { + exprs.push(scope.buildUndefinedNode()); + } + + // + + if (exprs.length === 1) { + return exprs[0]; + } else { + return t.sequenceExpression(exprs); + } + } +} + +function toKeyAlias(node) { + var key = arguments.length <= 1 || arguments[1] === undefined ? node.key : arguments[1]; + return (function () { + var alias = undefined; + + if (node.kind === "method") { + return toKeyAlias.increment() + ""; + } else if (t.isIdentifier(key)) { + alias = key.name; + } else if (t.isStringLiteral(key)) { + alias = JSON.stringify(key.value); + } else { + alias = JSON.stringify(_babelTraverse2["default"].removeProperties(t.cloneDeep(key))); + } + + if (node.computed) { + alias = "[" + alias + "]"; + } + + if (node["static"]) { + alias = "static:" + alias; + } + + return alias; + })(); +} + +toKeyAlias.uid = 0; + +toKeyAlias.increment = function () { + if (toKeyAlias.uid >= _Number$MAX_SAFE_INTEGER) { + return toKeyAlias.uid = 0; + } else { + return toKeyAlias.uid++; + } +}; + +function toIdentifier(name) { + name = name + ""; + + // replace all non-valid identifiers with dashes + name = name.replace(/[^a-zA-Z0-9$_]/g, "-"); + + // remove all dashes and numbers from start of name + name = name.replace(/^[-0-9]+/, ""); + + // camel case + name = name.replace(/[-\s]+(.)?/g, function (match, c) { + return c ? c.toUpperCase() : ""; + }); + + if (!t.isValidIdentifier(name)) { + name = "_" + name; + } + + return name || "_"; +} + +function toBindingIdentifierName(name) { + name = toIdentifier(name); + if (name === "eval" || name === "arguments") name = "_" + name; + return name; +} + +/** + * [Please add a description.] + * @returns {Object|Boolean} + */ + +function toStatement(node, ignore) { + if (t.isStatement(node)) { + return node; + } + + var mustHaveId = false; + var newType = undefined; + + if (t.isClass(node)) { + mustHaveId = true; + newType = "ClassDeclaration"; + } else if (t.isFunction(node)) { + mustHaveId = true; + newType = "FunctionDeclaration"; + } else if (t.isAssignmentExpression(node)) { + return t.expressionStatement(node); + } + + if (mustHaveId && !node.id) { + newType = false; + } + + if (!newType) { + if (ignore) { + return false; + } else { + throw new Error("cannot turn " + node.type + " to a statement"); + } + } + + node.type = newType; + + return node; +} + +function toExpression(node) { + if (t.isExpressionStatement(node)) { + node = node.expression; + } + + if (t.isClass(node)) { + node.type = "ClassExpression"; + } else if (t.isFunction(node)) { + node.type = "FunctionExpression"; + } + + if (t.isExpression(node)) { + return node; + } else { + throw new Error("cannot turn " + node.type + " to an expression"); + } +} + +function toBlock(node, parent) { + if (t.isBlockStatement(node)) { + return node; + } + + if (t.isEmptyStatement(node)) { + node = []; + } + + if (!Array.isArray(node)) { + if (!t.isStatement(node)) { + if (t.isFunction(parent)) { + node = t.returnStatement(node); + } else { + node = t.expressionStatement(node); + } + } + + node = [node]; + } + + return t.blockStatement(node); +} + +function valueToNode(value) { + // undefined + if (value === undefined) { + return t.identifier("undefined"); + } + + // boolean + if (value === true || value === false) { + return t.booleanLiteral(value); + } + + // null + if (value === null) { + return t.nullLiteral(); + } + + // strings + if (_lodashLangIsString2["default"](value)) { + return t.stringLiteral(value); + } + + // numbers + if (_lodashLangIsNumber2["default"](value)) { + return t.numericLiteral(value); + } + + // regexes + if (_lodashLangIsRegExp2["default"](value)) { + var pattern = value.source; + var flags = value.toString().match(/\/([a-z]+|)$/)[1]; + return t.regExpLiteral(pattern, flags); + } + + // array + if (Array.isArray(value)) { + return t.arrayExpression(value.map(t.valueToNode)); + } + + // object + if (_lodashLangIsPlainObject2["default"](value)) { + var props = []; + for (var key in value) { + var nodeKey = undefined; + if (t.isValidIdentifier(key)) { + nodeKey = t.identifier(key); + } else { + nodeKey = t.stringLiteral(key); + } + props.push(t.objectProperty(nodeKey, t.valueToNode(value[key]))); + } + return t.objectExpression(props); + } + + throw new Error("don't know how to turn this value into a node"); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/core.js b/react-app/node_modules/babel-types/lib/definitions/core.js new file mode 100644 index 0000000000..36b1c9e5b1 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/core.js @@ -0,0 +1,700 @@ +/* eslint max-len: 0 */ + +"use strict"; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _index = require("../index"); + +var t = _interopRequireWildcard(_index); + +var _constants = require("../constants"); + +var _index2 = require("./index"); + +var _index3 = _interopRequireDefault(_index2); + +_index3["default"]("ArrayExpression", { + fields: { + elements: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeOrValueType("null", "Expression", "SpreadElement"))), + "default": [] + } + }, + visitor: ["elements"], + aliases: ["Expression"] +}); + +_index3["default"]("AssignmentExpression", { + fields: { + operator: { + validate: _index2.assertValueType("string") + }, + left: { + validate: _index2.assertNodeType("LVal") + }, + right: { + validate: _index2.assertNodeType("Expression") + } + }, + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Expression"] +}); + +_index3["default"]("BinaryExpression", { + builder: ["operator", "left", "right"], + fields: { + operator: { + validate: _index2.assertOneOf.apply(undefined, _constants.BINARY_OPERATORS) + }, + left: { + validate: _index2.assertNodeType("Expression") + }, + right: { + validate: _index2.assertNodeType("Expression") + } + }, + visitor: ["left", "right"], + aliases: ["Binary", "Expression"] +}); + +_index3["default"]("Directive", { + visitor: ["value"], + fields: { + value: { + validate: _index2.assertNodeType("DirectiveLiteral") + } + } +}); + +_index3["default"]("DirectiveLiteral", { + builder: ["value"], + fields: { + value: { + validate: _index2.assertValueType("string") + } + } +}); + +_index3["default"]("BlockStatement", { + builder: ["body", "directives"], + visitor: ["directives", "body"], + fields: { + directives: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Directive"))), + "default": [] + }, + body: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Statement"))) + } + }, + aliases: ["Scopable", "BlockParent", "Block", "Statement"] +}); + +_index3["default"]("BreakStatement", { + visitor: ["label"], + fields: { + label: { + validate: _index2.assertNodeType("Identifier"), + optional: true + } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] +}); + +_index3["default"]("CallExpression", { + visitor: ["callee", "arguments"], + fields: { + callee: { + validate: _index2.assertNodeType("Expression") + }, + arguments: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Expression", "SpreadElement"))) + } + }, + aliases: ["Expression"] +}); + +_index3["default"]("CatchClause", { + visitor: ["param", "body"], + fields: { + param: { + validate: _index2.assertNodeType("Identifier") + }, + body: { + validate: _index2.assertNodeType("BlockStatement") + } + }, + aliases: ["Scopable"] +}); + +_index3["default"]("ConditionalExpression", { + visitor: ["test", "consequent", "alternate"], + fields: { + test: { + validate: _index2.assertNodeType("Expression") + }, + consequent: { + validate: _index2.assertNodeType("Expression") + }, + alternate: { + validate: _index2.assertNodeType("Expression") + } + }, + aliases: ["Expression", "Conditional"] +}); + +_index3["default"]("ContinueStatement", { + visitor: ["label"], + fields: { + label: { + validate: _index2.assertNodeType("Identifier"), + optional: true + } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] +}); + +_index3["default"]("DebuggerStatement", { + aliases: ["Statement"] +}); + +_index3["default"]("DoWhileStatement", { + visitor: ["test", "body"], + fields: { + test: { + validate: _index2.assertNodeType("Expression") + }, + body: { + validate: _index2.assertNodeType("Statement") + } + }, + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"] +}); + +_index3["default"]("EmptyStatement", { + aliases: ["Statement"] +}); + +_index3["default"]("ExpressionStatement", { + visitor: ["expression"], + fields: { + expression: { + validate: _index2.assertNodeType("Expression") + } + }, + aliases: ["Statement", "ExpressionWrapper"] +}); + +_index3["default"]("File", { + builder: ["program", "comments", "tokens"], + visitor: ["program"], + fields: { + program: { + validate: _index2.assertNodeType("Program") + } + } +}); + +_index3["default"]("ForInStatement", { + visitor: ["left", "right", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"], + fields: { + left: { + validate: _index2.assertNodeType("VariableDeclaration", "LVal") + }, + right: { + validate: _index2.assertNodeType("Expression") + }, + body: { + validate: _index2.assertNodeType("Statement") + } + } +}); + +_index3["default"]("ForStatement", { + visitor: ["init", "test", "update", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop"], + fields: { + init: { + validate: _index2.assertNodeType("VariableDeclaration", "Expression"), + optional: true + }, + test: { + validate: _index2.assertNodeType("Expression"), + optional: true + }, + update: { + validate: _index2.assertNodeType("Expression"), + optional: true + }, + body: { + validate: _index2.assertNodeType("Statement") + } + } +}); + +_index3["default"]("FunctionDeclaration", { + builder: ["id", "params", "body", "generator", "async"], + visitor: ["id", "params", "body", "returnType", "typeParameters"], + fields: { + id: { + validate: _index2.assertNodeType("Identifier") + }, + params: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("LVal"))) + }, + body: { + validate: _index2.assertNodeType("BlockStatement") + }, + generator: { + "default": false, + validate: _index2.assertValueType("boolean") + }, + async: { + "default": false, + validate: _index2.assertValueType("boolean") + } + }, + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Statement", "Pureish", "Declaration"] +}); + +_index3["default"]("FunctionExpression", { + inherits: "FunctionDeclaration", + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"], + fields: { + id: { + validate: _index2.assertNodeType("Identifier"), + optional: true + }, + params: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("LVal"))) + }, + body: { + validate: _index2.assertNodeType("BlockStatement") + }, + generator: { + "default": false, + validate: _index2.assertValueType("boolean") + }, + async: { + "default": false, + validate: _index2.assertValueType("boolean") + } + } +}); + +_index3["default"]("Identifier", { + builder: ["name"], + visitor: ["typeAnnotation"], + aliases: ["Expression", "LVal"], + fields: { + name: { + validate: function validate(node, key, val) { + if (!t.isValidIdentifier(val)) { + // todo + } + } + } + } +}); + +_index3["default"]("IfStatement", { + visitor: ["test", "consequent", "alternate"], + aliases: ["Statement", "Conditional"], + fields: { + test: { + validate: _index2.assertNodeType("Expression") + }, + consequent: { + validate: _index2.assertNodeType("Statement") + }, + alternate: { + optional: true, + validate: _index2.assertNodeType("Statement") + } + } +}); + +_index3["default"]("LabeledStatement", { + visitor: ["label", "body"], + aliases: ["Statement"], + fields: { + label: { + validate: _index2.assertNodeType("Identifier") + }, + body: { + validate: _index2.assertNodeType("Statement") + } + } +}); + +_index3["default"]("StringLiteral", { + builder: ["value"], + fields: { + value: { + validate: _index2.assertValueType("string") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] +}); + +_index3["default"]("NumericLiteral", { + builder: ["value"], + deprecatedAlias: "NumberLiteral", + fields: { + value: { + validate: _index2.assertValueType("number") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] +}); + +_index3["default"]("NullLiteral", { + aliases: ["Expression", "Pureish", "Literal", "Immutable"] +}); + +_index3["default"]("BooleanLiteral", { + builder: ["value"], + fields: { + value: { + validate: _index2.assertValueType("boolean") + } + }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] +}); + +_index3["default"]("RegExpLiteral", { + builder: ["pattern", "flags"], + deprecatedAlias: "RegexLiteral", + aliases: ["Expression", "Literal"], + fields: { + pattern: { + validate: _index2.assertValueType("string") + }, + flags: { + validate: _index2.assertValueType("string"), + "default": "" + } + } +}); + +_index3["default"]("LogicalExpression", { + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Binary", "Expression"], + fields: { + operator: { + validate: _index2.assertOneOf.apply(undefined, _constants.LOGICAL_OPERATORS) + }, + left: { + validate: _index2.assertNodeType("Expression") + }, + right: { + validate: _index2.assertNodeType("Expression") + } + } +}); + +_index3["default"]("MemberExpression", { + builder: ["object", "property", "computed"], + visitor: ["object", "property"], + aliases: ["Expression", "LVal"], + fields: { + object: { + validate: _index2.assertNodeType("Expression") + }, + property: { + validate: function validate(node, key, val) { + var expectedType = node.computed ? "Expression" : "Identifier"; + _index2.assertNodeType(expectedType)(node, key, val); + } + }, + computed: { + "default": false + } + } +}); + +_index3["default"]("NewExpression", { + visitor: ["callee", "arguments"], + aliases: ["Expression"], + fields: { + callee: { + validate: _index2.assertNodeType("Expression") + }, + arguments: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Expression", "SpreadElement"))) + } + } +}); + +_index3["default"]("Program", { + visitor: ["directives", "body"], + builder: ["body", "directives"], + fields: { + directives: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Directive"))), + "default": [] + }, + body: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Statement"))) + } + }, + aliases: ["Scopable", "BlockParent", "Block", "FunctionParent"] +}); + +_index3["default"]("ObjectExpression", { + visitor: ["properties"], + aliases: ["Expression"], + fields: { + properties: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("ObjectMethod", "ObjectProperty", "SpreadProperty"))) + } + } +}); + +_index3["default"]("ObjectMethod", { + builder: ["kind", "key", "params", "body", "computed"], + fields: { + kind: { + validate: _index2.chain(_index2.assertValueType("string"), _index2.assertOneOf("method", "get", "set")), + "default": "method" + }, + computed: { + validate: _index2.assertValueType("boolean"), + "default": false + }, + key: { + validate: function validate(node, key, val) { + var expectedTypes = node.computed ? ["Expression"] : ["Identifier", "StringLiteral", "NumericLiteral"]; + _index2.assertNodeType.apply(undefined, expectedTypes)(node, key, val); + } + }, + decorators: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Decorator"))) + }, + body: { + validate: _index2.assertNodeType("BlockStatement") + }, + generator: { + "default": false, + validate: _index2.assertValueType("boolean") + }, + async: { + "default": false, + validate: _index2.assertValueType("boolean") + } + }, + visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"], + aliases: ["UserWhitespacable", "Function", "Scopable", "BlockParent", "FunctionParent", "Method", "ObjectMember"] +}); + +_index3["default"]("ObjectProperty", { + builder: ["key", "value", "computed", "shorthand", "decorators"], + fields: { + computed: { + validate: _index2.assertValueType("boolean"), + "default": false + }, + key: { + validate: function validate(node, key, val) { + var expectedTypes = node.computed ? ["Expression"] : ["Identifier", "StringLiteral", "NumericLiteral"]; + _index2.assertNodeType.apply(undefined, expectedTypes)(node, key, val); + } + }, + value: { + validate: _index2.assertNodeType("Expression") + }, + shorthand: { + validate: _index2.assertValueType("boolean"), + "default": false + }, + decorators: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Decorator"))), + optional: true + } + }, + visitor: ["key", "value", "decorators"], + aliases: ["UserWhitespacable", "Property", "ObjectMember"] +}); + +_index3["default"]("RestElement", { + visitor: ["argument", "typeAnnotation"], + aliases: ["LVal"], + fields: { + argument: { + validate: _index2.assertNodeType("LVal") + } + } +}); + +_index3["default"]("ReturnStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { + argument: { + validate: _index2.assertNodeType("Expression"), + optional: true + } + } +}); + +_index3["default"]("SequenceExpression", { + visitor: ["expressions"], + fields: { + expressions: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Expression"))) + } + }, + aliases: ["Expression"] +}); + +_index3["default"]("SwitchCase", { + visitor: ["test", "consequent"], + fields: { + test: { + validate: _index2.assertNodeType("Expression"), + optional: true + }, + consequent: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("Statement"))) + } + } +}); + +_index3["default"]("SwitchStatement", { + visitor: ["discriminant", "cases"], + aliases: ["Statement", "BlockParent", "Scopable"], + fields: { + discriminant: { + validate: _index2.assertNodeType("Expression") + }, + cases: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("SwitchCase"))) + } + } +}); + +_index3["default"]("ThisExpression", { + aliases: ["Expression"] +}); + +_index3["default"]("ThrowStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { + argument: { + validate: _index2.assertNodeType("Expression") + } + } +}); + +// todo: at least handler or finalizer should be set to be valid +_index3["default"]("TryStatement", { + visitor: ["block", "handler", "finalizer"], + aliases: ["Statement"], + fields: { + body: { + validate: _index2.assertNodeType("BlockStatement") + }, + handler: { + optional: true, + handler: _index2.assertNodeType("BlockStatement") + }, + finalizer: { + optional: true, + validate: _index2.assertNodeType("BlockStatement") + } + } +}); + +_index3["default"]("UnaryExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { + "default": true + }, + argument: { + validate: _index2.assertNodeType("Expression") + }, + operator: { + validate: _index2.assertOneOf.apply(undefined, _constants.UNARY_OPERATORS) + } + }, + visitor: ["argument"], + aliases: ["UnaryLike", "Expression"] +}); + +_index3["default"]("UpdateExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { + "default": false + }, + argument: { + validate: _index2.assertNodeType("Expression") + }, + operator: { + validate: _index2.assertOneOf.apply(undefined, _constants.UPDATE_OPERATORS) + } + }, + visitor: ["argument"], + aliases: ["Expression"] +}); + +_index3["default"]("VariableDeclaration", { + builder: ["kind", "declarations"], + visitor: ["declarations"], + aliases: ["Statement", "Declaration"], + fields: { + kind: { + validate: _index2.chain(_index2.assertValueType("string"), _index2.assertOneOf("var", "let", "const")) + }, + declarations: { + validate: _index2.chain(_index2.assertValueType("array"), _index2.assertEach(_index2.assertNodeType("VariableDeclarator"))) + } + } +}); + +_index3["default"]("VariableDeclarator", { + visitor: ["id", "init"], + fields: { + id: { + validate: _index2.assertNodeType("LVal") + }, + init: { + optional: true, + validate: _index2.assertNodeType("Expression") + } + } +}); + +_index3["default"]("WhileStatement", { + visitor: ["test", "body"], + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"], + fields: { + test: { + validate: _index2.assertNodeType("Expression") + }, + body: { + validate: _index2.assertNodeType("BlockStatement", "Statement") + } + } +}); + +_index3["default"]("WithStatement", { + visitor: ["object", "body"], + aliases: ["Statement"], + fields: { + object: { + object: _index2.assertNodeType("Expression") + }, + body: { + validate: _index2.assertNodeType("BlockStatement", "Statement") + } + } +}); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/es2015.js b/react-app/node_modules/babel-types/lib/definitions/es2015.js new file mode 100644 index 0000000000..2a8032ecb8 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/es2015.js @@ -0,0 +1,347 @@ +/* eslint max-len: 0 */ + +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _index = require("./index"); + +var _index2 = _interopRequireDefault(_index); + +_index2["default"]("AssignmentPattern", { + visitor: ["left", "right"], + aliases: ["Pattern", "LVal"], + fields: { + left: { + validate: _index.assertNodeType("Identifier") + }, + right: { + validate: _index.assertNodeType("Expression") + } + } +}); + +_index2["default"]("ArrayPattern", { + visitor: ["elements", "typeAnnotation"], + aliases: ["Pattern", "LVal"], + fields: { + elements: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("Expression"))) + } + } +}); + +_index2["default"]("ArrowFunctionExpression", { + builder: ["params", "body", "async"], + visitor: ["params", "body", "returnType"], + aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"], + fields: { + params: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("LVal"))) + }, + body: { + validate: _index.assertNodeType("BlockStatement", "Expression") + }, + async: { + validate: _index.assertValueType("boolean"), + "default": false + } + } +}); + +_index2["default"]("ClassBody", { + visitor: ["body"], + fields: { + body: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("ClassMethod", "ClassProperty"))) + } + } +}); + +_index2["default"]("ClassDeclaration", { + builder: ["id", "superClass", "body", "decorators"], + visitor: ["id", "body", "superClass", "mixins", "typeParameters", "superTypeParameters", "implements", "decorators"], + aliases: ["Scopable", "Class", "Statement", "Declaration", "Pureish"], + fields: { + id: { + validate: _index.assertNodeType("Identifier") + }, + body: { + validate: _index.assertNodeType("ClassBody") + }, + superClass: { + optional: true, + validate: _index.assertNodeType("Expression") + }, + decorators: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("Decorator"))) + } + } +}); + +_index2["default"]("ClassExpression", { + inherits: "ClassDeclaration", + aliases: ["Scopable", "Class", "Expression", "Pureish"], + fields: { + id: { + optional: true, + validate: _index.assertNodeType("Identifier") + }, + body: { + validate: _index.assertNodeType("ClassBody") + }, + superClass: { + optional: true, + validate: _index.assertNodeType("Expression") + }, + decorators: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("Decorator"))) + } + } +}); + +_index2["default"]("ExportAllDeclaration", { + visitor: ["source"], + aliases: ["Statement", "Declaration", "ModuleDeclaration", "ExportDeclaration"], + fields: { + source: { + validate: _index.assertNodeType("StringLiteral") + } + } +}); + +_index2["default"]("ExportDefaultDeclaration", { + visitor: ["declaration"], + aliases: ["Statement", "Declaration", "ModuleDeclaration", "ExportDeclaration"], + fields: { + declaration: { + validate: _index.assertNodeType("FunctionDeclaration", "ClassDeclaration", "Expression") + } + } +}); + +_index2["default"]("ExportNamedDeclaration", { + visitor: ["declaration", "specifiers", "source"], + aliases: ["Statement", "Declaration", "ModuleDeclaration", "ExportDeclaration"], + fields: { + declaration: { + validate: _index.assertNodeType("Declaration"), + optional: true + }, + specifiers: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("ExportSpecifier"))) + }, + source: { + validate: _index.assertNodeType("StringLiteral"), + optional: true + } + } +}); + +_index2["default"]("ExportSpecifier", { + visitor: ["local", "exported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: _index.assertNodeType("Identifier") + }, + exported: { + validate: _index.assertNodeType("Identifier") + } + } +}); + +_index2["default"]("ForOfStatement", { + visitor: ["left", "right", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"], + fields: { + left: { + validate: _index.assertNodeType("VariableDeclaration", "LVal") + }, + right: { + validate: _index.assertNodeType("Expression") + }, + body: { + validate: _index.assertNodeType("Statement") + } + } +}); + +_index2["default"]("ImportDeclaration", { + visitor: ["specifiers", "source"], + aliases: ["Statement", "Declaration", "ModuleDeclaration"], + fields: { + specifiers: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("ImportSpecifier", "ImportDefaultSpecifier", "ImportNamespaceSpecifier"))) + }, + source: { + validate: _index.assertNodeType("StringLiteral") + } + } +}); + +_index2["default"]("ImportDefaultSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: _index.assertNodeType("Identifier") + } + } +}); + +_index2["default"]("ImportNamespaceSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: _index.assertNodeType("Identifier") + } + } +}); + +_index2["default"]("ImportSpecifier", { + visitor: ["local", "imported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { + validate: _index.assertNodeType("Identifier") + }, + imported: { + validate: _index.assertNodeType("Identifier") + } + } +}); + +_index2["default"]("MetaProperty", { + visitor: ["meta", "property"], + aliases: ["Expression"], + fields: { + // todo: limit to new.target + meta: { + validate: _index.assertValueType("string") + }, + property: { + validate: _index.assertValueType("string") + } + } +}); + +_index2["default"]("ClassMethod", { + aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method"], + builder: ["kind", "key", "params", "body", "computed", "static"], + visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"], + fields: { + kind: { + validate: _index.chain(_index.assertValueType("string"), _index.assertOneOf("get", "set", "method", "constructor")), + "default": "method" + }, + computed: { + "default": false, + validate: _index.assertValueType("boolean") + }, + "static": { + "default": false, + validate: _index.assertValueType("boolean") + }, + key: { + validate: function validate(node, key, val) { + var expectedTypes = node.computed ? ["Expression"] : ["Identifier", "StringLiteral", "NumericLiteral"]; + _index.assertNodeType.apply(undefined, expectedTypes)(node, key, val); + } + }, + params: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("LVal"))) + }, + body: { + validate: _index.assertNodeType("BlockStatement") + }, + generator: { + "default": false, + validate: _index.assertValueType("boolean") + }, + async: { + "default": false, + validate: _index.assertValueType("boolean") + } + } +}); + +_index2["default"]("ObjectPattern", { + visitor: ["properties", "typeAnnotation"], + aliases: ["Pattern", "LVal"], + fields: { + properties: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("RestProperty", "Property"))) + } + } +}); + +_index2["default"]("SpreadElement", { + visitor: ["argument"], + aliases: ["UnaryLike"], + fields: { + argument: { + validate: _index.assertNodeType("Expression") + } + } +}); + +_index2["default"]("Super", { + aliases: ["Expression"] +}); + +_index2["default"]("TaggedTemplateExpression", { + visitor: ["tag", "quasi"], + aliases: ["Expression"], + fields: { + tag: { + validate: _index.assertNodeType("Expression") + }, + quasi: { + validate: _index.assertNodeType("TemplateLiteral") + } + } +}); + +_index2["default"]("TemplateElement", { + builder: ["value", "tail"], + fields: { + value: { + // todo: flatten `raw` into main node + }, + tail: { + validate: _index.assertValueType("boolean"), + "default": false + } + } +}); + +_index2["default"]("TemplateLiteral", { + visitor: ["quasis", "expressions"], + aliases: ["Expression", "Literal"], + fields: { + quasis: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("TemplateElement"))) + }, + expressions: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("Expression"))) + } + } +}); + +_index2["default"]("YieldExpression", { + builder: ["argument", "delegate"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { + delegate: { + validate: _index.assertValueType("boolean"), + "default": false + }, + argument: { + optional: true, + validate: _index.assertNodeType("Expression") + } + } +}); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/experimental.js b/react-app/node_modules/babel-types/lib/definitions/experimental.js new file mode 100644 index 0000000000..590b847327 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/experimental.js @@ -0,0 +1,85 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _index = require("./index"); + +var _index2 = _interopRequireDefault(_index); + +_index2["default"]("AwaitExpression", { + builder: ["argument"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { + argument: { + validate: _index.assertNodeType("Expression") + } + } +}); + +_index2["default"]("BindExpression", { + visitor: ["object", "callee"], + aliases: ["Expression"], + fields: { + // todo + } +}); + +_index2["default"]("Decorator", { + visitor: ["expression"], + fields: { + expression: { + validate: _index.assertNodeType("Expression") + } + } +}); + +_index2["default"]("DoExpression", { + visitor: ["body"], + aliases: ["Expression"], + fields: { + body: { + validate: _index.assertNodeType("BlockStatement") + } + } +}); + +_index2["default"]("ExportDefaultSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { + exported: { + validate: _index.assertNodeType("Identifier") + } + } +}); + +_index2["default"]("ExportNamespaceSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { + exported: { + validate: _index.assertNodeType("Identifier") + } + } +}); + +_index2["default"]("RestProperty", { + visitor: ["argument"], + aliases: ["UnaryLike"], + fields: { + argument: { + validate: _index.assertNodeType("LVal") + } + } +}); + +_index2["default"]("SpreadProperty", { + visitor: ["argument"], + aliases: ["UnaryLike"], + fields: { + argument: { + validate: _index.assertNodeType("Expression") + } + } +}); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/flow.js b/react-app/node_modules/babel-types/lib/definitions/flow.js new file mode 100644 index 0000000000..fc6a7f996a --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/flow.js @@ -0,0 +1,311 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _index = require("./index"); + +var _index2 = _interopRequireDefault(_index); + +_index2["default"]("AnyTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: { + // todo + } +}); + +_index2["default"]("ArrayTypeAnnotation", { + visitor: ["elementType"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("BooleanTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: { + // todo + } +}); + +_index2["default"]("BooleanLiteralTypeAnnotation", { + aliases: ["Flow"], + fields: {} +}); + +_index2["default"]("NullLiteralTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} +}); + +_index2["default"]("ClassImplements", { + visitor: ["id", "typeParameters"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("ClassProperty", { + visitor: ["key", "value", "typeAnnotation", "decorators"], + aliases: ["Flow", "Property"], + fields: { + // todo + } +}); + +_index2["default"]("DeclareClass", { + visitor: ["id", "typeParameters", "extends", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("DeclareFunction", { + visitor: ["id"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("DeclareInterface", { + visitor: ["id", "typeParameters", "extends", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("DeclareModule", { + visitor: ["id", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("DeclareTypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("DeclareVariable", { + visitor: ["id"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("ExistentialTypeParam", { + aliases: ["Flow"] +}); + +_index2["default"]("FunctionTypeAnnotation", { + visitor: ["typeParameters", "params", "rest", "returnType"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("FunctionTypeParam", { + visitor: ["name", "typeAnnotation"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("GenericTypeAnnotation", { + visitor: ["id", "typeParameters"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("InterfaceExtends", { + visitor: ["id", "typeParameters"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("InterfaceDeclaration", { + visitor: ["id", "typeParameters", "extends", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("IntersectionTypeAnnotation", { + visitor: ["types"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("MixedTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"] +}); + +_index2["default"]("NullableTypeAnnotation", { + visitor: ["typeAnnotation"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("NumericLiteralTypeAnnotation", { + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("NumberTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: { + // todo + } +}); + +_index2["default"]("StringLiteralTypeAnnotation", { + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("StringTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: { + // todo + } +}); + +_index2["default"]("ThisTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} +}); + +_index2["default"]("TupleTypeAnnotation", { + visitor: ["types"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("TypeofTypeAnnotation", { + visitor: ["argument"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("TypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + +_index2["default"]("TypeAnnotation", { + visitor: ["typeAnnotation"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("TypeCastExpression", { + visitor: ["expression", "typeAnnotation"], + aliases: ["Flow", "ExpressionWrapper", "Expression"], + fields: { + // todo + } +}); + +_index2["default"]("TypeParameterDeclaration", { + visitor: ["params"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("TypeParameterInstantiation", { + visitor: ["params"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("ObjectTypeAnnotation", { + visitor: ["properties", "indexers", "callProperties"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("ObjectTypeCallProperty", { + visitor: ["value"], + aliases: ["Flow", "UserWhitespacable"], + fields: { + // todo + } +}); + +_index2["default"]("ObjectTypeIndexer", { + visitor: ["id", "key", "value"], + aliases: ["Flow", "UserWhitespacable"], + fields: { + // todo + } +}); + +_index2["default"]("ObjectTypeProperty", { + visitor: ["key", "value"], + aliases: ["Flow", "UserWhitespacable"], + fields: { + // todo + } +}); + +_index2["default"]("QualifiedTypeIdentifier", { + visitor: ["id", "qualification"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("UnionTypeAnnotation", { + visitor: ["types"], + aliases: ["Flow"], + fields: { + // todo + } +}); + +_index2["default"]("VoidTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: { + // todo + } +}); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/index.js b/react-app/node_modules/babel-types/lib/definitions/index.js new file mode 100644 index 0000000000..0b6c5ed2d1 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/index.js @@ -0,0 +1,229 @@ +"use strict"; + +var _getIterator = require("babel-runtime/core-js/get-iterator")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.assertEach = assertEach; +exports.assertOneOf = assertOneOf; +exports.assertNodeType = assertNodeType; +exports.assertNodeOrValueType = assertNodeOrValueType; +exports.assertValueType = assertValueType; +exports.chain = chain; +exports["default"] = defineType; + +var _index = require("../index"); + +var t = _interopRequireWildcard(_index); + +var VISITOR_KEYS = {}; +exports.VISITOR_KEYS = VISITOR_KEYS; +var ALIAS_KEYS = {}; +exports.ALIAS_KEYS = ALIAS_KEYS; +var NODE_FIELDS = {}; +exports.NODE_FIELDS = NODE_FIELDS; +var BUILDER_KEYS = {}; +exports.BUILDER_KEYS = BUILDER_KEYS; +var DEPRECATED_KEYS = {}; + +exports.DEPRECATED_KEYS = DEPRECATED_KEYS; +function getType(val) { + if (Array.isArray(val)) { + return "array"; + } else if (val === null) { + return "null"; + } else if (val === undefined) { + return "undefined"; + } else { + return typeof val; + } +} + +function assertEach(callback) { + function validator(node, key, val) { + if (!Array.isArray(val)) return; + + for (var i = 0; i < val.length; i++) { + callback(node, key + "[" + i + "]", val[i]); + } + } + validator.each = callback; + return validator; +} + +function assertOneOf() { + for (var _len = arguments.length, vals = Array(_len), _key = 0; _key < _len; _key++) { + vals[_key] = arguments[_key]; + } + + function validate(node, key, val) { + if (vals.indexOf(val) < 0) { + throw new TypeError("Property " + key + " expected value to be one of " + JSON.stringify(vals) + " but got " + JSON.stringify(val)); + } + } + + validate.oneOf = vals; + + return validate; +} + +function assertNodeType() { + for (var _len2 = arguments.length, types = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + types[_key2] = arguments[_key2]; + } + + function validate(node, key, val) { + var valid = false; + + for (var _iterator = types, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var type = _ref; + + if (t.is(type, val)) { + valid = true; + break; + } + } + + if (!valid) { + throw new TypeError("Property " + key + " of " + node.type + " expected node to be of a type " + JSON.stringify(types) + " " + ("but instead got " + JSON.stringify(val && val.type))); + } + } + + validate.oneOfNodeTypes = types; + + return validate; +} + +function assertNodeOrValueType() { + for (var _len3 = arguments.length, types = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + types[_key3] = arguments[_key3]; + } + + function validate(node, key, val) { + var valid = false; + + for (var _iterator2 = types, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var type = _ref2; + + if (getType(val) === type || t.is(type, val)) { + valid = true; + break; + } + } + + if (!valid) { + throw new TypeError("Property " + key + " of " + node.type + " expected node to be of a type " + JSON.stringify(types) + " " + ("but instead got " + JSON.stringify(val && val.type))); + } + } + + validate.oneOfNodeOrValueTypes = types; + + return validate; +} + +function assertValueType(type) { + function validate(node, key, val) { + var valid = getType(val) === type; + + if (!valid) { + throw new TypeError("Property " + key + " expected type of " + type + " but got " + getType(val)); + } + } + + validate.type = type; + + return validate; +} + +function chain() { + for (var _len4 = arguments.length, fns = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + fns[_key4] = arguments[_key4]; + } + + function validate() { + for (var _iterator3 = fns, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var fn = _ref3; + + fn.apply(undefined, arguments); + } + } + validate.chainOf = fns; + return validate; +} + +function defineType(type) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var inherits = opts.inherits && store[opts.inherits] || {}; + + opts.fields = opts.fields || inherits.fields || {}; + opts.visitor = opts.visitor || inherits.visitor || []; + opts.aliases = opts.aliases || inherits.aliases || []; + opts.builder = opts.builder || inherits.builder || opts.visitor || []; + + if (opts.deprecatedAlias) { + DEPRECATED_KEYS[opts.deprecatedAlias] = type; + } + + // ensure all field keys are represented in `fields` + + var _arr = opts.visitor.concat(opts.builder); + + for (var _i4 = 0; _i4 < _arr.length; _i4++) { + var key = _arr[_i4]; + opts.fields[key] = opts.fields[key] || {}; + } + + for (var key in opts.fields) { + var field = opts.fields[key]; + + if (field["default"] === undefined) { + field["default"] = null; + } else if (!field.validate) { + field.validate = assertValueType(getType(field["default"])); + } + } + + VISITOR_KEYS[type] = opts.visitor; + BUILDER_KEYS[type] = opts.builder; + NODE_FIELDS[type] = opts.fields; + ALIAS_KEYS[type] = opts.aliases; + + store[type] = opts; +} + +var store = {}; \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/init.js b/react-app/node_modules/babel-types/lib/definitions/init.js new file mode 100644 index 0000000000..a3334fedbe --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/init.js @@ -0,0 +1,15 @@ +"use strict"; + +require("./index"); + +require("./core"); + +require("./es2015"); + +require("./flow"); + +require("./jsx"); + +require("./misc"); + +require("./experimental"); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/jsx.js b/react-app/node_modules/babel-types/lib/definitions/jsx.js new file mode 100644 index 0000000000..56dfb0b824 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/jsx.js @@ -0,0 +1,137 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _index = require("./index"); + +var _index2 = _interopRequireDefault(_index); + +_index2["default"]("JSXAttribute", { + visitor: ["name", "value"], + aliases: ["JSX", "Immutable"], + fields: { + name: { + validate: _index.assertNodeType("JSXIdentifier", "JSXNamespacedName") + }, + value: { + optional: true, + validate: _index.assertNodeType("JSXElement", "StringLiteral", "JSXExpressionContainer") + } + } +}); + +_index2["default"]("JSXClosingElement", { + visitor: ["name"], + aliases: ["JSX", "Immutable"], + fields: { + name: { + validate: _index.assertNodeType("JSXIdentifier", "JSXMemberExpression") + } + } +}); + +_index2["default"]("JSXElement", { + builder: ["openingElement", "closingElement", "children", "selfClosing"], + visitor: ["openingElement", "children", "closingElement"], + aliases: ["JSX", "Immutable", "Expression"], + fields: { + openingElement: { + validate: _index.assertNodeType("JSXOpeningElement") + }, + closingElement: { + optional: true, + validate: _index.assertNodeType("JSXClosingElement") + }, + children: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("JSXText", "JSXExpressionContainer", "JSXElement"))) + } + } +}); + +_index2["default"]("JSXEmptyExpression", { + aliases: ["JSX", "Expression"] +}); + +_index2["default"]("JSXExpressionContainer", { + visitor: ["expression"], + aliases: ["JSX", "Immutable"], + fields: { + expression: { + validate: _index.assertNodeType("Expression") + } + } +}); + +_index2["default"]("JSXIdentifier", { + builder: ["name"], + aliases: ["JSX", "Expression"], + fields: { + name: { + validate: _index.assertValueType("string") + } + } +}); + +_index2["default"]("JSXMemberExpression", { + visitor: ["object", "property"], + aliases: ["JSX", "Expression"], + fields: { + object: { + validate: _index.assertNodeType("JSXMemberExpression", "JSXIdentifier") + }, + property: { + validate: _index.assertNodeType("JSXIdentifier") + } + } +}); + +_index2["default"]("JSXNamespacedName", { + visitor: ["namespace", "name"], + aliases: ["JSX"], + fields: { + namespace: { + validate: _index.assertNodeType("JSXIdentifier") + }, + name: { + validate: _index.assertNodeType("JSXIdentifier") + } + } +}); + +_index2["default"]("JSXOpeningElement", { + builder: ["name", "attributes", "selfClosing"], + visitor: ["name", "attributes"], + aliases: ["JSX", "Immutable"], + fields: { + name: { + validate: _index.assertNodeType("JSXIdentifier", "JSXMemberExpression") + }, + selfClosing: { + "default": false, + validate: _index.assertValueType("boolean") + }, + attributes: { + validate: _index.chain(_index.assertValueType("array"), _index.assertEach(_index.assertNodeType("JSXAttribute", "JSXSpreadAttribute"))) + } + } +}); + +_index2["default"]("JSXSpreadAttribute", { + visitor: ["argument"], + aliases: ["JSX"], + fields: { + argument: { + validate: _index.assertNodeType("Expression") + } + } +}); + +_index2["default"]("JSXText", { + aliases: ["JSX"], + builder: ["value"], + fields: { + value: { + validate: _index.assertValueType("string") + } + } +}); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/definitions/misc.js b/react-app/node_modules/babel-types/lib/definitions/misc.js new file mode 100644 index 0000000000..062e59f47d --- /dev/null +++ b/react-app/node_modules/babel-types/lib/definitions/misc.js @@ -0,0 +1,21 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _index = require("./index"); + +var _index2 = _interopRequireDefault(_index); + +_index2["default"]("Noop", { + visitor: [] +}); + +_index2["default"]("ParenthesizedExpression", { + visitor: ["expression"], + aliases: ["Expression", "ExpressionWrapper"], + fields: { + expression: { + validate: _index.assertNodeType("Expression") + } + } +}); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/flow.js b/react-app/node_modules/babel-types/lib/flow.js new file mode 100644 index 0000000000..eb34b9f341 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/flow.js @@ -0,0 +1,129 @@ +"use strict"; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.createUnionTypeAnnotation = createUnionTypeAnnotation; +exports.removeTypeDuplicates = removeTypeDuplicates; +exports.createTypeAnnotationBasedOnTypeof = createTypeAnnotationBasedOnTypeof; + +var _index = require("./index"); + +var t = _interopRequireWildcard(_index); + +/** + * Takes an array of `types` and flattens them, removing duplicates and + * returns a `UnionTypeAnnotation` node containg them. + */ + +function createUnionTypeAnnotation(types) { + var flattened = removeTypeDuplicates(types); + + if (flattened.length === 1) { + return flattened[0]; + } else { + return t.unionTypeAnnotation(flattened); + } +} + +/** + * Dedupe type annotations. + */ + +function removeTypeDuplicates(nodes) { + var generics = {}; + var bases = {}; + + // store union type groups to circular references + var typeGroups = []; + + var types = []; + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + if (!node) continue; + + // detect duplicates + if (types.indexOf(node) >= 0) { + continue; + } + + // this type matches anything + if (t.isAnyTypeAnnotation(node)) { + return [node]; + } + + // + if (t.isFlowBaseAnnotation(node)) { + bases[node.type] = node; + continue; + } + + // + if (t.isUnionTypeAnnotation(node)) { + if (typeGroups.indexOf(node.types) < 0) { + nodes = nodes.concat(node.types); + typeGroups.push(node.types); + } + continue; + } + + // find a matching generic type and merge and deduplicate the type parameters + if (t.isGenericTypeAnnotation(node)) { + var _name = node.id.name; + + if (generics[_name]) { + var existing = generics[_name]; + if (existing.typeParameters) { + if (node.typeParameters) { + existing.typeParameters.params = removeTypeDuplicates(existing.typeParameters.params.concat(node.typeParameters.params)); + } + } else { + existing = node.typeParameters; + } + } else { + generics[_name] = node; + } + + continue; + } + + types.push(node); + } + + // add back in bases + for (var type in bases) { + types.push(bases[type]); + } + + // add back in generics + for (var _name2 in generics) { + types.push(generics[_name2]); + } + + return types; +} + +/** + * Create a type anotation based on typeof expression. + */ + +function createTypeAnnotationBasedOnTypeof(type) { + if (type === "string") { + return t.stringTypeAnnotation(); + } else if (type === "number") { + return t.numberTypeAnnotation(); + } else if (type === "undefined") { + return t.voidTypeAnnotation(); + } else if (type === "boolean") { + return t.booleanTypeAnnotation(); + } else if (type === "function") { + return t.genericTypeAnnotation(t.identifier("Function")); + } else if (type === "object") { + return t.genericTypeAnnotation(t.identifier("Object")); + } else if (type === "symbol") { + return t.genericTypeAnnotation(t.identifier("Symbol")); + } else { + throw new Error("Invalid typeof value"); + } +} \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/index.js b/react-app/node_modules/babel-types/lib/index.js new file mode 100644 index 0000000000..eea5dd2ca4 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/index.js @@ -0,0 +1,544 @@ +"use strict"; + +var _Object$keys = require("babel-runtime/core-js/object/keys")["default"]; + +var _getIterator = require("babel-runtime/core-js/get-iterator")["default"]; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +var _defaults = require("babel-runtime/helpers/defaults")["default"]; + +var _interopExportWildcard = require("babel-runtime/helpers/interop-export-wildcard")["default"]; + +exports.__esModule = true; +exports.is = is; +exports.isType = isType; +exports.validate = validate; +exports.shallowEqual = shallowEqual; +exports.appendToMemberExpression = appendToMemberExpression; +exports.prependToMemberExpression = prependToMemberExpression; +exports.ensureBlock = ensureBlock; +exports.clone = clone; +exports.cloneWithoutLoc = cloneWithoutLoc; +exports.cloneDeep = cloneDeep; +exports.buildMatchMemberExpression = buildMatchMemberExpression; +exports.removeComments = removeComments; +exports.inheritsComments = inheritsComments; +exports.inheritTrailingComments = inheritTrailingComments; +exports.inheritLeadingComments = inheritLeadingComments; +exports.inheritInnerComments = inheritInnerComments; +exports.inherits = inherits; +exports.assertNode = assertNode; +exports.isNode = isNode; + +var _toFastProperties = require("to-fast-properties"); + +var _toFastProperties2 = _interopRequireDefault(_toFastProperties); + +var _lodashArrayCompact = require("lodash/array/compact"); + +var _lodashArrayCompact2 = _interopRequireDefault(_lodashArrayCompact); + +var _lodashLangClone = require("lodash/lang/clone"); + +var _lodashLangClone2 = _interopRequireDefault(_lodashLangClone); + +var _lodashCollectionEach = require("lodash/collection/each"); + +var _lodashCollectionEach2 = _interopRequireDefault(_lodashCollectionEach); + +var _lodashArrayUniq = require("lodash/array/uniq"); + +var _lodashArrayUniq2 = _interopRequireDefault(_lodashArrayUniq); + +require("./definitions/init"); + +var _definitions = require("./definitions"); + +var _react2 = require("./react"); + +var _react = _interopRequireWildcard(_react2); + +var t = exports; + +/** + * Registers `is[Type]` and `assert[Type]` generated functions for a given `type`. + * Pass `skipAliasCheck` to force it to directly compare `node.type` with `type`. + */ + +function registerType(type) { + var is = t["is" + type] = function (node, opts) { + return t.is(type, node, opts); + }; + + t["assert" + type] = function (node, opts) { + opts = opts || {}; + if (!is(node, opts)) { + throw new Error("Expected type " + JSON.stringify(type) + " with option " + JSON.stringify(opts)); + } + }; +} + +// + +var _constants = require("./constants"); + +_defaults(exports, _interopExportWildcard(_constants, _defaults)); + +exports.VISITOR_KEYS = _definitions.VISITOR_KEYS; +exports.ALIAS_KEYS = _definitions.ALIAS_KEYS; +exports.NODE_FIELDS = _definitions.NODE_FIELDS; +exports.BUILDER_KEYS = _definitions.BUILDER_KEYS; +exports.DEPRECATED_KEYS = _definitions.DEPRECATED_KEYS; +exports.react = _react; + +/** + * Registers `is[Type]` and `assert[Type]` for all types. + */ + +for (var type in t.VISITOR_KEYS) { + registerType(type); +} + +/** + * Flip `ALIAS_KEYS` for faster access in the reverse direction. + */ + +t.FLIPPED_ALIAS_KEYS = {}; + +_lodashCollectionEach2["default"](t.ALIAS_KEYS, function (aliases, type) { + _lodashCollectionEach2["default"](aliases, function (alias) { + var types = t.FLIPPED_ALIAS_KEYS[alias] = t.FLIPPED_ALIAS_KEYS[alias] || []; + types.push(type); + }); +}); + +/** + * Registers `is[Alias]` and `assert[Alias]` functions for all aliases. + */ + +_lodashCollectionEach2["default"](t.FLIPPED_ALIAS_KEYS, function (types, type) { + t[type.toUpperCase() + "_TYPES"] = types; + registerType(type); +}); + +var TYPES = _Object$keys(t.VISITOR_KEYS).concat(_Object$keys(t.FLIPPED_ALIAS_KEYS)).concat(_Object$keys(t.DEPRECATED_KEYS)); + +exports.TYPES = TYPES; +/** + * Returns whether `node` is of given `type`. + * + * For better performance, use this instead of `is[Type]` when `type` is unknown. + * Optionally, pass `skipAliasCheck` to directly compare `node.type` with `type`. + */ + +function is(type, node, opts) { + if (!node) return false; + + var matches = isType(node.type, type); + if (!matches) return false; + + if (typeof opts === "undefined") { + return true; + } else { + return t.shallowEqual(node, opts); + } +} + +/** + * Test if a `nodeType` is a `targetType` or if `targetType` is an alias of `nodeType`. + */ + +function isType(nodeType, targetType) { + if (nodeType === targetType) return true; + + var aliases = t.FLIPPED_ALIAS_KEYS[targetType]; + if (aliases) { + if (aliases[0] === nodeType) return true; + + for (var _iterator = aliases, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var alias = _ref; + + if (nodeType === alias) return true; + } + } + + return false; +} + +/** + * Description + */ + +_lodashCollectionEach2["default"](t.BUILDER_KEYS, function (keys, type) { + function builder() { + if (arguments.length > keys.length) { + throw new Error("t." + type + ": Too many arguments passed. Received " + arguments.length + " but can receive " + ("no more than " + keys.length)); + } + + var node = {}; + node.type = type; + + var i = 0; + + var _arr = keys; + for (var _i2 = 0; _i2 < _arr.length; _i2++) { + var key = _arr[_i2]; + var field = t.NODE_FIELDS[type][key]; + + var arg = arguments[i++]; + if (arg === undefined) arg = _lodashLangClone2["default"](field["default"]); + + node[key] = arg; + } + + for (var key in node) { + validate(node, key, node[key]); + } + + return node; + } + + t[type] = builder; + t[type[0].toLowerCase() + type.slice(1)] = builder; +}); + +/** + * Description + */ + +var _loop = function (type) { + var proxy = function proxy(fn) { + return function () { + console.trace("The node type " + type + " has been renamed to " + newType); + return fn.apply(this, arguments); + }; + }; + + var newType = t.DEPRECATED_KEYS[type]; + + t[type] = t[type[0].toLowerCase() + type.slice(1)] = proxy(t[newType]); + t["is" + type] = proxy(t["is" + newType]); + t["assert" + type] = proxy(t["assert" + newType]); +}; + +for (var type in t.DEPRECATED_KEYS) { + _loop(type); +} + +/** + * Description + */ + +function validate(node, key, val) { + if (!node) return; + + var fields = t.NODE_FIELDS[node.type]; + if (!fields) return; + + var field = fields[key]; + if (!field || !field.validate) return; + if (field.optional && val == null) return; + + field.validate(node, key, val); +} + +/** + * Test if an object is shallowly equal. + */ + +function shallowEqual(actual, expected) { + var keys = _Object$keys(expected); + + var _arr2 = keys; + for (var _i3 = 0; _i3 < _arr2.length; _i3++) { + var key = _arr2[_i3]; + if (actual[key] !== expected[key]) { + return false; + } + } + + return true; +} + +/** + * Append a node to a member expression. + */ + +function appendToMemberExpression(member, append, computed) { + member.object = t.memberExpression(member.object, member.property, member.computed); + member.property = append; + member.computed = !!computed; + return member; +} + +/** + * Prepend a node to a member expression. + */ + +function prependToMemberExpression(member, prepend) { + member.object = t.memberExpression(prepend, member.object); + return member; +} + +/** + * Ensure the `key` (defaults to "body") of a `node` is a block. + * Casting it to a block if it is not. + */ + +function ensureBlock(node) { + var key = arguments.length <= 1 || arguments[1] === undefined ? "body" : arguments[1]; + + return node[key] = t.toBlock(node[key], node); +} + +/** + * Create a shallow clone of a `node` excluding `_private` properties. + */ + +function clone(node) { + var newNode = {}; + for (var key in node) { + if (key[0] === "_") continue; + newNode[key] = node[key]; + } + return newNode; +} + +/** + * Create a shallow clone of a `node` excluding `_private` and location properties. + */ + +function cloneWithoutLoc(node) { + var newNode = clone(node); + delete newNode.loc; + return newNode; +} + +/** + * Create a deep clone of a `node` and all of it's child nodes + * exluding `_private` properties. + */ + +function cloneDeep(node) { + var newNode = {}; + + for (var key in node) { + if (key[0] === "_") continue; + + var val = node[key]; + + if (val) { + if (val.type) { + val = t.cloneDeep(val); + } else if (Array.isArray(val)) { + val = val.map(t.cloneDeep); + } + } + + newNode[key] = val; + } + + return newNode; +} + +/** + * Build a function that when called will return whether or not the + * input `node` `MemberExpression` matches the input `match`. + * + * For example, given the match `React.createClass` it would match the + * parsed nodes of `React.createClass` and `React["createClass"]`. + */ + +function buildMatchMemberExpression(match, allowPartial) { + var parts = match.split("."); + + return function (member) { + // not a member expression + if (!t.isMemberExpression(member)) return false; + + var search = [member]; + var i = 0; + + while (search.length) { + var node = search.shift(); + + if (allowPartial && i === parts.length) { + return true; + } + + if (t.isIdentifier(node)) { + // this part doesn't match + if (parts[i] !== node.name) return false; + } else if (t.isStringLiteral(node)) { + // this part doesn't match + if (parts[i] !== node.value) return false; + } else if (t.isMemberExpression(node)) { + if (node.computed && !t.isStringLiteral(node.property)) { + // we can't deal with this + return false; + } else { + search.push(node.object); + search.push(node.property); + continue; + } + } else { + // we can't deal with this + return false; + } + + // too many parts + if (++i > parts.length) { + return false; + } + } + + return true; + }; +} + +/** + * Remove comment properties from a node. + */ + +function removeComments(node) { + for (var _iterator2 = t.COMMENT_KEYS, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) { + var _ref2; + + if (_isArray2) { + if (_i4 >= _iterator2.length) break; + _ref2 = _iterator2[_i4++]; + } else { + _i4 = _iterator2.next(); + if (_i4.done) break; + _ref2 = _i4.value; + } + + var key = _ref2; + + delete node[key]; + } + return node; +} + +/** + * Inherit all unique comments from `parent` node to `child` node. + */ + +function inheritsComments(child, parent) { + inheritTrailingComments(child, parent); + inheritLeadingComments(child, parent); + inheritInnerComments(child, parent); + return child; +} + +function inheritTrailingComments(child, parent) { + _inheritComments("trailingComments", child, parent); +} + +function inheritLeadingComments(child, parent) { + _inheritComments("leadingComments", child, parent); +} + +function inheritInnerComments(child, parent) { + _inheritComments("innerComments", child, parent); +} + +function _inheritComments(key, child, parent) { + if (child && parent) { + child[key] = _lodashArrayUniq2["default"](_lodashArrayCompact2["default"]([].concat(child[key], parent[key]))); + } +} + +// Can't use import because of cyclic dependency between babel-traverse +// and this module (babel-types). This require needs to appear after +// we export the TYPES constant. +var traverse = require("babel-traverse")["default"]; + +/** + * Inherit all contextual properties from `parent` node to `child` node. + */ + +function inherits(child, parent) { + if (!child || !parent) return child; + + // optionally inherit specific properties if not null + var _arr3 = t.INHERIT_KEYS.optional; + for (var _i5 = 0; _i5 < _arr3.length; _i5++) { + var key = _arr3[_i5]; + if (child[key] == null) { + child[key] = parent[key]; + } + } + + // force inherit "private" properties + for (var key in parent) { + if (key[0] === "_") child[key] = parent[key]; + } + + // force inherit select properties + var _arr4 = t.INHERIT_KEYS.force; + for (var _i6 = 0; _i6 < _arr4.length; _i6++) { + var key = _arr4[_i6]; + child[key] = parent[key]; + } + + t.inheritsComments(child, parent); + traverse.copyCache(parent, child); + + return child; +} + +/** + * TODO + */ + +function assertNode(node) { + if (!isNode(node)) { + // $FlowFixMe + throw new TypeError("Not a valid node " + (node && node.type)); + } +} + +/** + * TODO + */ + +function isNode(node) { + return !!(node && _definitions.VISITOR_KEYS[node.type]); +} + +// Optimize property access. +_toFastProperties2["default"](t); +_toFastProperties2["default"](t.VISITOR_KEYS); + +// + +var _retrievers = require("./retrievers"); + +_defaults(exports, _interopExportWildcard(_retrievers, _defaults)); + +var _validators = require("./validators"); + +_defaults(exports, _interopExportWildcard(_validators, _defaults)); + +var _converters = require("./converters"); + +_defaults(exports, _interopExportWildcard(_converters, _defaults)); + +var _flow = require("./flow"); + +_defaults(exports, _interopExportWildcard(_flow, _defaults)); \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/react.js b/react-app/node_modules/babel-types/lib/react.js new file mode 100644 index 0000000000..148aa7c2e5 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/react.js @@ -0,0 +1,84 @@ +"use strict"; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.isCompatTag = isCompatTag; +exports.buildChildren = buildChildren; + +var _index = require("./index"); + +var t = _interopRequireWildcard(_index); + +var isReactComponent = t.buildMatchMemberExpression("React.Component"); + +exports.isReactComponent = isReactComponent; + +function isCompatTag(tagName) { + return !!tagName && /^[a-z]|\-/.test(tagName); +} + +function cleanJSXElementLiteralChild(child, args) { + var lines = child.value.split(/\r\n|\n|\r/); + + var lastNonEmptyLine = 0; + + for (var i = 0; i < lines.length; i++) { + if (lines[i].match(/[^ \t]/)) { + lastNonEmptyLine = i; + } + } + + var str = ""; + + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + + var isFirstLine = i === 0; + var isLastLine = i === lines.length - 1; + var isLastNonEmptyLine = i === lastNonEmptyLine; + + // replace rendered whitespace tabs with spaces + var trimmedLine = line.replace(/\t/g, " "); + + // trim whitespace touching a newline + if (!isFirstLine) { + trimmedLine = trimmedLine.replace(/^[ ]+/, ""); + } + + // trim whitespace touching an endline + if (!isLastLine) { + trimmedLine = trimmedLine.replace(/[ ]+$/, ""); + } + + if (trimmedLine) { + if (!isLastNonEmptyLine) { + trimmedLine += " "; + } + + str += trimmedLine; + } + } + + if (str) args.push(t.stringLiteral(str)); +} + +function buildChildren(node) { + var elems = []; + + for (var i = 0; i < node.children.length; i++) { + var child = node.children[i]; + + if (t.isJSXText(child)) { + cleanJSXElementLiteralChild(child, elems); + continue; + } + + if (t.isJSXExpressionContainer(child)) child = child.expression; + if (t.isJSXEmptyExpression(child)) continue; + + elems.push(child); + } + + return elems; +} \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/retrievers.js b/react-app/node_modules/babel-types/lib/retrievers.js new file mode 100644 index 0000000000..f04124adf5 --- /dev/null +++ b/react-app/node_modules/babel-types/lib/retrievers.js @@ -0,0 +1,118 @@ +"use strict"; + +var _Object$create = require("babel-runtime/core-js/object/create")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.getBindingIdentifiers = getBindingIdentifiers; +exports.getOuterBindingIdentifiers = getOuterBindingIdentifiers; + +var _index = require("./index"); + +var t = _interopRequireWildcard(_index); + +/** + * Return a list of binding identifiers associated with the input `node`. + */ + +function getBindingIdentifiers(node, duplicates, outerOnly) { + var search = [].concat(node); + var ids = _Object$create(null); + + while (search.length) { + var id = search.shift(); + if (!id) continue; + + var keys = t.getBindingIdentifiers.keys[id.type]; + + if (t.isIdentifier(id)) { + if (duplicates) { + var _ids = ids[id.name] = ids[id.name] || []; + _ids.push(id); + } else { + ids[id.name] = id; + } + continue; + } + + if (t.isExportDeclaration(id)) { + if (t.isDeclaration(node.declaration)) { + search.push(node.declaration); + } + continue; + } + + if (outerOnly) { + if (t.isFunctionDeclaration(id)) { + search.push(id.id); + continue; + } + + if (t.isFunctionExpression(id)) { + continue; + } + } + + if (keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (id[key]) { + search = search.concat(id[key]); + } + } + } + } + + return ids; +} + +/** + * Mapping of types to their identifier keys. + */ + +getBindingIdentifiers.keys = { + DeclareClass: ["id"], + DeclareFunction: ["id"], + DeclareModule: ["id"], + DeclareVariable: ["id"], + InterfaceDeclaration: ["id"], + TypeAlias: ["id"], + + CatchClause: ["param"], + LabeledStatement: ["label"], + UnaryExpression: ["argument"], + AssignmentExpression: ["left"], + + ImportSpecifier: ["local"], + ImportNamespaceSpecifier: ["local"], + ImportDefaultSpecifier: ["local"], + ImportDeclaration: ["specifiers"], + + ExportSpecifier: ["exported"], + ExportNamespaceSpecifier: ["exported"], + ExportDefaultSpecifier: ["exported"], + + FunctionDeclaration: ["id", "params"], + FunctionExpression: ["id", "params"], + + ClassDeclaration: ["id"], + ClassExpression: ["id"], + + RestElement: ["argument"], + UpdateExpression: ["argument"], + + RestProperty: ["argument"], + ObjectProperty: ["value"], + + AssignmentPattern: ["left"], + ArrayPattern: ["elements"], + ObjectPattern: ["properties"], + + VariableDeclaration: ["declarations"], + VariableDeclarator: ["id"] +}; + +function getOuterBindingIdentifiers(node, duplicates) { + return getBindingIdentifiers(node, duplicates, true); +} \ No newline at end of file diff --git a/react-app/node_modules/babel-types/lib/validators.js b/react-app/node_modules/babel-types/lib/validators.js new file mode 100644 index 0000000000..eda31e98ec --- /dev/null +++ b/react-app/node_modules/babel-types/lib/validators.js @@ -0,0 +1,261 @@ +/* eslint indent: 0 */ + +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"]; + +var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"]; + +exports.__esModule = true; +exports.isBinding = isBinding; +exports.isReferenced = isReferenced; +exports.isValidIdentifier = isValidIdentifier; +exports.isLet = isLet; +exports.isBlockScoped = isBlockScoped; +exports.isVar = isVar; +exports.isSpecifierDefault = isSpecifierDefault; +exports.isScope = isScope; +exports.isImmutable = isImmutable; + +var _retrievers = require("./retrievers"); + +var _esutils = require("esutils"); + +var _esutils2 = _interopRequireDefault(_esutils); + +var _index = require("./index"); + +var t = _interopRequireWildcard(_index); + +var _constants = require("./constants"); + +/** + * Check if the input `node` is a binding identifier. + */ + +function isBinding(node, parent) { + var keys = _retrievers.getBindingIdentifiers.keys[parent.type]; + if (keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var val = parent[key]; + if (Array.isArray(val)) { + if (val.indexOf(node) >= 0) return true; + } else { + if (val === node) return true; + } + } + } + + return false; +} + +/** + * Check if the input `node` is a reference to a bound variable. + */ + +function isReferenced(node, parent) { + switch (parent.type) { + // yes: object::NODE + // yes: NODE::callee + case "BindExpression": + return parent.object === node || parent.callee === node; + + // yes: PARENT[NODE] + // yes: NODE.child + // no: parent.NODE + case "MemberExpression": + case "JSXMemberExpression": + if (parent.property === node && parent.computed) { + return true; + } else if (parent.object === node) { + return true; + } else { + return false; + } + + // no: new.NODE + // no: NODE.target + case "MetaProperty": + return false; + + // yes: { [NODE]: "" } + // yes: { NODE } + // no: { NODE: "" } + case "ObjectProperty": + if (parent.key === node) { + return parent.computed; + } + + // no: let NODE = init; + // yes: let id = NODE; + case "VariableDeclarator": + return parent.id !== node; + + // no: function NODE() {} + // no: function foo(NODE) {} + case "ArrowFunctionExpression": + case "FunctionDeclaration": + case "FunctionExpression": + var _arr = parent.params; + + for (var _i = 0; _i < _arr.length; _i++) { + var param = _arr[_i]; + if (param === node) return false; + } + + return parent.id !== node; + + // no: export { foo as NODE }; + // yes: export { NODE as foo }; + // no: export { NODE as foo } from "foo"; + case "ExportSpecifier": + if (parent.source) { + return false; + } else { + return parent.local === node; + } + + // no: export NODE from "foo"; + // no: export * as NODE from "foo"; + case "ExportNamespaceSpecifier": + case "ExportDefaultSpecifier": + return false; + + // no:
+ case "JSXAttribute": + return parent.name !== node; + + // no: class { NODE = value; } + // yes: class { key = NODE; } + case "ClassProperty": + return parent.value === node; + + // no: import NODE from "foo"; + // no: import * as NODE from "foo"; + // no: import { NODE as foo } from "foo"; + // no: import { foo as NODE } from "foo"; + // no: import NODE from "bar"; + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + return false; + + // no: class NODE {} + case "ClassDeclaration": + case "ClassExpression": + return parent.id !== node; + + // yes: class { [NODE](){} } + case "ClassMethod": + case "ObjectMethod": + return parent.key === node && parent.computed; + + // no: NODE: for (;;) {} + case "LabeledStatement": + return false; + + // no: try {} catch (NODE) {} + case "CatchClause": + return parent.param !== node; + + // no: function foo(...NODE) {} + case "RestElement": + return false; + + // yes: left = NODE; + // no: NODE = right; + case "AssignmentExpression": + return parent.right === node; + + // no: [NODE = foo] = []; + // yes: [foo = NODE] = []; + case "AssignmentPattern": + return parent.right === node; + + // no: [NODE] = []; + // no: ({ NODE }) = []; + case "ObjectPattern": + case "ArrayPattern": + return false; + } + + return true; +} + +/** + * Check if the input `name` is a valid identifier name + * and isn't a reserved word. + */ + +function isValidIdentifier(name) { + if (typeof name !== "string" || _esutils2["default"].keyword.isReservedWordES6(name, true)) { + return false; + } else { + return _esutils2["default"].keyword.isIdentifierNameES6(name); + } +} + +/** + * Check if the input `node` is a `let` variable declaration. + */ + +function isLet(node) { + return t.isVariableDeclaration(node) && (node.kind !== "var" || node[_constants.BLOCK_SCOPED_SYMBOL]); +} + +/** + * Check if the input `node` is block scoped. + */ + +function isBlockScoped(node) { + return t.isFunctionDeclaration(node) || t.isClassDeclaration(node) || t.isLet(node); +} + +/** + * Check if the input `node` is a variable declaration. + */ + +function isVar(node) { + return t.isVariableDeclaration(node, { kind: "var" }) && !node[_constants.BLOCK_SCOPED_SYMBOL]; +} + +/** + * Check if the input `specifier` is a `default` import or export. + */ + +function isSpecifierDefault(specifier) { + return t.isImportDefaultSpecifier(specifier) || t.isIdentifier(specifier.imported || specifier.exported, { name: "default" }); +} + +/** + * Check if the input `node` is a scope. + */ + +function isScope(node, parent) { + if (t.isBlockStatement(node) && t.isFunction(parent, { body: node })) { + return false; + } + + return t.isScopable(node); +} + +/** + * Check if the input `node` is definitely immutable. + */ + +function isImmutable(node) { + if (t.isType(node.type, "Immutable")) return true; + + if (t.isIdentifier(node)) { + if (node.name === "undefined") { + // immutable! + return true; + } else { + // no idea... + return false; + } + } + + return false; +} \ No newline at end of file diff --git a/react-app/node_modules/babel-types/package.json b/react-app/node_modules/babel-types/package.json new file mode 100644 index 0000000000..8739018b70 --- /dev/null +++ b/react-app/node_modules/babel-types/package.json @@ -0,0 +1,100 @@ +{ + "_args": [ + [ + "babel-types@^6.6.5", + "/Users/mromano/dev/react-sfs/node_modules/babel-helper-builder-react-jsx" + ] + ], + "_from": "babel-types@>=6.6.5 <7.0.0", + "_id": "babel-types@6.7.2", + "_inCache": true, + "_installable": true, + "_location": "/babel-types", + "_nodeVersion": "5.5.0", + "_npmOperationalInternal": { + "host": "packages-13-west.internal.npmjs.com", + "tmp": "tmp/babel-types-6.7.2.tgz_1457649694542_0.08641894650645554" + }, + "_npmUser": { + "email": "amjad.masad@gmail.com", + "name": "amasad" + }, + "_npmVersion": "3.3.12", + "_phantomChildren": {}, + "_requested": { + "name": "babel-types", + "raw": "babel-types@^6.6.5", + "rawSpec": "^6.6.5", + "scope": null, + "spec": ">=6.6.5 <7.0.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-core", + "/babel-generator", + "/babel-helper-builder-react-jsx", + "/babel-template", + "/babel-traverse" + ], + "_resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz", + "_shasum": "7f8a1bac2d2b11bbe2691685e17153e84355bd02", + "_shrinkwrap": null, + "_spec": "babel-types@^6.6.5", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babel-helper-builder-react-jsx", + "author": { + "email": "sebmck@gmail.com", + "name": "Sebastian McKenzie" + }, + "dependencies": { + "babel-runtime": "^5.0.0", + "babel-traverse": "^6.7.2", + "esutils": "^2.0.2", + "lodash": "^3.10.1", + "to-fast-properties": "^1.0.1" + }, + "description": "This module contains methods for building ASTs manually and for checking the types of AST nodes.", + "devDependencies": {}, + "directories": {}, + "dist": { + "shasum": "7f8a1bac2d2b11bbe2691685e17153e84355bd02", + "tarball": "https://registry.npmjs.org/babel-types/-/babel-types-6.7.2.tgz" + }, + "homepage": "https://babeljs.io/", + "license": "MIT", + "main": "lib/index.js", + "maintainers": [ + { + "email": "amjad.masad@gmail.com", + "name": "amasad" + }, + { + "email": "hi@henryzoo.com", + "name": "hzoo" + }, + { + "email": "npm-public@jessemccarthy.net", + "name": "jmm" + }, + { + "email": "loganfsmyth@gmail.com", + "name": "loganfsmyth" + }, + { + "email": "sebmck@gmail.com", + "name": "sebmck" + }, + { + "email": "me@thejameskyle.com", + "name": "thejameskyle" + } + ], + "name": "babel-types", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel/tree/master/packages/babel-types" + }, + "scripts": {}, + "version": "6.7.2" +} diff --git a/react-app/node_modules/babel/.npmignore b/react-app/node_modules/babel/.npmignore new file mode 100644 index 0000000000..47cdd2c655 --- /dev/null +++ b/react-app/node_modules/babel/.npmignore @@ -0,0 +1,3 @@ +src +test +node_modules diff --git a/react-app/node_modules/babel/README.md b/react-app/node_modules/babel/README.md new file mode 100644 index 0000000000..17590de468 --- /dev/null +++ b/react-app/node_modules/babel/README.md @@ -0,0 +1 @@ +# babel diff --git a/react-app/node_modules/babel/cli.js b/react-app/node_modules/babel/cli.js new file mode 100755 index 0000000000..92c1235cd0 --- /dev/null +++ b/react-app/node_modules/babel/cli.js @@ -0,0 +1,10 @@ +#!/usr/bin/env node + +console.error("You have mistakenly installed the `babel` package, which is a no-op in Babel 6.\n" + + "Babel's CLI commands have been moved from the `babel` package to the `babel-cli` package.\n" + + "\n" + + " npm uninstall babel\n" + + " npm install babel-cli\n" + + "\n" + + "See http://babeljs.io/docs/usage/cli/ for setup instructions."); +process.exit(1); diff --git a/react-app/node_modules/babel/index.js b/react-app/node_modules/babel/index.js new file mode 100644 index 0000000000..06ca959245 --- /dev/null +++ b/react-app/node_modules/babel/index.js @@ -0,0 +1 @@ +throw new Error("The node API for `babel` has been moved to `babel-core`."); diff --git a/react-app/node_modules/babel/package.json b/react-app/node_modules/babel/package.json new file mode 100644 index 0000000000..014bbead13 --- /dev/null +++ b/react-app/node_modules/babel/package.json @@ -0,0 +1,94 @@ +{ + "_args": [ + [ + "babel@^6.5.2", + "/Users/mromano/dev/react-sfs" + ] + ], + "_from": "babel@>=6.5.2 <7.0.0", + "_id": "babel@6.5.2", + "_inCache": true, + "_installable": true, + "_location": "/babel", + "_nodeVersion": "5.1.0", + "_npmOperationalInternal": { + "host": "packages-5-east.internal.npmjs.com", + "tmp": "tmp/babel-6.5.2.tgz_1455294601370_0.7809299291111529" + }, + "_npmUser": { + "email": "hi@henryzoo.com", + "name": "hzoo" + }, + "_npmVersion": "3.6.0", + "_phantomChildren": {}, + "_requested": { + "name": "babel", + "raw": "babel@^6.5.2", + "rawSpec": "^6.5.2", + "scope": null, + "spec": ">=6.5.2 <7.0.0", + "type": "range" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/babel/-/babel-6.5.2.tgz", + "_shasum": "59140607438270920047ff56f02b2d8630c2d129", + "_shrinkwrap": null, + "_spec": "babel@^6.5.2", + "_where": "/Users/mromano/dev/react-sfs", + "author": { + "email": "sebmck@gmail.com", + "name": "Sebastian McKenzie" + }, + "bin": { + "babel": "./cli.js", + "babel-external-helpers": "./cli.js", + "babel-node": "./cli.js" + }, + "dependencies": {}, + "description": "Turn ES6 code into readable vanilla ES5 with source maps", + "devDependencies": {}, + "directories": {}, + "dist": { + "shasum": "59140607438270920047ff56f02b2d8630c2d129", + "tarball": "https://registry.npmjs.org/babel/-/babel-6.5.2.tgz" + }, + "homepage": "https://babeljs.io/", + "license": "MIT", + "maintainers": [ + { + "email": "amjad.masad@gmail.com", + "name": "amasad" + }, + { + "email": "hi@henryzoo.com", + "name": "hzoo" + }, + { + "email": "npm-public@jessemccarthy.net", + "name": "jmm" + }, + { + "email": "loganfsmyth@gmail.com", + "name": "loganfsmyth" + }, + { + "email": "sebmck@gmail.com", + "name": "sebmck" + }, + { + "email": "me@thejameskyle.com", + "name": "thejameskyle" + } + ], + "name": "babel", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel/tree/master/packages/babel" + }, + "scripts": {}, + "version": "6.5.2" +} diff --git a/react-app/node_modules/babelify/.npmignore b/react-app/node_modules/babelify/.npmignore new file mode 100644 index 0000000000..a4f6c74f59 --- /dev/null +++ b/react-app/node_modules/babelify/.npmignore @@ -0,0 +1,2 @@ +.travis.yml +test diff --git a/react-app/node_modules/babelify/LICENSE b/react-app/node_modules/babelify/LICENSE new file mode 100644 index 0000000000..e79355e35d --- /dev/null +++ b/react-app/node_modules/babelify/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015 Sebastian McKenzie + +MIT License + +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. diff --git a/react-app/node_modules/babelify/README.md b/react-app/node_modules/babelify/README.md new file mode 100644 index 0000000000..b207a1af8e --- /dev/null +++ b/react-app/node_modules/babelify/README.md @@ -0,0 +1,220 @@ +# babelify [![Build Status](https://travis-ci.org/babel/babelify.svg?branch=master)](https://travis-ci.org/babel/babelify) + +[Babel](https://github.com/babel/babel) [browserify](https://github.com/substack/node-browserify) transform. + +As of [Babel 6.0.0](http://babeljs.io/blog/2015/10/29/6.0.0/) there are **no plugins included by default**. For babelify to be useful, you must also include some [presets](http://babeljs.io/docs/plugins/#presets) and/or [plugins](http://babeljs.io/docs/plugins/#transform). + +## Installation + +```sh +$ npm install --save-dev babelify +``` + +## Usage + +### CLI + +```sh +$ browserify script.js -o bundle.js \ + -t [ babelify --presets [ es2015 react ] ] +``` + +### Node + +```javascript +var fs = require("fs"); +var browserify = require("browserify"); +browserify("./script.js") + .transform("babelify", {presets: ["es2015", "react"]}) + .bundle() + .pipe(fs.createWriteStream("bundle.js")); +``` + +**NOTE:** [Presets and plugins](http://babeljs.io/docs/plugins/) need to be installed as separate modules. For the above examples to work, you'd need to also install [`babel-preset-es2015`](https://www.npmjs.com/package/babel-preset-es2015) and [`babel-preset-react`](https://www.npmjs.com/package/babel-preset-react): + +```sh +$ npm install --save-dev babel-preset-es2015 babel-preset-react +``` + +### Options + +Selected options are discussed below. See the [babel](http://babeljs.io/) docs for the complete list of [options](http://babeljs.io/docs/usage/options/). + +Options may be passed in via standard [browserify](https://github.com/substack/node-browserify#btransformtr-opts) ways: + +```sh +$ browserify -t [ babelify --presets [ es2015 react ] ] +``` + +```js +browserify().transform("babelify", {presets: ["es2015", "react"]}); +``` + +```js +var babelify = require("babelify"); +browserify().transform(babelify, {presets: ["es2015", "react"]}); +``` + +Or, with the `configure` method: + +```js +browserify().transform(babelify.configure({ + presets: ["es2015", "react"] +})); +``` + +#### Customizing extensions + +By default, all files with the extensions `.js`, `.es`, `.es6` and `.jsx` are compiled. You can change this by passing an array of extensions. + +**NOTE:** This will override the default ones so if you want to use any of them +you have to add them back. + +```js +browserify().transform("babelify", {extensions: [".babel"]}); +``` + +```sh +$ browserify -t [ babelify --extensions .babel ] +``` + +Now you can use: + +```js +import NavBar from "nav-bar.babel"; +var Panels = require("panels.babel"); +``` + +**NOTE:** By default, Browserify will only lookup `.js` and `.json` files when the extension is ommited (like node's `require`). To lookup additional extensions, use browserify's [`extensions` option](https://github.com/substack/node-browserify#browserifyfiles--opts). + +```js +browserify({ + extensions: [".babel"] +}).transform("babelify", { + extensions: [".babel"] +}); +``` + +```sh +$ browserify --extensions=.babel -t [ babelify --extensions .babel ] +``` + +Now you can omit the extension and compile `.babel` files: + +```js +import NavBar from "nav-bar"; +var Panels = require("panels"); +``` + +#### Relative source maps + +Browserify passes an absolute path so there's no way to determine what folder +it's relative to. You can pass a relative path that'll be removed from the +absolute path with the `sourceMapRelative` option. + +```js +browserify().transform("babelify", { + sourceMapRelative: "/Users/sebastian/Projects/my-cool-website/assets" +}); +``` + +```sh +$ browserify -t [ babelify --sourceMapRelative . ] +``` + +#### Additional options + +```javascript +browserify().transform(babelify.configure({ + // Optional ignore regex - if any filenames **do** match this regex then + // they aren't compiled + ignore: /regex/, + + // Optional only regex - if any filenames **don't** match this regex + // then they aren't compiled + only: /my_es6_folder/ +})) +``` + +```sh +$ browserify -t [ babelify --ignore regex --only my_es6_folder ] +``` + +#### Babel result (metadata and others) + +Babelify emits a `babelify` event with Babel's full result object as the first +argument, and the filename as the second. Browserify doesn't pass-through the +events emitted by a transform, so it's necessary to get a reference to the +transform instance before you can attach a listener for the event: + +```js +var b = browserify().transform(babelify); + +b.on("transform", function(tr) { + if (tr instanceof babelify) { + tr.once("babelify", function(result, filename) { + result; // => { code, map, ast, metadata } + }); + } +}); +``` + +## FAQ + +### Why aren't files in `node_modules` being transformed? + +This is the default browserify behavior. + +A possible solution is to add: + +```json +{ + "browserify": { + "transform": ["babelify"] + } +} +``` + +to the root of all your modules `package.json` that you want to be transformed. If you'd like to +specify options then you can use: + +```json +{ + "browserify": { + "transform": [["babelify", { "presets": ["es2015"] }]] + } +} +``` + +Another solution (proceed with caution!) is to run babelify as a [global](https://github.com/substack/node-browserify#btransformtr-opts) transform. Use the babel [`ignore` option](http://babeljs.io/docs/usage/options/) to narrow the number of files transformed: + +```js +browserify().transform(babelify, { + global: true, + ignore: /\/node_modules\/(?!app\/)/ +}); +``` + +The above example will transform all files except those in the `node_modules` directory that are not in `node_modules/app`. + +### Why am I not getting source maps? + +To use source maps, enable them in browserify with the [`debug`](https://github.com/substack/node-browserify#browserifyfiles--opts) option: + +```js +browserify({debug: true}).transform("babelify"); +``` + +```sh +$ browserify -d -t [ babelify ] +``` + +If you want the source maps to be of the post-transpiled code, then leave `debug` on, but turn off babelify's `sourceMaps`: + +```js +browserify({debug: true}).transform("babelify", {sourceMaps: false}); +``` + +```sh +$ browserify -d -t [ babelify --no-sourceMaps ] +``` diff --git a/react-app/node_modules/babelify/index.js b/react-app/node_modules/babelify/index.js new file mode 100644 index 0000000000..bf23d59498 --- /dev/null +++ b/react-app/node_modules/babelify/index.js @@ -0,0 +1,74 @@ +var assign = require("object-assign"); +var stream = require("stream"); +var babel = require("babel-core"); +var path = require("path"); +var util = require("util"); + +module.exports = Babelify; +util.inherits(Babelify, stream.Transform); + +function Babelify(filename, opts) { + if (!(this instanceof Babelify)) { + return Babelify.configure(opts)(filename); + } + + stream.Transform.call(this); + this._data = ""; + this._filename = filename; + this._opts = assign({filename: filename}, opts); +} + +Babelify.prototype._transform = function (buf, enc, callback) { + this._data += buf; + callback(); +}; + +Babelify.prototype._flush = function (callback) { + try { + var result = babel.transform(this._data, this._opts); + this.emit("babelify", result, this._filename); + var code = result.code; + this.push(code); + } catch(err) { + this.emit("error", err); + return; + } + callback(); +}; + +Babelify.configure = function (opts) { + opts = assign({}, opts); + var extensions = opts.extensions ? babel.util.arrayify(opts.extensions) : null; + var sourceMapRelative = opts.sourceMapRelative; + if (opts.sourceMaps !== false) opts.sourceMaps = "inline"; + + // babelify specific options + delete opts.sourceMapRelative; + delete opts.extensions; + delete opts.filename; + + // browserify specific options + delete opts._flags; + delete opts.basedir; + delete opts.global; + + // browserify cli options + delete opts._; + // "--opt [ a b ]" and "--opt a --opt b" are allowed: + if (opts.ignore && opts.ignore._) opts.ignore = opts.ignore._; + if (opts.only && opts.only._) opts.only = opts.only._; + if (opts.plugins && opts.plugins._) opts.plugins = opts.plugins._; + if (opts.presets && opts.presets._) opts.presets = opts.presets._; + + return function (filename) { + if (!babel.util.canCompile(filename, extensions)) { + return stream.PassThrough(); + } + + if (sourceMapRelative) { + filename = path.relative(sourceMapRelative, filename); + } + + return new Babelify(filename, opts); + }; +}; diff --git a/react-app/node_modules/babelify/package.json b/react-app/node_modules/babelify/package.json new file mode 100644 index 0000000000..a5f67d5412 --- /dev/null +++ b/react-app/node_modules/babelify/package.json @@ -0,0 +1,88 @@ +{ + "_args": [ + [ + "babelify@^7.2.0", + "/Users/mromano/dev/react-sfs" + ] + ], + "_from": "babelify@>=7.2.0 <8.0.0", + "_id": "babelify@7.2.0", + "_inCache": true, + "_installable": true, + "_location": "/babelify", + "_nodeVersion": "5.0.0", + "_npmUser": { + "email": "zertosh@gmail.com", + "name": "zertosh" + }, + "_npmVersion": "3.3.6", + "_phantomChildren": {}, + "_requested": { + "name": "babelify", + "raw": "babelify@^7.2.0", + "rawSpec": "^7.2.0", + "scope": null, + "spec": ">=7.2.0 <8.0.0", + "type": "range" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/babelify/-/babelify-7.2.0.tgz", + "_shasum": "584249bc5066b61f984b3e745ed855203c9ec73e", + "_shrinkwrap": null, + "_spec": "babelify@^7.2.0", + "_where": "/Users/mromano/dev/react-sfs", + "author": { + "email": "sebmck@gmail.com", + "name": "Sebastian McKenzie" + }, + "bugs": { + "url": "https://github.com/babel/babelify/issues" + }, + "dependencies": { + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" + }, + "description": "Babel browserify transform", + "devDependencies": { + "babel-plugin-transform-es3-property-literals": "^6.0.14", + "babel-plugin-transform-node-env-inline": "^6.0.14", + "babel-plugin-transform-react-display-name": "^6.0.14", + "babel-plugin-undeclared-variables-check": "^6.0.14", + "babel-preset-es2015": "^6.0.14", + "babel-preset-react": "^6.0.14", + "browserify": "^12.0.1", + "convert-source-map": "^1.1.0", + "tap": "^2.1.1" + }, + "directories": {}, + "dist": { + "shasum": "584249bc5066b61f984b3e745ed855203c9ec73e", + "tarball": "https://registry.npmjs.org/babelify/-/babelify-7.2.0.tgz" + }, + "gitHead": "1b381da80249040588d1e6919a2190b1997bc09d", + "homepage": "https://github.com/babel/babelify", + "license": "MIT", + "maintainers": [ + { + "email": "sebmck@gmail.com", + "name": "sebmck" + }, + { + "email": "zertosh@gmail.com", + "name": "zertosh" + } + ], + "name": "babelify", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/babel/babelify.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "version": "7.2.0" +} diff --git a/react-app/node_modules/babylon/.npmignore b/react-app/node_modules/babylon/.npmignore new file mode 100644 index 0000000000..cbb7790fb4 --- /dev/null +++ b/react-app/node_modules/babylon/.npmignore @@ -0,0 +1,5 @@ +src +test +*.log +scripts +lib diff --git a/react-app/node_modules/babylon/AUTHORS b/react-app/node_modules/babylon/AUTHORS new file mode 100644 index 0000000000..2f39deff4b --- /dev/null +++ b/react-app/node_modules/babylon/AUTHORS @@ -0,0 +1,41 @@ +List of Acorn contributors. Updated before every release. + +Adrian Rakovsky +Alistair Braidwood +Andres Suarez +Aparajita Fishman +Arian Stolwijk +Artem Govorov +Brandon Mills +Charles Hughes +Conrad Irwin +David Bonnet +Forbes Lindesay +Gilad Peleg +impinball +Ingvar Stepanyan +Jesse McCarthy +Jiaxing Wang +Joel Kemp +Johannes Herr +Jürg Lehni +keeyipchan +Kevin Kwok +krator +Marijn Haverbeke +Martin Carlberg +Mathias Bynens +Mathieu 'p01' Henri +Max Schaefer +Max Zerzouri +Mihai Bazon +Mike Rennie +Nick Fitzgerald +Oskar Schöldström +Paul Harper +Peter Rust +PlNG +r-e-d +Rich Harris +Sebastian McKenzie +zsjforcn diff --git a/react-app/node_modules/babylon/LICENSE b/react-app/node_modules/babylon/LICENSE new file mode 100644 index 0000000000..d4c7fc5838 --- /dev/null +++ b/react-app/node_modules/babylon/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2012-2014 by various contributors (see AUTHORS) + +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. diff --git a/react-app/node_modules/babylon/README.md b/react-app/node_modules/babylon/README.md new file mode 100644 index 0000000000..d5833e498c --- /dev/null +++ b/react-app/node_modules/babylon/README.md @@ -0,0 +1,77 @@ +

+ babylon +

+ +

+ Babylon is a JavaScript parser used in Babel. +

+ + - ES6 enabled by default. + - Comment attachment. + - Support for JSX and Flow. + - Support for experimental language proposals. + +## Credits + +Heavily based on [acorn](https://github.com/marijnh/acorn) and [acorn-jsx](https://github.com/RReverser/acorn-jsx), +thanks to the awesome work of [@RReverser](https://github.com/RReverser) and [@marijnh](https://github.com/marijnh). + +Significant diversions are expected to occur in the future such as streaming, EBNF definitions, sweet.js integration, interspacial parsing and more. + +## API + +### `babylon.parse(code, [options])` + +## Options + +- **allowImportExportEverywhere**: By default, `import` and `export` + declarations can only appear at a program's top level. Setting this + option to `true` allows them anywhere where a statement is allowed. + +- **allowReturnOutsideFunction**: By default, a return statement at + the top level raises an error. Set this to `true` to accept such + code. + +- **allowSuperOutsideMethod** TODO + +- **sourceType**: Indicate the mode the code should be parsed in. Can be + either `"script"` or `"module"`. + +- **sourceFilename**: Correlate output AST nodes with their source filename. Useful when generating code and source maps from the ASTs of multiple input files. + +- **plugins**: Array containing the plugins that you want to enable. + +### Example + +```javascript +require("babylon").parse("code", { + // parse in strict mode and allow module declarations + sourceType: "module", + + plugins: [ + // enable experimental async functions + "asyncFunctions", + + // enable jsx and flow syntax + "jsx", + "flow" + ] +}); +``` + +### Plugins + + - `jsx` + - `flow` + - `asyncFunctions` + - `classConstructorCall` + - `doExpressions` + - `trailingFunctionCommas` + - `objectRestSpread` + - `decorators` + - `classProperties` + - `exportExtensions` + - `exponentiationOperator` + - `asyncGenerators` + - `functionBind` + - `functionSent` diff --git a/react-app/node_modules/babylon/bin/babylon.js b/react-app/node_modules/babylon/bin/babylon.js new file mode 100755 index 0000000000..449ddfed00 --- /dev/null +++ b/react-app/node_modules/babylon/bin/babylon.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node +/* eslint no-var: 0 */ + +var babylon = require(".."); +var fs = require("fs"); + +var filename = process.argv[2]; +if (!filename) { + console.error("no filename specified"); + process.exit(0); +} + +var file = fs.readFileSync(filename, "utf8"); +var ast = babylon.parse(file); + +console.log(JSON.stringify(ast, null, " ")); diff --git a/react-app/node_modules/babylon/index.js b/react-app/node_modules/babylon/index.js new file mode 100644 index 0000000000..ed6eb65745 --- /dev/null +++ b/react-app/node_modules/babylon/index.js @@ -0,0 +1,6264 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.babylon = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 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. + */ + +"use strict"; + +var _interopRequireDefault = _dereq_(25)["default"]; + +var _index = _dereq_(5); + +var _index2 = _interopRequireDefault(_index); + +function last(stack) { + return stack[stack.length - 1]; +} + +var pp = _index2["default"].prototype; + +pp.addComment = function (comment) { + this.state.trailingComments.push(comment); + this.state.leadingComments.push(comment); +}; + +pp.processComment = function (node) { + if (node.type === "Program" && node.body.length > 0) return; + + var stack = this.state.commentStack; + + var lastChild = undefined, + trailingComments = undefined, + i = undefined; + + if (this.state.trailingComments.length > 0) { + // If the first comment in trailingComments comes after the + // current node, then we're good - all comments in the array will + // come after the node and so it's safe to add them as official + // trailingComments. + if (this.state.trailingComments[0].start >= node.end) { + trailingComments = this.state.trailingComments; + this.state.trailingComments = []; + } else { + // Otherwise, if the first comment doesn't come after the + // current node, that means we have a mix of leading and trailing + // comments in the array and that leadingComments contains the + // same items as trailingComments. Reset trailingComments to + // zero items and we'll handle this by evaluating leadingComments + // later. + this.state.trailingComments.length = 0; + } + } else { + var lastInStack = last(stack); + if (stack.length > 0 && lastInStack.trailingComments && lastInStack.trailingComments[0].start >= node.end) { + trailingComments = lastInStack.trailingComments; + lastInStack.trailingComments = null; + } + } + + // Eating the stack. + while (stack.length > 0 && last(stack).start >= node.start) { + lastChild = stack.pop(); + } + + if (lastChild) { + if (lastChild.leadingComments) { + if (lastChild !== node && last(lastChild.leadingComments).end <= node.start) { + node.leadingComments = lastChild.leadingComments; + lastChild.leadingComments = null; + } else { + // A leading comment for an anonymous class had been stolen by its first ClassMethod, + // so this takes back the leading comment. + // See also: https://github.com/eslint/espree/issues/158 + for (i = lastChild.leadingComments.length - 2; i >= 0; --i) { + if (lastChild.leadingComments[i].end <= node.start) { + node.leadingComments = lastChild.leadingComments.splice(0, i + 1); + break; + } + } + } + } + } else if (this.state.leadingComments.length > 0) { + if (last(this.state.leadingComments).end <= node.start) { + node.leadingComments = this.state.leadingComments; + this.state.leadingComments = []; + } else { + // https://github.com/eslint/espree/issues/2 + // + // In special cases, such as return (without a value) and + // debugger, all comments will end up as leadingComments and + // will otherwise be eliminated. This step runs when the + // commentStack is empty and there are comments left + // in leadingComments. + // + // This loop figures out the stopping point between the actual + // leading and trailing comments by finding the location of the + // first comment that comes after the given node. + for (i = 0; i < this.state.leadingComments.length; i++) { + if (this.state.leadingComments[i].end > node.start) { + break; + } + } + + // Split the array based on the location of the first comment + // that comes after the node. Keep in mind that this could + // result in an empty array, and if so, the array must be + // deleted. + node.leadingComments = this.state.leadingComments.slice(0, i); + if (node.leadingComments.length === 0) { + node.leadingComments = null; + } + + // Similarly, trailing comments are attached later. The variable + // must be reset to null if there are no trailing comments. + trailingComments = this.state.leadingComments.slice(i); + if (trailingComments.length === 0) { + trailingComments = null; + } + } + } + + if (trailingComments) { + if (trailingComments.length && trailingComments[0].start >= node.start && last(trailingComments).end <= node.end) { + node.innerComments = trailingComments; + } else { + node.trailingComments = trailingComments; + } + } + + stack.push(node); +}; +},{"25":25,"5":5}],4:[function(_dereq_,module,exports){ +/* eslint indent: 0 */ +/* eslint max-len: 0 */ + +// A recursive descent parser operates by defining functions for all +// syntactic elements, and recursively calling those, each function +// advancing the input stream and returning an AST node. Precedence +// of constructs (for example, the fact that `!x[1]` means `!(x[1])` +// instead of `(!x)[1]` is handled by the fact that the parser +// function that parses unary prefix operators is called first, and +// in turn calls the function that parses `[]` subscripts — that +// way, it'll receive the node for `x[1]` already parsed, and wraps +// *that* in the unary operator node. +// +// Acorn uses an [operator precedence parser][opp] to handle binary +// operator precedence, because it is much more compact than using +// the technique outlined above, which uses different, nesting +// functions to specify precedence, for all of the ten binary +// precedence levels that JavaScript defines. +// +// [opp]: http://en.wikipedia.org/wiki/Operator-precedence_parser + +"use strict"; + +var _Object$create = _dereq_(21)["default"]; + +var _interopRequireDefault = _dereq_(25)["default"]; + +var _tokenizerTypes = _dereq_(17); + +var _index = _dereq_(5); + +var _index2 = _interopRequireDefault(_index); + +var _utilIdentifier = _dereq_(18); + +var pp = _index2["default"].prototype; + +// Check if property name clashes with already added. +// Object/class getters and setters are not allowed to clash — +// either with each other or with an init property — and in +// strict mode, init properties are also not allowed to be repeated. + +pp.checkPropClash = function (prop, propHash) { + if (prop.computed) return; + + var key = prop.key; + var name = undefined; + switch (key.type) { + case "Identifier": + name = key.name; + break; + + case "StringLiteral": + case "NumericLiteral": + name = String(key.value); + break; + + default: + return; + } + + if (name === "__proto__" && prop.kind === "init") { + if (propHash.proto) this.raise(key.start, "Redefinition of __proto__ property"); + propHash.proto = true; + } +}; + +// ### Expression parsing + +// These nest, from the most general expression type at the top to +// 'atomic', nondivisible expression types at the bottom. Most of +// the functions will simply let the function (s) below them parse, +// and, *if* the syntactic construct they handle is present, wrap +// the AST node that the inner parser gave them in another node. + +// Parse a full expression. The optional arguments are used to +// forbid the `in` operator (in for loops initalization expressions) +// and provide reference for storing '=' operator inside shorthand +// property assignment in contexts where both object expression +// and object pattern might appear (so it's possible to raise +// delayed syntax error at correct position). + +pp.parseExpression = function (noIn, refShorthandDefaultPos) { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var expr = this.parseMaybeAssign(noIn, refShorthandDefaultPos); + if (this.match(_tokenizerTypes.types.comma)) { + var node = this.startNodeAt(startPos, startLoc); + node.expressions = [expr]; + while (this.eat(_tokenizerTypes.types.comma)) { + node.expressions.push(this.parseMaybeAssign(noIn, refShorthandDefaultPos)); + } + this.toReferencedList(node.expressions); + return this.finishNode(node, "SequenceExpression"); + } + return expr; +}; + +// Parse an assignment expression. This includes applications of +// operators like `+=`. + +pp.parseMaybeAssign = function (noIn, refShorthandDefaultPos, afterLeftParse) { + if (this.match(_tokenizerTypes.types._yield) && this.state.inGenerator) { + return this.parseYield(); + } + + var failOnShorthandAssign = undefined; + if (refShorthandDefaultPos) { + failOnShorthandAssign = false; + } else { + refShorthandDefaultPos = { start: 0 }; + failOnShorthandAssign = true; + } + + var startPos = this.state.start; + var startLoc = this.state.startLoc; + + if (this.match(_tokenizerTypes.types.parenL) || this.match(_tokenizerTypes.types.name)) { + this.state.potentialArrowAt = this.state.start; + } + + var left = this.parseMaybeConditional(noIn, refShorthandDefaultPos); + if (afterLeftParse) left = afterLeftParse.call(this, left, startPos, startLoc); + if (this.state.type.isAssign) { + var node = this.startNodeAt(startPos, startLoc); + node.operator = this.state.value; + node.left = this.match(_tokenizerTypes.types.eq) ? this.toAssignable(left) : left; + refShorthandDefaultPos.start = 0; // reset because shorthand default was used correctly + + this.checkLVal(left); + + if (left.extra && left.extra.parenthesized) { + var errorMsg = undefined; + if (left.type === "ObjectPattern") { + errorMsg = "`({a}) = 0` use `({a} = 0)`"; + } else if (left.type === "ArrayPattern") { + errorMsg = "`([a]) = 0` use `([a] = 0)`"; + } + if (errorMsg) { + this.raise(left.start, "You're trying to assign to a parenthesized expression, eg. instead of " + errorMsg); + } + } + + this.next(); + node.right = this.parseMaybeAssign(noIn); + return this.finishNode(node, "AssignmentExpression"); + } else if (failOnShorthandAssign && refShorthandDefaultPos.start) { + this.unexpected(refShorthandDefaultPos.start); + } + + return left; +}; + +// Parse a ternary conditional (`?:`) operator. + +pp.parseMaybeConditional = function (noIn, refShorthandDefaultPos) { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var expr = this.parseExprOps(noIn, refShorthandDefaultPos); + if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr; + if (this.eat(_tokenizerTypes.types.question)) { + var node = this.startNodeAt(startPos, startLoc); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + this.expect(_tokenizerTypes.types.colon); + node.alternate = this.parseMaybeAssign(noIn); + return this.finishNode(node, "ConditionalExpression"); + } + return expr; +}; + +// Start the precedence parser. + +pp.parseExprOps = function (noIn, refShorthandDefaultPos) { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var expr = this.parseMaybeUnary(refShorthandDefaultPos); + if (refShorthandDefaultPos && refShorthandDefaultPos.start) { + return expr; + } else { + return this.parseExprOp(expr, startPos, startLoc, -1, noIn); + } +}; + +// Parse binary operators with the operator precedence parsing +// algorithm. `left` is the left-hand side of the operator. +// `minPrec` provides context that allows the function to stop and +// defer further parser to one of its callers when it encounters an +// operator that has a lower precedence than the set it is parsing. + +pp.parseExprOp = function (left, leftStartPos, leftStartLoc, minPrec, noIn) { + var prec = this.state.type.binop; + if (prec != null && (!noIn || !this.match(_tokenizerTypes.types._in))) { + if (prec > minPrec) { + var node = this.startNodeAt(leftStartPos, leftStartLoc); + node.left = left; + node.operator = this.state.value; + + if (node.operator === "**" && left.type === "UnaryExpression" && left.extra && !left.extra.parenthesizedArgument) { + this.raise(left.argument.start, "Illegal expression. Wrap left hand side or entire exponentiation in parentheses."); + } + + var op = this.state.type; + this.next(); + + var startPos = this.state.start; + var startLoc = this.state.startLoc; + node.right = this.parseExprOp(this.parseMaybeUnary(), startPos, startLoc, op.rightAssociative ? prec - 1 : prec, noIn); + + this.finishNode(node, op === _tokenizerTypes.types.logicalOR || op === _tokenizerTypes.types.logicalAND ? "LogicalExpression" : "BinaryExpression"); + return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn); + } + } + return left; +}; + +// Parse unary operators, both prefix and postfix. + +pp.parseMaybeUnary = function (refShorthandDefaultPos) { + if (this.state.type.prefix) { + var node = this.startNode(); + var update = this.match(_tokenizerTypes.types.incDec); + node.operator = this.state.value; + node.prefix = true; + this.next(); + + var argType = this.state.type; + this.addExtra(node, "parenthesizedArgument", argType === _tokenizerTypes.types.parenL); + node.argument = this.parseMaybeUnary(); + + if (refShorthandDefaultPos && refShorthandDefaultPos.start) { + this.unexpected(refShorthandDefaultPos.start); + } + + if (update) { + this.checkLVal(node.argument); + } else if (this.state.strict && node.operator === "delete" && node.argument.type === "Identifier") { + this.raise(node.start, "Deleting local variable in strict mode"); + } + + return this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } + + var startPos = this.state.start, + startLoc = this.state.startLoc; + var expr = this.parseExprSubscripts(refShorthandDefaultPos); + if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr; + while (this.state.type.postfix && !this.canInsertSemicolon()) { + var node = this.startNodeAt(startPos, startLoc); + node.operator = this.state.value; + node.prefix = false; + node.argument = expr; + this.checkLVal(expr); + this.next(); + expr = this.finishNode(node, "UpdateExpression"); + } + return expr; +}; + +// Parse call, dot, and `[]`-subscript expressions. + +pp.parseExprSubscripts = function (refShorthandDefaultPos) { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var potentialArrowAt = this.state.potentialArrowAt; + var expr = this.parseExprAtom(refShorthandDefaultPos); + + if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) { + return expr; + } + + if (refShorthandDefaultPos && refShorthandDefaultPos.start) { + return expr; + } + + return this.parseSubscripts(expr, startPos, startLoc); +}; + +pp.parseSubscripts = function (base, startPos, startLoc, noCalls) { + for (;;) { + if (!noCalls && this.eat(_tokenizerTypes.types.doubleColon)) { + var node = this.startNodeAt(startPos, startLoc); + node.object = base; + node.callee = this.parseNoCallExpr(); + return this.parseSubscripts(this.finishNode(node, "BindExpression"), startPos, startLoc, noCalls); + } else if (this.eat(_tokenizerTypes.types.dot)) { + var node = this.startNodeAt(startPos, startLoc); + node.object = base; + node.property = this.parseIdentifier(true); + node.computed = false; + base = this.finishNode(node, "MemberExpression"); + } else if (this.eat(_tokenizerTypes.types.bracketL)) { + var node = this.startNodeAt(startPos, startLoc); + node.object = base; + node.property = this.parseExpression(); + node.computed = true; + this.expect(_tokenizerTypes.types.bracketR); + base = this.finishNode(node, "MemberExpression"); + } else if (!noCalls && this.match(_tokenizerTypes.types.parenL)) { + var possibleAsync = this.state.potentialArrowAt === base.start && base.type === "Identifier" && base.name === "async" && !this.canInsertSemicolon(); + this.next(); + + var node = this.startNodeAt(startPos, startLoc); + node.callee = base; + node.arguments = this.parseCallExpressionArguments(_tokenizerTypes.types.parenR, this.hasPlugin("trailingFunctionCommas"), possibleAsync); + base = this.finishNode(node, "CallExpression"); + + if (possibleAsync && this.shouldParseAsyncArrow()) { + return this.parseAsyncArrowFromCallExpression(this.startNodeAt(startPos, startLoc), node); + } else { + this.toReferencedList(node.arguments); + } + } else if (this.match(_tokenizerTypes.types.backQuote)) { + var node = this.startNodeAt(startPos, startLoc); + node.tag = base; + node.quasi = this.parseTemplate(); + base = this.finishNode(node, "TaggedTemplateExpression"); + } else { + return base; + } + } +}; + +pp.parseCallExpressionArguments = function (close, allowTrailingComma, possibleAsyncArrow) { + var innerParenStart = undefined; + + var elts = [], + first = true; + while (!this.eat(close)) { + if (first) { + first = false; + } else { + this.expect(_tokenizerTypes.types.comma); + if (allowTrailingComma && this.eat(close)) break; + } + + // we need to make sure that if this is an async arrow functions, that we don't allow inner parens inside the params + if (this.match(_tokenizerTypes.types.parenL) && !innerParenStart) { + innerParenStart = this.state.start; + } + + elts.push(this.parseExprListItem()); + } + + // we found an async arrow function so let's not allow any inner parens + if (possibleAsyncArrow && innerParenStart && this.shouldParseAsyncArrow()) { + this.unexpected(); + } + + return elts; +}; + +pp.shouldParseAsyncArrow = function () { + return this.match(_tokenizerTypes.types.arrow); +}; + +pp.parseAsyncArrowFromCallExpression = function (node, call) { + if (!this.hasPlugin("asyncFunctions")) this.unexpected(); + this.expect(_tokenizerTypes.types.arrow); + return this.parseArrowExpression(node, call.arguments, true); +}; + +// Parse a no-call expression (like argument of `new` or `::` operators). + +pp.parseNoCallExpr = function () { + var startPos = this.state.start, + startLoc = this.state.startLoc; + return this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true); +}; + +// Parse an atomic expression — either a single token that is an +// expression, an expression started by a keyword like `function` or +// `new`, or an expression wrapped in punctuation like `()`, `[]`, +// or `{}`. + +pp.parseExprAtom = function (refShorthandDefaultPos) { + var node = undefined, + canBeArrow = this.state.potentialArrowAt === this.state.start; + switch (this.state.type) { + case _tokenizerTypes.types._super: + if (!this.state.inMethod && !this.options.allowSuperOutsideMethod) { + this.raise(this.state.start, "'super' outside of function or class"); + } + + node = this.startNode(); + this.next(); + if (!this.match(_tokenizerTypes.types.parenL) && !this.match(_tokenizerTypes.types.bracketL) && !this.match(_tokenizerTypes.types.dot)) { + this.unexpected(); + } + if (this.match(_tokenizerTypes.types.parenL) && this.state.inMethod !== "constructor" && !this.options.allowSuperOutsideMethod) { + this.raise(node.start, "super() outside of class constructor"); + } + return this.finishNode(node, "Super"); + + case _tokenizerTypes.types._this: + node = this.startNode(); + this.next(); + return this.finishNode(node, "ThisExpression"); + + case _tokenizerTypes.types._yield: + if (this.state.inGenerator) this.unexpected(); + + case _tokenizerTypes.types.name: + node = this.startNode(); + var allowAwait = this.hasPlugin("asyncFunctions") && this.state.value === "await" && this.state.inAsync; + var allowYield = this.shouldAllowYieldIdentifier(); + var id = this.parseIdentifier(allowAwait || allowYield); + + if (this.hasPlugin("asyncFunctions")) { + if (id.name === "await") { + if (this.state.inAsync || this.inModule) { + return this.parseAwait(node); + } + } else if (id.name === "async" && this.match(_tokenizerTypes.types._function) && !this.canInsertSemicolon()) { + this.next(); + return this.parseFunction(node, false, false, true); + } else if (canBeArrow && id.name === "async" && this.match(_tokenizerTypes.types.name)) { + var params = [this.parseIdentifier()]; + this.expect(_tokenizerTypes.types.arrow); + // let foo = bar => {}; + return this.parseArrowExpression(node, params, true); + } + } + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(_tokenizerTypes.types.arrow)) { + return this.parseArrowExpression(node, [id]); + } + + return id; + + case _tokenizerTypes.types._do: + if (this.hasPlugin("doExpressions")) { + var _node = this.startNode(); + this.next(); + var oldInFunction = this.state.inFunction; + var oldLabels = this.state.labels; + this.state.labels = []; + this.state.inFunction = false; + _node.body = this.parseBlock(false, true); + this.state.inFunction = oldInFunction; + this.state.labels = oldLabels; + return this.finishNode(_node, "DoExpression"); + } + + case _tokenizerTypes.types.regexp: + var value = this.state.value; + node = this.parseLiteral(value.value, "RegExpLiteral"); + node.pattern = value.pattern; + node.flags = value.flags; + return node; + + case _tokenizerTypes.types.num: + return this.parseLiteral(this.state.value, "NumericLiteral"); + + case _tokenizerTypes.types.string: + return this.parseLiteral(this.state.value, "StringLiteral"); + + case _tokenizerTypes.types._null: + node = this.startNode(); + this.next(); + return this.finishNode(node, "NullLiteral"); + + case _tokenizerTypes.types._true:case _tokenizerTypes.types._false: + node = this.startNode(); + node.value = this.match(_tokenizerTypes.types._true); + this.next(); + return this.finishNode(node, "BooleanLiteral"); + + case _tokenizerTypes.types.parenL: + return this.parseParenAndDistinguishExpression(null, null, canBeArrow); + + case _tokenizerTypes.types.bracketL: + node = this.startNode(); + this.next(); + node.elements = this.parseExprList(_tokenizerTypes.types.bracketR, true, true, refShorthandDefaultPos); + this.toReferencedList(node.elements); + return this.finishNode(node, "ArrayExpression"); + + case _tokenizerTypes.types.braceL: + return this.parseObj(false, refShorthandDefaultPos); + + case _tokenizerTypes.types._function: + return this.parseFunctionExpression(); + + case _tokenizerTypes.types.at: + this.parseDecorators(); + + case _tokenizerTypes.types._class: + node = this.startNode(); + this.takeDecorators(node); + return this.parseClass(node, false); + + case _tokenizerTypes.types._new: + return this.parseNew(); + + case _tokenizerTypes.types.backQuote: + return this.parseTemplate(); + + case _tokenizerTypes.types.doubleColon: + node = this.startNode(); + this.next(); + node.object = null; + var callee = node.callee = this.parseNoCallExpr(); + if (callee.type === "MemberExpression") { + return this.finishNode(node, "BindExpression"); + } else { + this.raise(callee.start, "Binding should be performed on object property."); + } + + default: + this.unexpected(); + } +}; + +pp.parseFunctionExpression = function () { + var node = this.startNode(); + var meta = this.parseIdentifier(true); + if (this.state.inGenerator && this.eat(_tokenizerTypes.types.dot) && this.hasPlugin("functionSent")) { + return this.parseMetaProperty(node, meta, "sent"); + } else { + return this.parseFunction(node, false); + } +}; + +pp.parseMetaProperty = function (node, meta, propertyName) { + node.meta = meta; + node.property = this.parseIdentifier(true); + + if (node.property.name !== propertyName) { + this.raise(node.property.start, "The only valid meta property for new is " + meta.name + "." + propertyName); + } + + return this.finishNode(node, "MetaProperty"); +}; + +pp.parseLiteral = function (value, type) { + var node = this.startNode(); + this.addExtra(node, "rawValue", value); + this.addExtra(node, "raw", this.input.slice(this.state.start, this.state.end)); + node.value = value; + this.next(); + return this.finishNode(node, type); +}; + +pp.parseParenExpression = function () { + this.expect(_tokenizerTypes.types.parenL); + var val = this.parseExpression(); + this.expect(_tokenizerTypes.types.parenR); + return val; +}; + +pp.parseParenAndDistinguishExpression = function (startPos, startLoc, canBeArrow, isAsync, allowOptionalCommaStart) { + startPos = startPos || this.state.start; + startLoc = startLoc || this.state.startLoc; + + var val = undefined; + this.next(); + + var innerStartPos = this.state.start, + innerStartLoc = this.state.startLoc; + var exprList = [], + first = true; + var refShorthandDefaultPos = { start: 0 }, + spreadStart = undefined, + optionalCommaStart = undefined; + while (!this.match(_tokenizerTypes.types.parenR)) { + if (first) { + first = false; + } else { + this.expect(_tokenizerTypes.types.comma); + if (this.match(_tokenizerTypes.types.parenR) && this.hasPlugin("trailingFunctionCommas")) { + optionalCommaStart = this.state.start; + break; + } + } + + if (this.match(_tokenizerTypes.types.ellipsis)) { + var spreadNodeStartPos = this.state.start, + spreadNodeStartLoc = this.state.startLoc; + spreadStart = this.state.start; + exprList.push(this.parseParenItem(this.parseRest(), spreadNodeStartLoc, spreadNodeStartPos)); + break; + } else { + exprList.push(this.parseMaybeAssign(false, refShorthandDefaultPos, this.parseParenItem)); + } + } + + var innerEndPos = this.state.start; + var innerEndLoc = this.state.startLoc; + this.expect(_tokenizerTypes.types.parenR); + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(_tokenizerTypes.types.arrow)) { + for (var _i = 0; _i < exprList.length; _i++) { + var param = exprList[_i]; + if (param.extra && param.extra.parenthesized) this.unexpected(param.extra.parenStart); + } + + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, isAsync); + } + + if (!exprList.length) { + if (isAsync) { + return; + } else { + this.unexpected(this.state.lastTokStart); + } + } + if (optionalCommaStart && !allowOptionalCommaStart) this.unexpected(optionalCommaStart); + if (spreadStart) this.unexpected(spreadStart); + if (refShorthandDefaultPos.start) this.unexpected(refShorthandDefaultPos.start); + + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.toReferencedList(val.expressions); + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + + this.addExtra(val, "parenthesized", true); + this.addExtra(val, "parenStart", startPos); + + return val; +}; + +pp.parseParenItem = function (node) { + return node; +}; + +// New's precedence is slightly tricky. It must allow its argument +// to be a `[]` or dot subscript expression, but not a call — at +// least, not without wrapping it in parentheses. Thus, it uses the + +pp.parseNew = function () { + var node = this.startNode(); + var meta = this.parseIdentifier(true); + + if (this.eat(_tokenizerTypes.types.dot)) { + return this.parseMetaProperty(node, meta, "target"); + } + + node.callee = this.parseNoCallExpr(); + + if (this.eat(_tokenizerTypes.types.parenL)) { + node.arguments = this.parseExprList(_tokenizerTypes.types.parenR, this.hasPlugin("trailingFunctionCommas")); + this.toReferencedList(node.arguments); + } else { + node.arguments = []; + } + + return this.finishNode(node, "NewExpression"); +}; + +// Parse template expression. + +pp.parseTemplateElement = function () { + var elem = this.startNode(); + elem.value = { + raw: this.input.slice(this.state.start, this.state.end).replace(/\r\n?/g, "\n"), + cooked: this.state.value + }; + this.next(); + elem.tail = this.match(_tokenizerTypes.types.backQuote); + return this.finishNode(elem, "TemplateElement"); +}; + +pp.parseTemplate = function () { + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement(); + node.quasis = [curElt]; + while (!curElt.tail) { + this.expect(_tokenizerTypes.types.dollarBraceL); + node.expressions.push(this.parseExpression()); + this.expect(_tokenizerTypes.types.braceR); + node.quasis.push(curElt = this.parseTemplateElement()); + } + this.next(); + return this.finishNode(node, "TemplateLiteral"); +}; + +// Parse an object literal or binding pattern. + +pp.parseObj = function (isPattern, refShorthandDefaultPos) { + var decorators = []; + var propHash = _Object$create(null); + var first = true; + var node = this.startNode(); + + node.properties = []; + this.next(); + + while (!this.eat(_tokenizerTypes.types.braceR)) { + if (first) { + first = false; + } else { + this.expect(_tokenizerTypes.types.comma); + if (this.eat(_tokenizerTypes.types.braceR)) break; + } + + while (this.match(_tokenizerTypes.types.at)) { + decorators.push(this.parseDecorator()); + } + + var prop = this.startNode(), + isGenerator = false, + isAsync = false, + startPos = undefined, + startLoc = undefined; + if (decorators.length) { + prop.decorators = decorators; + decorators = []; + } + + if (this.hasPlugin("objectRestSpread") && this.match(_tokenizerTypes.types.ellipsis)) { + prop = this.parseSpread(); + prop.type = isPattern ? "RestProperty" : "SpreadProperty"; + node.properties.push(prop); + continue; + } + + prop.method = false; + prop.shorthand = false; + + if (isPattern || refShorthandDefaultPos) { + startPos = this.state.start; + startLoc = this.state.startLoc; + } + + if (!isPattern) { + isGenerator = this.eat(_tokenizerTypes.types.star); + } + + if (!isPattern && this.hasPlugin("asyncFunctions") && this.isContextual("async")) { + if (isGenerator) this.unexpected(); + + var asyncId = this.parseIdentifier(); + if (this.match(_tokenizerTypes.types.colon) || this.match(_tokenizerTypes.types.parenL) || this.match(_tokenizerTypes.types.braceR)) { + prop.key = asyncId; + } else { + isAsync = true; + if (this.hasPlugin("asyncGenerators")) isGenerator = this.eat(_tokenizerTypes.types.star); + this.parsePropertyName(prop); + } + } else { + this.parsePropertyName(prop); + } + + this.parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos); + this.checkPropClash(prop, propHash); + + if (prop.shorthand) { + this.addExtra(prop, "shorthand", true); + } + + node.properties.push(prop); + } + + if (decorators.length) { + this.raise(this.state.start, "You have trailing decorators with no property"); + } + + return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression"); +}; + +pp.parseObjPropValue = function (prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos) { + if (isAsync || isGenerator || this.match(_tokenizerTypes.types.parenL)) { + if (isPattern) this.unexpected(); + prop.kind = "method"; + prop.method = true; + this.parseMethod(prop, isGenerator, isAsync); + return this.finishNode(prop, "ObjectMethod"); + } + + if (this.eat(_tokenizerTypes.types.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.state.start, this.state.startLoc) : this.parseMaybeAssign(false, refShorthandDefaultPos); + return this.finishNode(prop, "ObjectProperty"); + } + + if (!prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && !this.match(_tokenizerTypes.types.comma) && !this.match(_tokenizerTypes.types.braceR)) { + if (isGenerator || isAsync || isPattern) this.unexpected(); + prop.kind = prop.key.name; + this.parsePropertyName(prop); + this.parseMethod(prop, false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.params.length !== paramCount) { + var start = prop.start; + if (prop.kind === "get") { + this.raise(start, "getter should have no params"); + } else { + this.raise(start, "setter should have exactly one param"); + } + } + return this.finishNode(prop, "ObjectMethod"); + } + + if (!prop.computed && prop.key.type === "Identifier") { + if (isPattern) { + var illegalBinding = this.isKeyword(prop.key.name); + if (!illegalBinding && this.state.strict) { + illegalBinding = _utilIdentifier.reservedWords.strictBind(prop.key.name) || _utilIdentifier.reservedWords.strict(prop.key.name); + } + if (illegalBinding) { + this.raise(prop.key.start, "Binding " + prop.key.name); + } + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone()); + } else if (this.match(_tokenizerTypes.types.eq) && refShorthandDefaultPos) { + if (!refShorthandDefaultPos.start) { + refShorthandDefaultPos.start = this.state.start; + } + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone()); + } else { + prop.value = prop.key.__clone(); + } + prop.shorthand = true; + return this.finishNode(prop, "ObjectProperty"); + } + + this.unexpected(); +}; + +pp.parsePropertyName = function (prop) { + if (this.eat(_tokenizerTypes.types.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(_tokenizerTypes.types.bracketR); + return prop.key; + } else { + prop.computed = false; + return prop.key = this.match(_tokenizerTypes.types.num) || this.match(_tokenizerTypes.types.string) ? this.parseExprAtom() : this.parseIdentifier(true); + } +}; + +// Initialize empty function node. + +pp.initFunction = function (node, isAsync) { + node.id = null; + node.generator = false; + node.expression = false; + if (this.hasPlugin("asyncFunctions")) { + node.async = !!isAsync; + } +}; + +// Parse object or class method. + +pp.parseMethod = function (node, isGenerator, isAsync) { + var oldInMethod = this.state.inMethod; + this.state.inMethod = node.kind || true; + this.initFunction(node, isAsync); + this.expect(_tokenizerTypes.types.parenL); + node.params = this.parseBindingList(_tokenizerTypes.types.parenR, false, this.hasPlugin("trailingFunctionCommas")); + node.generator = isGenerator; + this.parseFunctionBody(node); + this.state.inMethod = oldInMethod; + return node; +}; + +// Parse arrow function expression with given parameters. + +pp.parseArrowExpression = function (node, params, isAsync) { + this.initFunction(node, isAsync); + node.params = this.toAssignableList(params, true); + this.parseFunctionBody(node, true); + return this.finishNode(node, "ArrowFunctionExpression"); +}; + +// Parse function body and check parameters. + +pp.parseFunctionBody = function (node, allowExpression) { + var isExpression = allowExpression && !this.match(_tokenizerTypes.types.braceL); + + var oldInAsync = this.state.inAsync; + this.state.inAsync = node.async; + if (isExpression) { + node.body = this.parseMaybeAssign(); + node.expression = true; + } else { + // Start a new scope with regard to labels and the `inFunction` + // flag (restore them to their old value afterwards). + var oldInFunc = this.state.inFunction, + oldInGen = this.state.inGenerator, + oldLabels = this.state.labels; + this.state.inFunction = true;this.state.inGenerator = node.generator;this.state.labels = []; + node.body = this.parseBlock(true); + node.expression = false; + this.state.inFunction = oldInFunc;this.state.inGenerator = oldInGen;this.state.labels = oldLabels; + } + this.state.inAsync = oldInAsync; + + // If this is a strict mode function, verify that argument names + // are not repeated, and it does not try to bind the words `eval` + // or `arguments`. + var checkLVal = this.state.strict; + var checkLValStrict = false; + var isStrict = false; + + // arrow function + if (allowExpression) checkLVal = true; + + // normal function + if (!isExpression && node.body.directives.length) { + var _arr = node.body.directives; + + for (var _i2 = 0; _i2 < _arr.length; _i2++) { + var directive = _arr[_i2]; + if (directive.value.value === "use strict") { + isStrict = true; + checkLVal = true; + checkLValStrict = true; + break; + } + } + } + + // + if (isStrict && node.id && node.id.type === "Identifier" && node.id.name === "yield") { + this.raise(node.id.start, "Binding yield in strict mode"); + } + + if (checkLVal) { + var nameHash = _Object$create(null); + var oldStrict = this.state.strict; + if (checkLValStrict) this.state.strict = true; + if (node.id) { + this.checkLVal(node.id, true); + } + var _arr2 = node.params; + for (var _i3 = 0; _i3 < _arr2.length; _i3++) { + var param = _arr2[_i3]; + this.checkLVal(param, true, nameHash); + } + this.state.strict = oldStrict; + } +}; + +// Parses a comma-separated list of expressions, and returns them as +// an array. `close` is the token type that ends the list, and +// `allowEmpty` can be turned on to allow subsequent commas with +// nothing in between them to be parsed as `null` (which is needed +// for array literals). + +pp.parseExprList = function (close, allowTrailingComma, allowEmpty, refShorthandDefaultPos) { + var elts = [], + first = true; + while (!this.eat(close)) { + if (first) { + first = false; + } else { + this.expect(_tokenizerTypes.types.comma); + if (allowTrailingComma && this.eat(close)) break; + } + + elts.push(this.parseExprListItem(allowEmpty, refShorthandDefaultPos)); + } + return elts; +}; + +pp.parseExprListItem = function (allowEmpty, refShorthandDefaultPos) { + var elt = undefined; + if (allowEmpty && this.match(_tokenizerTypes.types.comma)) { + elt = null; + } else if (this.match(_tokenizerTypes.types.ellipsis)) { + elt = this.parseSpread(refShorthandDefaultPos); + } else { + elt = this.parseMaybeAssign(false, refShorthandDefaultPos); + } + return elt; +}; + +// Parse the next token as an identifier. If `liberal` is true (used +// when parsing properties), it will also convert keywords into +// identifiers. + +pp.parseIdentifier = function (liberal) { + var node = this.startNode(); + + if (this.match(_tokenizerTypes.types.name)) { + if (!liberal && this.state.strict && _utilIdentifier.reservedWords.strict(this.state.value)) { + this.raise(this.state.start, "The keyword '" + this.state.value + "' is reserved"); + } + + node.name = this.state.value; + } else if (liberal && this.state.type.keyword) { + node.name = this.state.type.keyword; + } else { + this.unexpected(); + } + + if (!liberal && node.name === "await" && this.state.inAsync) { + this.raise(node.start, "invalid use of await inside of an async function"); + } + + this.next(); + return this.finishNode(node, "Identifier"); +}; + +// Parses await expression inside async function. + +pp.parseAwait = function (node) { + if (!this.state.inAsync) { + this.unexpected(); + } + if (this.isLineTerminator()) { + this.unexpected(); + } + if (this.match(_tokenizerTypes.types.star)) { + this.raise(node.start, "await* has been removed from the async functions proposal. Use Promise.all() instead."); + } + node.argument = this.parseMaybeUnary(); + return this.finishNode(node, "AwaitExpression"); +}; + +// Parses yield expression inside generator. + +pp.parseYield = function () { + var node = this.startNode(); + this.next(); + if (this.match(_tokenizerTypes.types.semi) || this.canInsertSemicolon() || !this.match(_tokenizerTypes.types.star) && !this.state.type.startsExpr) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(_tokenizerTypes.types.star); + node.argument = this.parseMaybeAssign(); + } + return this.finishNode(node, "YieldExpression"); +}; +},{"17":17,"18":18,"21":21,"25":25,"5":5}],5:[function(_dereq_,module,exports){ +"use strict"; + +var _inherits = _dereq_(24)["default"]; + +var _classCallCheck = _dereq_(23)["default"]; + +var _interopRequireDefault = _dereq_(25)["default"]; + +exports.__esModule = true; + +var _utilIdentifier = _dereq_(18); + +var _options = _dereq_(2); + +var _tokenizer = _dereq_(15); + +var _tokenizer2 = _interopRequireDefault(_tokenizer); + +var plugins = {}; + +exports.plugins = plugins; + +var Parser = (function (_Tokenizer) { + _inherits(Parser, _Tokenizer); + + function Parser(options, input) { + _classCallCheck(this, Parser); + + options = _options.getOptions(options); + _Tokenizer.call(this, options, input); + + this.options = options; + this.inModule = this.options.sourceType === "module"; + this.isReservedWord = _utilIdentifier.reservedWords[6]; + this.input = input; + this.plugins = this.loadPlugins(this.options.plugins); + this.filename = options.sourceFilename; + + // If enabled, skip leading hashbang line. + if (this.state.pos === 0 && this.input[0] === "#" && this.input[1] === "!") { + this.skipLineComment(2); + } + } + + Parser.prototype.hasPlugin = function hasPlugin(name) { + return !!(this.plugins["*"] || this.plugins[name]); + }; + + Parser.prototype.extend = function extend(name, f) { + this[name] = f(this[name]); + }; + + Parser.prototype.loadPlugins = function loadPlugins(plugins) { + var pluginMap = {}; + + if (plugins.indexOf("flow") >= 0) { + // ensure flow plugin loads last + plugins = plugins.filter(function (plugin) { + return plugin !== "flow"; + }); + plugins.push("flow"); + } + + for (var _i = 0; _i < plugins.length; _i++) { + var _name = plugins[_i]; + if (!pluginMap[_name]) { + pluginMap[_name] = true; + + var plugin = exports.plugins[_name]; + if (plugin) plugin(this); + } + } + + return pluginMap; + }; + + Parser.prototype.parse = function parse() { + var file = this.startNode(); + var program = this.startNode(); + this.nextToken(); + return this.parseTopLevel(file, program); + }; + + return Parser; +})(_tokenizer2["default"]); + +exports["default"] = Parser; +},{"15":15,"18":18,"2":2,"23":23,"24":24,"25":25}],6:[function(_dereq_,module,exports){ +"use strict"; + +var _interopRequireDefault = _dereq_(25)["default"]; + +var _utilLocation = _dereq_(19); + +var _index = _dereq_(5); + +var _index2 = _interopRequireDefault(_index); + +var pp = _index2["default"].prototype; + +// This function is used to raise exceptions on parse errors. It +// takes an offset integer (into the current `input`) to indicate +// the location of the error, attaches the position to the end +// of the error message, and then raises a `SyntaxError` with that +// message. + +pp.raise = function (pos, message) { + var loc = _utilLocation.getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; + err.loc = loc; + throw err; +}; +},{"19":19,"25":25,"5":5}],7:[function(_dereq_,module,exports){ +/* eslint indent: 0 */ + +"use strict"; + +var _interopRequireDefault = _dereq_(25)["default"]; + +var _tokenizerTypes = _dereq_(17); + +var _index = _dereq_(5); + +var _index2 = _interopRequireDefault(_index); + +var _utilIdentifier = _dereq_(18); + +var pp = _index2["default"].prototype; + +// Convert existing expression atom to assignable pattern +// if possible. + +pp.toAssignable = function (node, isBinding) { + if (node) { + switch (node.type) { + case "Identifier": + case "ObjectPattern": + case "ArrayPattern": + case "AssignmentPattern": + break; + + case "ObjectExpression": + node.type = "ObjectPattern"; + var _arr = node.properties; + for (var _i = 0; _i < _arr.length; _i++) { + var prop = _arr[_i]; + if (prop.type === "ObjectMethod") { + if (prop.kind === "get" || prop.kind === "set") { + this.raise(prop.key.start, "Object pattern can't contain getter or setter"); + } else { + this.raise(prop.key.start, "Object pattern can't contain methods"); + } + } else { + this.toAssignable(prop, isBinding); + } + } + break; + + case "ObjectProperty": + this.toAssignable(node.value, isBinding); + break; + + case "SpreadProperty": + node.type = "RestProperty"; + break; + + case "ArrayExpression": + node.type = "ArrayPattern"; + this.toAssignableList(node.elements, isBinding); + break; + + case "AssignmentExpression": + if (node.operator === "=") { + node.type = "AssignmentPattern"; + delete node.operator; + } else { + this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); + } + break; + + case "MemberExpression": + if (!isBinding) break; + + default: + this.raise(node.start, "Assigning to rvalue"); + } + } + return node; +}; + +// Convert list of expression atoms to binding list. + +pp.toAssignableList = function (exprList, isBinding) { + var end = exprList.length; + if (end) { + var last = exprList[end - 1]; + if (last && last.type === "RestElement") { + --end; + } else if (last && last.type === "SpreadElement") { + last.type = "RestElement"; + var arg = last.argument; + this.toAssignable(arg, isBinding); + if (arg.type !== "Identifier" && arg.type !== "MemberExpression" && arg.type !== "ArrayPattern") { + this.unexpected(arg.start); + } + --end; + } + } + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) this.toAssignable(elt, isBinding); + } + return exprList; +}; + +// Convert list of expression atoms to a list of + +pp.toReferencedList = function (exprList) { + return exprList; +}; + +// Parses spread element. + +pp.parseSpread = function (refShorthandDefaultPos) { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeAssign(refShorthandDefaultPos); + return this.finishNode(node, "SpreadElement"); +}; + +pp.parseRest = function () { + var node = this.startNode(); + this.next(); + node.argument = this.parseBindingIdentifier(); + return this.finishNode(node, "RestElement"); +}; + +pp.shouldAllowYieldIdentifier = function () { + return this.match(_tokenizerTypes.types._yield) && !this.state.strict && !this.state.inGenerator; +}; + +pp.parseBindingIdentifier = function () { + return this.parseIdentifier(this.shouldAllowYieldIdentifier()); +}; + +// Parses lvalue (assignable) atom. + +pp.parseBindingAtom = function () { + switch (this.state.type) { + case _tokenizerTypes.types._yield: + if (this.state.strict || this.state.inGenerator) this.unexpected(); + + case _tokenizerTypes.types.name: + return this.parseIdentifier(true); + + case _tokenizerTypes.types.bracketL: + var node = this.startNode(); + this.next(); + node.elements = this.parseBindingList(_tokenizerTypes.types.bracketR, true, true); + return this.finishNode(node, "ArrayPattern"); + + case _tokenizerTypes.types.braceL: + return this.parseObj(true); + + default: + this.unexpected(); + } +}; + +pp.parseBindingList = function (close, allowEmpty, allowTrailingComma) { + var elts = []; + var first = true; + while (!this.eat(close)) { + if (first) { + first = false; + } else { + this.expect(_tokenizerTypes.types.comma); + } + if (allowEmpty && this.match(_tokenizerTypes.types.comma)) { + elts.push(null); + } else if (allowTrailingComma && this.eat(close)) { + break; + } else if (this.match(_tokenizerTypes.types.ellipsis)) { + elts.push(this.parseAssignableListItemTypes(this.parseRest())); + this.expect(close); + break; + } else { + var left = this.parseMaybeDefault(); + this.parseAssignableListItemTypes(left); + elts.push(this.parseMaybeDefault(null, null, left)); + } + } + return elts; +}; + +pp.parseAssignableListItemTypes = function (param) { + return param; +}; + +// Parses assignment pattern around given atom if possible. + +pp.parseMaybeDefault = function (startPos, startLoc, left) { + startLoc = startLoc || this.state.startLoc; + startPos = startPos || this.state.start; + left = left || this.parseBindingAtom(); + if (!this.eat(_tokenizerTypes.types.eq)) return left; + + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.right = this.parseMaybeAssign(); + return this.finishNode(node, "AssignmentPattern"); +}; + +// Verify that a node is an lval — something that can be assigned +// to. + +pp.checkLVal = function (expr, isBinding, checkClashes) { + switch (expr.type) { + case "Identifier": + if (this.state.strict && (_utilIdentifier.reservedWords.strictBind(expr.name) || _utilIdentifier.reservedWords.strict(expr.name))) { + this.raise(expr.start, (isBinding ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); + } + + if (checkClashes) { + // we need to prefix this with an underscore for the cases where we have a key of + // `__proto__`. there's a bug in old V8 where the following wouldn't work: + // + // > var obj = Object.create(null); + // undefined + // > obj.__proto__ + // null + // > obj.__proto__ = true; + // true + // > obj.__proto__ + // null + var key = "_" + expr.name; + + if (checkClashes[key]) { + this.raise(expr.start, "Argument name clash in strict mode"); + } else { + checkClashes[key] = true; + } + } + break; + + case "MemberExpression": + if (isBinding) this.raise(expr.start, (isBinding ? "Binding" : "Assigning to") + " member expression"); + break; + + case "ObjectPattern": + var _arr2 = expr.properties; + + for (var _i2 = 0; _i2 < _arr2.length; _i2++) { + var prop = _arr2[_i2]; + if (prop.type === "ObjectProperty") prop = prop.value; + this.checkLVal(prop, isBinding, checkClashes); + } + break; + + case "ArrayPattern": + var _arr3 = expr.elements; + + for (var _i3 = 0; _i3 < _arr3.length; _i3++) { + var elem = _arr3[_i3]; + if (elem) this.checkLVal(elem, isBinding, checkClashes); + } + break; + + case "AssignmentPattern": + this.checkLVal(expr.left, isBinding, checkClashes); + break; + + case "RestProperty": + case "RestElement": + this.checkLVal(expr.argument, isBinding, checkClashes); + break; + + default: + this.raise(expr.start, (isBinding ? "Binding" : "Assigning to") + " rvalue"); + } +}; +},{"17":17,"18":18,"25":25,"5":5}],8:[function(_dereq_,module,exports){ +"use strict"; + +var _classCallCheck = _dereq_(23)["default"]; + +var _interopRequireDefault = _dereq_(25)["default"]; + +var _index = _dereq_(5); + +var _index2 = _interopRequireDefault(_index); + +var _utilLocation = _dereq_(19); + +// Start an AST node, attaching a start offset. + +var pp = _index2["default"].prototype; + +var Node = (function () { + function Node(pos, loc, filename) { + _classCallCheck(this, Node); + + this.type = ""; + this.start = pos; + this.end = 0; + this.loc = new _utilLocation.SourceLocation(loc); + if (filename) this.loc.filename = filename; + } + + Node.prototype.__clone = function __clone() { + var node2 = new Node(); + for (var key in this) { + node2[key] = this[key]; + }return node2; + }; + + return Node; +})(); + +pp.startNode = function () { + return new Node(this.state.start, this.state.startLoc, this.filename); +}; + +pp.startNodeAt = function (pos, loc) { + return new Node(pos, loc, this.filename); +}; + +function finishNodeAt(node, type, pos, loc) { + node.type = type; + node.end = pos; + node.loc.end = loc; + this.processComment(node); + return node; +} + +// Finish an AST node, adding `type` and `end` properties. + +pp.finishNode = function (node, type) { + return finishNodeAt.call(this, node, type, this.state.lastTokEnd, this.state.lastTokEndLoc); +}; + +// Finish node at given position + +pp.finishNodeAt = function (node, type, pos, loc) { + return finishNodeAt.call(this, node, type, pos, loc); +}; +},{"19":19,"23":23,"25":25,"5":5}],9:[function(_dereq_,module,exports){ +/* eslint indent: 0 */ +/* eslint max-len: 0 */ + +"use strict"; + +var _Object$create = _dereq_(21)["default"]; + +var _interopRequireDefault = _dereq_(25)["default"]; + +var _tokenizerTypes = _dereq_(17); + +var _index = _dereq_(5); + +var _index2 = _interopRequireDefault(_index); + +var _utilWhitespace = _dereq_(20); + +var pp = _index2["default"].prototype; + +// ### Statement parsing + +// Parse a program. Initializes the parser, reads any number of +// statements, and wraps them in a Program node. Optionally takes a +// `program` argument. If present, the statements will be appended +// to its body instead of creating a new node. + +pp.parseTopLevel = function (file, program) { + program.sourceType = this.options.sourceType; + + this.parseBlockBody(program, true, true, _tokenizerTypes.types.eof); + + file.program = this.finishNode(program, "Program"); + file.comments = this.state.comments; + file.tokens = this.state.tokens; + + return this.finishNode(file, "File"); +}; + +var loopLabel = { kind: "loop" }, + switchLabel = { kind: "switch" }; + +// TODO + +pp.stmtToDirective = function (stmt) { + var expr = stmt.expression; + + var directiveLiteral = this.startNodeAt(expr.start, expr.loc.start); + var directive = this.startNodeAt(stmt.start, stmt.loc.start); + + var raw = this.input.slice(expr.start, expr.end); + var val = directiveLiteral.value = raw.slice(1, -1); // remove quotes + + this.addExtra(directiveLiteral, "raw", raw); + this.addExtra(directiveLiteral, "rawValue", val); + + directive.value = this.finishNodeAt(directiveLiteral, "DirectiveLiteral", expr.end, expr.loc.end); + + return this.finishNodeAt(directive, "Directive", stmt.end, stmt.loc.end); +}; + +// Parse a single statement. +// +// If expecting a statement and finding a slash operator, parse a +// regular expression literal. This is to handle cases like +// `if (foo) /blah/.exec(foo)`, where looking at the previous token +// does not help. + +pp.parseStatement = function (declaration, topLevel) { + if (this.match(_tokenizerTypes.types.at)) { + this.parseDecorators(true); + } + + var starttype = this.state.type, + node = this.startNode(); + + // Most types of statements are recognized by the keyword they + // start with. Many are trivial to parse, some require a bit of + // complexity. + + switch (starttype) { + case _tokenizerTypes.types._break:case _tokenizerTypes.types._continue: + return this.parseBreakContinueStatement(node, starttype.keyword); + case _tokenizerTypes.types._debugger: + return this.parseDebuggerStatement(node); + case _tokenizerTypes.types._do: + return this.parseDoStatement(node); + case _tokenizerTypes.types._for: + return this.parseForStatement(node); + case _tokenizerTypes.types._function: + if (!declaration) this.unexpected(); + return this.parseFunctionStatement(node); + + case _tokenizerTypes.types._class: + if (!declaration) this.unexpected(); + this.takeDecorators(node); + return this.parseClass(node, true); + + case _tokenizerTypes.types._if: + return this.parseIfStatement(node); + case _tokenizerTypes.types._return: + return this.parseReturnStatement(node); + case _tokenizerTypes.types._switch: + return this.parseSwitchStatement(node); + case _tokenizerTypes.types._throw: + return this.parseThrowStatement(node); + case _tokenizerTypes.types._try: + return this.parseTryStatement(node); + + case _tokenizerTypes.types._let: + case _tokenizerTypes.types._const: + if (!declaration) this.unexpected(); // NOTE: falls through to _var + + case _tokenizerTypes.types._var: + return this.parseVarStatement(node, starttype); + + case _tokenizerTypes.types._while: + return this.parseWhileStatement(node); + case _tokenizerTypes.types._with: + return this.parseWithStatement(node); + case _tokenizerTypes.types.braceL: + return this.parseBlock(); + case _tokenizerTypes.types.semi: + return this.parseEmptyStatement(node); + case _tokenizerTypes.types._export: + case _tokenizerTypes.types._import: + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) { + this.raise(this.state.start, "'import' and 'export' may only appear at the top level"); + } + + if (!this.inModule) { + this.raise(this.state.start, "'import' and 'export' may appear only with 'sourceType: module'"); + } + } + return starttype === _tokenizerTypes.types._import ? this.parseImport(node) : this.parseExport(node); + + case _tokenizerTypes.types.name: + if (this.hasPlugin("asyncFunctions") && this.state.value === "async") { + // peek ahead and see if next token is a function + var state = this.state.clone(); + this.next(); + if (this.match(_tokenizerTypes.types._function) && !this.canInsertSemicolon()) { + this.expect(_tokenizerTypes.types._function); + return this.parseFunction(node, true, false, true); + } else { + this.state = state; + } + } + } + + // If the statement does not start with a statement keyword or a + // brace, it's an ExpressionStatement or LabeledStatement. We + // simply start parsing an expression, and afterwards, if the + // next token is a colon and the expression was a simple + // Identifier node, we switch to interpreting it as a label. + var maybeName = this.state.value; + var expr = this.parseExpression(); + + if (starttype === _tokenizerTypes.types.name && expr.type === "Identifier" && this.eat(_tokenizerTypes.types.colon)) { + return this.parseLabeledStatement(node, maybeName, expr); + } else { + return this.parseExpressionStatement(node, expr); + } +}; + +pp.takeDecorators = function (node) { + if (this.state.decorators.length) { + node.decorators = this.state.decorators; + this.state.decorators = []; + } +}; + +pp.parseDecorators = function (allowExport) { + while (this.match(_tokenizerTypes.types.at)) { + this.state.decorators.push(this.parseDecorator()); + } + + if (allowExport && this.match(_tokenizerTypes.types._export)) { + return; + } + + if (!this.match(_tokenizerTypes.types._class)) { + this.raise(this.state.start, "Leading decorators must be attached to a class declaration"); + } +}; + +pp.parseDecorator = function () { + if (!this.hasPlugin("decorators")) { + this.unexpected(); + } + var node = this.startNode(); + this.next(); + node.expression = this.parseMaybeAssign(); + return this.finishNode(node, "Decorator"); +}; + +pp.parseBreakContinueStatement = function (node, keyword) { + var isBreak = keyword === "break"; + this.next(); + + if (this.isLineTerminator()) { + node.label = null; + } else if (!this.match(_tokenizerTypes.types.name)) { + this.unexpected(); + } else { + node.label = this.parseIdentifier(); + this.semicolon(); + } + + // Verify that there is an actual destination to break or + // continue to. + var i = undefined; + for (i = 0; i < this.state.labels.length; ++i) { + var lab = this.state.labels[i]; + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) break; + if (node.label && isBreak) break; + } + } + if (i === this.state.labels.length) this.raise(node.start, "Unsyntactic " + keyword); + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement"); +}; + +pp.parseDebuggerStatement = function (node) { + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement"); +}; + +pp.parseDoStatement = function (node) { + this.next(); + this.state.labels.push(loopLabel); + node.body = this.parseStatement(false); + this.state.labels.pop(); + this.expect(_tokenizerTypes.types._while); + node.test = this.parseParenExpression(); + this.eat(_tokenizerTypes.types.semi); + return this.finishNode(node, "DoWhileStatement"); +}; + +// Disambiguating between a `for` and a `for`/`in` or `for`/`of` +// loop is non-trivial. Basically, we have to parse the init `var` +// statement or expression, disallowing the `in` operator (see +// the second parameter to `parseExpression`), and then check +// whether the next token is `in` or `of`. When there is no init +// part (semicolon immediately after the opening parenthesis), it +// is a regular `for` loop. + +pp.parseForStatement = function (node) { + this.next(); + this.state.labels.push(loopLabel); + this.expect(_tokenizerTypes.types.parenL); + + if (this.match(_tokenizerTypes.types.semi)) { + return this.parseFor(node, null); + } + + if (this.match(_tokenizerTypes.types._var) || this.match(_tokenizerTypes.types._let) || this.match(_tokenizerTypes.types._const)) { + var _init = this.startNode(), + varKind = this.state.type; + this.next(); + this.parseVar(_init, true, varKind); + this.finishNode(_init, "VariableDeclaration"); + + if (this.match(_tokenizerTypes.types._in) || this.isContextual("of")) { + if (_init.declarations.length === 1 && !_init.declarations[0].init) { + return this.parseForIn(node, _init); + } + } + + return this.parseFor(node, _init); + } + + var refShorthandDefaultPos = { start: 0 }; + var init = this.parseExpression(true, refShorthandDefaultPos); + if (this.match(_tokenizerTypes.types._in) || this.isContextual("of")) { + this.toAssignable(init); + this.checkLVal(init); + return this.parseForIn(node, init); + } else if (refShorthandDefaultPos.start) { + this.unexpected(refShorthandDefaultPos.start); + } + return this.parseFor(node, init); +}; + +pp.parseFunctionStatement = function (node) { + this.next(); + return this.parseFunction(node, true); +}; + +pp.parseIfStatement = function (node) { + this.next(); + node.test = this.parseParenExpression(); + node.consequent = this.parseStatement(false); + node.alternate = this.eat(_tokenizerTypes.types._else) ? this.parseStatement(false) : null; + return this.finishNode(node, "IfStatement"); +}; + +pp.parseReturnStatement = function (node) { + if (!this.state.inFunction && !this.options.allowReturnOutsideFunction) { + this.raise(this.state.start, "'return' outside of function"); + } + + this.next(); + + // In `return` (and `break`/`continue`), the keywords with + // optional arguments, we eagerly look for a semicolon or the + // possibility to insert one. + + if (this.isLineTerminator()) { + node.argument = null; + } else { + node.argument = this.parseExpression(); + this.semicolon(); + } + + return this.finishNode(node, "ReturnStatement"); +}; + +pp.parseSwitchStatement = function (node) { + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.expect(_tokenizerTypes.types.braceL); + this.state.labels.push(switchLabel); + + // Statements under must be grouped (by label) in SwitchCase + // nodes. `cur` is used to keep the node that we are currently + // adding statements to. + + var cur = undefined; + for (var sawDefault = undefined; !this.match(_tokenizerTypes.types.braceR);) { + if (this.match(_tokenizerTypes.types._case) || this.match(_tokenizerTypes.types._default)) { + var isCase = this.match(_tokenizerTypes.types._case); + if (cur) this.finishNode(cur, "SwitchCase"); + node.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { + cur.test = this.parseExpression(); + } else { + if (sawDefault) this.raise(this.state.lastTokStart, "Multiple default clauses"); + sawDefault = true; + cur.test = null; + } + this.expect(_tokenizerTypes.types.colon); + } else { + if (cur) { + cur.consequent.push(this.parseStatement(true)); + } else { + this.unexpected(); + } + } + } + if (cur) this.finishNode(cur, "SwitchCase"); + this.next(); // Closing brace + this.state.labels.pop(); + return this.finishNode(node, "SwitchStatement"); +}; + +pp.parseThrowStatement = function (node) { + this.next(); + if (_utilWhitespace.lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start))) this.raise(this.state.lastTokEnd, "Illegal newline after throw"); + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement"); +}; + +// Reused empty array added for node fields that are always empty. + +var empty = []; + +pp.parseTryStatement = function (node) { + this.next(); + + node.block = this.parseBlock(); + node.handler = null; + + if (this.match(_tokenizerTypes.types._catch)) { + var clause = this.startNode(); + this.next(); + + this.expect(_tokenizerTypes.types.parenL); + clause.param = this.parseBindingAtom(); + this.checkLVal(clause.param, true, _Object$create(null)); + this.expect(_tokenizerTypes.types.parenR); + + clause.body = this.parseBlock(); + node.handler = this.finishNode(clause, "CatchClause"); + } + + node.guardedHandlers = empty; + node.finalizer = this.eat(_tokenizerTypes.types._finally) ? this.parseBlock() : null; + + if (!node.handler && !node.finalizer) { + this.raise(node.start, "Missing catch or finally clause"); + } + + return this.finishNode(node, "TryStatement"); +}; + +pp.parseVarStatement = function (node, kind) { + this.next(); + this.parseVar(node, false, kind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration"); +}; + +pp.parseWhileStatement = function (node) { + this.next(); + node.test = this.parseParenExpression(); + this.state.labels.push(loopLabel); + node.body = this.parseStatement(false); + this.state.labels.pop(); + return this.finishNode(node, "WhileStatement"); +}; + +pp.parseWithStatement = function (node) { + if (this.state.strict) this.raise(this.state.start, "'with' in strict mode"); + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement(false); + return this.finishNode(node, "WithStatement"); +}; + +pp.parseEmptyStatement = function (node) { + this.next(); + return this.finishNode(node, "EmptyStatement"); +}; + +pp.parseLabeledStatement = function (node, maybeName, expr) { + var _arr = this.state.labels; + + for (var _i = 0; _i < _arr.length; _i++) { + var label = _arr[_i]; + if (label.name === maybeName) { + this.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } + } + + var kind = this.state.type.isLoop ? "loop" : this.match(_tokenizerTypes.types._switch) ? "switch" : null; + for (var i = this.state.labels.length - 1; i >= 0; i--) { + var label = this.state.labels[i]; + if (label.statementStart === node.start) { + label.statementStart = this.state.start; + label.kind = kind; + } else { + break; + } + } + + this.state.labels.push({ name: maybeName, kind: kind, statementStart: this.state.start }); + node.body = this.parseStatement(true); + this.state.labels.pop(); + node.label = expr; + return this.finishNode(node, "LabeledStatement"); +}; + +pp.parseExpressionStatement = function (node, expr) { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement"); +}; + +// Parse a semicolon-enclosed block of statements, handling `"use +// strict"` declarations when `allowStrict` is true (used for +// function bodies). + +pp.parseBlock = function (allowDirectives) { + var node = this.startNode(); + this.expect(_tokenizerTypes.types.braceL); + this.parseBlockBody(node, allowDirectives, false, _tokenizerTypes.types.braceR); + return this.finishNode(node, "BlockStatement"); +}; + +// TODO + +pp.parseBlockBody = function (node, allowDirectives, topLevel, end) { + node.body = []; + node.directives = []; + + var parsedNonDirective = false; + var oldStrict = undefined; + var octalPosition = undefined; + + while (!this.eat(end)) { + if (!parsedNonDirective && this.state.containsOctal && !octalPosition) { + octalPosition = this.state.octalPosition; + } + + var stmt = this.parseStatement(true, topLevel); + + if (allowDirectives && !parsedNonDirective && stmt.type === "ExpressionStatement" && stmt.expression.type === "StringLiteral" && !stmt.expression.extra.parenthesized) { + var directive = this.stmtToDirective(stmt); + node.directives.push(directive); + + if (oldStrict === undefined && directive.value.value === "use strict") { + oldStrict = this.state.strict; + this.setStrict(true); + + if (octalPosition) { + this.raise(octalPosition, "Octal literal in strict mode"); + } + } + + continue; + } + + parsedNonDirective = true; + node.body.push(stmt); + } + + if (oldStrict === false) { + this.setStrict(false); + } +}; + +// Parse a regular `for` loop. The disambiguation code in +// `parseStatement` will already have parsed the init statement or +// expression. + +pp.parseFor = function (node, init) { + node.init = init; + this.expect(_tokenizerTypes.types.semi); + node.test = this.match(_tokenizerTypes.types.semi) ? null : this.parseExpression(); + this.expect(_tokenizerTypes.types.semi); + node.update = this.match(_tokenizerTypes.types.parenR) ? null : this.parseExpression(); + this.expect(_tokenizerTypes.types.parenR); + node.body = this.parseStatement(false); + this.state.labels.pop(); + return this.finishNode(node, "ForStatement"); +}; + +// Parse a `for`/`in` and `for`/`of` loop, which are almost +// same from parser's perspective. + +pp.parseForIn = function (node, init) { + var type = this.match(_tokenizerTypes.types._in) ? "ForInStatement" : "ForOfStatement"; + this.next(); + node.left = init; + node.right = this.parseExpression(); + this.expect(_tokenizerTypes.types.parenR); + node.body = this.parseStatement(false); + this.state.labels.pop(); + return this.finishNode(node, type); +}; + +// Parse a list of variable declarations. + +pp.parseVar = function (node, isFor, kind) { + node.declarations = []; + node.kind = kind.keyword; + for (;;) { + var decl = this.startNode(); + this.parseVarHead(decl); + if (this.eat(_tokenizerTypes.types.eq)) { + decl.init = this.parseMaybeAssign(isFor); + } else if (kind === _tokenizerTypes.types._const && !(this.match(_tokenizerTypes.types._in) || this.isContextual("of"))) { + this.unexpected(); + } else if (decl.id.type !== "Identifier" && !(isFor && (this.match(_tokenizerTypes.types._in) || this.isContextual("of")))) { + this.raise(this.state.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node.declarations.push(this.finishNode(decl, "VariableDeclarator")); + if (!this.eat(_tokenizerTypes.types.comma)) break; + } + return node; +}; + +pp.parseVarHead = function (decl) { + decl.id = this.parseBindingAtom(); + this.checkLVal(decl.id, true); +}; + +// Parse a function declaration or literal (depending on the +// `isStatement` parameter). + +pp.parseFunction = function (node, isStatement, allowExpressionBody, isAsync, optionalId) { + var oldInMethod = this.state.inMethod; + this.state.inMethod = false; + + this.initFunction(node, isAsync); + + if (this.match(_tokenizerTypes.types.star)) { + if (node.async && !this.hasPlugin("asyncGenerators")) { + this.unexpected(); + } else { + node.generator = true; + this.next(); + } + } + + if (isStatement && !optionalId && !this.match(_tokenizerTypes.types.name) && !this.match(_tokenizerTypes.types._yield)) { + this.unexpected(); + } + + if (this.match(_tokenizerTypes.types.name) || this.match(_tokenizerTypes.types._yield)) { + node.id = this.parseBindingIdentifier(); + } + + this.parseFunctionParams(node); + this.parseFunctionBody(node, allowExpressionBody); + + this.state.inMethod = oldInMethod; + + return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression"); +}; + +pp.parseFunctionParams = function (node) { + this.expect(_tokenizerTypes.types.parenL); + node.params = this.parseBindingList(_tokenizerTypes.types.parenR, false, this.hasPlugin("trailingFunctionCommas")); +}; + +// Parse a class declaration or literal (depending on the +// `isStatement` parameter). + +pp.parseClass = function (node, isStatement, optionalId) { + this.next(); + this.parseClassId(node, isStatement, optionalId); + this.parseClassSuper(node); + this.parseClassBody(node); + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression"); +}; + +pp.isClassProperty = function () { + return this.match(_tokenizerTypes.types.eq) || this.isLineTerminator(); +}; + +pp.parseClassBody = function (node) { + // class bodies are implicitly strict + var oldStrict = this.state.strict; + this.state.strict = true; + + var hadConstructorCall = false; + var hadConstructor = false; + var decorators = []; + var classBody = this.startNode(); + + classBody.body = []; + + this.expect(_tokenizerTypes.types.braceL); + + while (!this.eat(_tokenizerTypes.types.braceR)) { + if (this.eat(_tokenizerTypes.types.semi)) { + continue; + } + + if (this.match(_tokenizerTypes.types.at)) { + decorators.push(this.parseDecorator()); + continue; + } + + var method = this.startNode(); + + // steal the decorators if there are any + if (decorators.length) { + method.decorators = decorators; + decorators = []; + } + + var isConstructorCall = false; + var isMaybeStatic = this.match(_tokenizerTypes.types.name) && this.state.value === "static"; + var isGenerator = this.eat(_tokenizerTypes.types.star); + var isGetSet = false; + var isAsync = false; + + this.parsePropertyName(method); + + method["static"] = isMaybeStatic && !this.match(_tokenizerTypes.types.parenL); + if (method["static"]) { + if (isGenerator) this.unexpected(); + isGenerator = this.eat(_tokenizerTypes.types.star); + this.parsePropertyName(method); + } + + if (!isGenerator && method.key.type === "Identifier" && !method.computed) { + if (this.isClassProperty()) { + classBody.body.push(this.parseClassProperty(method)); + continue; + } + + if (this.hasPlugin("classConstructorCall") && method.key.name === "call" && this.match(_tokenizerTypes.types.name) && this.state.value === "constructor") { + isConstructorCall = true; + this.parsePropertyName(method); + } + } + + var isAsyncMethod = this.hasPlugin("asyncFunctions") && !this.match(_tokenizerTypes.types.parenL) && !method.computed && method.key.type === "Identifier" && method.key.name === "async"; + if (isAsyncMethod) { + if (this.hasPlugin("asyncGenerators") && this.eat(_tokenizerTypes.types.star)) isGenerator = true; + isAsync = true; + this.parsePropertyName(method); + } + + method.kind = "method"; + + if (!method.computed) { + var key = method.key; + + // handle get/set methods + // eg. class Foo { get bar() {} set bar() {} } + if (!isAsync && !isGenerator && key.type === "Identifier" && !this.match(_tokenizerTypes.types.parenL) && (key.name === "get" || key.name === "set")) { + isGetSet = true; + method.kind = key.name; + key = this.parsePropertyName(method); + } + + // disallow invalid constructors + var isConstructor = !isConstructorCall && !method["static"] && (key.type === "Identifier" && key.name === "constructor" || key.type === "StringLiteral" && key.value === "constructor"); + if (isConstructor) { + if (hadConstructor) this.raise(key.start, "Duplicate constructor in the same class"); + if (isGetSet) this.raise(key.start, "Constructor can't have get/set modifier"); + if (isGenerator) this.raise(key.start, "Constructor can't be a generator"); + if (isAsync) this.raise(key.start, "Constructor can't be an async function"); + method.kind = "constructor"; + hadConstructor = true; + } + + // disallow static prototype method + var isStaticPrototype = method["static"] && (key.type === "Identifier" && key.name === "prototype" || key.type === "StringLiteral" && key.value === "prototype"); + if (isStaticPrototype) { + this.raise(key.start, "Classes may not have static property named prototype"); + } + } + + // convert constructor to a constructor call + if (isConstructorCall) { + if (hadConstructorCall) this.raise(method.start, "Duplicate constructor call in the same class"); + method.kind = "constructorCall"; + hadConstructorCall = true; + } + + // disallow decorators on class constructors + if ((method.kind === "constructor" || method.kind === "constructorCall") && method.decorators) { + this.raise(method.start, "You can't attach decorators to a class constructor"); + } + + this.parseClassMethod(classBody, method, isGenerator, isAsync); + + // get methods aren't allowed to have any parameters + // set methods must have exactly 1 parameter + if (isGetSet) { + var paramCount = method.kind === "get" ? 0 : 1; + if (method.params.length !== paramCount) { + var start = method.start; + if (method.kind === "get") { + this.raise(start, "getter should have no params"); + } else { + this.raise(start, "setter should have exactly one param"); + } + } + } + } + + if (decorators.length) { + this.raise(this.state.start, "You have trailing decorators with no method"); + } + + node.body = this.finishNode(classBody, "ClassBody"); + + this.state.strict = oldStrict; +}; + +pp.parseClassProperty = function (node) { + if (this.match(_tokenizerTypes.types.eq)) { + if (!this.hasPlugin("classProperties")) this.unexpected(); + this.next(); + node.value = this.parseMaybeAssign(); + } else { + node.value = null; + } + this.semicolon(); + return this.finishNode(node, "ClassProperty"); +}; + +pp.parseClassMethod = function (classBody, method, isGenerator, isAsync) { + this.parseMethod(method, isGenerator, isAsync); + classBody.body.push(this.finishNode(method, "ClassMethod")); +}; + +pp.parseClassId = function (node, isStatement, optionalId) { + if (this.match(_tokenizerTypes.types.name)) { + node.id = this.parseIdentifier(); + } else { + if (optionalId || !isStatement) { + node.id = null; + } else { + this.unexpected(); + } + } +}; + +pp.parseClassSuper = function (node) { + node.superClass = this.eat(_tokenizerTypes.types._extends) ? this.parseExprSubscripts() : null; +}; + +// Parses module export declaration. + +pp.parseExport = function (node) { + this.next(); + // export * from '...' + if (this.match(_tokenizerTypes.types.star)) { + var specifier = this.startNode(); + this.next(); + if (this.hasPlugin("exportExtensions") && this.eatContextual("as")) { + specifier.exported = this.parseIdentifier(); + node.specifiers = [this.finishNode(specifier, "ExportNamespaceSpecifier")]; + this.parseExportSpecifiersMaybe(node); + this.parseExportFrom(node, true); + } else { + this.parseExportFrom(node, true); + return this.finishNode(node, "ExportAllDeclaration"); + } + } else if (this.hasPlugin("exportExtensions") && this.isExportDefaultSpecifier()) { + var specifier = this.startNode(); + specifier.exported = this.parseIdentifier(true); + node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")]; + if (this.match(_tokenizerTypes.types.comma) && this.lookahead().type === _tokenizerTypes.types.star) { + this.expect(_tokenizerTypes.types.comma); + var _specifier = this.startNode(); + this.expect(_tokenizerTypes.types.star); + this.expectContextual("as"); + _specifier.exported = this.parseIdentifier(); + node.specifiers.push(this.finishNode(_specifier, "ExportNamespaceSpecifier")); + } else { + this.parseExportSpecifiersMaybe(node); + } + this.parseExportFrom(node, true); + } else if (this.eat(_tokenizerTypes.types._default)) { + // export default ... + var expr = this.startNode(); + var needsSemi = false; + if (this.eat(_tokenizerTypes.types._function)) { + expr = this.parseFunction(expr, true, false, false, true); + } else if (this.match(_tokenizerTypes.types._class)) { + expr = this.parseClass(expr, true, true); + } else { + needsSemi = true; + expr = this.parseMaybeAssign(); + } + node.declaration = expr; + if (needsSemi) this.semicolon(); + this.checkExport(node); + return this.finishNode(node, "ExportDefaultDeclaration"); + } else if (this.state.type.keyword || this.shouldParseExportDeclaration()) { + node.specifiers = []; + node.source = null; + node.declaration = this.parseExportDeclaration(node); + } else { + // export { x, y as z } [from '...'] + node.declaration = null; + node.specifiers = this.parseExportSpecifiers(); + this.parseExportFrom(node); + } + this.checkExport(node); + return this.finishNode(node, "ExportNamedDeclaration"); +}; + +pp.parseExportDeclaration = function () { + return this.parseStatement(true); +}; + +pp.isExportDefaultSpecifier = function () { + if (this.match(_tokenizerTypes.types.name)) { + return this.state.value !== "type" && this.state.value !== "async" && this.state.value !== "interface"; + } + + if (!this.match(_tokenizerTypes.types._default)) { + return false; + } + + var lookahead = this.lookahead(); + return lookahead.type === _tokenizerTypes.types.comma || lookahead.type === _tokenizerTypes.types.name && lookahead.value === "from"; +}; + +pp.parseExportSpecifiersMaybe = function (node) { + if (this.eat(_tokenizerTypes.types.comma)) { + node.specifiers = node.specifiers.concat(this.parseExportSpecifiers()); + } +}; + +pp.parseExportFrom = function (node, expect) { + if (this.eatContextual("from")) { + node.source = this.match(_tokenizerTypes.types.string) ? this.parseExprAtom() : this.unexpected(); + this.checkExport(node); + } else { + if (expect) { + this.unexpected(); + } else { + node.source = null; + } + } + + this.semicolon(); +}; + +pp.shouldParseExportDeclaration = function () { + return this.hasPlugin("asyncFunctions") && this.isContextual("async"); +}; + +pp.checkExport = function (node) { + if (this.state.decorators.length) { + var isClass = node.declaration && (node.declaration.type === "ClassDeclaration" || node.declaration.type === "ClassExpression"); + if (!node.declaration || !isClass) { + this.raise(node.start, "You can only use decorators on an export when exporting a class"); + } + this.takeDecorators(node.declaration); + } +}; + +// Parses a comma-separated list of module exports. + +pp.parseExportSpecifiers = function () { + var nodes = []; + var first = true; + var needsFrom = undefined; + + // export { x, y as z } [from '...'] + this.expect(_tokenizerTypes.types.braceL); + + while (!this.eat(_tokenizerTypes.types.braceR)) { + if (first) { + first = false; + } else { + this.expect(_tokenizerTypes.types.comma); + if (this.eat(_tokenizerTypes.types.braceR)) break; + } + + var isDefault = this.match(_tokenizerTypes.types._default); + if (isDefault && !needsFrom) needsFrom = true; + + var node = this.startNode(); + node.local = this.parseIdentifier(isDefault); + node.exported = this.eatContextual("as") ? this.parseIdentifier(true) : node.local.__clone(); + nodes.push(this.finishNode(node, "ExportSpecifier")); + } + + // https://github.com/ember-cli/ember-cli/pull/3739 + if (needsFrom && !this.isContextual("from")) { + this.unexpected(); + } + + return nodes; +}; + +// Parses import declaration. + +pp.parseImport = function (node) { + this.next(); + + // import '...' + if (this.match(_tokenizerTypes.types.string)) { + node.specifiers = []; + node.source = this.parseExprAtom(); + } else { + node.specifiers = []; + this.parseImportSpecifiers(node); + this.expectContextual("from"); + node.source = this.match(_tokenizerTypes.types.string) ? this.parseExprAtom() : this.unexpected(); + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration"); +}; + +// Parses a comma-separated list of module imports. + +pp.parseImportSpecifiers = function (node) { + var first = true; + if (this.match(_tokenizerTypes.types.name)) { + // import defaultObj, { x, y as z } from '...' + var startPos = this.state.start, + startLoc = this.state.startLoc; + node.specifiers.push(this.parseImportSpecifierDefault(this.parseIdentifier(), startPos, startLoc)); + if (!this.eat(_tokenizerTypes.types.comma)) return; + } + + if (this.match(_tokenizerTypes.types.star)) { + var specifier = this.startNode(); + this.next(); + this.expectContextual("as"); + specifier.local = this.parseIdentifier(); + this.checkLVal(specifier.local, true); + node.specifiers.push(this.finishNode(specifier, "ImportNamespaceSpecifier")); + return; + } + + this.expect(_tokenizerTypes.types.braceL); + while (!this.eat(_tokenizerTypes.types.braceR)) { + if (first) { + first = false; + } else { + this.expect(_tokenizerTypes.types.comma); + if (this.eat(_tokenizerTypes.types.braceR)) break; + } + + var specifier = this.startNode(); + specifier.imported = this.parseIdentifier(true); + specifier.local = this.eatContextual("as") ? this.parseIdentifier() : specifier.imported.__clone(); + this.checkLVal(specifier.local, true); + node.specifiers.push(this.finishNode(specifier, "ImportSpecifier")); + } +}; + +pp.parseImportSpecifierDefault = function (id, startPos, startLoc) { + var node = this.startNodeAt(startPos, startLoc); + node.local = id; + this.checkLVal(node.local, true); + return this.finishNode(node, "ImportDefaultSpecifier"); +}; +},{"17":17,"20":20,"21":21,"25":25,"5":5}],10:[function(_dereq_,module,exports){ +"use strict"; + +var _interopRequireDefault = _dereq_(25)["default"]; + +var _tokenizerTypes = _dereq_(17); + +var _index = _dereq_(5); + +var _index2 = _interopRequireDefault(_index); + +var _utilWhitespace = _dereq_(20); + +var pp = _index2["default"].prototype; + +// ## Parser utilities + +// TODO + +pp.addExtra = function (node, key, val) { + if (!node) return; + + var extra = node.extra = node.extra || {}; + extra[key] = val; +}; + +// TODO + +pp.isRelational = function (op) { + return this.match(_tokenizerTypes.types.relational) && this.state.value === op; +}; + +// TODO + +pp.expectRelational = function (op) { + if (this.isRelational(op)) { + this.next(); + } else { + this.unexpected(); + } +}; + +// Tests whether parsed token is a contextual keyword. + +pp.isContextual = function (name) { + return this.match(_tokenizerTypes.types.name) && this.state.value === name; +}; + +// Consumes contextual keyword if possible. + +pp.eatContextual = function (name) { + return this.state.value === name && this.eat(_tokenizerTypes.types.name); +}; + +// Asserts that following token is given contextual keyword. + +pp.expectContextual = function (name) { + if (!this.eatContextual(name)) this.unexpected(); +}; + +// Test whether a semicolon can be inserted at the current position. + +pp.canInsertSemicolon = function () { + return this.match(_tokenizerTypes.types.eof) || this.match(_tokenizerTypes.types.braceR) || _utilWhitespace.lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start)); +}; + +// TODO + +pp.isLineTerminator = function () { + return this.eat(_tokenizerTypes.types.semi) || this.canInsertSemicolon(); +}; + +// Consume a semicolon, or, failing that, see if we are allowed to +// pretend that there is a semicolon at this position. + +pp.semicolon = function () { + if (!this.isLineTerminator()) this.unexpected(); +}; + +// Expect a token of a given type. If found, consume it, otherwise, +// raise an unexpected token error. + +pp.expect = function (type) { + return this.eat(type) || this.unexpected(); +}; + +// Raise an unexpected token error. + +pp.unexpected = function (pos) { + this.raise(pos != null ? pos : this.state.start, "Unexpected token"); +}; +},{"17":17,"20":20,"25":25,"5":5}],11:[function(_dereq_,module,exports){ +/* eslint indent: 0 */ +/* eslint max-len: 0 */ + +"use strict"; + +var _interopRequireDefault = _dereq_(25)["default"]; + +exports.__esModule = true; + +var _tokenizerTypes = _dereq_(17); + +var _parser = _dereq_(5); + +var _parser2 = _interopRequireDefault(_parser); + +var pp = _parser2["default"].prototype; + +pp.flowParseTypeInitialiser = function (tok, allowLeadingPipeOrAnd) { + var oldInType = this.state.inType; + this.state.inType = true; + this.expect(tok || _tokenizerTypes.types.colon); + if (allowLeadingPipeOrAnd) { + if (this.match(_tokenizerTypes.types.bitwiseAND) || this.match(_tokenizerTypes.types.bitwiseOR)) { + this.next(); + } + } + var type = this.flowParseType(); + this.state.inType = oldInType; + return type; +}; + +pp.flowParseDeclareClass = function (node) { + this.next(); + this.flowParseInterfaceish(node, true); + return this.finishNode(node, "DeclareClass"); +}; + +pp.flowParseDeclareFunction = function (node) { + this.next(); + + var id = node.id = this.parseIdentifier(); + + var typeNode = this.startNode(); + var typeContainer = this.startNode(); + + if (this.isRelational("<")) { + typeNode.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + typeNode.typeParameters = null; + } + + this.expect(_tokenizerTypes.types.parenL); + var tmp = this.flowParseFunctionTypeParams(); + typeNode.params = tmp.params; + typeNode.rest = tmp.rest; + this.expect(_tokenizerTypes.types.parenR); + typeNode.returnType = this.flowParseTypeInitialiser(); + + typeContainer.typeAnnotation = this.finishNode(typeNode, "FunctionTypeAnnotation"); + id.typeAnnotation = this.finishNode(typeContainer, "TypeAnnotation"); + + this.finishNode(id, id.type); + + this.semicolon(); + + return this.finishNode(node, "DeclareFunction"); +}; + +pp.flowParseDeclare = function (node) { + if (this.match(_tokenizerTypes.types._class)) { + return this.flowParseDeclareClass(node); + } else if (this.match(_tokenizerTypes.types._function)) { + return this.flowParseDeclareFunction(node); + } else if (this.match(_tokenizerTypes.types._var)) { + return this.flowParseDeclareVariable(node); + } else if (this.isContextual("module")) { + return this.flowParseDeclareModule(node); + } else if (this.isContextual("type")) { + return this.flowParseDeclareTypeAlias(node); + } else if (this.isContextual("interface")) { + return this.flowParseDeclareInterface(node); + } else { + this.unexpected(); + } +}; + +pp.flowParseDeclareVariable = function (node) { + this.next(); + node.id = this.flowParseTypeAnnotatableIdentifier(); + this.semicolon(); + return this.finishNode(node, "DeclareVariable"); +}; + +pp.flowParseDeclareModule = function (node) { + this.next(); + + if (this.match(_tokenizerTypes.types.string)) { + node.id = this.parseExprAtom(); + } else { + node.id = this.parseIdentifier(); + } + + var bodyNode = node.body = this.startNode(); + var body = bodyNode.body = []; + this.expect(_tokenizerTypes.types.braceL); + while (!this.match(_tokenizerTypes.types.braceR)) { + var node2 = this.startNode(); + + // todo: declare check + this.next(); + + body.push(this.flowParseDeclare(node2)); + } + this.expect(_tokenizerTypes.types.braceR); + + this.finishNode(bodyNode, "BlockStatement"); + return this.finishNode(node, "DeclareModule"); +}; + +pp.flowParseDeclareTypeAlias = function (node) { + this.next(); + this.flowParseTypeAlias(node); + return this.finishNode(node, "DeclareTypeAlias"); +}; + +pp.flowParseDeclareInterface = function (node) { + this.next(); + this.flowParseInterfaceish(node); + return this.finishNode(node, "DeclareInterface"); +}; + +// Interfaces + +pp.flowParseInterfaceish = function (node, allowStatic) { + node.id = this.parseIdentifier(); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; + } + + node["extends"] = []; + node.mixins = []; + + if (this.eat(_tokenizerTypes.types._extends)) { + do { + node["extends"].push(this.flowParseInterfaceExtends()); + } while (this.eat(_tokenizerTypes.types.comma)); + } + + if (this.isContextual("mixins")) { + this.next(); + do { + node.mixins.push(this.flowParseInterfaceExtends()); + } while (this.eat(_tokenizerTypes.types.comma)); + } + + node.body = this.flowParseObjectType(allowStatic); +}; + +pp.flowParseInterfaceExtends = function () { + var node = this.startNode(); + + node.id = this.parseIdentifier(); + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterInstantiation(); + } else { + node.typeParameters = null; + } + + return this.finishNode(node, "InterfaceExtends"); +}; + +pp.flowParseInterface = function (node) { + this.flowParseInterfaceish(node, false); + return this.finishNode(node, "InterfaceDeclaration"); +}; + +// Type aliases + +pp.flowParseTypeAlias = function (node) { + node.id = this.parseIdentifier(); + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; + } + + node.right = this.flowParseTypeInitialiser(_tokenizerTypes.types.eq, + /*allowLeadingPipeOrAnd*/true); + this.semicolon(); + + return this.finishNode(node, "TypeAlias"); +}; + +// Type annotations + +pp.flowParseTypeParameterDeclaration = function () { + var node = this.startNode(); + node.params = []; + + this.expectRelational("<"); + while (!this.isRelational(">")) { + node.params.push(this.flowParseExistentialTypeParam() || this.flowParseTypeAnnotatableIdentifier()); + if (!this.isRelational(">")) { + this.expect(_tokenizerTypes.types.comma); + } + } + this.expectRelational(">"); + + return this.finishNode(node, "TypeParameterDeclaration"); +}; + +pp.flowParseExistentialTypeParam = function () { + if (this.match(_tokenizerTypes.types.star)) { + var node = this.startNode(); + this.next(); + return this.finishNode(node, "ExistentialTypeParam"); + } +}; + +pp.flowParseTypeParameterInstantiation = function () { + var node = this.startNode(), + oldInType = this.state.inType; + node.params = []; + + this.state.inType = true; + + this.expectRelational("<"); + while (!this.isRelational(">")) { + node.params.push(this.flowParseExistentialTypeParam() || this.flowParseType()); + if (!this.isRelational(">")) { + this.expect(_tokenizerTypes.types.comma); + } + } + this.expectRelational(">"); + + this.state.inType = oldInType; + + return this.finishNode(node, "TypeParameterInstantiation"); +}; + +pp.flowParseObjectPropertyKey = function () { + return this.match(_tokenizerTypes.types.num) || this.match(_tokenizerTypes.types.string) ? this.parseExprAtom() : this.parseIdentifier(true); +}; + +pp.flowParseObjectTypeIndexer = function (node, isStatic) { + node["static"] = isStatic; + + this.expect(_tokenizerTypes.types.bracketL); + node.id = this.flowParseObjectPropertyKey(); + node.key = this.flowParseTypeInitialiser(); + this.expect(_tokenizerTypes.types.bracketR); + node.value = this.flowParseTypeInitialiser(); + + this.flowObjectTypeSemicolon(); + return this.finishNode(node, "ObjectTypeIndexer"); +}; + +pp.flowParseObjectTypeMethodish = function (node) { + node.params = []; + node.rest = null; + node.typeParameters = null; + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } + + this.expect(_tokenizerTypes.types.parenL); + while (this.match(_tokenizerTypes.types.name)) { + node.params.push(this.flowParseFunctionTypeParam()); + if (!this.match(_tokenizerTypes.types.parenR)) { + this.expect(_tokenizerTypes.types.comma); + } + } + + if (this.eat(_tokenizerTypes.types.ellipsis)) { + node.rest = this.flowParseFunctionTypeParam(); + } + this.expect(_tokenizerTypes.types.parenR); + node.returnType = this.flowParseTypeInitialiser(); + + return this.finishNode(node, "FunctionTypeAnnotation"); +}; + +pp.flowParseObjectTypeMethod = function (startPos, startLoc, isStatic, key) { + var node = this.startNodeAt(startPos, startLoc); + node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(startPos, startLoc)); + node["static"] = isStatic; + node.key = key; + node.optional = false; + this.flowObjectTypeSemicolon(); + return this.finishNode(node, "ObjectTypeProperty"); +}; + +pp.flowParseObjectTypeCallProperty = function (node, isStatic) { + var valueNode = this.startNode(); + node["static"] = isStatic; + node.value = this.flowParseObjectTypeMethodish(valueNode); + this.flowObjectTypeSemicolon(); + return this.finishNode(node, "ObjectTypeCallProperty"); +}; + +pp.flowParseObjectType = function (allowStatic) { + var nodeStart = this.startNode(); + var node = undefined; + var propertyKey = undefined; + var isStatic = undefined; + + nodeStart.callProperties = []; + nodeStart.properties = []; + nodeStart.indexers = []; + + this.expect(_tokenizerTypes.types.braceL); + + while (!this.match(_tokenizerTypes.types.braceR)) { + var optional = false; + var startPos = this.state.start, + startLoc = this.state.startLoc; + node = this.startNode(); + if (allowStatic && this.isContextual("static")) { + this.next(); + isStatic = true; + } + + if (this.match(_tokenizerTypes.types.bracketL)) { + nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic)); + } else if (this.match(_tokenizerTypes.types.parenL) || this.isRelational("<")) { + nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, allowStatic)); + } else { + if (isStatic && this.match(_tokenizerTypes.types.colon)) { + propertyKey = this.parseIdentifier(); + } else { + propertyKey = this.flowParseObjectPropertyKey(); + } + if (this.isRelational("<") || this.match(_tokenizerTypes.types.parenL)) { + // This is a method property + nodeStart.properties.push(this.flowParseObjectTypeMethod(startPos, startLoc, isStatic, propertyKey)); + } else { + if (this.eat(_tokenizerTypes.types.question)) { + optional = true; + } + node.key = propertyKey; + node.value = this.flowParseTypeInitialiser(); + node.optional = optional; + node["static"] = isStatic; + this.flowObjectTypeSemicolon(); + nodeStart.properties.push(this.finishNode(node, "ObjectTypeProperty")); + } + } + } + + this.expect(_tokenizerTypes.types.braceR); + + return this.finishNode(nodeStart, "ObjectTypeAnnotation"); +}; + +pp.flowObjectTypeSemicolon = function () { + if (!this.eat(_tokenizerTypes.types.semi) && !this.eat(_tokenizerTypes.types.comma) && !this.match(_tokenizerTypes.types.braceR)) { + this.unexpected(); + } +}; + +pp.flowParseGenericType = function (startPos, startLoc, id) { + var node = this.startNodeAt(startPos, startLoc); + + node.typeParameters = null; + node.id = id; + + while (this.eat(_tokenizerTypes.types.dot)) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.qualification = node.id; + node2.id = this.parseIdentifier(); + node.id = this.finishNode(node2, "QualifiedTypeIdentifier"); + } + + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterInstantiation(); + } + + return this.finishNode(node, "GenericTypeAnnotation"); +}; + +pp.flowParseTypeofType = function () { + var node = this.startNode(); + this.expect(_tokenizerTypes.types._typeof); + node.argument = this.flowParsePrimaryType(); + return this.finishNode(node, "TypeofTypeAnnotation"); +}; + +pp.flowParseTupleType = function () { + var node = this.startNode(); + node.types = []; + this.expect(_tokenizerTypes.types.bracketL); + // We allow trailing commas + while (this.state.pos < this.input.length && !this.match(_tokenizerTypes.types.bracketR)) { + node.types.push(this.flowParseType()); + if (this.match(_tokenizerTypes.types.bracketR)) break; + this.expect(_tokenizerTypes.types.comma); + } + this.expect(_tokenizerTypes.types.bracketR); + return this.finishNode(node, "TupleTypeAnnotation"); +}; + +pp.flowParseFunctionTypeParam = function () { + var optional = false; + var node = this.startNode(); + node.name = this.parseIdentifier(); + if (this.eat(_tokenizerTypes.types.question)) { + optional = true; + } + node.optional = optional; + node.typeAnnotation = this.flowParseTypeInitialiser(); + return this.finishNode(node, "FunctionTypeParam"); +}; + +pp.flowParseFunctionTypeParams = function () { + var ret = { params: [], rest: null }; + while (this.match(_tokenizerTypes.types.name)) { + ret.params.push(this.flowParseFunctionTypeParam()); + if (!this.match(_tokenizerTypes.types.parenR)) { + this.expect(_tokenizerTypes.types.comma); + } + } + if (this.eat(_tokenizerTypes.types.ellipsis)) { + ret.rest = this.flowParseFunctionTypeParam(); + } + return ret; +}; + +pp.flowIdentToTypeAnnotation = function (startPos, startLoc, node, id) { + switch (id.name) { + case "any": + return this.finishNode(node, "AnyTypeAnnotation"); + + case "void": + return this.finishNode(node, "VoidTypeAnnotation"); + + case "bool": + case "boolean": + return this.finishNode(node, "BooleanTypeAnnotation"); + + case "mixed": + return this.finishNode(node, "MixedTypeAnnotation"); + + case "number": + return this.finishNode(node, "NumberTypeAnnotation"); + + case "string": + return this.finishNode(node, "StringTypeAnnotation"); + + default: + return this.flowParseGenericType(startPos, startLoc, id); + } +}; + +// The parsing of types roughly parallels the parsing of expressions, and +// primary types are kind of like primary expressions...they're the +// primitives with which other types are constructed. +pp.flowParsePrimaryType = function () { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var node = this.startNode(); + var tmp = undefined; + var type = undefined; + var isGroupedType = false; + + switch (this.state.type) { + case _tokenizerTypes.types.name: + return this.flowIdentToTypeAnnotation(startPos, startLoc, node, this.parseIdentifier()); + + case _tokenizerTypes.types.braceL: + return this.flowParseObjectType(); + + case _tokenizerTypes.types.bracketL: + return this.flowParseTupleType(); + + case _tokenizerTypes.types.relational: + if (this.state.value === "<") { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + this.expect(_tokenizerTypes.types.parenL); + tmp = this.flowParseFunctionTypeParams(); + node.params = tmp.params; + node.rest = tmp.rest; + this.expect(_tokenizerTypes.types.parenR); + + this.expect(_tokenizerTypes.types.arrow); + + node.returnType = this.flowParseType(); + + return this.finishNode(node, "FunctionTypeAnnotation"); + } + + case _tokenizerTypes.types.parenL: + this.next(); + + // Check to see if this is actually a grouped type + if (!this.match(_tokenizerTypes.types.parenR) && !this.match(_tokenizerTypes.types.ellipsis)) { + if (this.match(_tokenizerTypes.types.name)) { + var token = this.lookahead().type; + isGroupedType = token !== _tokenizerTypes.types.question && token !== _tokenizerTypes.types.colon; + } else { + isGroupedType = true; + } + } + + if (isGroupedType) { + type = this.flowParseType(); + this.expect(_tokenizerTypes.types.parenR); + + // If we see a => next then someone was probably confused about + // function types, so we can provide a better error message + if (this.eat(_tokenizerTypes.types.arrow)) { + this.raise(node, "Unexpected token =>. It looks like " + "you are trying to write a function type, but you ended up " + "writing a grouped type followed by an =>, which is a syntax " + "error. Remember, function type parameters are named so function " + "types look like (name1: type1, name2: type2) => returnType. You " + "probably wrote (type1) => returnType"); + } + + return type; + } + + tmp = this.flowParseFunctionTypeParams(); + node.params = tmp.params; + node.rest = tmp.rest; + + this.expect(_tokenizerTypes.types.parenR); + + this.expect(_tokenizerTypes.types.arrow); + + node.returnType = this.flowParseType(); + node.typeParameters = null; + + return this.finishNode(node, "FunctionTypeAnnotation"); + + case _tokenizerTypes.types.string: + node.value = this.state.value; + this.addExtra(node, "rawValue", node.value); + this.addExtra(node, "raw", this.input.slice(this.state.start, this.state.end)); + this.next(); + return this.finishNode(node, "StringLiteralTypeAnnotation"); + + case _tokenizerTypes.types._true:case _tokenizerTypes.types._false: + node.value = this.match(_tokenizerTypes.types._true); + this.next(); + return this.finishNode(node, "BooleanLiteralTypeAnnotation"); + + case _tokenizerTypes.types.num: + node.value = this.state.value; + this.addExtra(node, "rawValue", node.value); + this.addExtra(node, "raw", this.input.slice(this.state.start, this.state.end)); + this.next(); + return this.finishNode(node, "NumericLiteralTypeAnnotation"); + + case _tokenizerTypes.types._null: + node.value = this.match(_tokenizerTypes.types._null); + this.next(); + return this.finishNode(node, "NullLiteralTypeAnnotation"); + + case _tokenizerTypes.types._this: + node.value = this.match(_tokenizerTypes.types._this); + this.next(); + return this.finishNode(node, "ThisTypeAnnotation"); + + default: + if (this.state.type.keyword === "typeof") { + return this.flowParseTypeofType(); + } + } + + this.unexpected(); +}; + +pp.flowParsePostfixType = function () { + var node = this.startNode(); + var type = node.elementType = this.flowParsePrimaryType(); + if (this.match(_tokenizerTypes.types.bracketL)) { + this.expect(_tokenizerTypes.types.bracketL); + this.expect(_tokenizerTypes.types.bracketR); + return this.finishNode(node, "ArrayTypeAnnotation"); + } else { + return type; + } +}; + +pp.flowParsePrefixType = function () { + var node = this.startNode(); + if (this.eat(_tokenizerTypes.types.question)) { + node.typeAnnotation = this.flowParsePrefixType(); + return this.finishNode(node, "NullableTypeAnnotation"); + } else { + return this.flowParsePostfixType(); + } +}; + +pp.flowParseIntersectionType = function () { + var node = this.startNode(); + var type = this.flowParsePrefixType(); + node.types = [type]; + while (this.eat(_tokenizerTypes.types.bitwiseAND)) { + node.types.push(this.flowParsePrefixType()); + } + return node.types.length === 1 ? type : this.finishNode(node, "IntersectionTypeAnnotation"); +}; + +pp.flowParseUnionType = function () { + var node = this.startNode(); + var type = this.flowParseIntersectionType(); + node.types = [type]; + while (this.eat(_tokenizerTypes.types.bitwiseOR)) { + node.types.push(this.flowParseIntersectionType()); + } + return node.types.length === 1 ? type : this.finishNode(node, "UnionTypeAnnotation"); +}; + +pp.flowParseType = function () { + var oldInType = this.state.inType; + this.state.inType = true; + var type = this.flowParseUnionType(); + this.state.inType = oldInType; + return type; +}; + +pp.flowParseTypeAnnotation = function () { + var node = this.startNode(); + node.typeAnnotation = this.flowParseTypeInitialiser(); + return this.finishNode(node, "TypeAnnotation"); +}; + +pp.flowParseTypeAnnotatableIdentifier = function (requireTypeAnnotation, canBeOptionalParam) { + var variance = undefined; + if (this.match(_tokenizerTypes.types.plusMin)) { + if (this.state.value === "+") { + variance = "plus"; + } else if (this.state.value === "-") { + variance = "minus"; + } + this.eat(_tokenizerTypes.types.plusMin); + } + + var ident = this.parseIdentifier(); + var isOptionalParam = false; + + if (variance) { + ident.variance = variance; + } + + if (canBeOptionalParam && this.eat(_tokenizerTypes.types.question)) { + this.expect(_tokenizerTypes.types.question); + isOptionalParam = true; + } + + if (requireTypeAnnotation || this.match(_tokenizerTypes.types.colon)) { + ident.typeAnnotation = this.flowParseTypeAnnotation(); + this.finishNode(ident, ident.type); + } + + if (isOptionalParam) { + ident.optional = true; + this.finishNode(ident, ident.type); + } + + return ident; +}; + +exports["default"] = function (instance) { + // plain function return types: function name(): string {} + instance.extend("parseFunctionBody", function (inner) { + return function (node, allowExpression) { + if (this.match(_tokenizerTypes.types.colon) && !allowExpression) { + // if allowExpression is true then we're parsing an arrow function and if + // there's a return type then it's been handled elsewhere + node.returnType = this.flowParseTypeAnnotation(); + } + + return inner.call(this, node, allowExpression); + }; + }); + + // interfaces + instance.extend("parseStatement", function (inner) { + return function (declaration, topLevel) { + // strict mode handling of `interface` since it's a reserved word + if (this.state.strict && this.match(_tokenizerTypes.types.name) && this.state.value === "interface") { + var node = this.startNode(); + this.next(); + return this.flowParseInterface(node); + } else { + return inner.call(this, declaration, topLevel); + } + }; + }); + + // declares, interfaces and type aliases + instance.extend("parseExpressionStatement", function (inner) { + return function (node, expr) { + if (expr.type === "Identifier") { + if (expr.name === "declare") { + if (this.match(_tokenizerTypes.types._class) || this.match(_tokenizerTypes.types.name) || this.match(_tokenizerTypes.types._function) || this.match(_tokenizerTypes.types._var)) { + return this.flowParseDeclare(node); + } + } else if (this.match(_tokenizerTypes.types.name)) { + if (expr.name === "interface") { + return this.flowParseInterface(node); + } else if (expr.name === "type") { + return this.flowParseTypeAlias(node); + } + } + } + + return inner.call(this, node, expr); + }; + }); + + // export type + instance.extend("shouldParseExportDeclaration", function (inner) { + return function () { + return this.isContextual("type") || this.isContextual("interface") || inner.call(this); + }; + }); + + instance.extend("parseParenItem", function () { + return function (node, startLoc, startPos, forceArrow) { + var canBeArrow = this.state.potentialArrowAt = startPos; + if (this.match(_tokenizerTypes.types.colon)) { + var typeCastNode = this.startNodeAt(startLoc, startPos); + typeCastNode.expression = node; + typeCastNode.typeAnnotation = this.flowParseTypeAnnotation(); + + if (forceArrow && !this.match(_tokenizerTypes.types.arrow)) { + this.unexpected(); + } + + if (canBeArrow && this.eat(_tokenizerTypes.types.arrow)) { + // ((lol): number => {}); + var params = node.type === "SequenceExpression" ? node.expressions : [node]; + var func = this.parseArrowExpression(this.startNodeAt(startLoc, startPos), params); + func.returnType = typeCastNode.typeAnnotation; + return func; + } else { + return this.finishNode(typeCastNode, "TypeCastExpression"); + } + } else { + return node; + } + }; + }); + + instance.extend("parseExport", function (inner) { + return function (node) { + node = inner.call(this, node); + if (node.type === "ExportNamedDeclaration") { + node.exportKind = node.exportKind || "value"; + } + return node; + }; + }); + + instance.extend("parseExportDeclaration", function (inner) { + return function (node) { + if (this.isContextual("type")) { + node.exportKind = "type"; + + var declarationNode = this.startNode(); + this.next(); + + if (this.match(_tokenizerTypes.types.braceL)) { + // export type { foo, bar }; + node.specifiers = this.parseExportSpecifiers(); + this.parseExportFrom(node); + return null; + } else { + // export type Foo = Bar; + return this.flowParseTypeAlias(declarationNode); + } + } else if (this.isContextual("interface")) { + node.exportKind = "type"; + var declarationNode = this.startNode(); + this.next(); + return this.flowParseInterface(declarationNode); + } else { + return inner.call(this, node); + } + }; + }); + + instance.extend("parseClassId", function (inner) { + return function (node) { + inner.apply(this, arguments); + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } + }; + }); + + // don't consider `void` to be a keyword as then it'll use the void token type + // and set startExpr + instance.extend("isKeyword", function (inner) { + return function (name) { + if (this.state.inType && name === "void") { + return false; + } else { + return inner.call(this, name); + } + }; + }); + + // ensure that inside flow types, we bypass the jsx parser plugin + instance.extend("readToken", function (inner) { + return function (code) { + if (this.state.inType && (code === 62 || code === 60)) { + return this.finishOp(_tokenizerTypes.types.relational, 1); + } else { + return inner.call(this, code); + } + }; + }); + + // don't lex any token as a jsx one inside a flow type + instance.extend("jsx_readToken", function (inner) { + return function () { + if (!this.state.inType) return inner.call(this); + }; + }); + + function typeCastToParameter(node) { + node.expression.typeAnnotation = node.typeAnnotation; + return node.expression; + } + + instance.extend("toAssignable", function (inner) { + return function (node) { + if (node.type === "TypeCastExpression") { + return typeCastToParameter(node); + } else { + return inner.apply(this, arguments); + } + }; + }); + + // turn type casts that we found in function parameter head into type annotated params + instance.extend("toAssignableList", function (inner) { + return function (exprList, isBinding) { + for (var i = 0; i < exprList.length; i++) { + var expr = exprList[i]; + if (expr && expr.type === "TypeCastExpression") { + exprList[i] = typeCastToParameter(expr); + } + } + return inner.call(this, exprList, isBinding); + }; + }); + + // this is a list of nodes, from something like a call expression, we need to filter the + // type casts that we've found that are illegal in this context + instance.extend("toReferencedList", function () { + return function (exprList) { + for (var i = 0; i < exprList.length; i++) { + var expr = exprList[i]; + if (expr && expr._exprListItem && expr.type === "TypeCastExpression") { + this.raise(expr.start, "Unexpected type cast"); + } + } + + return exprList; + }; + }); + + // parse an item inside a expression list eg. `(NODE, NODE)` where NODE represents + // the position where this function is cal;ed + instance.extend("parseExprListItem", function (inner) { + return function (allowEmpty, refShorthandDefaultPos) { + var container = this.startNode(); + var node = inner.call(this, allowEmpty, refShorthandDefaultPos); + if (this.match(_tokenizerTypes.types.colon)) { + container._exprListItem = true; + container.expression = node; + container.typeAnnotation = this.flowParseTypeAnnotation(); + return this.finishNode(container, "TypeCastExpression"); + } else { + return node; + } + }; + }); + + instance.extend("checkLVal", function (inner) { + return function (node) { + if (node.type !== "TypeCastExpression") { + return inner.apply(this, arguments); + } + }; + }); + + // parse class property type annotations + instance.extend("parseClassProperty", function (inner) { + return function (node) { + if (this.match(_tokenizerTypes.types.colon)) { + node.typeAnnotation = this.flowParseTypeAnnotation(); + } + return inner.call(this, node); + }; + }); + + // determine whether or not we're currently in the position where a class property would appear + instance.extend("isClassProperty", function (inner) { + return function () { + return this.match(_tokenizerTypes.types.colon) || inner.call(this); + }; + }); + + // parse type parameters for class methods + instance.extend("parseClassMethod", function () { + return function (classBody, method, isGenerator, isAsync) { + if (this.isRelational("<")) { + method.typeParameters = this.flowParseTypeParameterDeclaration(); + } + this.parseMethod(method, isGenerator, isAsync); + classBody.body.push(this.finishNode(method, "ClassMethod")); + }; + }); + + // parse a the super class type parameters and implements + instance.extend("parseClassSuper", function (inner) { + return function (node, isStatement) { + inner.call(this, node, isStatement); + if (node.superClass && this.isRelational("<")) { + node.superTypeParameters = this.flowParseTypeParameterInstantiation(); + } + if (this.isContextual("implements")) { + this.next(); + var implemented = node["implements"] = []; + do { + var _node = this.startNode(); + _node.id = this.parseIdentifier(); + if (this.isRelational("<")) { + _node.typeParameters = this.flowParseTypeParameterInstantiation(); + } else { + _node.typeParameters = null; + } + implemented.push(this.finishNode(_node, "ClassImplements")); + } while (this.eat(_tokenizerTypes.types.comma)); + } + }; + }); + + // parse type parameters for object method shorthand + instance.extend("parseObjPropValue", function (inner) { + return function (prop) { + var typeParameters = undefined; + + // method shorthand + if (this.isRelational("<")) { + typeParameters = this.flowParseTypeParameterDeclaration(); + if (!this.match(_tokenizerTypes.types.parenL)) this.unexpected(); + } + + inner.apply(this, arguments); + + // add typeParameters if we found them + if (typeParameters) { + (prop.value || prop).typeParameters = typeParameters; + } + }; + }); + + instance.extend("parseAssignableListItemTypes", function () { + return function (param) { + if (this.eat(_tokenizerTypes.types.question)) { + param.optional = true; + } + if (this.match(_tokenizerTypes.types.colon)) { + param.typeAnnotation = this.flowParseTypeAnnotation(); + } + this.finishNode(param, param.type); + return param; + }; + }); + + // parse typeof and type imports + instance.extend("parseImportSpecifiers", function (inner) { + return function (node) { + node.importKind = "value"; + + var kind = null; + if (this.match(_tokenizerTypes.types._typeof)) { + kind = "typeof"; + } else if (this.isContextual("type")) { + kind = "type"; + } + if (kind) { + var lh = this.lookahead(); + if (lh.type === _tokenizerTypes.types.name && lh.value !== "from" || lh.type === _tokenizerTypes.types.braceL || lh.type === _tokenizerTypes.types.star) { + this.next(); + node.importKind = kind; + } + } + + inner.call(this, node); + }; + }); + + // parse function type parameters - function foo() {} + instance.extend("parseFunctionParams", function (inner) { + return function (node) { + if (this.isRelational("<")) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } + inner.call(this, node); + }; + }); + + // parse flow type annotations on variable declarator heads - let foo: string = bar + instance.extend("parseVarHead", function (inner) { + return function (decl) { + inner.call(this, decl); + if (this.match(_tokenizerTypes.types.colon)) { + decl.id.typeAnnotation = this.flowParseTypeAnnotation(); + this.finishNode(decl.id, decl.id.type); + } + }; + }); + + // parse the return type of an async arrow function - let foo = (async (): number => {}); + instance.extend("parseAsyncArrowFromCallExpression", function (inner) { + return function (node, call) { + if (this.match(_tokenizerTypes.types.colon)) { + node.returnType = this.flowParseTypeAnnotation(); + } + + return inner.call(this, node, call); + }; + }); + + // todo description + instance.extend("shouldParseAsyncArrow", function (inner) { + return function () { + return this.match(_tokenizerTypes.types.colon) || inner.call(this); + }; + }); + + // handle return types for arrow functions + instance.extend("parseParenAndDistinguishExpression", function (inner) { + return function (startPos, startLoc, canBeArrow, isAsync) { + startPos = startPos || this.state.start; + startLoc = startLoc || this.state.startLoc; + + if (canBeArrow && this.lookahead().type === _tokenizerTypes.types.parenR) { + // let foo = (): number => {}; + this.expect(_tokenizerTypes.types.parenL); + this.expect(_tokenizerTypes.types.parenR); + + var node = this.startNodeAt(startPos, startLoc); + if (this.match(_tokenizerTypes.types.colon)) node.returnType = this.flowParseTypeAnnotation(); + this.expect(_tokenizerTypes.types.arrow); + return this.parseArrowExpression(node, [], isAsync); + } else { + // let foo = (foo): number => {}; + var node = inner.call(this, startPos, startLoc, canBeArrow, isAsync, this.hasPlugin("trailingFunctionCommas")); + + if (this.match(_tokenizerTypes.types.colon)) { + var state = this.state.clone(); + try { + return this.parseParenItem(node, startPos, startLoc, true); + } catch (err) { + if (err instanceof SyntaxError) { + this.state = state; + return node; + } else { + throw err; + } + } + } else { + return node; + } + } + }; + }); +}; + +module.exports = exports["default"]; +},{"17":17,"25":25,"5":5}],12:[function(_dereq_,module,exports){ +/* eslint indent: 0 */ + +"use strict"; + +var _interopRequireDefault = _dereq_(25)["default"]; + +exports.__esModule = true; + +var _xhtml = _dereq_(13); + +var _xhtml2 = _interopRequireDefault(_xhtml); + +var _tokenizerTypes = _dereq_(17); + +var _tokenizerContext = _dereq_(14); + +var _parser = _dereq_(5); + +var _parser2 = _interopRequireDefault(_parser); + +var _utilIdentifier = _dereq_(18); + +var _utilWhitespace = _dereq_(20); + +var HEX_NUMBER = /^[\da-fA-F]+$/; +var DECIMAL_NUMBER = /^\d+$/; + +_tokenizerContext.types.j_oTag = new _tokenizerContext.TokContext("...", true, true); + +_tokenizerTypes.types.jsxName = new _tokenizerTypes.TokenType("jsxName"); +_tokenizerTypes.types.jsxText = new _tokenizerTypes.TokenType("jsxText", { beforeExpr: true }); +_tokenizerTypes.types.jsxTagStart = new _tokenizerTypes.TokenType("jsxTagStart"); +_tokenizerTypes.types.jsxTagEnd = new _tokenizerTypes.TokenType("jsxTagEnd"); + +_tokenizerTypes.types.jsxTagStart.updateContext = function () { + this.state.context.push(_tokenizerContext.types.j_expr); // treat as beginning of JSX expression + this.state.context.push(_tokenizerContext.types.j_oTag); // start opening tag context + this.state.exprAllowed = false; +}; + +_tokenizerTypes.types.jsxTagEnd.updateContext = function (prevType) { + var out = this.state.context.pop(); + if (out === _tokenizerContext.types.j_oTag && prevType === _tokenizerTypes.types.slash || out === _tokenizerContext.types.j_cTag) { + this.state.context.pop(); + this.state.exprAllowed = this.curContext() === _tokenizerContext.types.j_expr; + } else { + this.state.exprAllowed = true; + } +}; + +var pp = _parser2["default"].prototype; + +// Reads inline JSX contents token. + +pp.jsxReadToken = function () { + var out = ""; + var chunkStart = this.state.pos; + for (;;) { + if (this.state.pos >= this.input.length) { + this.raise(this.state.start, "Unterminated JSX contents"); + } + + var ch = this.input.charCodeAt(this.state.pos); + + switch (ch) { + case 60: // "<" + case 123: + // "{" + if (this.state.pos === this.state.start) { + if (ch === 60 && this.state.exprAllowed) { + ++this.state.pos; + return this.finishToken(_tokenizerTypes.types.jsxTagStart); + } + return this.getTokenFromCode(ch); + } + out += this.input.slice(chunkStart, this.state.pos); + return this.finishToken(_tokenizerTypes.types.jsxText, out); + + case 38: + // "&" + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadEntity(); + chunkStart = this.state.pos; + break; + + default: + if (_utilWhitespace.isNewLine(ch)) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadNewLine(true); + chunkStart = this.state.pos; + } else { + ++this.state.pos; + } + } + } +}; + +pp.jsxReadNewLine = function (normalizeCRLF) { + var ch = this.input.charCodeAt(this.state.pos); + var out = undefined; + ++this.state.pos; + if (ch === 13 && this.input.charCodeAt(this.state.pos) === 10) { + ++this.state.pos; + out = normalizeCRLF ? "\n" : "\r\n"; + } else { + out = String.fromCharCode(ch); + } + ++this.state.curLine; + this.state.lineStart = this.state.pos; + + return out; +}; + +pp.jsxReadString = function (quote) { + var out = ""; + var chunkStart = ++this.state.pos; + for (;;) { + if (this.state.pos >= this.input.length) { + this.raise(this.state.start, "Unterminated string constant"); + } + + var ch = this.input.charCodeAt(this.state.pos); + if (ch === quote) break; + if (ch === 38) { + // "&" + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadEntity(); + chunkStart = this.state.pos; + } else if (_utilWhitespace.isNewLine(ch)) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadNewLine(false); + chunkStart = this.state.pos; + } else { + ++this.state.pos; + } + } + out += this.input.slice(chunkStart, this.state.pos++); + return this.finishToken(_tokenizerTypes.types.string, out); +}; + +pp.jsxReadEntity = function () { + var str = ""; + var count = 0; + var entity = undefined; + var ch = this.input[this.state.pos]; + + var startPos = ++this.state.pos; + while (this.state.pos < this.input.length && count++ < 10) { + ch = this.input[this.state.pos++]; + if (ch === ";") { + if (str[0] === "#") { + if (str[1] === "x") { + str = str.substr(2); + if (HEX_NUMBER.test(str)) entity = String.fromCharCode(parseInt(str, 16)); + } else { + str = str.substr(1); + if (DECIMAL_NUMBER.test(str)) entity = String.fromCharCode(parseInt(str, 10)); + } + } else { + entity = _xhtml2["default"][str]; + } + break; + } + str += ch; + } + if (!entity) { + this.state.pos = startPos; + return "&"; + } + return entity; +}; + +// Read a JSX identifier (valid tag or attribute name). +// +// Optimized version since JSX identifiers can"t contain +// escape characters and so can be read as single slice. +// Also assumes that first character was already checked +// by isIdentifierStart in readToken. + +pp.jsxReadWord = function () { + var ch = undefined; + var start = this.state.pos; + do { + ch = this.input.charCodeAt(++this.state.pos); + } while (_utilIdentifier.isIdentifierChar(ch) || ch === 45); // "-" + return this.finishToken(_tokenizerTypes.types.jsxName, this.input.slice(start, this.state.pos)); +}; + +// Transforms JSX element name to string. + +function getQualifiedJSXName(object) { + if (object.type === "JSXIdentifier") { + return object.name; + } + + if (object.type === "JSXNamespacedName") { + return object.namespace.name + ":" + object.name.name; + } + + if (object.type === "JSXMemberExpression") { + return getQualifiedJSXName(object.object) + "." + getQualifiedJSXName(object.property); + } +} + +// Parse next token as JSX identifier + +pp.jsxParseIdentifier = function () { + var node = this.startNode(); + if (this.match(_tokenizerTypes.types.jsxName)) { + node.name = this.state.value; + } else if (this.state.type.keyword) { + node.name = this.state.type.keyword; + } else { + this.unexpected(); + } + this.next(); + return this.finishNode(node, "JSXIdentifier"); +}; + +// Parse namespaced identifier. + +pp.jsxParseNamespacedName = function () { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var name = this.jsxParseIdentifier(); + if (!this.eat(_tokenizerTypes.types.colon)) return name; + + var node = this.startNodeAt(startPos, startLoc); + node.namespace = name; + node.name = this.jsxParseIdentifier(); + return this.finishNode(node, "JSXNamespacedName"); +}; + +// Parses element name in any form - namespaced, member +// or single identifier. + +pp.jsxParseElementName = function () { + var startPos = this.state.start, + startLoc = this.state.startLoc; + var node = this.jsxParseNamespacedName(); + while (this.eat(_tokenizerTypes.types.dot)) { + var newNode = this.startNodeAt(startPos, startLoc); + newNode.object = node; + newNode.property = this.jsxParseIdentifier(); + node = this.finishNode(newNode, "JSXMemberExpression"); + } + return node; +}; + +// Parses any type of JSX attribute value. + +pp.jsxParseAttributeValue = function () { + var node = undefined; + switch (this.state.type) { + case _tokenizerTypes.types.braceL: + node = this.jsxParseExpressionContainer(); + if (node.expression.type === "JSXEmptyExpression") { + this.raise(node.start, "JSX attributes must only be assigned a non-empty expression"); + } else { + return node; + } + + case _tokenizerTypes.types.jsxTagStart: + case _tokenizerTypes.types.string: + node = this.parseExprAtom(); + node.extra = null; + return node; + + default: + this.raise(this.state.start, "JSX value should be either an expression or a quoted JSX text"); + } +}; + +// JSXEmptyExpression is unique type since it doesn't actually parse anything, +// and so it should start at the end of last read token (left brace) and finish +// at the beginning of the next one (right brace). + +pp.jsxParseEmptyExpression = function () { + var node = this.startNodeAt(this.lastTokEnd, this.lastTokEndLoc); + return this.finishNodeAt(node, "JSXEmptyExpression", this.start, this.startLoc); +}; + +// Parses JSX expression enclosed into curly brackets. + +pp.jsxParseExpressionContainer = function () { + var node = this.startNode(); + this.next(); + if (this.match(_tokenizerTypes.types.braceR)) { + node.expression = this.jsxParseEmptyExpression(); + } else { + node.expression = this.parseExpression(); + } + this.expect(_tokenizerTypes.types.braceR); + return this.finishNode(node, "JSXExpressionContainer"); +}; + +// Parses following JSX attribute name-value pair. + +pp.jsxParseAttribute = function () { + var node = this.startNode(); + if (this.eat(_tokenizerTypes.types.braceL)) { + this.expect(_tokenizerTypes.types.ellipsis); + node.argument = this.parseMaybeAssign(); + this.expect(_tokenizerTypes.types.braceR); + return this.finishNode(node, "JSXSpreadAttribute"); + } + node.name = this.jsxParseNamespacedName(); + node.value = this.eat(_tokenizerTypes.types.eq) ? this.jsxParseAttributeValue() : null; + return this.finishNode(node, "JSXAttribute"); +}; + +// Parses JSX opening tag starting after "<". + +pp.jsxParseOpeningElementAt = function (startPos, startLoc) { + var node = this.startNodeAt(startPos, startLoc); + node.attributes = []; + node.name = this.jsxParseElementName(); + while (!this.match(_tokenizerTypes.types.slash) && !this.match(_tokenizerTypes.types.jsxTagEnd)) { + node.attributes.push(this.jsxParseAttribute()); + } + node.selfClosing = this.eat(_tokenizerTypes.types.slash); + this.expect(_tokenizerTypes.types.jsxTagEnd); + return this.finishNode(node, "JSXOpeningElement"); +}; + +// Parses JSX closing tag starting after ""); + } + } + + node.openingElement = openingElement; + node.closingElement = closingElement; + node.children = children; + if (this.match(_tokenizerTypes.types.relational) && this.state.value === "<") { + this.raise(this.state.start, "Adjacent JSX elements must be wrapped in an enclosing tag"); + } + return this.finishNode(node, "JSXElement"); +}; + +// Parses entire JSX element from current position. + +pp.jsxParseElement = function () { + var startPos = this.state.start, + startLoc = this.state.startLoc; + this.next(); + return this.jsxParseElementAt(startPos, startLoc); +}; + +exports["default"] = function (instance) { + instance.extend("parseExprAtom", function (inner) { + return function (refShortHandDefaultPos) { + if (this.match(_tokenizerTypes.types.jsxText)) { + var node = this.parseLiteral(this.state.value, "JSXText"); + // https://github.com/babel/babel/issues/2078 + node.extra = null; + return node; + } else if (this.match(_tokenizerTypes.types.jsxTagStart)) { + return this.jsxParseElement(); + } else { + return inner.call(this, refShortHandDefaultPos); + } + }; + }); + + instance.extend("readToken", function (inner) { + return function (code) { + var context = this.curContext(); + + if (context === _tokenizerContext.types.j_expr) { + return this.jsxReadToken(); + } + + if (context === _tokenizerContext.types.j_oTag || context === _tokenizerContext.types.j_cTag) { + if (_utilIdentifier.isIdentifierStart(code)) { + return this.jsxReadWord(); + } + + if (code === 62) { + ++this.state.pos; + return this.finishToken(_tokenizerTypes.types.jsxTagEnd); + } + + if ((code === 34 || code === 39) && context === _tokenizerContext.types.j_oTag) { + return this.jsxReadString(code); + } + } + + if (code === 60 && this.state.exprAllowed) { + ++this.state.pos; + return this.finishToken(_tokenizerTypes.types.jsxTagStart); + } + + return inner.call(this, code); + }; + }); + + instance.extend("updateContext", function (inner) { + return function (prevType) { + if (this.match(_tokenizerTypes.types.braceL)) { + var curContext = this.curContext(); + if (curContext === _tokenizerContext.types.j_oTag) { + this.state.context.push(_tokenizerContext.types.b_expr); + } else if (curContext === _tokenizerContext.types.j_expr) { + this.state.context.push(_tokenizerContext.types.b_tmpl); + } else { + inner.call(this, prevType); + } + this.state.exprAllowed = true; + } else if (this.match(_tokenizerTypes.types.slash) && prevType === _tokenizerTypes.types.jsxTagStart) { + this.state.context.length -= 2; // do not consider JSX expr -> JSX open tag -> ... anymore + this.state.context.push(_tokenizerContext.types.j_cTag); // reconsider as closing tag context + this.state.exprAllowed = false; + } else { + return inner.call(this, prevType); + } + }; + }); +}; + +module.exports = exports["default"]; +},{"13":13,"14":14,"17":17,"18":18,"20":20,"25":25,"5":5}],13:[function(_dereq_,module,exports){ +"use strict"; + +exports.__esModule = true; +exports["default"] = { + quot: "\"", + amp: "&", + apos: "'", + lt: "<", + gt: ">", + nbsp: " ", + iexcl: "¡", + cent: "¢", + pound: "£", + curren: "¤", + yen: "¥", + brvbar: "¦", + sect: "§", + uml: "¨", + copy: "©", + ordf: "ª", + laquo: "«", + not: "¬", + shy: "­", + reg: "®", + macr: "¯", + deg: "°", + plusmn: "±", + sup2: "²", + sup3: "³", + acute: "´", + micro: "µ", + para: "¶", + middot: "·", + cedil: "¸", + sup1: "¹", + ordm: "º", + raquo: "»", + frac14: "¼", + frac12: "½", + frac34: "¾", + iquest: "¿", + Agrave: "À", + Aacute: "Á", + Acirc: "Â", + Atilde: "Ã", + Auml: "Ä", + Aring: "Å", + AElig: "Æ", + Ccedil: "Ç", + Egrave: "È", + Eacute: "É", + Ecirc: "Ê", + Euml: "Ë", + Igrave: "Ì", + Iacute: "Í", + Icirc: "Î", + Iuml: "Ï", + ETH: "Ð", + Ntilde: "Ñ", + Ograve: "Ò", + Oacute: "Ó", + Ocirc: "Ô", + Otilde: "Õ", + Ouml: "Ö", + times: "×", + Oslash: "Ø", + Ugrave: "Ù", + Uacute: "Ú", + Ucirc: "Û", + Uuml: "Ü", + Yacute: "Ý", + THORN: "Þ", + szlig: "ß", + agrave: "à", + aacute: "á", + acirc: "â", + atilde: "ã", + auml: "ä", + aring: "å", + aelig: "æ", + ccedil: "ç", + egrave: "è", + eacute: "é", + ecirc: "ê", + euml: "ë", + igrave: "ì", + iacute: "í", + icirc: "î", + iuml: "ï", + eth: "ð", + ntilde: "ñ", + ograve: "ò", + oacute: "ó", + ocirc: "ô", + otilde: "õ", + ouml: "ö", + divide: "÷", + oslash: "ø", + ugrave: "ù", + uacute: "ú", + ucirc: "û", + uuml: "ü", + yacute: "ý", + thorn: "þ", + yuml: "ÿ", + OElig: "Œ", + oelig: "œ", + Scaron: "Š", + scaron: "š", + Yuml: "Ÿ", + fnof: "ƒ", + circ: "ˆ", + tilde: "˜", + Alpha: "Α", + Beta: "Β", + Gamma: "Γ", + Delta: "Δ", + Epsilon: "Ε", + Zeta: "Ζ", + Eta: "Η", + Theta: "Θ", + Iota: "Ι", + Kappa: "Κ", + Lambda: "Λ", + Mu: "Μ", + Nu: "Ν", + Xi: "Ξ", + Omicron: "Ο", + Pi: "Π", + Rho: "Ρ", + Sigma: "Σ", + Tau: "Τ", + Upsilon: "Υ", + Phi: "Φ", + Chi: "Χ", + Psi: "Ψ", + Omega: "Ω", + alpha: "α", + beta: "β", + gamma: "γ", + delta: "δ", + epsilon: "ε", + zeta: "ζ", + eta: "η", + theta: "θ", + iota: "ι", + kappa: "κ", + lambda: "λ", + mu: "μ", + nu: "ν", + xi: "ξ", + omicron: "ο", + pi: "π", + rho: "ρ", + sigmaf: "ς", + sigma: "σ", + tau: "τ", + upsilon: "υ", + phi: "φ", + chi: "χ", + psi: "ψ", + omega: "ω", + thetasym: "ϑ", + upsih: "ϒ", + piv: "ϖ", + ensp: " ", + emsp: " ", + thinsp: " ", + zwnj: "‌", + zwj: "‍", + lrm: "‎", + rlm: "‏", + ndash: "–", + mdash: "—", + lsquo: "‘", + rsquo: "’", + sbquo: "‚", + ldquo: "“", + rdquo: "”", + bdquo: "„", + dagger: "†", + Dagger: "‡", + bull: "•", + hellip: "…", + permil: "‰", + prime: "′", + Prime: "″", + lsaquo: "‹", + rsaquo: "›", + oline: "‾", + frasl: "⁄", + euro: "€", + image: "ℑ", + weierp: "℘", + real: "ℜ", + trade: "™", + alefsym: "ℵ", + larr: "←", + uarr: "↑", + rarr: "→", + darr: "↓", + harr: "↔", + crarr: "↵", + lArr: "⇐", + uArr: "⇑", + rArr: "⇒", + dArr: "⇓", + hArr: "⇔", + forall: "∀", + part: "∂", + exist: "∃", + empty: "∅", + nabla: "∇", + isin: "∈", + notin: "∉", + ni: "∋", + prod: "∏", + sum: "∑", + minus: "−", + lowast: "∗", + radic: "√", + prop: "∝", + infin: "∞", + ang: "∠", + and: "∧", + or: "∨", + cap: "∩", + cup: "∪", + "int": "∫", + there4: "∴", + sim: "∼", + cong: "≅", + asymp: "≈", + ne: "≠", + equiv: "≡", + le: "≤", + ge: "≥", + sub: "⊂", + sup: "⊃", + nsub: "⊄", + sube: "⊆", + supe: "⊇", + oplus: "⊕", + otimes: "⊗", + perp: "⊥", + sdot: "⋅", + lceil: "⌈", + rceil: "⌉", + lfloor: "⌊", + rfloor: "⌋", + lang: "〈", + rang: "〉", + loz: "◊", + spades: "♠", + clubs: "♣", + hearts: "♥", + diams: "♦" +}; +module.exports = exports["default"]; +},{}],14:[function(_dereq_,module,exports){ +// The algorithm used to determine whether a regexp can appear at a +// given point in the program is loosely based on sweet.js' approach. +// See https://github.com/mozilla/sweet.js/wiki/design + +"use strict"; + +var _classCallCheck = _dereq_(23)["default"]; + +exports.__esModule = true; + +var _types = _dereq_(17); + +var _utilWhitespace = _dereq_(20); + +var TokContext = function TokContext(token, isExpr, preserveSpace, override) { + _classCallCheck(this, TokContext); + + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; +}; + +exports.TokContext = TokContext; +var types = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", true), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function (p) { + return p.readTmplToken(); + }), + f_expr: new TokContext("function", true) +}; + +exports.types = types; +// Token-specific context update code + +_types.types.parenR.updateContext = _types.types.braceR.updateContext = function () { + if (this.state.context.length === 1) { + this.state.exprAllowed = true; + return; + } + + var out = this.state.context.pop(); + if (out === types.b_stat && this.curContext() === types.f_expr) { + this.state.context.pop(); + this.state.exprAllowed = false; + } else if (out === types.b_tmpl) { + this.state.exprAllowed = true; + } else { + this.state.exprAllowed = !out.isExpr; + } +}; + +_types.types.name.updateContext = function (prevType) { + this.state.exprAllowed = false; + + if (prevType === _types.types._let || prevType === _types.types._const || prevType === _types.types._var) { + if (_utilWhitespace.lineBreak.test(this.input.slice(this.state.end))) { + this.state.exprAllowed = true; + } + } +}; + +_types.types.braceL.updateContext = function (prevType) { + this.state.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr); + this.state.exprAllowed = true; +}; + +_types.types.dollarBraceL.updateContext = function () { + this.state.context.push(types.b_tmpl); + this.state.exprAllowed = true; +}; + +_types.types.parenL.updateContext = function (prevType) { + var statementParens = prevType === _types.types._if || prevType === _types.types._for || prevType === _types.types._with || prevType === _types.types._while; + this.state.context.push(statementParens ? types.p_stat : types.p_expr); + this.state.exprAllowed = true; +}; + +_types.types.incDec.updateContext = function () { + // tokExprAllowed stays unchanged +}; + +_types.types._function.updateContext = function () { + if (this.curContext() !== types.b_stat) { + this.state.context.push(types.f_expr); + } + + this.state.exprAllowed = false; +}; + +_types.types.backQuote.updateContext = function () { + if (this.curContext() === types.q_tmpl) { + this.state.context.pop(); + } else { + this.state.context.push(types.q_tmpl); + } + this.state.exprAllowed = false; +}; +},{"17":17,"20":20,"23":23}],15:[function(_dereq_,module,exports){ +/* eslint max-len: 0 */ +/* eslint indent: 0 */ + +"use strict"; + +var _classCallCheck = _dereq_(23)["default"]; + +var _interopRequireDefault = _dereq_(25)["default"]; + +exports.__esModule = true; + +var _utilIdentifier = _dereq_(18); + +var _types = _dereq_(17); + +var _context = _dereq_(14); + +var _utilLocation = _dereq_(19); + +var _utilWhitespace = _dereq_(20); + +var _state = _dereq_(16); + +var _state2 = _interopRequireDefault(_state); + +// Object type used to represent tokens. Note that normally, tokens +// simply exist as properties on the parser object. This is only +// used for the onToken callback and the external tokenizer. + +var Token = function Token(state) { + _classCallCheck(this, Token); + + this.type = state.type; + this.value = state.value; + this.start = state.start; + this.end = state.end; + this.loc = new _utilLocation.SourceLocation(state.startLoc, state.endLoc); +} + +// ## Tokenizer + +; + +exports.Token = Token; +function codePointToString(code) { + // UTF-16 Decoding + if (code <= 0xFFFF) { + return String.fromCharCode(code); + } else { + return String.fromCharCode((code - 0x10000 >> 10) + 0xD800, (code - 0x10000 & 1023) + 0xDC00); + } +} + +var Tokenizer = (function () { + function Tokenizer(options, input) { + _classCallCheck(this, Tokenizer); + + this.state = new _state2["default"](); + this.state.init(options, input); + } + + // Move to the next token + + Tokenizer.prototype.next = function next() { + if (!this.isLookahead) { + this.state.tokens.push(new Token(this.state)); + } + + this.state.lastTokEnd = this.state.end; + this.state.lastTokStart = this.state.start; + this.state.lastTokEndLoc = this.state.endLoc; + this.state.lastTokStartLoc = this.state.startLoc; + this.nextToken(); + }; + + // TODO + + Tokenizer.prototype.eat = function eat(type) { + if (this.match(type)) { + this.next(); + return true; + } else { + return false; + } + }; + + // TODO + + Tokenizer.prototype.match = function match(type) { + return this.state.type === type; + }; + + // TODO + + Tokenizer.prototype.isKeyword = function isKeyword(word) { + return _utilIdentifier.isKeyword(word); + }; + + // TODO + + Tokenizer.prototype.lookahead = function lookahead() { + var old = this.state; + this.state = old.clone(true); + + this.isLookahead = true; + this.next(); + this.isLookahead = false; + + var curr = this.state.clone(true); + this.state = old; + return curr; + }; + + // Toggle strict mode. Re-reads the next number or string to please + // pedantic tests (`"use strict"; 010;` should fail). + + Tokenizer.prototype.setStrict = function setStrict(strict) { + this.state.strict = strict; + if (!this.match(_types.types.num) && !this.match(_types.types.string)) return; + this.state.pos = this.state.start; + while (this.state.pos < this.state.lineStart) { + this.state.lineStart = this.input.lastIndexOf("\n", this.state.lineStart - 2) + 1; + --this.state.curLine; + } + this.nextToken(); + }; + + Tokenizer.prototype.curContext = function curContext() { + return this.state.context[this.state.context.length - 1]; + }; + + // Read a single token, updating the parser object's token-related + // properties. + + Tokenizer.prototype.nextToken = function nextToken() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) this.skipSpace(); + + this.state.containsOctal = false; + this.state.octalPosition = null; + this.state.start = this.state.pos; + this.state.startLoc = this.state.curPosition(); + if (this.state.pos >= this.input.length) return this.finishToken(_types.types.eof); + + if (curContext.override) { + return curContext.override(this); + } else { + return this.readToken(this.fullCharCodeAtPos()); + } + }; + + Tokenizer.prototype.readToken = function readToken(code) { + // Identifier or keyword. '\uXXXX' sequences are allowed in + // identifiers, so '\' also dispatches to that. + if (_utilIdentifier.isIdentifierStart(code) || code === 92 /* '\' */) { + return this.readWord(); + } else { + return this.getTokenFromCode(code); + } + }; + + Tokenizer.prototype.fullCharCodeAtPos = function fullCharCodeAtPos() { + var code = this.input.charCodeAt(this.state.pos); + if (code <= 0xd7ff || code >= 0xe000) return code; + + var next = this.input.charCodeAt(this.state.pos + 1); + return (code << 10) + next - 0x35fdc00; + }; + + Tokenizer.prototype.pushComment = function pushComment(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "CommentBlock" : "CommentLine", + value: text, + start: start, + end: end, + loc: new _utilLocation.SourceLocation(startLoc, endLoc) + }; + + if (!this.isLookahead) { + this.state.tokens.push(comment); + this.state.comments.push(comment); + } + + this.addComment(comment); + }; + + Tokenizer.prototype.skipBlockComment = function skipBlockComment() { + var startLoc = this.state.curPosition(); + var start = this.state.pos, + end = this.input.indexOf("*/", this.state.pos += 2); + if (end === -1) this.raise(this.state.pos - 2, "Unterminated comment"); + + this.state.pos = end + 2; + _utilWhitespace.lineBreakG.lastIndex = start; + var match = undefined; + while ((match = _utilWhitespace.lineBreakG.exec(this.input)) && match.index < this.state.pos) { + ++this.state.curLine; + this.state.lineStart = match.index + match[0].length; + } + + this.pushComment(true, this.input.slice(start + 2, end), start, this.state.pos, startLoc, this.state.curPosition()); + }; + + Tokenizer.prototype.skipLineComment = function skipLineComment(startSkip) { + var start = this.state.pos; + var startLoc = this.state.curPosition(); + var ch = this.input.charCodeAt(this.state.pos += startSkip); + while (this.state.pos < this.input.length && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) { + ++this.state.pos; + ch = this.input.charCodeAt(this.state.pos); + } + + this.pushComment(false, this.input.slice(start + startSkip, this.state.pos), start, this.state.pos, startLoc, this.state.curPosition()); + }; + + // Called at the start of the parse and after every token. Skips + // whitespace and comments, and. + + Tokenizer.prototype.skipSpace = function skipSpace() { + loop: while (this.state.pos < this.input.length) { + var ch = this.input.charCodeAt(this.state.pos); + switch (ch) { + case 32:case 160: + // ' ' + ++this.state.pos; + break; + + case 13: + if (this.input.charCodeAt(this.state.pos + 1) === 10) { + ++this.state.pos; + } + + case 10:case 8232:case 8233: + ++this.state.pos; + ++this.state.curLine; + this.state.lineStart = this.state.pos; + break; + + case 47: + // '/' + switch (this.input.charCodeAt(this.state.pos + 1)) { + case 42: + // '*' + this.skipBlockComment(); + break; + + case 47: + this.skipLineComment(2); + break; + + default: + break loop; + } + break; + + default: + if (ch > 8 && ch < 14 || ch >= 5760 && _utilWhitespace.nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this.state.pos; + } else { + break loop; + } + } + } + }; + + // Called at the end of every token. Sets `end`, `val`, and + // maintains `context` and `exprAllowed`, and skips the space after + // the token, so that the next one's `start` will point at the + // right position. + + Tokenizer.prototype.finishToken = function finishToken(type, val) { + this.state.end = this.state.pos; + this.state.endLoc = this.state.curPosition(); + var prevType = this.state.type; + this.state.type = type; + this.state.value = val; + + this.updateContext(prevType); + }; + + // ### Token reading + + // This is the function that is called to fetch the next token. It + // is somewhat obscure, because it works in character codes rather + // than characters, and because operator parsing has been inlined + // into it. + // + // All in the name of speed. + // + + Tokenizer.prototype.readToken_dot = function readToken_dot() { + var next = this.input.charCodeAt(this.state.pos + 1); + if (next >= 48 && next <= 57) { + return this.readNumber(true); + } + + var next2 = this.input.charCodeAt(this.state.pos + 2); + if (next === 46 && next2 === 46) { + // 46 = dot '.' + this.state.pos += 3; + return this.finishToken(_types.types.ellipsis); + } else { + ++this.state.pos; + return this.finishToken(_types.types.dot); + } + }; + + Tokenizer.prototype.readToken_slash = function readToken_slash() { + // '/' + if (this.state.exprAllowed) { + ++this.state.pos; + return this.readRegexp(); + } + + var next = this.input.charCodeAt(this.state.pos + 1); + if (next === 61) { + return this.finishOp(_types.types.assign, 2); + } else { + return this.finishOp(_types.types.slash, 1); + } + }; + + Tokenizer.prototype.readToken_mult_modulo = function readToken_mult_modulo(code) { + // '%*' + var type = code === 42 ? _types.types.star : _types.types.modulo; + var width = 1; + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === 42 && this.hasPlugin("exponentiationOperator")) { + // '*' + width++; + next = this.input.charCodeAt(this.state.pos + 2); + type = _types.types.exponent; + } + + if (next === 61) { + width++; + type = _types.types.assign; + } + + return this.finishOp(type, width); + }; + + Tokenizer.prototype.readToken_pipe_amp = function readToken_pipe_amp(code) { + // '|&' + var next = this.input.charCodeAt(this.state.pos + 1); + if (next === code) return this.finishOp(code === 124 ? _types.types.logicalOR : _types.types.logicalAND, 2); + if (next === 61) return this.finishOp(_types.types.assign, 2); + return this.finishOp(code === 124 ? _types.types.bitwiseOR : _types.types.bitwiseAND, 1); + }; + + Tokenizer.prototype.readToken_caret = function readToken_caret() { + // '^' + var next = this.input.charCodeAt(this.state.pos + 1); + if (next === 61) { + return this.finishOp(_types.types.assign, 2); + } else { + return this.finishOp(_types.types.bitwiseXOR, 1); + } + }; + + Tokenizer.prototype.readToken_plus_min = function readToken_plus_min(code) { + // '+-' + var next = this.input.charCodeAt(this.state.pos + 1); + + if (next === code) { + if (next === 45 && this.input.charCodeAt(this.state.pos + 2) === 62 && _utilWhitespace.lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.pos))) { + // A `-->` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken(); + } + return this.finishOp(_types.types.incDec, 2); + } + + if (next === 61) { + return this.finishOp(_types.types.assign, 2); + } else { + return this.finishOp(_types.types.plusMin, 1); + } + }; + + Tokenizer.prototype.readToken_lt_gt = function readToken_lt_gt(code) { + // '<>' + var next = this.input.charCodeAt(this.state.pos + 1); + var size = 1; + + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.state.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.state.pos + size) === 61) return this.finishOp(_types.types.assign, size + 1); + return this.finishOp(_types.types.bitShift, size); + } + + if (next === 33 && code === 60 && this.input.charCodeAt(this.state.pos + 2) === 45 && this.input.charCodeAt(this.state.pos + 3) === 45) { + if (this.inModule) this.unexpected(); + // `0;)d in g?g[b]=g[d]:delete g[b],b+=j,d+=j;return g}},function(c,d,a){var b=a(3);b(b.P,"Array",{fill:a(125)}),a(118)("fill")},function(d,g,b){var e=b(21),c=b(26),f=b(27);d.exports=[].fill||function fill(k){for(var b=e(this),d=f(b.length),g=arguments,h=g.length,i=c(h>1?g[1]:a,d),j=h>2?g[2]:a,l=j===a?d:c(j,d);l>i;)b[i++]=k;return b}},function(g,h,b){var c=b(3),f=b(28)(5),d="find",e=!0;d in[]&&Array(1)[d](function(){e=!1}),c(c.P+c.F*e,"Array",{find:function find(b){return f(this,b,arguments.length>1?arguments[1]:a)}}),b(118)(d)},function(g,h,b){var c=b(3),f=b(28)(6),d="findIndex",e=!0;d in[]&&Array(1)[d](function(){e=!1}),c(c.P+c.F*e,"Array",{findIndex:function findIndex(b){return f(this,b,arguments.length>1?arguments[1]:a)}}),b(118)(d)},function(n,m,c){var f=c(2),i=c(4),k=c(101),l=c(129),b=i.RegExp,d=b,j=b.prototype,e=/a/g,g=/a/g,h=new b(e)!==e;!c(8)||h&&!c(9)(function(){return g[c(31)("match")]=!1,b(e)!=e||b(g)==g||"/a/i"!=b(e,"i")})||(b=function RegExp(c,f){var e=k(c),g=f===a;return this instanceof b||!e||c.constructor!==b||!g?h?new d(e&&!g?c.source:c,f):d((e=c instanceof b)?c.source:c,e&&g?l.call(c):f):c},f.each.call(f.getNames(d),function(a){a in b||f.setDesc(b,a,{configurable:!0,get:function(){return d[a]},set:function(b){d[a]=b}})}),j.constructor=b,b.prototype=j,c(10)(i,"RegExp",b)),c(121)("RegExp")},function(a,d,b){var c=b(20);a.exports=function(){var b=c(this),a="";return b.global&&(a+="g"),b.ignoreCase&&(a+="i"),b.multiline&&(a+="m"),b.unicode&&(a+="u"),b.sticky&&(a+="y"),a}},function(c,d,a){var b=a(2);a(8)&&"g"!=/./g.flags&&b.setDesc(RegExp.prototype,"flags",{configurable:!0,get:a(129)})},function(c,d,b){b(132)("match",1,function(c,b){return function match(d){var e=c(this),f=d==a?a:d[b];return f!==a?f.call(d,e):new RegExp(d)[b](String(e))}})},function(b,h,a){var c=a(6),d=a(10),e=a(9),f=a(22),g=a(31);b.exports=function(a,i,j){var b=g(a),h=""[a];e(function(){var c={};return c[b]=function(){return 7},7!=""[a](c)})&&(d(String.prototype,a,j(f,b,h)),c(RegExp.prototype,b,2==i?function(a,b){return h.call(a,this,b)}:function(a){return h.call(a,this)}))}},function(c,d,b){b(132)("replace",2,function(b,c,d){return function replace(e,f){var g=b(this),h=e==a?a:e[c];return h!==a?h.call(e,g,f):d.call(String(g),e,f)}})},function(c,d,b){b(132)("search",1,function(c,b){return function search(d){var e=c(this),f=d==a?a:d[b];return f!==a?f.call(d,e):new RegExp(d)[b](String(e))}})},function(c,d,b){b(132)("split",2,function(b,c,d){return function split(e,f){var g=b(this),h=e==a?a:e[c];return h!==a?h.call(e,g,f):d.call(String(g),e,f)}})},function(J,I,b){var r,k=b(2),F=b(39),i=b(4),j=b(12),y=b(47),d=b(3),C=b(16),E=b(20),m=b(13),G=b(137),w=b(138),p=b(45).set,A=b(43),z=b(31)("species"),D=b(139),n=b(140),e="Promise",o=i.process,H="process"==y(o),c=i[e],q=function(b){var a=new c(function(){});return b&&(a.constructor=Object),c.resolve(a)===a},g=function(){function P2(b){var a=new c(b);return p(a,P2.prototype),a}var a=!1;try{if(a=c&&c.resolve&&q(),p(P2,c),P2.prototype=k.create(c.prototype,{constructor:{ +value:P2}}),P2.resolve(5).then(function(){})instanceof P2||(a=!1),a&&b(8)){var d=!1;c.resolve(k.setDesc({},"then",{get:function(){d=!0}})),a=d}}catch(e){a=!1}return a}(),B=function(a,b){return F&&a===c&&b===r?!0:A(a,b)},s=function(b){var c=E(b)[z];return c!=a?c:b},t=function(a){var b;return C(a)&&"function"==typeof(b=a.then)?b:!1},h=function(d){var b,c;this.promise=new d(function(d,e){if(b!==a||c!==a)throw TypeError("Bad Promise constructor");b=d,c=e}),this.resolve=m(b),this.reject=m(c)},v=function(a){try{a()}catch(b){return{error:b}}},l=function(b,d){if(!b.n){b.n=!0;var c=b.c;n(function(){for(var e=b.v,f=1==b.s,g=0,h=function(a){var c,h,g=f?a.ok:a.fail,i=a.resolve,d=a.reject;try{g?(f||(b.h=!0),c=g===!0?e:g(e),c===a.promise?d(TypeError("Promise-chain cycle")):(h=t(c))?h.call(c,i,d):i(c)):d(e)}catch(j){d(j)}};c.length>g;)h(c[g++]);c.length=0,b.n=!1,d&&setTimeout(function(){var f,c,d=b.p;x(d)&&(H?o.emit("unhandledRejection",e,d):(f=i.onunhandledrejection)?f({promise:d,reason:e}):(c=i.console)&&c.error&&c.error("Unhandled promise rejection",e)),b.a=a},1)})}},x=function(e){var a,b=e._d,c=b.a||b.c,d=0;if(b.h)return!1;for(;c.length>d;)if(a=c[d++],a.fail||!x(a.promise))return!1;return!0},f=function(b){var a=this;a.d||(a.d=!0,a=a.r||a,a.v=b,a.s=2,a.a=a.c.slice(),l(a,!0))},u=function(b){var c,a=this;if(!a.d){a.d=!0,a=a.r||a;try{if(a.p===b)throw TypeError("Promise can't be resolved itself");(c=t(b))?n(function(){var d={r:a,d:!1};try{c.call(b,j(u,d,1),j(f,d,1))}catch(e){f.call(d,e)}}):(a.v=b,a.s=1,l(a,!1))}catch(d){f.call({r:a,d:!1},d)}}};g||(c=function Promise(d){m(d);var b=this._d={p:G(this,c,e),c:[],a:a,s:0,d:!1,v:a,h:!1,n:!1};try{d(j(u,b,1),j(f,b,1))}catch(g){f.call(b,g)}},b(142)(c.prototype,{then:function then(d,e){var a=new h(D(this,c)),f=a.promise,b=this._d;return a.ok="function"==typeof d?d:!0,a.fail="function"==typeof e&&e,b.c.push(a),b.a&&b.a.push(a),b.s&&l(b,!1),f},"catch":function(b){return this.then(a,b)}})),d(d.G+d.W+d.F*!g,{Promise:c}),b(35)(c,e),b(121)(e),r=b(5)[e],d(d.S+d.F*!g,e,{reject:function reject(b){var a=new h(this),c=a.reject;return c(b),a.promise}}),d(d.S+d.F*(!g||q(!0)),e,{resolve:function resolve(a){if(a instanceof c&&B(a.constructor,this))return a;var b=new h(this),d=b.resolve;return d(a),b.promise}}),d(d.S+d.F*!(g&&b(115)(function(a){c.all(a)["catch"](function(){})})),e,{all:function all(g){var c=s(this),b=new h(c),d=b.resolve,e=b.reject,a=[],f=v(function(){w(g,!1,a.push,a);var b=a.length,f=Array(b);b?k.each.call(a,function(g,h){var a=!1;c.resolve(g).then(function(c){a||(a=!0,f[h]=c,--b||d(f))},e)}):d(f)});return f&&e(f.error),b.promise},race:function race(e){var b=s(this),a=new h(b),c=a.reject,d=v(function(){w(e,!1,function(d){b.resolve(d).then(a.resolve,c)})});return d&&c(d.error),a.promise}})},function(a,b){a.exports=function(a,b,c){if(!(a instanceof b))throw TypeError(c+": use the 'new' operator!");return a}},function(b,i,a){var c=a(12),d=a(112),e=a(113),f=a(20),g=a(27),h=a(114);b.exports=function(a,j,o,p){var n,b,k,l=h(a),m=c(o,p,j?2:1),i=0;if("function"!=typeof l)throw TypeError(a+" is not iterable!");if(e(l))for(n=g(a.length);n>i;i++)j?m(f(b=a[i])[0],b[1]):m(a[i]);else for(k=l.call(a);!(b=k.next()).done;)d(k,m,b.value,j)}},function(d,g,b){var c=b(20),e=b(13),f=b(31)("species");d.exports=function(g,h){var b,d=c(g).constructor;return d===a||(b=c(d)[f])==a?h:e(b)}},function(n,p,h){var b,f,g,c=h(4),o=h(141).set,k=c.MutationObserver||c.WebKitMutationObserver,d=c.process,i=c.Promise,j="process"==h(18)(d),e=function(){var e,c,g;for(j&&(e=d.domain)&&(d.domain=null,e.exit());b;)c=b.domain,g=b.fn,c&&c.enter(),g(),c&&c.exit(),b=b.next;f=a,e&&e.enter()};if(j)g=function(){d.nextTick(e)};else if(k){var m=1,l=document.createTextNode("");new k(e).observe(l,{characterData:!0}),g=function(){l.data=m=-m}}else g=i&&i.resolve?function(){i.resolve().then(e)}:function(){o.call(c,e)};n.exports=function asap(e){var c={fn:e,next:a,domain:j&&d.domain};f&&(f.next=c),b||(b=c,g()),f=c}},function(s,t,b){var c,g,f,k=b(12),r=b(19),n=b(14),p=b(15),a=b(4),l=a.process,h=a.setImmediate,i=a.clearImmediate,o=a.MessageChannel,j=0,d={},q="onreadystatechange",e=function(){var a=+this;if(d.hasOwnProperty(a)){var b=d[a];delete d[a],b()}},m=function(a){e.call(a.data)};h&&i||(h=function setImmediate(a){for(var b=[],e=1;arguments.length>e;)b.push(arguments[e++]);return d[++j]=function(){r("function"==typeof a?a:Function(a),b)},c(j),j},i=function clearImmediate(a){delete d[a]},"process"==b(18)(l)?c=function(a){l.nextTick(k(e,a,1))}:o?(g=new o,f=g.port2,g.port1.onmessage=m,c=k(f.postMessage,f,1)):a.addEventListener&&"function"==typeof postMessage&&!a.importScripts?(c=function(b){a.postMessage(b+"","*")},a.addEventListener("message",m,!1)):c=q in p("script")?function(a){n.appendChild(p("script"))[q]=function(){n.removeChild(this),e.call(a)}}:function(a){setTimeout(k(e,a,1),0)}),s.exports={set:h,clear:i}},function(a,d,b){var c=b(10);a.exports=function(a,b){for(var d in b)c(a,d,b[d]);return a}},function(d,e,c){var b=c(144);c(145)("Map",function(b){return function Map(){return b(this,arguments.length>0?arguments[0]:a)}},{get:function get(c){var a=b.getEntry(this,c);return a&&a.v},set:function set(a,c){return b.def(this,0===a?0:a,c)}},b,!0)},function(v,w,b){var j=b(2),m=b(6),o=b(142),n=b(12),p=b(137),r=b(22),t=b(138),l=b(108),d=b(119),f=b(11)("id"),k=b(17),h=b(16),q=b(121),i=b(8),s=Object.isExtensible||h,c=i?"_s":"size",u=0,g=function(a,b){if(!h(a))return"symbol"==typeof a?a:("string"==typeof a?"S":"P")+a;if(!k(a,f)){if(!s(a))return"F";if(!b)return"E";m(a,f,++u)}return"O"+a[f]},e=function(b,c){var a,d=g(c);if("F"!==d)return b._i[d];for(a=b._f;a;a=a.n)if(a.k==c)return a};v.exports={getConstructor:function(d,f,g,h){var b=d(function(d,e){p(d,b,f),d._i=j.create(null),d._f=a,d._l=a,d[c]=0,e!=a&&t(e,g,d[h],d)});return o(b.prototype,{clear:function clear(){for(var d=this,e=d._i,b=d._f;b;b=b.n)b.r=!0,b.p&&(b.p=b.p.n=a),delete e[b.i];d._f=d._l=a,d[c]=0},"delete":function(g){var b=this,a=e(b,g);if(a){var d=a.n,f=a.p;delete b._i[a.i],a.r=!0,f&&(f.n=d),d&&(d.p=f),b._f==a&&(b._f=d),b._l==a&&(b._l=f),b[c]--}return!!a},forEach:function forEach(c){for(var b,d=n(c,arguments.length>1?arguments[1]:a,3);b=b?b.n:this._f;)for(d(b.v,b.k,this);b&&b.r;)b=b.p},has:function has(a){return!!e(this,a)}}),i&&j.setDesc(b.prototype,"size",{get:function(){return r(this[c])}}),b},def:function(b,f,j){var h,i,d=e(b,f);return d?d.v=j:(b._l=d={i:i=g(f,!0),k:f,v:j,p:h=b._l,n:a,r:!1},b._f||(b._f=d),h&&(h.n=d),b[c]++,"F"!==i&&(b._i[i]=d)),b},getEntry:e,setStrong:function(e,b,c){l(e,b,function(b,c){this._t=b,this._k=c,this._l=a},function(){for(var c=this,e=c._k,b=c._l;b&&b.r;)b=b.p;return c._t&&(c._l=b=b?b.n:c._t._f)?"keys"==e?d(0,b.k):"values"==e?d(0,b.v):d(0,[b.k,b.v]):(c._t=a,d(1))},c?"entries":"values",!c,!0),q(b)}}},function(l,n,b){var k=b(4),c=b(3),g=b(10),f=b(142),i=b(138),j=b(137),d=b(16),e=b(9),h=b(115),m=b(35);l.exports=function(o,v,y,x,p,l){var t=k[o],b=t,s=p?"set":"add",n=b&&b.prototype,w={},r=function(b){var c=n[b];g(n,b,"delete"==b?function(a){return l&&!d(a)?!1:c.call(this,0===a?0:a)}:"has"==b?function has(a){return l&&!d(a)?!1:c.call(this,0===a?0:a)}:"get"==b?function get(b){return l&&!d(b)?a:c.call(this,0===b?0:b)}:"add"==b?function add(a){return c.call(this,0===a?0:a),this}:function set(a,b){return c.call(this,0===a?0:a,b),this})};if("function"==typeof b&&(l||n.forEach&&!e(function(){(new b).entries().next()}))){var u,q=new b,z=q[s](l?{}:-0,1)!=q,A=e(function(){q.has(1)}),B=h(function(a){new b(a)});B||(b=v(function(e,d){j(e,b,o);var c=new t;return d!=a&&i(d,p,c[s],c),c}),b.prototype=n,n.constructor=b),l||q.forEach(function(b,a){u=1/a===-(1/0)}),(A||u)&&(r("delete"),r("has"),p&&r("get")),(u||z)&&r(s),l&&n.clear&&delete n.clear}else b=x.getConstructor(v,o,p,s),f(b.prototype,y);return m(b,o),w[o]=b,c(c.G+c.W+c.F*(b!=t),w),l||x.setStrong(b,o,p),b}},function(d,e,b){var c=b(144);b(145)("Set",function(b){return function Set(){return b(this,arguments.length>0?arguments[0]:a)}},{add:function add(a){return c.def(this,a=0===a?0:a,a)}},c)},function(n,m,b){var l=b(2),k=b(10),c=b(148),d=b(16),j=b(17),i=c.frozenStore,h=c.WEAK,f=Object.isExtensible||d,e={},g=b(145)("WeakMap",function(b){return function WeakMap(){return b(this,arguments.length>0?arguments[0]:a)}},{get:function get(a){if(d(a)){if(!f(a))return i(this).get(a);if(j(a,h))return a[h][this._i]}},set:function set(a,b){return c.def(this,a,b)}},c,!0,!0);7!=(new g).set((Object.freeze||Object)(e),7).get(e)&&l.each.call(["delete","has","get","set"],function(a){var b=g.prototype,c=b[a];k(b,a,function(b,e){if(d(b)&&!f(b)){var g=i(this)[a](b,e);return"set"==a?this:g}return c.call(this,b,e)})})},function(s,t,b){var r=b(6),q=b(142),m=b(20),h=b(16),l=b(137),k=b(138),j=b(28),d=b(17),c=b(11)("weak"),g=Object.isExtensible||h,n=j(5),o=j(6),p=0,e=function(a){return a._l||(a._l=new i)},i=function(){this.a=[]},f=function(a,b){return n(a.a,function(a){return a[0]===b})};i.prototype={get:function(b){var a=f(this,b);return a?a[1]:void 0},has:function(a){return!!f(this,a)},set:function(a,b){var c=f(this,a);c?c[1]=b:this.a.push([a,b])},"delete":function(b){var a=o(this.a,function(a){return a[0]===b});return~a&&this.a.splice(a,1),!!~a}},s.exports={getConstructor:function(f,i,j,m){var b=f(function(c,d){l(c,b,i),c._i=p++,c._l=a,d!=a&&k(d,j,c[m],c)});return q(b.prototype,{"delete":function(a){return h(a)?g(a)?d(a,c)&&d(a[c],this._i)&&delete a[c][this._i]:e(this)["delete"](a):!1},has:function has(a){return h(a)?g(a)?d(a,c)&&d(a[c],this._i):e(this).has(a):!1}}),b},def:function(b,a,f){return g(m(a))?(d(a,c)||r(a,c,{}),a[c][b._i]=f):e(b).set(a,f),b},frozenStore:e,WEAK:c}},function(d,e,b){var c=b(148);b(145)("WeakSet",function(b){return function WeakSet(){return b(this,arguments.length>0?arguments[0]:a)}},{add:function add(a){return c.def(this,a,!0)}},c,!1,!0)},function(d,e,b){var a=b(3),c=Function.apply;a(a.S,"Reflect",{apply:function apply(a,b,d){return c.call(a,b,d)}})},function(i,j,b){var f=b(2),c=b(3),d=b(13),g=b(20),e=b(16),h=Function.bind||b(5).Function.prototype.bind;c(c.S+c.F*b(9)(function(){function F(){}return!(Reflect.construct(function(){},[],F)instanceof F)}),"Reflect",{construct:function construct(c,b){d(c);var j=arguments.length<3?c:d(arguments[2]);if(c==j){if(b!=a)switch(g(b).length){case 0:return new c;case 1:return new c(b[0]);case 2:return new c(b[0],b[1]);case 3:return new c(b[0],b[1],b[2]);case 4:return new c(b[0],b[1],b[2],b[3])}var i=[null];return i.push.apply(i,b),new(h.apply(c,i))}var k=j.prototype,l=f.create(e(k)?k:Object.prototype),m=Function.apply.call(c,l,b);return e(m)?m:l}})},function(e,f,a){var c=a(2),b=a(3),d=a(20);b(b.S+b.F*a(9)(function(){Reflect.defineProperty(c.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function defineProperty(a,b,e){d(a);try{return c.setDesc(a,b,e),!0}catch(f){return!1}}})},function(e,f,a){var b=a(3),c=a(2).getDesc,d=a(20);b(b.S,"Reflect",{deleteProperty:function deleteProperty(a,b){var e=c(d(a),b);return e&&!e.configurable?!1:delete a[b]}})},function(f,g,b){var c=b(3),e=b(20),d=function(a){this._t=e(a),this._i=0;var b,c=this._k=[];for(b in a)c.push(b)};b(110)(d,"Object",function(){var c,b=this,d=b._k;do if(b._i>=d.length)return{value:a,done:!0};while(!((c=d[b._i++])in b._t));return{value:c,done:!1}}),c(c.S,"Reflect",{enumerate:function enumerate(a){return new d(a)}})},function(h,i,b){function get(b,h){var d,j,i=arguments.length<3?b:arguments[2];return g(b)===i?b[h]:(d=c.getDesc(b,h))?e(d,"value")?d.value:d.get!==a?d.get.call(i):a:f(j=c.getProto(b))?get(j,h,i):void 0}var c=b(2),e=b(17),d=b(3),f=b(16),g=b(20);d(d.S,"Reflect",{get:get})},function(e,f,a){var c=a(2),b=a(3),d=a(20);b(b.S,"Reflect",{getOwnPropertyDescriptor:function getOwnPropertyDescriptor(a,b){return c.getDesc(d(a),b)}})},function(e,f,a){var b=a(3),c=a(2).getProto,d=a(20);b(b.S,"Reflect",{getPrototypeOf:function getPrototypeOf(a){return c(d(a))}})},function(c,d,b){var a=b(3);a(a.S,"Reflect",{has:function has(a,b){return b in a}})},function(e,f,a){var b=a(3),d=a(20),c=Object.isExtensible;b(b.S,"Reflect",{isExtensible:function isExtensible(a){return d(a),c?c(a):!0}})},function(c,d,a){var b=a(3);b(b.S,"Reflect",{ownKeys:a(161)})},function(d,f,a){var b=a(2),e=a(20),c=a(4).Reflect;d.exports=c&&c.ownKeys||function ownKeys(a){var c=b.getNames(e(a)),d=b.getSymbols;return d?c.concat(d(a)):c}},function(e,f,a){var b=a(3),d=a(20),c=Object.preventExtensions;b(b.S,"Reflect",{preventExtensions:function preventExtensions(a){d(a);try{return c&&c(a),!0}catch(b){return!1}}})},function(i,j,b){function set(j,i,k){var l,m,d=arguments.length<4?j:arguments[3],b=c.getDesc(h(j),i);if(!b){if(f(m=c.getProto(j)))return set(m,i,k,d);b=e(0)}return g(b,"value")?b.writable!==!1&&f(d)?(l=c.getDesc(d,i)||e(0),l.value=k,c.setDesc(d,i,l),!0):!1:b.set===a?!1:(b.set.call(d,k),!0)}var c=b(2),g=b(17),d=b(3),e=b(7),h=b(20),f=b(16);d(d.S,"Reflect",{set:set})},function(d,e,b){var c=b(3),a=b(45);a&&c(c.S,"Reflect",{setPrototypeOf:function setPrototypeOf(b,c){a.check(b,c);try{return a.set(b,c),!0}catch(d){return!1}}})},function(e,f,b){var c=b(3),d=b(33)(!0);c(c.P,"Array",{includes:function includes(b){return d(this,b,arguments.length>1?arguments[1]:a)}}),b(118)("includes")},function(d,e,a){var b=a(3),c=a(98)(!0);b(b.P,"String",{at:function at(a){return c(this,a)}})},function(e,f,b){var c=b(3),d=b(168);c(c.P,"String",{padLeft:function padLeft(b){return d(this,b,arguments.length>1?arguments[1]:a,!0)}})},function(c,g,b){var d=b(27),e=b(105),f=b(22);c.exports=function(l,m,i,n){var c=String(f(l)),j=c.length,g=i===a?" ":String(i),k=d(m);if(j>=k)return c;""==g&&(g=" ");var h=k-j,b=e.call(g,Math.ceil(h/g.length));return b.length>h&&(b=b.slice(0,h)),n?b+c:c+b}},function(e,f,b){var c=b(3),d=b(168);c(c.P,"String",{padRight:function padRight(b){return d(this,b,arguments.length>1?arguments[1]:a,!1)}})},function(b,c,a){a(63)("trimLeft",function(a){return function trimLeft(){return a(this,1)}})},function(b,c,a){a(63)("trimRight",function(a){return function trimRight(){return a(this,2)}})},function(d,e,a){var b=a(3),c=a(173)(/[\\^$*+?.()|[\]{}]/g,"\\$&");b(b.S,"RegExp",{escape:function escape(a){return c(a)}})},function(a,b){a.exports=function(b,a){var c=a===Object(a)?function(b){return a[b]}:a;return function(a){return String(a).replace(b,c)}}},function(g,h,a){var b=a(2),c=a(3),d=a(161),e=a(23),f=a(7);c(c.S,"Object",{getOwnPropertyDescriptors:function getOwnPropertyDescriptors(k){for(var a,g,h=e(k),l=b.setDesc,m=b.getDesc,i=d(h),c={},j=0;i.length>j;)g=m(h,a=i[j++]),a in c?l(c,a,f(0,g)):c[a]=g;return c}})},function(d,e,a){var b=a(3),c=a(176)(!1);b(b.S,"Object",{values:function values(a){return c(a)}})},function(c,f,a){var b=a(2),d=a(23),e=b.isEnum;c.exports=function(a){return function(j){for(var c,f=d(j),g=b.getKeys(f),k=g.length,h=0,i=[];k>h;)e.call(f,c=g[h++])&&i.push(a?[c,f[c]]:f[c]);return i}}},function(d,e,a){var b=a(3),c=a(176)(!0);b(b.S,"Object",{entries:function entries(a){return c(a)}})},function(c,d,a){var b=a(3);b(b.P,"Map",{toJSON:a(179)("Map")})},function(b,e,a){var c=a(138),d=a(47);b.exports=function(a){return function toJSON(){if(d(this)!=a)throw TypeError(a+"#toJSON isn't generic");var b=[];return c(this,!1,b.push,b),b}}},function(c,d,a){var b=a(3);b(b.P,"Set",{toJSON:a(179)("Set")})},function(d,e,b){var a=b(3),c=b(141);a(a.G+a.B,{setImmediate:c.set,clearImmediate:c.clear})},function(l,k,a){a(117);var g=a(4),j=a(6),c=a(109),b=a(31)("iterator"),h=g.NodeList,i=g.HTMLCollection,e=h&&h.prototype,d=i&&i.prototype,f=c.NodeList=c.HTMLCollection=c.Array;e&&!e[b]&&j(e,b,f),d&&!d[b]&&j(d,b,f)},function(i,j,a){var c=a(4),b=a(3),g=a(19),h=a(184),d=c.navigator,e=!!d&&/MSIE .\./.test(d.userAgent),f=function(a){return e?function(b,c){return a(g(h,[].slice.call(arguments,2),"function"==typeof b?b:Function(b)),c)}:a};b(b.G+b.B+b.F*e,{setTimeout:f(c.setTimeout),setInterval:f(c.setInterval)})},function(c,f,a){var d=a(185),b=a(19),e=a(13);c.exports=function(){for(var h=e(this),a=arguments.length,c=Array(a),f=0,i=d._,g=!1;a>f;)(c[f]=arguments[f++])===i&&(g=!0);return function(){var d,k=this,f=arguments,l=f.length,e=0,j=0;if(!g&&!l)return b(h,c,k);if(d=c.slice(),g)for(;a>e;e++)d[e]===i&&(d[e]=f[j++]);for(;l>j;)d.push(f[j++]);return b(h,d,k)}}},function(a,c,b){a.exports=b(4)},function(x,w,b){function Dict(b){var c=f.create(null);return b!=a&&(r(b)?q(b,!0,function(a,b){c[a]=b}):o(c,b)),c}function reduce(g,h,l){p(h);var a,c,b=i(g),e=k(b),j=e.length,f=0;if(arguments.length<3){if(!j)throw TypeError("Reduce of empty object with no initial value");a=b[e[f++]]}else a=Object(l);for(;j>f;)d(b,c=e[f++])&&(a=h(a,b[c],c,g));return a}function includes(c,b){return(b==b?j(c,b):l(c,function(a){return a!=a}))!==a}function get(a,b){return d(a,b)?a[b]:void 0}function set(a,b,c){return v&&b in Object?f.setDesc(a,b,t(0,c)):a[b]=c,a}function isDict(a){return u(a)&&f.getProto(a)===Dict.prototype}var f=b(2),n=b(12),e=b(3),t=b(7),o=b(41),j=b(36),p=b(13),q=b(138),r=b(187),s=b(110),g=b(119),u=b(16),i=b(23),v=b(8),d=b(17),k=f.getKeys,c=function(b){var e=1==b,c=4==b;return function(l,m,o){var f,h,g,p=n(m,o,3),k=i(l),j=e||7==b||2==b?new("function"==typeof this?this:Dict):a;for(f in k)if(d(k,f)&&(h=k[f],g=p(h,f,l),b))if(e)j[f]=g;else if(g)switch(b){case 2:j[f]=h;break;case 3:return!0;case 5:return h;case 6:return f;case 7:j[g[0]]=g[1]}else if(c)return!1;return 3==b||c?c:j}},l=c(6),h=function(a){return function(b){return new m(b,a)}},m=function(a,b){this._t=i(a),this._a=k(a),this._i=0,this._k=b};s(m,"Dict",function(){var c,b=this,e=b._t,f=b._a,h=b._k;do if(b._i>=f.length)return b._t=a,g(1);while(!d(e,c=f[b._i++]));return"keys"==h?g(0,c):"values"==h?g(0,e[c]):g(0,[c,e[c]])}),Dict.prototype=null,e(e.G+e.F,{Dict:Dict}),e(e.S,"Dict",{keys:h("keys"),values:h("values"),entries:h("entries"),forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findKey:l,mapPairs:c(7),reduce:reduce,keyOf:j,includes:includes,has:d,get:get,set:set,isDict:isDict})},function(c,g,b){var d=b(47),e=b(31)("iterator"),f=b(109);c.exports=b(5).isIterable=function(c){var b=Object(c);return b[e]!==a||"@@iterator"in b||f.hasOwnProperty(d(b))}},function(b,e,a){var c=a(20),d=a(114);b.exports=a(5).getIterator=function(a){var b=d(a);if("function"!=typeof b)throw TypeError(a+" is not iterable!");return c(b.call(a))}},function(f,g,a){var c=a(4),d=a(5),b=a(3),e=a(184);b(b.G+b.F,{delay:function delay(a){return new(d.Promise||c.Promise)(function(b){setTimeout(e.call(b,!0),a)})}})},function(d,e,a){var c=a(185),b=a(3);a(5)._=c._=c._||{},b(b.P+b.F,"Function",{part:a(184)})},function(c,d,b){var a=b(3);a(a.S+a.F,"Object",{isObject:b(16)})},function(c,d,b){var a=b(3);a(a.S+a.F,"Object",{classof:b(47)})},function(d,e,b){var a=b(3),c=b(194);a(a.S+a.F,"Object",{define:c})},function(c,f,a){var b=a(2),d=a(161),e=a(23);c.exports=function define(a,c){for(var f,g=d(e(c)),i=g.length,h=0;i>h;)b.setDesc(a,f=g[h++],b.getDesc(c,f));return a}},function(e,f,a){var b=a(3),c=a(194),d=a(2).create;b(b.S+b.F,"Object",{make:function(a,b){return c(d(a),b)}})},function(c,d,b){b(108)(Number,"Number",function(a){this._l=+a,this._i=0},function(){var b=this._i++,c=!(this._l>b);return{done:c,value:c?a:b}})},function(d,e,b){var a=b(3),c=b(173)(/[&<>"']/g,{"&":"&","<":"<",">":">",'"':""","'":"'"});a(a.P+a.F,"String",{escapeHTML:function escapeHTML(){return c(this)}})},function(d,e,b){var a=b(3),c=b(173)(/&(?:amp|lt|gt|quot|apos);/g,{"&":"&","<":"<",">":">",""":'"',"'":"'"});a(a.P+a.F,"String",{unescapeHTML:function unescapeHTML(){return c(this)}})},function(g,h,a){var e=a(2),f=a(4),b=a(3),c={},d=!0;e.each.call("assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,isIndependentlyComposed,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn".split(","),function(a){c[a]=function(){var b=f.console;return d&&b&&b[a]?Function.apply.call(b[a],b,arguments):void 0}}),b(b.G+b.F,{log:a(41)(c.log,c,{enable:function(){d=!0},disable:function(){d=!1}})})},function(i,j,b){var g=b(2),e=b(3),h=b(12),f=b(5).Array||Array,c={},d=function(d,b){g.each.call(d.split(","),function(d){b==a&&d in f?c[d]=f[d]:d in[]&&(c[d]=h(Function.call,[][d],b))})};d("pop,reverse,shift,keys,values,entries",1),d("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),d("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),e(e.S,"Array",c)}]),"undefined"!=typeof module&&module.exports?module.exports=b:"function"==typeof define&&define.amd?define(function(){return b}):c.core=b}(1,1); +//# sourceMappingURL=core.min.js.map \ No newline at end of file diff --git a/react-app/node_modules/core-js/client/core.min.js.map b/react-app/node_modules/core-js/client/core.min.js.map new file mode 100644 index 0000000000..eaa2482cb7 --- /dev/null +++ b/react-app/node_modules/core-js/client/core.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["core.js"],"names":["__e","__g","undefined","modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","IE8_DOM_DEFINE","$","$export","DESCRIPTORS","createDesc","html","cel","has","cof","invoke","fails","anObject","aFunction","isObject","toObject","toIObject","toInteger","toIndex","toLength","IObject","IE_PROTO","createArrayMethod","arrayIndexOf","ObjectProto","Object","prototype","ArrayProto","Array","arraySlice","slice","arrayJoin","join","defineProperty","setDesc","getOwnDescriptor","getDesc","defineProperties","setDescs","factories","get","a","O","P","Attributes","e","TypeError","value","propertyIsEnumerable","Properties","keys","getKeys","length","i","S","F","getOwnPropertyDescriptor","keys1","split","keys2","concat","keysLen1","createDict","iframeDocument","iframe","gt","style","display","appendChild","src","contentWindow","document","open","write","close","createGetKeys","names","object","key","result","push","Empty","getPrototypeOf","getProto","constructor","getOwnPropertyNames","getNames","create","construct","len","args","n","Function","bind","that","fn","this","partArgs","arguments","bound","begin","end","klass","start","upTo","size","cloned","charAt","separator","isArray","createArrayReduce","isRight","callbackfn","memo","index","methodize","$fn","arg1","forEach","each","map","filter","some","every","reduce","reduceRight","indexOf","lastIndexOf","el","fromIndex","Math","min","now","Date","lz","num","toISOString","NaN","isFinite","RangeError","d","y","getUTCFullYear","getUTCMilliseconds","s","abs","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","$Object","isEnum","getSymbols","getOwnPropertySymbols","global","core","hide","redefine","ctx","PROTOTYPE","type","name","source","own","out","exp","IS_FORCED","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","W","window","self","version","bitmap","enumerable","configurable","writable","exec","SRC","TO_STRING","$toString","TPL","inspectSource","it","val","safe","hasOwnProperty","String","toString","px","random","b","apply","documentElement","is","createElement","un","defined","ceil","floor","isNaN","max","asc","TYPE","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","$this","res","f","SPECIES","original","C","arg","store","uid","Symbol","SHARED","IS_INCLUDES","$fails","shared","setToStringTag","wks","keyOf","$names","enumKeys","_create","$Symbol","$JSON","JSON","_stringify","stringify","setter","HIDDEN","SymbolRegistry","AllSymbols","useNative","setSymbolDesc","D","protoDesc","wrap","tag","sym","_k","set","isSymbol","$defineProperty","$defineProperties","l","$create","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","$stringify","replacer","$replacer","$$","buggyJSON","symbolStatics","for","keyFor","useSetter","useSimple","def","TAG","stat","windowNames","getWindowNames","symbols","assign","A","K","k","T","$$len","j","x","setPrototypeOf","check","proto","test","buggy","__proto__","classof","ARG","callee","$freeze","freeze","KEY","$seal","seal","$preventExtensions","preventExtensions","$isFrozen","isFrozen","$isSealed","isSealed","$isExtensible","isExtensible","$getPrototypeOf","$keys","FProto","nameRE","NAME","match","HAS_INSTANCE","FunctionProto","toPrimitive","$trim","trim","NUMBER","$Number","Base","BROKEN_COF","TRIM","toNumber","argument","third","radix","maxCode","first","charCodeAt","code","digits","parseInt","Number","valueOf","spaces","space","non","ltrim","RegExp","rtrim","exporter","string","replace","EPSILON","pow","_isFinite","isInteger","number","isSafeInteger","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","parseFloat","log1p","sqrt","$acosh","acosh","MAX_VALUE","log","LN2","asinh","atanh","sign","cbrt","clz32","LOG2E","cosh","expm1","EPSILON32","MAX32","MIN32","roundTiesToEven","fround","$abs","$sign","Infinity","hypot","value1","value2","div","sum","larg","$imul","imul","UINT16","xn","yn","xl","yl","log10","LN10","log2","sinh","tanh","trunc","fromCharCode","$fromCodePoint","fromCodePoint","raw","callSite","tpl","$at","codePointAt","pos","context","ENDS_WITH","$endsWith","endsWith","searchString","endPosition","search","isRegExp","MATCH","re","INCLUDES","includes","repeat","count","str","STARTS_WITH","$startsWith","startsWith","iterated","_t","_i","point","done","LIBRARY","Iterators","$iterCreate","ITERATOR","BUGGY","FF_ITERATOR","KEYS","VALUES","returnThis","Constructor","next","DEFAULT","IS_SET","FORCED","methods","getMethod","kind","values","entries","DEF_VALUES","VALUES_BUG","$native","$default","IteratorPrototype","descriptor","isArrayIter","getIterFn","iter","from","arrayLike","step","iterator","mapfn","mapping","iterFn","ret","getIteratorMethod","SAFE_CLOSING","riter","skipClosing","arr","of","addToUnscopables","Arguments","UNSCOPABLES","copyWithin","to","inc","fill","endPos","$find","forced","find","findIndex","$flags","$RegExp","re1","re2","CORRECT_NEW","piRE","fiU","ignoreCase","multiline","unicode","sticky","flags","regexp","SYMBOL","REPLACE","$replace","searchValue","replaceValue","SEARCH","SPLIT","$split","limit","Wrapper","strictNew","forOf","setProto","same","speciesConstructor","asap","PROMISE","process","isNode","testResolve","sub","resolve","USE_NATIVE","P2","works","then","thenableThenGotten","sameConstructor","getConstructor","isThenable","PromiseCapability","reject","promise","$$resolve","$$reject","perform","error","notify","record","isReject","chain","v","ok","run","reaction","handler","fail","h","setTimeout","console","isUnhandled","emit","onunhandledrejection","reason","_d","$reject","r","$resolve","wrapper","Promise","executor","err","onFulfilled","onRejected","catch","capability","all","iterable","abrupt","remaining","results","alreadyCalled","race","head","last","macrotask","Observer","MutationObserver","WebKitMutationObserver","flush","parent","domain","exit","enter","nextTick","toggle","node","createTextNode","observe","characterData","data","task","defer","channel","port","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","counter","queue","ONREADYSTATECHANGE","listner","event","port2","port1","onmessage","postMessage","addEventListener","importScripts","removeChild","clear","strong","Map","entry","getEntry","redefineAll","$iterDefine","ID","$has","setSpecies","SIZE","fastKey","_f","ADDER","_l","delete","prev","setStrong","$iterDetect","common","IS_WEAK","fixMethod","add","BUGGY_ZERO","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","Set","weak","frozenStore","WEAK","tmp","$WeakMap","WeakMap","method","arrayFind","arrayFindIndex","FrozenStore","findFrozen","splice","WeakSet","_apply","thisArgument","argumentsList","Reflect","Target","newTarget","$args","propertyKey","attributes","deleteProperty","desc","Enumerate","enumerate","receiver","ownKeys","V","existingDescriptor","ownDesc","$includes","at","$pad","padLeft","maxLength","fillString","left","stringLength","fillStr","intMaxLength","fillLen","stringFiller","padRight","trimLeft","trimRight","$re","escape","regExp","part","getOwnPropertyDescriptors","$values","isEntries","$entries","toJSON","$task","NL","NodeList","HTC","HTMLCollection","NLProto","HTCProto","ArrayValues","partial","navigator","MSIE","userAgent","time","setInterval","path","pargs","_","holder","Dict","dict","isIterable","init","findKey","isDict","createDictMethod","createDictIter","DictIterator","_a","mapPairs","getIterator","delay","define","mixin","make","&","<",">","\"","'","escapeHTML","&","<",">",""","'","unescapeHTML","enabled","$console","enable","disable","$ctx","$Array","statics","setStatics","amd"],"mappings":";;;;;;CAMC,SAASA,EAAKC,EAAKC,GACpB,cACS,SAAUC,GAKT,QAASC,qBAAoBC,GAG5B,GAAGC,EAAiBD,GACnB,MAAOC,GAAiBD,GAAUE,OAGnC,IAAIC,GAASF,EAAiBD,IAC7BE,WACAE,GAAIJ,EACJK,QAAQ,EAUT,OANAP,GAAQE,GAAUM,KAAKH,EAAOD,QAASC,EAAQA,EAAOD,QAASH,qBAG/DI,EAAOE,QAAS,EAGTF,EAAOD,QAvBf,GAAID,KAqCJ,OATAF,qBAAoBQ,EAAIT,EAGxBC,oBAAoBS,EAAIP,EAGxBF,oBAAoBU,EAAI,GAGjBV,oBAAoB,KAK/B,SAASI,EAAQD,EAASH,GAE/BA,EAAoB,GACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBA,EAAoB,KACpBI,EAAOD,QAAUH,EAAoB,MAKhC,SAASI,EAAQD,EAASH,GAG/B,GA8BIW,GA9BAC,EAAoBZ,EAAoB,GACxCa,EAAoBb,EAAoB,GACxCc,EAAoBd,EAAoB,GACxCe,EAAoBf,EAAoB,GACxCgB,EAAoBhB,EAAoB,IACxCiB,EAAoBjB,EAAoB,IACxCkB,EAAoBlB,EAAoB,IACxCmB,EAAoBnB,EAAoB,IACxCoB,EAAoBpB,EAAoB,IACxCqB,EAAoBrB,EAAoB,GACxCsB,EAAoBtB,EAAoB,IACxCuB,EAAoBvB,EAAoB,IACxCwB,EAAoBxB,EAAoB,IACxCyB,EAAoBzB,EAAoB,IACxC0B,EAAoB1B,EAAoB,IACxC2B,EAAoB3B,EAAoB,IACxC4B,EAAoB5B,EAAoB,IACxC6B,EAAoB7B,EAAoB,IACxC8B,EAAoB9B,EAAoB,IACxC+B,EAAoB/B,EAAoB,IAAI,aAC5CgC,EAAoBhC,EAAoB,IACxCiC,EAAoBjC,EAAoB,KAAI,GAC5CkC,EAAoBC,OAAOC,UAC3BC,EAAoBC,MAAMF,UAC1BG,EAAoBF,EAAWG,MAC/BC,EAAoBJ,EAAWK,KAC/BC,EAAoB/B,EAAEgC,QACtBC,EAAoBjC,EAAEkC,QACtBC,EAAoBnC,EAAEoC,SACtBC,IAGAnC,KACFH,GAAkBU,EAAM,WACtB,MAA4E,IAArEsB,EAAe1B,EAAI,OAAQ,KAAMiC,IAAK,WAAY,MAAO,MAAOC,IAEzEvC,EAAEgC,QAAU,SAASQ,EAAGC,EAAGC,GACzB,GAAG3C,EAAe,IAChB,MAAOgC,GAAeS,EAAGC,EAAGC,GAC5B,MAAMC,IACR,GAAG,OAASD,IAAc,OAASA,GAAW,KAAME,WAAU,2BAE9D,OADG,SAAWF,KAAWhC,EAAS8B,GAAGC,GAAKC,EAAWG,OAC9CL,GAETxC,EAAEkC,QAAU,SAASM,EAAGC,GACtB,GAAG1C,EAAe,IAChB,MAAOkC,GAAiBO,EAAGC,GAC3B,MAAME,IACR,MAAGrC,GAAIkC,EAAGC,GAAUtC,GAAYmB,EAAYwB,qBAAqBnD,KAAK6C,EAAGC,GAAID,EAAEC,IAA/E,QAEFzC,EAAEoC,SAAWD,EAAmB,SAASK,EAAGO,GAC1CrC,EAAS8B,EAKT,KAJA,GAGIC,GAHAO,EAAShD,EAAEiD,QAAQF,GACnBG,EAASF,EAAKE,OACdC,EAAI,EAEFD,EAASC,GAAEnD,EAAEgC,QAAQQ,EAAGC,EAAIO,EAAKG,KAAMJ,EAAWN,GACxD,OAAOD,KAGXvC,EAAQA,EAAQmD,EAAInD,EAAQoD,GAAKnD,EAAa,UAE5CoD,yBAA0BtD,EAAEkC,QAE5BH,eAAgB/B,EAAEgC,QAElBG,iBAAkBA,GAIpB,IAAIoB,GAAQ,gGACmCC,MAAM,KAEjDC,EAAQF,EAAMG,OAAO,SAAU,aAC/BC,EAAWJ,EAAML,OAGjBU,EAAa,WAEf,GAGIC,GAHAC,EAASzD,EAAI,UACb8C,EAASQ,EACTI,EAAS,GAYb,KAVAD,EAAOE,MAAMC,QAAU,OACvB7D,EAAK8D,YAAYJ,GACjBA,EAAOK,IAAM,cAGbN,EAAiBC,EAAOM,cAAcC,SACtCR,EAAeS,OACfT,EAAeU,MAAM,oCAAsCR,GAC3DF,EAAeW,QACfZ,EAAaC,EAAeR,EACtBF,WAAWS,GAAWpC,UAAU+B,EAAMJ,GAC5C,OAAOS,MAELa,EAAgB,SAASC,EAAOxB,GAClC,MAAO,UAASyB,GACd,GAGIC,GAHApC,EAAS1B,EAAU6D,GACnBxB,EAAS,EACT0B,IAEJ,KAAID,IAAOpC,GAAKoC,GAAOzD,GAASb,EAAIkC,EAAGoC,IAAQC,EAAOC,KAAKF,EAE3D,MAAM1B,EAASC,GAAK7C,EAAIkC,EAAGoC,EAAMF,EAAMvB,SACpC9B,EAAawD,EAAQD,IAAQC,EAAOC,KAAKF,GAE5C,OAAOC,KAGPE,EAAQ,YACZ9E,GAAQA,EAAQmD,EAAG,UAEjB4B,eAAgBhF,EAAEiF,SAAWjF,EAAEiF,UAAY,SAASzC,GAElD,MADAA,GAAI3B,EAAS2B,GACVlC,EAAIkC,EAAGrB,GAAiBqB,EAAErB,GACF,kBAAjBqB,GAAE0C,aAA6B1C,YAAaA,GAAE0C,YAC/C1C,EAAE0C,YAAY1D,UACdgB,YAAajB,QAASD,EAAc,MAG/C6D,oBAAqBnF,EAAEoF,SAAWpF,EAAEoF,UAAYX,EAAchB,EAAOA,EAAMP,QAAQ,GAEnFmC,OAAQrF,EAAEqF,OAASrF,EAAEqF,QAAU,SAAS7C,EAAQO,GAC9C,GAAI8B,EAQJ,OAPS,QAANrC,GACDuC,EAAMvD,UAAYd,EAAS8B,GAC3BqC,EAAS,GAAIE,GACbA,EAAMvD,UAAY,KAElBqD,EAAO1D,GAAYqB,GACdqC,EAASjB,IACTb,IAAe7D,EAAY2F,EAAS1C,EAAiB0C,EAAQ9B,IAGtEC,KAAMhD,EAAEiD,QAAUjD,EAAEiD,SAAWwB,EAAclB,EAAOI,GAAU,IAGhE,IAAI2B,GAAY,SAASjC,EAAGkC,EAAKC,GAC/B,KAAKD,IAAOlD,IAAW,CACrB,IAAI,GAAIoD,MAAQtC,EAAI,EAAOoC,EAAJpC,EAASA,IAAIsC,EAAEtC,GAAK,KAAOA,EAAI,GACtDd,GAAUkD,GAAOG,SAAS,MAAO,gBAAkBD,EAAE3D,KAAK,KAAO,KAEnE,MAAOO,GAAUkD,GAAKlC,EAAGmC,GAI3BvF,GAAQA,EAAQwC,EAAG,YACjBkD,KAAM,QAASA,MAAKC,GAClB,GAAIC,GAAWlF,EAAUmF,MACrBC,EAAWpE,EAAWhC,KAAKqG,UAAW,GACtCC,EAAQ,WACV,GAAIT,GAAOO,EAASrC,OAAO/B,EAAWhC,KAAKqG,WAC3C,OAAOF,gBAAgBG,GAAQX,EAAUO,EAAIL,EAAKtC,OAAQsC,GAAQhF,EAAOqF,EAAIL,EAAMI,GAGrF,OADGhF,GAASiF,EAAGrE,aAAWyE,EAAMzE,UAAYqE,EAAGrE,WACxCyE,KAKXhG,EAAQA,EAAQwC,EAAIxC,EAAQoD,EAAI5C,EAAM,WACjCL,GAAKuB,EAAWhC,KAAKS,KACtB,SACFwB,MAAO,SAASsE,EAAOC,GACrB,GAAIZ,GAAQtE,EAAS6E,KAAK5C,QACtBkD,EAAQ7F,EAAIuF,KAEhB,IADAK,EAAMA,IAAQjH,EAAYqG,EAAMY,EACpB,SAATC,EAAiB,MAAOzE,GAAWhC,KAAKmG,KAAMI,EAAOC,EAMxD,KALA,GAAIE,GAASrF,EAAQkF,EAAOX,GACxBe,EAAStF,EAAQmF,EAAKZ,GACtBgB,EAAStF,EAASqF,EAAOD,GACzBG,EAAS9E,MAAM6E,GACfpD,EAAS,EACHoD,EAAJpD,EAAUA,IAAIqD,EAAOrD,GAAc,UAATiD,EAC5BN,KAAKW,OAAOJ,EAAQlD,GACpB2C,KAAKO,EAAQlD,EACjB,OAAOqD,MAGXvG,EAAQA,EAAQwC,EAAIxC,EAAQoD,GAAKnC,GAAWK,QAAS,SACnDO,KAAM,QAASA,MAAK4E,GAClB,MAAO7E,GAAUlC,KAAKuB,EAAQ4E,MAAOY,IAAcxH,EAAY,IAAMwH,MAKzEzG,EAAQA,EAAQmD,EAAG,SAAUuD,QAASvH,EAAoB,KAE1D,IAAIwH,GAAoB,SAASC,GAC/B,MAAO,UAASC,EAAYC,GAC1BpG,EAAUmG,EACV,IAAItE,GAAStB,EAAQ4E,MACjB5C,EAASjC,EAASuB,EAAEU,QACpB8D,EAASH,EAAU3D,EAAS,EAAI,EAChCC,EAAS0D,EAAU,GAAK,CAC5B,IAAGb,UAAU9C,OAAS,EAAE,OAAO,CAC7B,GAAG8D,IAASxE,GAAE,CACZuE,EAAOvE,EAAEwE,GACTA,GAAS7D,CACT,OAGF,GADA6D,GAAS7D,EACN0D,EAAkB,EAARG,EAAsBA,GAAV9D,EACvB,KAAMN,WAAU,+CAGpB,KAAKiE,EAAUG,GAAS,EAAI9D,EAAS8D,EAAOA,GAAS7D,EAAK6D,IAASxE,KACjEuE,EAAOD,EAAWC,EAAMvE,EAAEwE,GAAQA,EAAOlB,MAE3C,OAAOiB,KAIPE,EAAY,SAASC,GACvB,MAAO,UAASC,GACd,MAAOD,GAAIpB,KAAMqB,EAAMnB,UAAU,KAIrC/F,GAAQA,EAAQwC,EAAG,SAEjB2E,QAASpH,EAAEqH,KAAOrH,EAAEqH,MAAQJ,EAAU7F,EAAkB,IAExDkG,IAAKL,EAAU7F,EAAkB,IAEjCmG,OAAQN,EAAU7F,EAAkB,IAEpCoG,KAAMP,EAAU7F,EAAkB,IAElCqG,MAAOR,EAAU7F,EAAkB,IAEnCsG,OAAQd,GAAkB,GAE1Be,YAAaf,GAAkB,GAE/BgB,QAASX,EAAU5F,GAEnBwG,YAAa,SAASC,EAAIC,GACxB,GAAIvF,GAAS1B,EAAUgF,MACnB5C,EAASjC,EAASuB,EAAEU,QACpB8D,EAAS9D,EAAS,CAGtB,KAFG8C,UAAU9C,OAAS,IAAE8D,EAAQgB,KAAKC,IAAIjB,EAAOjG,EAAUgH,KAC/C,EAARf,IAAUA,EAAQ/F,EAASiC,EAAS8D,IAClCA,GAAS,EAAGA,IAAQ,GAAGA,IAASxE,IAAKA,EAAEwE,KAAWc,EAAG,MAAOd,EACjE,OAAO,MAKX/G,EAAQA,EAAQmD,EAAG,QAAS8E,IAAK,WAAY,OAAQ,GAAIC,QAEzD,IAAIC,GAAK,SAASC,GAChB,MAAOA,GAAM,EAAIA,EAAM,IAAMA,EAK/BpI,GAAQA,EAAQwC,EAAIxC,EAAQoD,GAAK5C,EAAM,WACrC,MAA4C,4BAArC,GAAI0H,MAAK,MAAQ,GAAGG,kBACtB7H,EAAM,WACX,GAAI0H,MAAKI,KAAKD,iBACX,QACHA,YAAa,QAASA,eACpB,IAAIE,SAAS1C,MAAM,KAAM2C,YAAW,qBACpC,IAAIC,GAAI5C,KACJ6C,EAAID,EAAEE,iBACNhJ,EAAI8I,EAAEG,qBACNC,EAAQ,EAAJH,EAAQ,IAAMA,EAAI,KAAO,IAAM,EACvC,OAAOG,IAAK,QAAUd,KAAKe,IAAIJ,IAAI/G,MAAMkH,EAAI,GAAK,IAChD,IAAMV,EAAGM,EAAEM,cAAgB,GAAK,IAAMZ,EAAGM,EAAEO,cAC3C,IAAMb,EAAGM,EAAEQ,eAAiB,IAAMd,EAAGM,EAAES,iBACvC,IAAMf,EAAGM,EAAEU,iBAAmB,KAAOxJ,EAAI,GAAKA,EAAI,IAAMwI,EAAGxI,IAAM,QAMlE,SAASJ,EAAQD,GAEtB,GAAI8J,GAAU9H,MACd/B,GAAOD,SACL8F,OAAYgE,EAAQhE,OACpBJ,SAAYoE,EAAQrE,eACpBsE,UAAexG,qBACfZ,QAAYmH,EAAQ/F,yBACpBtB,QAAYqH,EAAQtH,eACpBK,SAAYiH,EAAQlH,iBACpBc,QAAYoG,EAAQrG,KACpBoC,SAAYiE,EAAQlE,oBACpBoE,WAAYF,EAAQG,sBACpBnC,QAAeD,UAKZ,SAAS5H,EAAQD,EAASH,GAE/B,GAAIqK,GAAYrK,EAAoB,GAChCsK,EAAYtK,EAAoB,GAChCuK,EAAYvK,EAAoB,GAChCwK,EAAYxK,EAAoB,IAChCyK,EAAYzK,EAAoB,IAChC0K,EAAY,YAEZ7J,EAAU,SAAS8J,EAAMC,EAAMC,GACjC,GAQIrF,GAAKsF,EAAKC,EAAKC,EARfC,EAAYN,EAAO9J,EAAQoD,EAC3BiH,EAAYP,EAAO9J,EAAQsK,EAC3BC,EAAYT,EAAO9J,EAAQmD,EAC3BqH,EAAYV,EAAO9J,EAAQwC,EAC3BiI,EAAYX,EAAO9J,EAAQ0K,EAC3BC,EAAYN,EAAYb,EAASe,EAAYf,EAAOO,KAAUP,EAAOO,QAAeP,EAAOO,QAAaF,GACxGvK,EAAY+K,EAAYZ,EAAOA,EAAKM,KAAUN,EAAKM,OACnDa,EAAYtL,EAAQuK,KAAevK,EAAQuK,MAE5CQ,KAAUL,EAASD,EACtB,KAAIpF,IAAOqF,GAETC,GAAOG,GAAaO,GAAUhG,IAAOgG,GAErCT,GAAOD,EAAMU,EAASX,GAAQrF,GAE9BwF,EAAMM,GAAWR,EAAML,EAAIM,EAAKV,GAAUgB,GAA0B,kBAAPN,GAAoBN,EAAInE,SAAS/F,KAAMwK,GAAOA,EAExGS,IAAWV,GAAIN,EAASgB,EAAQhG,EAAKuF,GAErC5K,EAAQqF,IAAQuF,GAAIR,EAAKpK,EAASqF,EAAKwF,GACvCK,GAAYI,EAASjG,IAAQuF,IAAIU,EAASjG,GAAOuF,GAGxDV,GAAOC,KAAOA,EAEdzJ,EAAQoD,EAAI,EACZpD,EAAQsK,EAAI,EACZtK,EAAQmD,EAAI,EACZnD,EAAQwC,EAAI,EACZxC,EAAQ0K,EAAI,GACZ1K,EAAQ6K,EAAI,GACZtL,EAAOD,QAAUU,GAIZ,SAAST,EAAQD,GAGtB,GAAIkK,GAASjK,EAAOD,QAA2B,mBAAVwL,SAAyBA,OAAO/C,MAAQA,KACzE+C,OAAwB,mBAARC,OAAuBA,KAAKhD,MAAQA,KAAOgD,KAAOtF,SAAS,gBAC9D,iBAAPzG,KAAgBA,EAAMwK,IAI3B,SAASjK,EAAQD,GAEtB,GAAImK,GAAOlK,EAAOD,SAAW0L,QAAS,QACrB,iBAAPjM,KAAgBA,EAAM0K,IAI3B,SAASlK,EAAQD,EAASH,GAE/B,GAAIY,GAAaZ,EAAoB,GACjCe,EAAaf,EAAoB,EACrCI,GAAOD,QAAUH,EAAoB,GAAK,SAASuF,EAAQC,EAAK/B,GAC9D,MAAO7C,GAAEgC,QAAQ2C,EAAQC,EAAKzE,EAAW,EAAG0C,KAC1C,SAAS8B,EAAQC,EAAK/B,GAExB,MADA8B,GAAOC,GAAO/B,EACP8B,IAKJ,SAASnF,EAAQD,GAEtBC,EAAOD,QAAU,SAAS2L,EAAQrI,GAChC,OACEsI,aAAyB,EAATD,GAChBE,eAAyB,EAATF,GAChBG,WAAyB,EAATH,GAChBrI,MAAcA,KAMb,SAASrD,EAAQD,EAASH,GAG/BI,EAAOD,SAAWH,EAAoB,GAAG,WACvC,MAA2E,IAApEmC,OAAOQ,kBAAmB,KAAMO,IAAK,WAAY,MAAO,MAAOC,KAKnE,SAAS/C,EAAQD,GAEtBC,EAAOD,QAAU,SAAS+L,GACxB,IACE,QAASA,IACT,MAAM3I,GACN,OAAO,KAMN,SAASnD,EAAQD,EAASH,GAI/B,GAAIqK,GAAYrK,EAAoB,GAChCuK,EAAYvK,EAAoB,GAChCmM,EAAYnM,EAAoB,IAAI,OACpCoM,EAAY,WACZC,EAAY/F,SAAS8F,GACrBE,GAAa,GAAKD,GAAWjI,MAAMgI,EAEvCpM,GAAoB,GAAGuM,cAAgB,SAASC,GAC9C,MAAOH,GAAU9L,KAAKiM,KAGvBpM,EAAOD,QAAU,SAASiD,EAAGoC,EAAKiH,EAAKC,GACrB,kBAAPD,KACRA,EAAIE,eAAeR,IAAQ5B,EAAKkC,EAAKN,EAAK/I,EAAEoC,GAAO,GAAKpC,EAAEoC,GAAO8G,EAAI5J,KAAKkK,OAAOpH,KACjFiH,EAAIE,eAAe,SAAWpC,EAAKkC,EAAK,OAAQjH,IAE/CpC,IAAMiH,EACPjH,EAAEoC,GAAOiH,GAELC,SAAYtJ,GAAEoC,GAClB+E,EAAKnH,EAAGoC,EAAKiH,MAEdnG,SAASlE,UAAWgK,EAAW,QAASS,YACzC,MAAsB,kBAARnG,OAAsBA,KAAKyF,IAAQE,EAAU9L,KAAKmG,SAK7D,SAAStG,EAAQD,GAEtB,GAAIE,GAAK,EACLyM,EAAKlE,KAAKmE,QACd3M,GAAOD,QAAU,SAASqF,GACxB,MAAO,UAAUlB,OAAOkB,IAAQ1F,EAAY,GAAK0F,EAAK,QAASnF,EAAKyM,GAAID,SAAS,OAK9E,SAASzM,EAAQD,EAASH,GAG/B,GAAIuB,GAAYvB,EAAoB,GACpCI,GAAOD,QAAU,SAASsG,EAAID,EAAM1C,GAElC,GADAvC,EAAUkF,GACPD,IAAS1G,EAAU,MAAO2G,EAC7B,QAAO3C,GACL,IAAK,GAAG,MAAO,UAASX,GACtB,MAAOsD,GAAGlG,KAAKiG,EAAMrD,GAEvB,KAAK,GAAG,MAAO,UAASA,EAAG6J,GACzB,MAAOvG,GAAGlG,KAAKiG,EAAMrD,EAAG6J,GAE1B,KAAK,GAAG,MAAO,UAAS7J,EAAG6J,EAAGvM,GAC5B,MAAOgG,GAAGlG,KAAKiG,EAAMrD,EAAG6J,EAAGvM,IAG/B,MAAO,YACL,MAAOgG,GAAGwG,MAAMzG,EAAMI,cAMrB,SAASxG,EAAQD,GAEtBC,EAAOD,QAAU,SAASqM,GACxB,GAAgB,kBAANA,GAAiB,KAAMhJ,WAAUgJ,EAAK,sBAChD,OAAOA,KAKJ,SAASpM,EAAQD,EAASH,GAE/BI,EAAOD,QAAUH,EAAoB,GAAGiF,UAAYA,SAASiI,iBAIxD,SAAS9M,EAAQD,EAASH,GAE/B,GAAIwB,GAAWxB,EAAoB,IAC/BiF,EAAWjF,EAAoB,GAAGiF,SAElCkI,EAAK3L,EAASyD,IAAazD,EAASyD,EAASmI,cACjDhN,GAAOD,QAAU,SAASqM,GACxB,MAAOW,GAAKlI,EAASmI,cAAcZ,QAKhC,SAASpM,EAAQD,GAEtBC,EAAOD,QAAU,SAASqM,GACxB,MAAqB,gBAAPA,GAAyB,OAAPA,EAA4B,kBAAPA,KAKlD,SAASpM,EAAQD,GAEtB,GAAIwM,MAAoBA,cACxBvM,GAAOD,QAAU,SAASqM,EAAIhH,GAC5B,MAAOmH,GAAepM,KAAKiM,EAAIhH,KAK5B,SAASpF,EAAQD,GAEtB,GAAI0M,MAAcA,QAElBzM,GAAOD,QAAU,SAASqM,GACxB,MAAOK,GAAStM,KAAKiM,GAAIhK,MAAM,EAAG,MAK/B,SAASpC,EAAQD,GAGtBC,EAAOD,QAAU,SAASsG,EAAIL,EAAMI,GAClC,GAAI6G,GAAK7G,IAAS1G,CAClB,QAAOsG,EAAKtC,QACV,IAAK,GAAG,MAAOuJ,GAAK5G,IACAA,EAAGlG,KAAKiG,EAC5B,KAAK,GAAG,MAAO6G,GAAK5G,EAAGL,EAAK,IACRK,EAAGlG,KAAKiG,EAAMJ,EAAK,GACvC,KAAK,GAAG,MAAOiH,GAAK5G,EAAGL,EAAK,GAAIA,EAAK,IACjBK,EAAGlG,KAAKiG,EAAMJ,EAAK,GAAIA,EAAK,GAChD,KAAK,GAAG,MAAOiH,GAAK5G,EAAGL,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAC1BK,EAAGlG,KAAKiG,EAAMJ,EAAK,GAAIA,EAAK,GAAIA,EAAK,GACzD,KAAK,GAAG,MAAOiH,GAAK5G,EAAGL,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACnCK,EAAGlG,KAAKiG,EAAMJ,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAClE,MAAoBK,GAAGwG,MAAMzG,EAAMJ,KAKlC,SAAShG,EAAQD,EAASH,GAE/B,GAAIwB,GAAWxB,EAAoB,GACnCI,GAAOD,QAAU,SAASqM,GACxB,IAAIhL,EAASgL,GAAI,KAAMhJ,WAAUgJ,EAAK,qBACtC,OAAOA,KAKJ,SAASpM,EAAQD,EAASH,GAG/B,GAAIsN,GAAUtN,EAAoB,GAClCI,GAAOD,QAAU,SAASqM,GACxB,MAAOrK,QAAOmL,EAAQd,MAKnB,SAASpM,EAAQD,GAGtBC,EAAOD,QAAU,SAASqM,GACxB,GAAGA,GAAM1M,EAAU,KAAM0D,WAAU,yBAA2BgJ,EAC9D,OAAOA,KAKJ,SAASpM,EAAQD,EAASH,GAG/B,GAAI8B,GAAU9B,EAAoB,IAC9BsN,EAAUtN,EAAoB,GAClCI,GAAOD,QAAU,SAASqM,GACxB,MAAO1K,GAAQwL,EAAQd,MAKpB,SAASpM,EAAQD,EAASH,GAG/B,GAAImB,GAAMnB,EAAoB,GAC9BI,GAAOD,QAAUgC,OAAO,KAAKuB,qBAAqB,GAAKvB,OAAS,SAASqK,GACvE,MAAkB,UAAXrL,EAAIqL,GAAkBA,EAAGpI,MAAM,IAAMjC,OAAOqK,KAKhD,SAASpM,EAAQD,GAGtB,GAAIoN,GAAQ3E,KAAK2E,KACbC,EAAQ5E,KAAK4E,KACjBpN,GAAOD,QAAU,SAASqM,GACxB,MAAOiB,OAAMjB,GAAMA,GAAM,GAAKA,EAAK,EAAIgB,EAAQD,GAAMf,KAKlD,SAASpM,EAAQD,EAASH,GAE/B,GAAI2B,GAAY3B,EAAoB,IAChC0N,EAAY9E,KAAK8E,IACjB7E,EAAYD,KAAKC,GACrBzI,GAAOD,QAAU,SAASyH,EAAO9D,GAE/B,MADA8D,GAAQjG,EAAUiG,GACH,EAARA,EAAY8F,EAAI9F,EAAQ9D,EAAQ,GAAK+E,EAAIjB,EAAO9D,KAKpD,SAAS1D,EAAQD,EAASH,GAG/B,GAAI2B,GAAY3B,EAAoB,IAChC6I,EAAYD,KAAKC,GACrBzI,GAAOD,QAAU,SAASqM,GACxB,MAAOA,GAAK,EAAI3D,EAAIlH,EAAU6K,GAAK,kBAAoB,IAKpD,SAASpM,EAAQD,EAASH,GAS/B,GAAIyK,GAAWzK,EAAoB,IAC/B8B,EAAW9B,EAAoB,IAC/ByB,EAAWzB,EAAoB,IAC/B6B,EAAW7B,EAAoB,IAC/B2N,EAAW3N,EAAoB,GACnCI,GAAOD,QAAU,SAASyN,GACxB,GAAIC,GAAwB,GAARD,EAChBE,EAAwB,GAARF,EAChBG,EAAwB,GAARH,EAChBI,EAAwB,GAARJ,EAChBK,EAAwB,GAARL,EAChBM,EAAwB,GAARN,GAAaK,CACjC,OAAO,UAASE,EAAOzG,EAAYlB,GAQjC,IAPA,GAMIiG,GAAK2B,EANLhL,EAAS3B,EAAS0M,GAClBvC,EAAS9J,EAAQsB,GACjBiL,EAAS5D,EAAI/C,EAAYlB,EAAM,GAC/B1C,EAASjC,EAAS+J,EAAK9H,QACvB8D,EAAS,EACTnC,EAASoI,EAASF,EAAIQ,EAAOrK,GAAUgK,EAAYH,EAAIQ,EAAO,GAAKrO,EAElEgE,EAAS8D,EAAOA,IAAQ,IAAGsG,GAAYtG,IAASgE,MACnDa,EAAMb,EAAKhE,GACXwG,EAAMC,EAAE5B,EAAK7E,EAAOxE,GACjBwK,GACD,GAAGC,EAAOpI,EAAOmC,GAASwG,MACrB,IAAGA,EAAI,OAAOR,GACjB,IAAK,GAAG,OAAO,CACf,KAAK,GAAG,MAAOnB,EACf,KAAK,GAAG,MAAO7E,EACf,KAAK,GAAGnC,EAAOC,KAAK+G,OACf,IAAGuB,EAAS,OAAO,CAG9B,OAAOC,GAAgB,GAAKF,GAAWC,EAAWA,EAAWvI,KAM5D,SAASrF,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,IAC/BuH,EAAWvH,EAAoB,IAC/BsO,EAAWtO,EAAoB,IAAI,UACvCI,GAAOD,QAAU,SAASoO,EAAUzK,GAClC,GAAI0K,EASF,OARCjH,GAAQgH,KACTC,EAAID,EAASzI,YAEE,kBAAL0I,IAAoBA,IAAMlM,QAASiF,EAAQiH,EAAEpM,aAAYoM,EAAI1O,GACpE0B,EAASgN,KACVA,EAAIA,EAAEF,GACG,OAANE,IAAWA,EAAI1O,KAEb,IAAK0O,IAAM1O,EAAYwC,MAAQkM,GAAG1K,KAKxC,SAAS1D,EAAQD,EAASH,GAG/B,GAAImB,GAAMnB,EAAoB,GAC9BI,GAAOD,QAAUmC,MAAMiF,SAAW,SAASkH,GACzC,MAAmB,SAAZtN,EAAIsN,KAKR,SAASrO,EAAQD,EAASH,GAE/B,GAAI0O,GAAS1O,EAAoB,IAAI,OACjC2O,EAAS3O,EAAoB,IAC7B4O,EAAS5O,EAAoB,GAAG4O,MACpCxO,GAAOD,QAAU,SAASyK,GACxB,MAAO8D,GAAM9D,KAAU8D,EAAM9D,GAC3BgE,GAAUA,EAAOhE,KAAUgE,GAAUD,GAAK,UAAY/D,MAKrD,SAASxK,EAAQD,EAASH,GAE/B,GAAIqK,GAASrK,EAAoB,GAC7B6O,EAAS,qBACTH,EAASrE,EAAOwE,KAAYxE,EAAOwE,MACvCzO,GAAOD,QAAU,SAASqF,GACxB,MAAOkJ,GAAMlJ,KAASkJ,EAAMlJ,SAKzB,SAASpF,EAAQD,EAASH,GAI/B,GAAI0B,GAAY1B,EAAoB,IAChC6B,EAAY7B,EAAoB,IAChC4B,EAAY5B,EAAoB,GACpCI,GAAOD,QAAU,SAAS2O,GACxB,MAAO,UAASX,EAAOzF,EAAIC,GACzB,GAGIlF,GAHAL,EAAS1B,EAAUyM,GACnBrK,EAASjC,EAASuB,EAAEU,QACpB8D,EAAShG,EAAQ+G,EAAW7E,EAGhC,IAAGgL,GAAepG,GAAMA,GAAG,KAAM5E,EAAS8D,GAExC,GADAnE,EAAQL,EAAEwE,KACPnE,GAASA,EAAM,OAAO,MAEpB,MAAKK,EAAS8D,EAAOA,IAAQ,IAAGkH,GAAelH,IAASxE,KAC1DA,EAAEwE,KAAWc,EAAG,MAAOoG,IAAelH,CACzC,QAAQkH,GAAe,MAMxB,SAAS1O,EAAQD,EAASH,GAI/B,GAAIY,GAAiBZ,EAAoB,GACrCqK,EAAiBrK,EAAoB,GACrCkB,EAAiBlB,EAAoB,IACrCc,EAAiBd,EAAoB,GACrCa,EAAiBb,EAAoB,GACrCwK,EAAiBxK,EAAoB,IACrC+O,EAAiB/O,EAAoB,GACrCgP,EAAiBhP,EAAoB,IACrCiP,EAAiBjP,EAAoB,IACrC2O,EAAiB3O,EAAoB,IACrCkP,EAAiBlP,EAAoB,IACrCmP,EAAiBnP,EAAoB,IACrCoP,EAAiBpP,EAAoB,IACrCqP,EAAiBrP,EAAoB,IACrCuH,EAAiBvH,EAAoB,IACrCsB,EAAiBtB,EAAoB,IACrC0B,EAAiB1B,EAAoB,IACrCe,EAAiBf,EAAoB,GACrC8C,EAAiBlC,EAAEkC,QACnBF,EAAiBhC,EAAEgC,QACnB0M,EAAiB1O,EAAEqF,OACnBD,EAAiBoJ,EAAOlM,IACxBqM,EAAiBlF,EAAOuE,OACxBY,EAAiBnF,EAAOoF,KACxBC,EAAiBF,GAASA,EAAMG,UAChCC,GAAiB,EACjBC,EAAiBX,EAAI,WACrBhF,EAAiBtJ,EAAEsJ,OACnB4F,EAAiBd,EAAO,mBACxBe,EAAiBf,EAAO,WACxBgB,EAAmC,kBAAXT,GACxBrN,EAAiBC,OAAOC,UAGxB6N,EAAgBnP,GAAeiO,EAAO,WACxC,MAES,IAFFO,EAAQ1M,KAAY,KACzBM,IAAK,WAAY,MAAON,GAAQ8D,KAAM,KAAMjD,MAAO,IAAIN,MACrDA,IACD,SAASqJ,EAAIhH,EAAK0K,GACrB,GAAIC,GAAYrN,EAAQZ,EAAasD,EAClC2K,UAAiBjO,GAAYsD,GAChC5C,EAAQ4J,EAAIhH,EAAK0K,GACdC,GAAa3D,IAAOtK,GAAYU,EAAQV,EAAasD,EAAK2K,IAC3DvN,EAEAwN,EAAO,SAASC,GAClB,GAAIC,GAAMP,EAAWM,GAAOf,EAAQC,EAAQnN,UAS5C,OARAkO,GAAIC,GAAKF,EACTvP,GAAe8O,GAAUK,EAAc/N,EAAamO,GAClDrE,cAAc,EACdwE,IAAK,SAAS/M,GACTvC,EAAIwF,KAAMmJ,IAAW3O,EAAIwF,KAAKmJ,GAASQ,KAAK3J,KAAKmJ,GAAQQ,IAAO,GACnEJ,EAAcvJ,KAAM2J,EAAKtP,EAAW,EAAG0C,OAGpC6M,GAGLG,EAAW,SAASjE,GACtB,MAAoB,gBAANA,IAGZkE,EAAkB,QAAS/N,gBAAe6J,EAAIhH,EAAK0K,GACrD,MAAGA,IAAKhP,EAAI6O,EAAYvK,IAClB0K,EAAEnE,YAID7K,EAAIsL,EAAIqD,IAAWrD,EAAGqD,GAAQrK,KAAKgH,EAAGqD,GAAQrK,IAAO,GACxD0K,EAAIZ,EAAQY,GAAInE,WAAYhL,EAAW,GAAG,OAJtCG,EAAIsL,EAAIqD,IAAQjN,EAAQ4J,EAAIqD,EAAQ9O,EAAW,OACnDyL,EAAGqD,GAAQrK,IAAO,GAIXyK,EAAczD,EAAIhH,EAAK0K,IACzBtN,EAAQ4J,EAAIhH,EAAK0K,IAExBS,EAAoB,QAAS5N,kBAAiByJ,EAAInJ,GACpD/B,EAASkL,EAKT,KAJA,GAGIhH,GAHA5B,EAAOyL,EAAShM,EAAI3B,EAAU2B,IAC9BU,EAAO,EACP6M,EAAIhN,EAAKE,OAEP8M,EAAI7M,GAAE2M,EAAgBlE,EAAIhH,EAAM5B,EAAKG,KAAMV,EAAEmC,GACnD,OAAOgH,IAELqE,EAAU,QAAS5K,QAAOuG,EAAInJ,GAChC,MAAOA,KAAMvD,EAAYwP,EAAQ9C,GAAMmE,EAAkBrB,EAAQ9C,GAAKnJ,IAEpEyN,EAAwB,QAASpN,sBAAqB8B,GACxD,GAAIuL,GAAI7G,EAAO3J,KAAKmG,KAAMlB,EAC1B,OAAOuL,KAAM7P,EAAIwF,KAAMlB,KAAStE,EAAI6O,EAAYvK,IAAQtE,EAAIwF,KAAMmJ,IAAWnJ,KAAKmJ,GAAQrK,GACtFuL,GAAI,GAENC,EAA4B,QAAS9M,0BAAyBsI,EAAIhH,GACpE,GAAI0K,GAAIpN,EAAQ0J,EAAK9K,EAAU8K,GAAKhH,EAEpC,QADG0K,IAAKhP,EAAI6O,EAAYvK,IAAUtE,EAAIsL,EAAIqD,IAAWrD,EAAGqD,GAAQrK,KAAM0K,EAAEnE,YAAa,GAC9EmE,GAELe,EAAuB,QAASlL,qBAAoByG,GAKtD,IAJA,GAGIhH,GAHAF,EAASU,EAAStE,EAAU8K,IAC5B/G,KACA1B,EAAS,EAEPuB,EAAMxB,OAASC,GAAM7C,EAAI6O,EAAYvK,EAAMF,EAAMvB,OAASyB,GAAOqK,GAAOpK,EAAOC,KAAKF,EAC1F,OAAOC,IAELyL,EAAyB,QAAS9G,uBAAsBoC,GAK1D,IAJA,GAGIhH,GAHAF,EAASU,EAAStE,EAAU8K,IAC5B/G,KACA1B,EAAS,EAEPuB,EAAMxB,OAASC,GAAK7C,EAAI6O,EAAYvK,EAAMF,EAAMvB,OAAM0B,EAAOC,KAAKqK,EAAWvK,GACnF,OAAOC,IAEL0L,EAAa,QAASxB,WAAUnD,GAClC,GAAGA,IAAO1M,IAAa2Q,EAASjE,GAAhC,CAKA,IAJA,GAGI4E,GAAUC,EAHVjL,GAAQoG,GACRzI,EAAO,EACPuN,EAAO1K,UAEL0K,EAAGxN,OAASC,GAAEqC,EAAKV,KAAK4L,EAAGvN,KAQjC,OAPAqN,GAAWhL,EAAK,GACM,kBAAZgL,KAAuBC,EAAYD,IAC1CC,IAAc9J,EAAQ6J,MAAUA,EAAW,SAAS5L,EAAK/B,GAE1D,MADG4N,KAAU5N,EAAQ4N,EAAU9Q,KAAKmG,KAAMlB,EAAK/B,IAC3CgN,EAAShN,GAAb,OAA2BA,IAE7B2C,EAAK,GAAKgL,EACH1B,EAAWzC,MAAMuC,EAAOpJ,KAE7BmL,EAAYxC,EAAO,WACrB,GAAI/K,GAAIuL,GAIR,OAA0B,UAAnBG,GAAY1L,KAAyC,MAAtB0L,GAAYvM,EAAGa,KAAwC,MAAzB0L,EAAWvN,OAAO6B,KAIpFgM,KACFT,EAAU,QAASX,UACjB,GAAG6B,EAAS/J,MAAM,KAAMlD,WAAU,8BAClC,OAAO4M,GAAKzB,EAAI/H,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,KAExD0K,EAAS+E,EAAQnN,UAAW,WAAY,QAASyK,YAC/C,MAAOnG,MAAK6J,KAGdE,EAAW,SAASjE,GAClB,MAAOA,aAAc+C,IAGvB3O,EAAEqF,OAAa4K,EACfjQ,EAAEsJ,OAAa4G,EACflQ,EAAEkC,QAAakO,EACfpQ,EAAEgC,QAAa8N,EACf9P,EAAEoC,SAAa2N,EACf/P,EAAEoF,SAAaoJ,EAAOlM,IAAM+N,EAC5BrQ,EAAEuJ,WAAa+G,EAEZpQ,IAAgBd,EAAoB,KACrCwK,EAAStI,EAAa,uBAAwB4O,GAAuB,GAIzE,IAAIU,IAEFC,MAAO,SAASjM,GACd,MAAOtE,GAAI4O,EAAgBtK,GAAO,IAC9BsK,EAAetK,GACfsK,EAAetK,GAAO+J,EAAQ/J,IAGpCkM,OAAQ,QAASA,QAAOlM,GACtB,MAAO2J,GAAMW,EAAgBtK,IAE/BmM,UAAW,WAAY/B,GAAS,GAChCgC,UAAW,WAAYhC,GAAS,GAalChP,GAAEqH,KAAK1H,KAAK,iHAGV6D,MAAM,KAAM,SAASoI,GACrB,GAAI8D,GAAMpB,EAAI1C,EACdgF,GAAchF,GAAMwD,EAAYM,EAAMF,EAAKE,KAG7CV,GAAS,EAET/O,EAAQA,EAAQsK,EAAItK,EAAQ6K,GAAIkD,OAAQW,IAExC1O,EAAQA,EAAQmD,EAAG,SAAUwN,GAE7B3Q,EAAQA,EAAQmD,EAAInD,EAAQoD,GAAK+L,EAAW,UAE1C/J,OAAQ4K,EAERlO,eAAgB+N,EAEhB3N,iBAAkB4N,EAElBzM,yBAA0B8M,EAE1BjL,oBAAqBkL,EAErB7G,sBAAuB8G,IAIzB1B,GAAS3O,EAAQA,EAAQmD,EAAInD,EAAQoD,IAAM+L,GAAauB,GAAY,QAAS5B,UAAWwB,IAGxFlC,EAAeM,EAAS,UAExBN,EAAerG,KAAM,QAAQ,GAE7BqG,EAAe5E,EAAOoF,KAAM,QAAQ,IAI/B,SAASrP,EAAQD,EAASH,GAE/B,GAAI6R,GAAM7R,EAAoB,GAAG4C,QAC7B1B,EAAMlB,EAAoB,IAC1B8R,EAAM9R,EAAoB,IAAI,cAElCI,GAAOD,QAAU,SAASqM,EAAI6D,EAAK0B,GAC9BvF,IAAOtL,EAAIsL,EAAKuF,EAAOvF,EAAKA,EAAGpK,UAAW0P,IAAKD,EAAIrF,EAAIsF,GAAM9F,cAAc,EAAMvI,MAAO4M,MAKxF,SAASjQ,EAAQD,EAASH,GAE/B,GAAIY,GAAYZ,EAAoB,GAChC0B,EAAY1B,EAAoB,GACpCI,GAAOD,QAAU,SAASoF,EAAQmD,GAMhC,IALA,GAIIlD,GAJApC,EAAS1B,EAAU6D,GACnB3B,EAAShD,EAAEiD,QAAQT,GACnBU,EAASF,EAAKE,OACd8D,EAAS,EAEP9D,EAAS8D,GAAM,GAAGxE,EAAEoC,EAAM5B,EAAKgE,QAAcc,EAAG,MAAOlD,KAK1D,SAASpF,EAAQD,EAASH,GAG/B,GAAI0B,GAAY1B,EAAoB,IAChCgG,EAAYhG,EAAoB,GAAGgG,SACnC6G,KAAeA,SAEfmF,EAA+B,gBAAVrG,SAAsBxJ,OAAO4D,oBAClD5D,OAAO4D,oBAAoB4F,WAE3BsG,EAAiB,SAASzF,GAC5B,IACE,MAAOxG,GAASwG,GAChB,MAAMjJ,GACN,MAAOyO,GAAYxP,SAIvBpC,GAAOD,QAAQ+C,IAAM,QAAS6C,qBAAoByG,GAChD,MAAGwF,IAAoC,mBAArBnF,EAAStM,KAAKiM,GAAgCyF,EAAezF,GACxExG,EAAStE,EAAU8K,MAKvB,SAASpM,EAAQD,EAASH,GAG/B,GAAIY,GAAIZ,EAAoB,EAC5BI,GAAOD,QAAU,SAASqM,GACxB,GAAI5I,GAAahD,EAAEiD,QAAQ2I,GACvBrC,EAAavJ,EAAEuJ,UACnB,IAAGA,EAKD,IAJA,GAGI3E,GAHA0M,EAAU/H,EAAWqC,GACrBtC,EAAUtJ,EAAEsJ,OACZnG,EAAU,EAERmO,EAAQpO,OAASC,GAAKmG,EAAO3J,KAAKiM,EAAIhH,EAAM0M,EAAQnO,OAAMH,EAAK8B,KAAKF,EAE5E,OAAO5B,KAKJ,SAASxD,EAAQD,GAEtBC,EAAOD,SAAU,GAIZ,SAASC,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAG,UAAWkO,OAAQnS,EAAoB,OAIjE,SAASI,EAAQD,EAASH,GAG/B,GAAIY,GAAWZ,EAAoB,GAC/ByB,EAAWzB,EAAoB,IAC/B8B,EAAW9B,EAAoB,GAGnCI,GAAOD,QAAUH,EAAoB,GAAG,WACtC,GAAImD,GAAIhB,OAAOgQ,OACXC,KACA7G,KACAvH,EAAI4K,SACJyD,EAAI,sBAGR,OAFAD,GAAEpO,GAAK,EACPqO,EAAEjO,MAAM,IAAI4D,QAAQ,SAASsK,GAAI/G,EAAE+G,GAAKA,IAClB,GAAfnP,KAAMiP,GAAGpO,IAAW7B,OAAOyB,KAAKT,KAAMoI,IAAI7I,KAAK,KAAO2P,IAC1D,QAASF,QAAO3G,EAAQX,GAQ3B,IAPA,GAAI0H,GAAQ9Q,EAAS+J,GACjB8F,EAAQ1K,UACR4L,EAAQlB,EAAGxN,OACX8D,EAAQ,EACR/D,EAAajD,EAAEiD,QACfsG,EAAavJ,EAAEuJ,WACfD,EAAatJ,EAAEsJ,OACbsI,EAAQ5K,GAMZ,IALA,GAIIpC,GAJAxB,EAASlC,EAAQwP,EAAG1J,MACpBhE,EAASuG,EAAatG,EAAQG,GAAGM,OAAO6F,EAAWnG,IAAMH,EAAQG,GACjEF,EAASF,EAAKE,OACd2O,EAAS,EAEP3O,EAAS2O,GAAKvI,EAAO3J,KAAKyD,EAAGwB,EAAM5B,EAAK6O,QAAMF,EAAE/M,GAAOxB,EAAEwB,GAEjE,OAAO+M,IACLpQ,OAAOgQ,QAIN,SAAS/R,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAClCa,GAAQA,EAAQmD,EAAG,UAAWmJ,GAAInN,EAAoB,OAIjD,SAASI,EAAQD,GAGtBC,EAAOD,QAAUgC,OAAOgL,IAAM,QAASA,IAAGuF,EAAGnJ,GAC3C,MAAOmJ,KAAMnJ,EAAU,IAANmJ,GAAW,EAAIA,IAAM,EAAInJ,EAAImJ,GAAKA,GAAKnJ,GAAKA,IAK1D,SAASnJ,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAClCa,GAAQA,EAAQmD,EAAG,UAAW2O,eAAgB3S,EAAoB,IAAIwQ,OAIjE,SAASpQ,EAAQD,EAASH,GAI/B,GAAI8C,GAAW9C,EAAoB,GAAG8C,QAClCtB,EAAWxB,EAAoB,IAC/BsB,EAAWtB,EAAoB,IAC/B4S,EAAQ,SAASxP,EAAGyP,GAEtB,GADAvR,EAAS8B,IACL5B,EAASqR,IAAoB,OAAVA,EAAe,KAAMrP,WAAUqP,EAAQ,6BAEhEzS,GAAOD,SACLqQ,IAAKrO,OAAOwQ,iBAAmB,gBAC7B,SAASG,EAAMC,EAAOvC,GACpB,IACEA,EAAMxQ,EAAoB,IAAIsG,SAAS/F,KAAMuC,EAAQX,OAAOC,UAAW,aAAaoO,IAAK,GACzFA,EAAIsC,MACJC,IAAUD,YAAgBxQ,QAC1B,MAAMiB,GAAIwP,GAAQ,EACpB,MAAO,SAASJ,gBAAevP,EAAGyP,GAIhC,MAHAD,GAAMxP,EAAGyP,GACNE,EAAM3P,EAAE4P,UAAYH,EAClBrC,EAAIpN,EAAGyP,GACLzP,QAEL,GAAStD,GACjB8S,MAAOA,IAKJ,SAASxS,EAAQD,EAASH,GAI/B,GAAIiT,GAAUjT,EAAoB,IAC9B8S,IACJA,GAAK9S,EAAoB,IAAI,gBAAkB,IAC5C8S,EAAO,IAAM,cACd9S,EAAoB,IAAImC,OAAOC,UAAW,WAAY,QAASyK,YAC7D,MAAO,WAAaoG,EAAQvM,MAAQ,MACnC,IAKA,SAAStG,EAAQD,EAASH,GAG/B,GAAImB,GAAMnB,EAAoB,IAC1B8R,EAAM9R,EAAoB,IAAI,eAE9BkT,EAAgD,aAA1C/R,EAAI,WAAY,MAAOyF,cAEjCxG,GAAOD,QAAU,SAASqM,GACxB,GAAIpJ,GAAGmP,EAAGhH,CACV,OAAOiB,KAAO1M,EAAY,YAAqB,OAAP0M,EAAc,OAEZ,iBAA9B+F,GAAKnP,EAAIjB,OAAOqK,IAAKsF,IAAoBS,EAEjDW,EAAM/R,EAAIiC,GAEM,WAAfmI,EAAIpK,EAAIiC,KAAsC,kBAAZA,GAAE+P,OAAuB,YAAc5H,IAK3E,SAASnL,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,GAEnCA,GAAoB,IAAI,SAAU,SAASoT,GACzC,MAAO,SAASC,QAAO7G,GACrB,MAAO4G,IAAW5R,EAASgL,GAAM4G,EAAQ5G,GAAMA,MAM9C,SAASpM,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9BsK,EAAUtK,EAAoB,GAC9BqB,EAAUrB,EAAoB,EAClCI,GAAOD,QAAU,SAASmT,EAAKpH,GAC7B,GAAIzF,IAAO6D,EAAKnI,YAAcmR,IAAQnR,OAAOmR,GACzCtI,IACJA,GAAIsI,GAAOpH,EAAKzF,GAChB5F,EAAQA,EAAQmD,EAAInD,EAAQoD,EAAI5C,EAAM,WAAYoF,EAAG,KAAQ,SAAUuE,KAKpE,SAAS5K,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,GAEnCA,GAAoB,IAAI,OAAQ,SAASuT,GACvC,MAAO,SAASC,MAAKhH,GACnB,MAAO+G,IAAS/R,EAASgL,GAAM+G,EAAM/G,GAAMA,MAM1C,SAASpM,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,GAEnCA,GAAoB,IAAI,oBAAqB,SAASyT,GACpD,MAAO,SAASC,mBAAkBlH,GAChC,MAAOiH,IAAsBjS,EAASgL,GAAMiH,EAAmBjH,GAAMA,MAMpE,SAASpM,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,GAEnCA,GAAoB,IAAI,WAAY,SAAS2T,GAC3C,MAAO,SAASC,UAASpH,GACvB,MAAOhL,GAASgL,GAAMmH,EAAYA,EAAUnH,IAAM,GAAQ,MAMzD,SAASpM,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,GAEnCA,GAAoB,IAAI,WAAY,SAAS6T,GAC3C,MAAO,SAASC,UAAStH,GACvB,MAAOhL,GAASgL,GAAMqH,EAAYA,EAAUrH,IAAM,GAAQ,MAMzD,SAASpM,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,GAEnCA,GAAoB,IAAI,eAAgB,SAAS+T,GAC/C,MAAO,SAASC,cAAaxH,GAC3B,MAAOhL,GAASgL,GAAMuH,EAAgBA,EAAcvH,IAAM,GAAO,MAMhE,SAASpM,EAAQD,EAASH,GAG/B,GAAI0B,GAAY1B,EAAoB,GAEpCA,GAAoB,IAAI,2BAA4B,SAASgR,GAC3D,MAAO,SAAS9M,0BAAyBsI,EAAIhH,GAC3C,MAAOwL,GAA0BtP,EAAU8K,GAAKhH,OAM/C,SAASpF,EAAQD,EAASH,GAG/B,GAAIyB,GAAWzB,EAAoB,GAEnCA,GAAoB,IAAI,iBAAkB,SAASiU,GACjD,MAAO,SAASrO,gBAAe4G,GAC7B,MAAOyH,GAAgBxS,EAAS+K,QAM/B,SAASpM,EAAQD,EAASH,GAG/B,GAAIyB,GAAWzB,EAAoB,GAEnCA,GAAoB,IAAI,OAAQ,SAASkU,GACvC,MAAO,SAAStQ,MAAK4I,GACnB,MAAO0H,GAAMzS,EAAS+K,QAMrB,SAASpM,EAAQD,EAASH,GAG/BA,EAAoB,IAAI,sBAAuB,WAC7C,MAAOA,GAAoB,IAAIkD,OAK5B,SAAS9C,EAAQD,EAASH,GAE/B,GAAI4C,GAAa5C,EAAoB,GAAG4C,QACpC7B,EAAaf,EAAoB,GACjCkB,EAAalB,EAAoB,IACjCmU,EAAa7N,SAASlE,UACtBgS,EAAa,wBACbC,EAAa,MAEjBA,KAAQF,IAAUnU,EAAoB,IAAM4C,EAAQuR,EAAQE,GAC1DrI,cAAc,EACd9I,IAAK,WACH,GAAIoR,IAAS,GAAK5N,MAAM4N,MAAMF,GAC1BxJ,EAAQ0J,EAAQA,EAAM,GAAK,EAE/B,OADApT,GAAIwF,KAAM2N,IAASzR,EAAQ8D,KAAM2N,EAAMtT,EAAW,EAAG6J,IAC9CA,MAMN,SAASxK,EAAQD,EAASH,GAG/B,GAAIY,GAAgBZ,EAAoB,GACpCwB,EAAgBxB,EAAoB,IACpCuU,EAAgBvU,EAAoB,IAAI,eACxCwU,EAAgBlO,SAASlE,SAExBmS,KAAgBC,IAAe5T,EAAEgC,QAAQ4R,EAAeD,GAAe9Q,MAAO,SAASL,GAC1F,GAAkB,kBAARsD,QAAuBlF,EAAS4B,GAAG,OAAO,CACpD,KAAI5B,EAASkF,KAAKtE,WAAW,MAAOgB,aAAasD,KAEjD,MAAMtD,EAAIxC,EAAEiF,SAASzC,IAAG,GAAGsD,KAAKtE,YAAcgB,EAAE,OAAO,CACvD,QAAO,MAKJ,SAAShD,EAAQD,EAASH,GAG/B,GAAIY,GAAcZ,EAAoB,GAClCqK,EAAcrK,EAAoB,GAClCkB,EAAclB,EAAoB,IAClCmB,EAAcnB,EAAoB,IAClCyU,EAAczU,EAAoB,IAClCqB,EAAcrB,EAAoB,GAClC0U,EAAc1U,EAAoB,IAAI2U,KACtCC,EAAc,SACdC,EAAcxK,EAAOuK,GACrBE,EAAcD,EACdhC,EAAcgC,EAAQzS,UAEtB2S,EAAc5T,EAAIP,EAAEqF,OAAO4M,KAAW+B,EACtCI,EAAc,QAAUpI,QAAOxK,UAG/B6S,EAAW,SAASC,GACtB,GAAI1I,GAAKiI,EAAYS,GAAU,EAC/B,IAAgB,gBAAN1I,IAAkBA,EAAG1I,OAAS,EAAE,CACxC0I,EAAKwI,EAAOxI,EAAGmI,OAASD,EAAMlI,EAAI,EAClC,IACI2I,GAAOC,EAAOC,EADdC,EAAQ9I,EAAG+I,WAAW,EAE1B,IAAa,KAAVD,GAA0B,KAAVA,GAEjB,GADAH,EAAQ3I,EAAG+I,WAAW,GACT,KAAVJ,GAA0B,MAAVA,EAAc,MAAOhM,SACnC,IAAa,KAAVmM,EAAa,CACrB,OAAO9I,EAAG+I,WAAW,IACnB,IAAK,IAAK,IAAK,IAAMH,EAAQ,EAAGC,EAAU,EAAI,MAC9C,KAAK,IAAK,IAAK,KAAMD,EAAQ,EAAGC,EAAU,EAAI,MAC9C,SAAU,OAAQ7I,EAEpB,IAAI,GAAoDgJ,GAAhDC,EAASjJ,EAAGhK,MAAM,GAAIuB,EAAI,EAAG6M,EAAI6E,EAAO3R,OAAkB8M,EAAJ7M,EAAOA,IAInE,GAHAyR,EAAOC,EAAOF,WAAWxR,GAGf,GAAPyR,GAAaA,EAAOH,EAAQ,MAAOlM,IACtC,OAAOuM,UAASD,EAAQL,IAE5B,OAAQ5I,EAGRqI,GAAQ,SAAYA,EAAQ,SAAUA,EAAQ,UAChDA,EAAU,QAASc,QAAOlS,GACxB,GAAI+I,GAAK5F,UAAU9C,OAAS,EAAI,EAAIL,EAChC+C,EAAOE,IACX,OAAOF,aAAgBqO,KAEjBE,EAAa1T,EAAM,WAAYwR,EAAM+C,QAAQrV,KAAKiG,KAAYrF,EAAIqF,IAASoO,GAC3E,GAAIE,GAAKG,EAASzI,IAAOyI,EAASzI,IAE1C5L,EAAEqH,KAAK1H,KAAKP,EAAoB,GAAKY,EAAEoF,SAAS8O,GAAQ,6KAMtD1Q,MAAM,KAAM,SAASoB,GAClBtE,EAAI4T,EAAMtP,KAAStE,EAAI2T,EAASrP,IACjC5E,EAAEgC,QAAQiS,EAASrP,EAAK5E,EAAEkC,QAAQgS,EAAMtP,MAG5CqP,EAAQzS,UAAYyQ,EACpBA,EAAM/M,YAAc+O,EACpB7U,EAAoB,IAAIqK,EAAQuK,EAAQC,KAKrC,SAASzU,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,GAGnCI,GAAOD,QAAU,SAASqM,EAAIxI,GAC5B,IAAIxC,EAASgL,GAAI,MAAOA,EACxB,IAAI/F,GAAIgG,CACR,IAAGzI,GAAkC,mBAArByC,EAAK+F,EAAGK,YAA4BrL,EAASiL,EAAMhG,EAAGlG,KAAKiM,IAAK,MAAOC,EACvF,IAA+B,mBAApBhG,EAAK+F,EAAGoJ,WAA2BpU,EAASiL,EAAMhG,EAAGlG,KAAKiM,IAAK,MAAOC,EACjF,KAAIzI,GAAkC,mBAArByC,EAAK+F,EAAGK,YAA4BrL,EAASiL,EAAMhG,EAAGlG,KAAKiM,IAAK,MAAOC,EACxF,MAAMjJ,WAAU,6CAKb,SAASpD,EAAQD,EAASH,GAE/B,GAAIa,GAAUb,EAAoB,GAC9BsN,EAAUtN,EAAoB,IAC9BqB,EAAUrB,EAAoB,GAC9B6V,EAAU,+CAEVC,EAAU,IAAMD,EAAS,IACzBE,EAAU,KACVC,EAAUC,OAAO,IAAMH,EAAQA,EAAQ,KACvCI,EAAUD,OAAOH,EAAQA,EAAQ,MAEjCK,EAAW,SAAS7C,EAAKpH,GAC3B,GAAIlB,KACJA,GAAIsI,GAAOpH,EAAKyI,GAChB9T,EAAQA,EAAQwC,EAAIxC,EAAQoD,EAAI5C,EAAM,WACpC,QAASwU,EAAOvC,MAAUyC,EAAIzC,MAAUyC,IACtC,SAAU/K,IAMZ2J,EAAOwB,EAASxB,KAAO,SAASyB,EAAQxI,GAI1C,MAHAwI,GAASxJ,OAAOU,EAAQ8I,IACd,EAAPxI,IAASwI,EAASA,EAAOC,QAAQL,EAAO,KACjC,EAAPpI,IAASwI,EAASA,EAAOC,QAAQH,EAAO,KACpCE,EAGThW,GAAOD,QAAUgW,GAIZ,SAAS/V,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,UAAWsS,QAAS1N,KAAK2N,IAAI,EAAG,QAI9C,SAASnW,EAAQD,EAASH,GAG/B,GAAIa,GAAYb,EAAoB,GAChCwW,EAAYxW,EAAoB,GAAGoJ,QAEvCvI,GAAQA,EAAQmD,EAAG,UACjBoF,SAAU,QAASA,UAASoD,GAC1B,MAAoB,gBAANA,IAAkBgK,EAAUhK,OAMzC,SAASpM,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,UAAWyS,UAAWzW,EAAoB,OAIxD,SAASI,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,IAC/BwN,EAAW5E,KAAK4E,KACpBpN,GAAOD,QAAU,QAASsW,WAAUjK,GAClC,OAAQhL,EAASgL,IAAOpD,SAASoD,IAAOgB,EAAMhB,KAAQA,IAKnD,SAASpM,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,UACjByJ,MAAO,QAASA,OAAMiJ,GACpB,MAAOA,IAAUA,MAMhB,SAAStW,EAAQD,EAASH,GAG/B,GAAIa,GAAYb,EAAoB,GAChCyW,EAAYzW,EAAoB,IAChC2J,EAAYf,KAAKe,GAErB9I,GAAQA,EAAQmD,EAAG,UACjB2S,cAAe,QAASA,eAAcD,GACpC,MAAOD,GAAUC,IAAW/M,EAAI+M,IAAW,qBAM1C,SAAStW,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,UAAW4S,iBAAkB,oBAI3C,SAASxW,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,UAAW6S,iBAAkB,qBAI3C,SAASzW,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,UAAW8S,WAAYA,cAIrC,SAAS1W,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,UAAW0R,SAAUA,YAInC,SAAStV,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B+W,EAAU/W,EAAoB,IAC9BgX,EAAUpO,KAAKoO,KACfC,EAAUrO,KAAKsO,KAGnBrW,GAAQA,EAAQmD,EAAInD,EAAQoD,IAAMgT,GAAkD,KAAxCrO,KAAK4E,MAAMyJ,EAAOtB,OAAOwB,aAAqB,QACxFD,MAAO,QAASA,OAAMxE,GACpB,OAAQA,GAAKA,GAAK,EAAIvJ,IAAMuJ,EAAI,kBAC5B9J,KAAKwO,IAAI1E,GAAK9J,KAAKyO,IACnBN,EAAMrE,EAAI,EAAIsE,EAAKtE,EAAI,GAAKsE,EAAKtE,EAAI,QAMxC,SAAStS,EAAQD,GAGtBC,EAAOD,QAAUyI,KAAKmO,OAAS,QAASA,OAAMrE,GAC5C,OAAQA,GAAKA,GAAK,OAAa,KAAJA,EAAWA,EAAIA,EAAIA,EAAI,EAAI9J,KAAKwO,IAAI,EAAI1E,KAKhE,SAAStS,EAAQD,EAASH,GAK/B,QAASsX,OAAM5E,GACb,MAAQtJ,UAASsJ,GAAKA,IAAW,GAALA,EAAiB,EAAJA,GAAS4E,OAAO5E,GAAK9J,KAAKwO,IAAI1E,EAAI9J,KAAKoO,KAAKtE,EAAIA,EAAI,IAAxDA,EAHvC,GAAI7R,GAAUb,EAAoB,EAMlCa,GAAQA,EAAQmD,EAAG,QAASsT,MAAOA,SAI9B,SAASlX,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QACjBuT,MAAO,QAASA,OAAM7E,GACpB,MAAmB,KAAXA,GAAKA,GAAUA,EAAI9J,KAAKwO,KAAK,EAAI1E,IAAM,EAAIA,IAAM,MAMxD,SAAStS,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9BwX,EAAUxX,EAAoB,GAElCa,GAAQA,EAAQmD,EAAG,QACjByT,KAAM,QAASA,MAAK/E,GAClB,MAAO8E,GAAK9E,GAAKA,GAAK9J,KAAK2N,IAAI3N,KAAKe,IAAI+I,GAAI,EAAI,OAM/C,SAAStS,EAAQD,GAGtBC,EAAOD,QAAUyI,KAAK4O,MAAQ,QAASA,MAAK9E,GAC1C,MAAmB,KAAXA,GAAKA,IAAWA,GAAKA,EAAIA,EAAQ,EAAJA,EAAQ,GAAK,IAK/C,SAAStS,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QACjB0T,MAAO,QAASA,OAAMhF,GACpB,OAAQA,KAAO,GAAK,GAAK9J,KAAK4E,MAAM5E,KAAKwO,IAAI1E,EAAI,IAAO9J,KAAK+O,OAAS,OAMrE,SAASvX,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9BgL,EAAUpC,KAAKoC,GAEnBnK,GAAQA,EAAQmD,EAAG,QACjB4T,KAAM,QAASA,MAAKlF,GAClB,OAAQ1H,EAAI0H,GAAKA,GAAK1H,GAAK0H,IAAM,MAMhC,SAAStS,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QAAS6T,MAAO7X,EAAoB,OAIlD,SAASI,EAAQD,GAGtBC,EAAOD,QAAUyI,KAAKiP,OAAS,QAASA,OAAMnF,GAC5C,MAAmB,KAAXA,GAAKA,GAAUA,EAAIA,GAAK,MAAY,KAAJA,EAAWA,EAAIA,EAAIA,EAAI,EAAI9J,KAAKoC,IAAI0H,GAAK,IAK9E,SAAStS,EAAQD,EAASH,GAG/B,GAAIa,GAAYb,EAAoB,GAChCwX,EAAYxX,EAAoB,IAChCuW,EAAY3N,KAAK2N,IACjBD,EAAYC,EAAI,EAAG,KACnBuB,EAAYvB,EAAI,EAAG,KACnBwB,EAAYxB,EAAI,EAAG,MAAQ,EAAIuB,GAC/BE,EAAYzB,EAAI,EAAG,MAEnB0B,EAAkB,SAAS5R,GAC7B,MAAOA,GAAI,EAAIiQ,EAAU,EAAIA,EAI/BzV,GAAQA,EAAQmD,EAAG,QACjBkU,OAAQ,QAASA,QAAOxF,GACtB,GAEIvP,GAAGsC,EAFH0S,EAAQvP,KAAKe,IAAI+I,GACjB0F,EAAQZ,EAAK9E,EAEjB,OAAUsF,GAAPG,EAAoBC,EAAQH,EAAgBE,EAAOH,EAAQF,GAAaE,EAAQF,GACnF3U,GAAK,EAAI2U,EAAYxB,GAAW6B,EAChC1S,EAAStC,GAAKA,EAAIgV,GACf1S,EAASsS,GAAStS,GAAUA,EAAc2S,GAAQC,EAAAA,GAC9CD,EAAQ3S,OAMd,SAASrF,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B2J,EAAUf,KAAKe,GAEnB9I,GAAQA,EAAQmD,EAAG,QACjBsU,MAAO,QAASA,OAAMC,EAAQC,GAO5B,IANA,GAKI/J,GAAKgK,EALLC,EAAQ,EACR3U,EAAQ,EACRuN,EAAQ1K,UACR4L,EAAQlB,EAAGxN,OACX6U,EAAQ,EAEFnG,EAAJzO,GACJ0K,EAAM9E,EAAI2H,EAAGvN,MACH0K,EAAPkK,GACDF,EAAOE,EAAOlK,EACdiK,EAAOA,EAAMD,EAAMA,EAAM,EACzBE,EAAOlK,GACCA,EAAM,GACdgK,EAAOhK,EAAMkK,EACbD,GAAOD,EAAMA,GACRC,GAAOjK,CAEhB,OAAOkK,KAASN,EAAAA,EAAWA,EAAAA,EAAWM,EAAO/P,KAAKoO,KAAK0B,OAMtD,SAAStY,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B4Y,EAAUhQ,KAAKiQ,IAGnBhY,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAIjE,EAAoB,GAAG,WACrD,MAA+B,IAAxB4Y,EAAM,WAAY,IAA4B,GAAhBA,EAAM9U,SACzC,QACF+U,KAAM,QAASA,MAAKnG,EAAGnJ,GACrB,GAAIuP,GAAS,MACTC,GAAMrG,EACNsG,GAAMzP,EACN0P,EAAKH,EAASC,EACdG,EAAKJ,EAASE,CAClB,OAAO,GAAIC,EAAKC,IAAOJ,EAASC,IAAO,IAAMG,EAAKD,GAAMH,EAASE,IAAO,KAAO,KAAO,OAMrF,SAAS5Y,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QACjBmV,MAAO,QAASA,OAAMzG,GACpB,MAAO9J,MAAKwO,IAAI1E,GAAK9J,KAAKwQ,SAMzB,SAAShZ,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QAAS+S,MAAO/W,EAAoB,OAIlD,SAASI,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QACjBqV,KAAM,QAASA,MAAK3G,GAClB,MAAO9J,MAAKwO,IAAI1E,GAAK9J,KAAKyO,QAMzB,SAASjX,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QAASwT,KAAMxX,EAAoB,OAIjD,SAASI,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B6X,EAAU7X,EAAoB,IAC9BgL,EAAUpC,KAAKoC,GAGnBnK,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAIjE,EAAoB,GAAG,WACrD,MAA6B,SAArB4I,KAAK0Q,KAAK,UAChB,QACFA,KAAM,QAASA,MAAK5G,GAClB,MAAO9J,MAAKe,IAAI+I,GAAKA,GAAK,GACrBmF,EAAMnF,GAAKmF,GAAOnF,IAAM,GACxB1H,EAAI0H,EAAI,GAAK1H,GAAK0H,EAAI,KAAO9J,KAAKmI,EAAI,OAM1C,SAAS3Q,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B6X,EAAU7X,EAAoB,IAC9BgL,EAAUpC,KAAKoC,GAEnBnK,GAAQA,EAAQmD,EAAG,QACjBuV,KAAM,QAASA,MAAK7G,GAClB,GAAIvP,GAAI0U,EAAMnF,GAAKA,GACf1F,EAAI6K,GAAOnF,EACf,OAAOvP,IAAKkV,EAAAA,EAAW,EAAIrL,GAAKqL,EAAAA,EAAW,IAAMlV,EAAI6J,IAAMhC,EAAI0H,GAAK1H,GAAK0H,QAMxE,SAAStS,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,QACjBwV,MAAO,QAASA,OAAMhN,GACpB,OAAQA,EAAK,EAAI5D,KAAK4E,MAAQ5E,KAAK2E,MAAMf,OAMxC,SAASpM,EAAQD,EAASH,GAE/B,GAAIa,GAAiBb,EAAoB,GACrC4B,EAAiB5B,EAAoB,IACrCyZ,EAAiB7M,OAAO6M,aACxBC,EAAiB9M,OAAO+M,aAG5B9Y,GAAQA,EAAQmD,EAAInD,EAAQoD,KAAOyV,GAA2C,GAAzBA,EAAe5V,QAAc,UAEhF6V,cAAe,QAASA,eAAcjH,GAMpC,IALA,GAII8C,GAJApH,KACAkD,EAAQ1K,UACR4L,EAAQlB,EAAGxN,OACXC,EAAQ,EAENyO,EAAQzO,GAAE,CAEd,GADAyR,GAAQlE,EAAGvN,KACRnC,EAAQ4T,EAAM,WAAcA,EAAK,KAAMnM,YAAWmM,EAAO,6BAC5DpH,GAAI1I,KAAY,MAAP8P,EACLiE,EAAajE,GACbiE,IAAejE,GAAQ,QAAY,IAAM,MAAQA,EAAO,KAAQ,QAEpE,MAAOpH,GAAI1L,KAAK,QAMjB,SAAStC,EAAQD,EAASH,GAE/B,GAAIa,GAAYb,EAAoB,GAChC0B,EAAY1B,EAAoB,IAChC6B,EAAY7B,EAAoB,GAEpCa,GAAQA,EAAQmD,EAAG,UAEjB4V,IAAK,QAASA,KAAIC,GAOhB,IANA,GAAIC,GAAQpY,EAAUmY,EAASD,KAC3BzT,EAAQtE,EAASiY,EAAIhW,QACrBwN,EAAQ1K,UACR4L,EAAQlB,EAAGxN,OACXsK,KACArK,EAAQ,EACNoC,EAAMpC,GACVqK,EAAI1I,KAAKkH,OAAOkN,EAAI/V,OACbyO,EAAJzO,GAAUqK,EAAI1I,KAAKkH,OAAO0E,EAAGvN,IAChC,OAAOqK,GAAI1L,KAAK,QAMjB,SAAStC,EAAQD,EAASH,GAI/BA,EAAoB,IAAI,OAAQ,SAAS0U,GACvC,MAAO,SAASC,QACd,MAAOD,GAAMhO,KAAM,OAMlB,SAAStG,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B+Z,EAAU/Z,EAAoB,KAAI,EACtCa,GAAQA,EAAQwC,EAAG,UAEjB2W,YAAa,QAASA,aAAYC,GAChC,MAAOF,GAAIrT,KAAMuT,OAMhB,SAAS7Z,EAAQD,EAASH,GAE/B,GAAI2B,GAAY3B,EAAoB,IAChCsN,EAAYtN,EAAoB,GAGpCI,GAAOD,QAAU,SAASiM,GACxB,MAAO,UAAS5F,EAAMyT,GACpB,GAGI9W,GAAG6J,EAHHtD,EAAIkD,OAAOU,EAAQ9G,IACnBzC,EAAIpC,EAAUsY,GACdrJ,EAAIlH,EAAE5F,MAEV,OAAO,GAAJC,GAASA,GAAK6M,EAASxE,EAAY,GAAKtM,GAC3CqD,EAAIuG,EAAE6L,WAAWxR,GACN,MAAJZ,GAAcA,EAAI,OAAUY,EAAI,IAAM6M,IAAM5D,EAAItD,EAAE6L,WAAWxR,EAAI,IAAM,OAAUiJ,EAAI,MACxFZ,EAAY1C,EAAErC,OAAOtD,GAAKZ,EAC1BiJ,EAAY1C,EAAElH,MAAMuB,EAAGA,EAAI,IAAMZ,EAAI,OAAU,KAAO6J,EAAI,OAAU,UAMvE,SAAS5M,EAAQD,EAASH,GAI/B,GAAIa,GAAYb,EAAoB,GAChC6B,EAAY7B,EAAoB,IAChCka,EAAYla,EAAoB,KAChCma,EAAY,WACZC,EAAY,GAAGD,EAEnBtZ,GAAQA,EAAQwC,EAAIxC,EAAQoD,EAAIjE,EAAoB,KAAKma,GAAY,UACnEE,SAAU,QAASA,UAASC,GAC1B,GAAI9T,GAAO0T,EAAQxT,KAAM4T,EAAcH,GACnC7I,EAAO1K,UACP2T,EAAcjJ,EAAGxN,OAAS,EAAIwN,EAAG,GAAKxR,EACtCqG,EAAStE,EAAS2E,EAAK1C,QACvBiD,EAASwT,IAAgBza,EAAYqG,EAAMyC,KAAKC,IAAIhH,EAAS0Y,GAAcpU,GAC3EqU,EAAS5N,OAAO0N,EACpB,OAAOF,GACHA,EAAU7Z,KAAKiG,EAAMgU,EAAQzT,GAC7BP,EAAKhE,MAAMuE,EAAMyT,EAAO1W,OAAQiD,KAASyT,MAM5C,SAASpa,EAAQD,EAASH,GAG/B,GAAIya,GAAWza,EAAoB,KAC/BsN,EAAWtN,EAAoB,GAEnCI,GAAOD,QAAU,SAASqG,EAAM8T,EAAcjG,GAC5C,GAAGoG,EAASH,GAAc,KAAM9W,WAAU,UAAY6Q,EAAO,yBAC7D,OAAOzH,QAAOU,EAAQ9G,MAKnB,SAASpG,EAAQD,EAASH,GAG/B,GAAIwB,GAAWxB,EAAoB,IAC/BmB,EAAWnB,EAAoB,IAC/B0a,EAAW1a,EAAoB,IAAI,QACvCI,GAAOD,QAAU,SAASqM,GACxB,GAAIiO,EACJ,OAAOjZ,GAASgL,MAASiO,EAAWjO,EAAGkO,MAAY5a,IAAc2a,EAAsB,UAAXtZ,EAAIqL,MAK7E,SAASpM,EAAQD,EAASH,GAE/B,GAAI0a,GAAQ1a,EAAoB,IAAI,QACpCI,GAAOD,QAAU,SAASmT,GACxB,GAAIqH,GAAK,GACT,KACE,MAAMrH,GAAKqH,GACX,MAAMpX,GACN,IAEE,MADAoX,GAAGD,IAAS,GACJ,MAAMpH,GAAKqH,GACnB,MAAMtM,KACR,OAAO,IAKN,SAASjO,EAAQD,EAASH,GAI/B,GAAIa,GAAWb,EAAoB,GAC/Bka,EAAWla,EAAoB,KAC/B4a,EAAW,UAEf/Z,GAAQA,EAAQwC,EAAIxC,EAAQoD,EAAIjE,EAAoB,KAAK4a,GAAW,UAClEC,SAAU,QAASA,UAASP,GAC1B,SAAUJ,EAAQxT,KAAM4T,EAAcM,GACnCpS,QAAQ8R,EAAc1T,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,OAM9D,SAASM,EAAQD,EAASH,GAE/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQwC,EAAG,UAEjByX,OAAQ9a,EAAoB,QAKzB,SAASI,EAAQD,EAASH,GAG/B,GAAI2B,GAAY3B,EAAoB,IAChCsN,EAAYtN,EAAoB,GAEpCI,GAAOD,QAAU,QAAS2a,QAAOC,GAC/B,GAAIC,GAAMpO,OAAOU,EAAQ5G,OACrB0H,EAAM,GACN/H,EAAM1E,EAAUoZ,EACpB,IAAO,EAAJ1U,GAASA,GAAKgS,EAAAA,EAAS,KAAMhP,YAAW,0BAC3C,MAAKhD,EAAI,GAAIA,KAAO,KAAO2U,GAAOA,GAAY,EAAJ3U,IAAM+H,GAAO4M,EACvD,OAAO5M,KAKJ,SAAShO,EAAQD,EAASH,GAI/B,GAAIa,GAAcb,EAAoB,GAClC6B,EAAc7B,EAAoB,IAClCka,EAAcla,EAAoB,KAClCib,EAAc,aACdC,EAAc,GAAGD,EAErBpa,GAAQA,EAAQwC,EAAIxC,EAAQoD,EAAIjE,EAAoB,KAAKib,GAAc,UACrEE,WAAY,QAASA,YAAWb,GAC9B,GAAI9T,GAAS0T,EAAQxT,KAAM4T,EAAcW,GACrC3J,EAAS1K,UACTgB,EAAS/F,EAAS+G,KAAKC,IAAIyI,EAAGxN,OAAS,EAAIwN,EAAG,GAAKxR,EAAW0G,EAAK1C,SACnE0W,EAAS5N,OAAO0N,EACpB,OAAOY,GACHA,EAAY3a,KAAKiG,EAAMgU,EAAQ5S,GAC/BpB,EAAKhE,MAAMoF,EAAOA,EAAQ4S,EAAO1W,UAAY0W,MAMhD,SAASpa,EAAQD,EAASH,GAG/B,GAAI+Z,GAAO/Z,EAAoB,KAAI,EAGnCA,GAAoB,KAAK4M,OAAQ,SAAU,SAASwO,GAClD1U,KAAK2U,GAAKzO,OAAOwO,GACjB1U,KAAK4U,GAAK,GAET,WACD,GAEIC,GAFAnY,EAAQsD,KAAK2U,GACbzT,EAAQlB,KAAK4U,EAEjB,OAAG1T,IAASxE,EAAEU,QAAeL,MAAO3D,EAAW0b,MAAM,IACrDD,EAAQxB,EAAI3W,EAAGwE,GACflB,KAAK4U,IAAMC,EAAMzX,QACTL,MAAO8X,EAAOC,MAAM,OAKzB,SAASpb,EAAQD,EAASH,GAG/B,GAAIyb,GAAiBzb,EAAoB,IACrCa,EAAiBb,EAAoB,GACrCwK,EAAiBxK,EAAoB,IACrCuK,EAAiBvK,EAAoB,GACrCkB,EAAiBlB,EAAoB,IACrC0b,EAAiB1b,EAAoB,KACrC2b,EAAiB3b,EAAoB,KACrCiP,EAAiBjP,EAAoB,IACrC6F,EAAiB7F,EAAoB,GAAG6F,SACxC+V,EAAiB5b,EAAoB,IAAI,YACzC6b,OAAsBjY,MAAQ,WAAaA,QAC3CkY,EAAiB,aACjBC,EAAiB,OACjBC,EAAiB,SAEjBC,EAAa,WAAY,MAAOvV,MAEpCtG,GAAOD,QAAU,SAAS2U,EAAMT,EAAM6H,EAAaC,EAAMC,EAASC,EAAQC,GACxEX,EAAYO,EAAa7H,EAAM8H,EAC/B,IAaII,GAAS/W,EAbTgX,EAAY,SAASC,GACvB,IAAIZ,GAASY,IAAQ5J,GAAM,MAAOA,GAAM4J,EACxC,QAAOA,GACL,IAAKV,GAAM,MAAO,SAASnY,QAAQ,MAAO,IAAIsY,GAAYxV,KAAM+V,GAChE,KAAKT,GAAQ,MAAO,SAASU,UAAU,MAAO,IAAIR,GAAYxV,KAAM+V,IACpE,MAAO,SAASE,WAAW,MAAO,IAAIT,GAAYxV,KAAM+V,KAExD3K,EAAauC,EAAO,YACpBuI,EAAaR,GAAWJ,EACxBa,GAAa,EACbhK,EAAaiC,EAAK1S,UAClB0a,EAAajK,EAAM+I,IAAa/I,EAAMiJ,IAAgBM,GAAWvJ,EAAMuJ,GACvEW,EAAaD,GAAWN,EAAUJ,EAGtC,IAAGU,EAAQ,CACT,GAAIE,GAAoBnX,EAASkX,EAASxc,KAAK,GAAIuU,IAEnD7F,GAAe+N,EAAmBlL,GAAK,IAEnC2J,GAAWva,EAAI2R,EAAOiJ,IAAavR,EAAKyS,EAAmBpB,EAAUK,GAEtEW,GAAcE,EAAQlS,OAASoR,IAChCa,GAAa,EACbE,EAAW,QAASL,UAAU,MAAOI,GAAQvc,KAAKmG,QAUtD,GANK+U,IAAWa,IAAYT,IAASgB,GAAehK,EAAM+I,IACxDrR,EAAKsI,EAAO+I,EAAUmB,GAGxBrB,EAAUrH,GAAQ0I,EAClBrB,EAAU5J,GAAQmK,EACfG,EAMD,GALAG,GACEG,OAASE,EAAcG,EAAWP,EAAUR,GAC5CpY,KAASyY,EAAcU,EAAWP,EAAUT,GAC5CY,QAAUC,EAAwBJ,EAAU,WAArBO,GAEtBT,EAAO,IAAI9W,IAAO+W,GACd/W,IAAOqN,IAAOrI,EAASqI,EAAOrN,EAAK+W,EAAQ/W,QAC3C3E,GAAQA,EAAQwC,EAAIxC,EAAQoD,GAAK4X,GAASgB,GAAaxI,EAAMkI,EAEtE,OAAOA,KAKJ,SAASnc,EAAQD,GAEtBC,EAAOD,YAIF,SAASC,EAAQD,EAASH,GAG/B,GAAIY,GAAiBZ,EAAoB,GACrCid,EAAiBjd,EAAoB,GACrCiP,EAAiBjP,EAAoB,IACrCgd,IAGJhd,GAAoB,GAAGgd,EAAmBhd,EAAoB,IAAI,YAAa,WAAY,MAAO0G,QAElGtG,EAAOD,QAAU,SAAS+b,EAAa7H,EAAM8H,GAC3CD,EAAY9Z,UAAYxB,EAAEqF,OAAO+W,GAAoBb,KAAMc,EAAW,EAAGd,KACzElN,EAAeiN,EAAa7H,EAAO,eAKhC,SAASjU,EAAQD,EAASH,GAG/B,GAAIyK,GAAczK,EAAoB,IAClCa,EAAcb,EAAoB,GAClCyB,EAAczB,EAAoB,IAClCO,EAAcP,EAAoB,KAClCkd,EAAcld,EAAoB,KAClC6B,EAAc7B,EAAoB,IAClCmd,EAAcnd,EAAoB,IACtCa,GAAQA,EAAQmD,EAAInD,EAAQoD,GAAKjE,EAAoB,KAAK,SAASod,GAAO9a,MAAM+a,KAAKD,KAAW,SAE9FC,KAAM,QAASA,MAAKC,GAClB,GAQIxZ,GAAQ2B,EAAQ8X,EAAMC,EARtBpa,EAAU3B,EAAS6b,GACnB9O,EAAyB,kBAAR9H,MAAqBA,KAAOpE,MAC7CgP,EAAU1K,UACV4L,EAAUlB,EAAGxN,OACb2Z,EAAUjL,EAAQ,EAAIlB,EAAG,GAAKxR,EAC9B4d,EAAUD,IAAU3d,EACpB8H,EAAU,EACV+V,EAAUR,EAAU/Z,EAIxB,IAFGsa,IAAQD,EAAQhT,EAAIgT,EAAOjL,EAAQ,EAAIlB,EAAG,GAAKxR,EAAW,IAE1D6d,GAAU7d,GAAe0O,GAAKlM,OAAS4a,EAAYS,GAMpD,IADA7Z,EAASjC,EAASuB,EAAEU,QAChB2B,EAAS,GAAI+I,GAAE1K,GAASA,EAAS8D,EAAOA,IAC1CnC,EAAOmC,GAAS8V,EAAUD,EAAMra,EAAEwE,GAAQA,GAASxE,EAAEwE,OANvD,KAAI4V,EAAWG,EAAOpd,KAAK6C,GAAIqC,EAAS,GAAI+I,KAAK+O,EAAOC,EAASrB,QAAQX,KAAM5T,IAC7EnC,EAAOmC,GAAS8V,EAAUnd,EAAKid,EAAUC,GAAQF,EAAK9Z,MAAOmE,IAAQ,GAAQ2V,EAAK9Z,KAStF,OADAgC,GAAO3B,OAAS8D,EACTnC,MAON,SAASrF,EAAQD,EAASH,GAG/B,GAAIsB,GAAWtB,EAAoB,GACnCI,GAAOD,QAAU,SAASqd,EAAU/W,EAAIhD,EAAOkZ,GAC7C,IACE,MAAOA,GAAUlW,EAAGnF,EAASmC,GAAO,GAAIA,EAAM,IAAMgD,EAAGhD,GAEvD,MAAMF,GACN,GAAIqa,GAAMJ,EAAS,SAEnB,MADGI,KAAQ9d,GAAUwB,EAASsc,EAAIrd,KAAKid,IACjCja,KAML,SAASnD,EAAQD,EAASH,GAG/B,GAAI0b,GAAa1b,EAAoB,KACjC4b,EAAa5b,EAAoB,IAAI,YACrCqC,EAAaC,MAAMF,SAEvBhC,GAAOD,QAAU,SAASqM,GACxB,MAAOA,KAAO1M,IAAc4b,EAAUpZ,QAAUkK,GAAMnK,EAAWuZ,KAAcpP,KAK5E,SAASpM,EAAQD,EAASH,GAE/B,GAAIiT,GAAYjT,EAAoB,IAChC4b,EAAY5b,EAAoB,IAAI,YACpC0b,EAAY1b,EAAoB,IACpCI,GAAOD,QAAUH,EAAoB,GAAG6d,kBAAoB,SAASrR,GACnE,MAAGA,IAAM1M,EAAiB0M,EAAGoP,IACxBpP,EAAG,eACHkP,EAAUzI,EAAQzG,IAFvB,SAOG,SAASpM,EAAQD,EAASH,GAE/B,GAAI4b,GAAe5b,EAAoB,IAAI,YACvC8d,GAAe,CAEnB,KACE,GAAIC,IAAS,GAAGnC,IAChBmC,GAAM,UAAY,WAAYD,GAAe,GAC7Cxb,MAAM+a,KAAKU,EAAO,WAAY,KAAM,KACpC,MAAMxa,IAERnD,EAAOD,QAAU,SAAS+L,EAAM8R,GAC9B,IAAIA,IAAgBF,EAAa,OAAO,CACxC,IAAIpR,IAAO,CACX,KACE,GAAIuR,IAAQ,GACRb,EAAOa,EAAIrC,IACfwB,GAAKjB,KAAO,WAAYzP,GAAO,GAC/BuR,EAAIrC,GAAY,WAAY,MAAOwB,IACnClR,EAAK+R,GACL,MAAM1a,IACR,MAAOmJ,KAKJ,SAAStM,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAGlCa,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAIjE,EAAoB,GAAG,WACrD,QAASiE,MACT,QAAS3B,MAAM4b,GAAG3d,KAAK0D,YAAcA,MACnC,SAEFia,GAAI,QAASA,MAKX,IAJA,GAAItW,GAAS,EACT0J,EAAS1K,UACT4L,EAASlB,EAAGxN,OACZ2B,EAAS,IAAoB,kBAARiB,MAAqBA,KAAOpE,OAAOkQ,GACtDA,EAAQ5K,GAAMnC,EAAOmC,GAAS0J,EAAG1J,IAEvC,OADAnC,GAAO3B,OAAS0O,EACT/M,MAMN,SAASrF,EAAQD,EAASH,GAG/B,GAAIme,GAAmBne,EAAoB,KACvCud,EAAmBvd,EAAoB,KACvC0b,EAAmB1b,EAAoB,KACvC0B,EAAmB1B,EAAoB,GAM3CI,GAAOD,QAAUH,EAAoB,KAAKsC,MAAO,QAAS,SAAS8Y,EAAUqB,GAC3E/V,KAAK2U,GAAK3Z,EAAU0Z,GACpB1U,KAAK4U,GAAK,EACV5U,KAAK6J,GAAKkM,GAET,WACD,GAAIrZ,GAAQsD,KAAK2U,GACboB,EAAQ/V,KAAK6J,GACb3I,EAAQlB,KAAK4U,IACjB,QAAIlY,GAAKwE,GAASxE,EAAEU,QAClB4C,KAAK2U,GAAKvb,EACHyd,EAAK,IAEH,QAARd,EAAwBc,EAAK,EAAG3V,GACxB,UAAR6U,EAAwBc,EAAK,EAAGna,EAAEwE,IAC9B2V,EAAK,GAAI3V,EAAOxE,EAAEwE,MACxB,UAGH8T,EAAU0C,UAAY1C,EAAUpZ,MAEhC6b,EAAiB,QACjBA,EAAiB,UACjBA,EAAiB,YAIZ,SAAS/d,EAAQD,EAASH,GAG/B,GAAIqe,GAAcre,EAAoB,IAAI,eACtCqC,EAAcC,MAAMF,SACrBC,GAAWgc,IAAgBve,GAAUE,EAAoB,GAAGqC,EAAYgc,MAC3Eje,EAAOD,QAAU,SAASqF,GACxBnD,EAAWgc,GAAa7Y,IAAO,IAK5B,SAASpF,EAAQD,GAEtBC,EAAOD,QAAU,SAASqb,EAAM/X,GAC9B,OAAQA,MAAOA,EAAO+X,OAAQA,KAK3B,SAASpb,EAAQD,EAASH,GAE/BA,EAAoB,KAAK,UAIpB,SAASI,EAAQD,EAASH,GAG/B,GAAIqK,GAAcrK,EAAoB,GAClCY,EAAcZ,EAAoB,GAClCc,EAAcd,EAAoB,GAClCsO,EAActO,EAAoB,IAAI,UAE1CI,GAAOD,QAAU,SAASmT,GACxB,GAAI9E,GAAInE,EAAOiJ,EACZxS,IAAe0N,IAAMA,EAAEF,IAAS1N,EAAEgC,QAAQ4L,EAAGF,GAC9CtC,cAAc,EACd9I,IAAK,WAAY,MAAOwD,WAMvB,SAAStG,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQwC,EAAG,SAAUib,WAAYte,EAAoB,OAE7DA,EAAoB,KAAK,eAIpB,SAASI,EAAQD,EAASH,GAI/B,GAAIyB,GAAWzB,EAAoB,IAC/B4B,EAAW5B,EAAoB,IAC/B6B,EAAW7B,EAAoB,GAEnCI,GAAOD,WAAame,YAAc,QAASA,YAAW9S,EAAevE,GACnE,GAAI7D,GAAQ3B,EAASiF,MACjBP,EAAQtE,EAASuB,EAAEU,QACnBya,EAAQ3c,EAAQ4J,EAAQrF,GACxBkX,EAAQzb,EAAQqF,EAAOd,GACvBmL,EAAQ1K,UACRG,EAAQuK,EAAGxN,OAAS,EAAIwN,EAAG,GAAKxR,EAChCib,EAAQnS,KAAKC,KAAK9B,IAAQjH,EAAYqG,EAAMvE,EAAQmF,EAAKZ,IAAQkX,EAAMlX,EAAMoY,GAC7EC,EAAQ,CAMZ,KALUD,EAAPlB,GAAkBA,EAAOtC,EAAZwD,IACdC,EAAO,GACPnB,GAAQtC,EAAQ,EAChBwD,GAAQxD,EAAQ,GAEZA,IAAU,GACXsC,IAAQja,GAAEA,EAAEmb,GAAMnb,EAAEia,SACXja,GAAEmb,GACdA,GAAQC,EACRnB,GAAQmB,CACR,OAAOpb,KAKN,SAAShD,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQwC,EAAG,SAAUob,KAAMze,EAAoB,OAEvDA,EAAoB,KAAK,SAIpB,SAASI,EAAQD,EAASH,GAI/B,GAAIyB,GAAWzB,EAAoB,IAC/B4B,EAAW5B,EAAoB,IAC/B6B,EAAW7B,EAAoB,GACnCI,GAAOD,WAAase,MAAQ,QAASA,MAAKhb,GAQxC,IAPA,GAAIL,GAAS3B,EAASiF,MAClB5C,EAASjC,EAASuB,EAAEU,QACpBwN,EAAS1K,UACT4L,EAASlB,EAAGxN,OACZ8D,EAAShG,EAAQ4Q,EAAQ,EAAIlB,EAAG,GAAKxR,EAAWgE,GAChDiD,EAASyL,EAAQ,EAAIlB,EAAG,GAAKxR,EAC7B4e,EAAS3X,IAAQjH,EAAYgE,EAASlC,EAAQmF,EAAKjD,GACjD4a,EAAS9W,GAAMxE,EAAEwE,KAAWnE,CAClC,OAAOL,KAKJ,SAAShD,EAAQD,EAASH,GAI/B,GAAIa,GAAUb,EAAoB,GAC9B2e,EAAU3e,EAAoB,IAAI,GAClCsT,EAAU,OACVsL,GAAU,CAEXtL,SAAUhR,MAAM,GAAGgR,GAAK,WAAYsL,GAAS,IAChD/d,EAAQA,EAAQwC,EAAIxC,EAAQoD,EAAI2a,EAAQ,SACtCC,KAAM,QAASA,MAAKnX,GAClB,MAAOiX,GAAMjY,KAAMgB,EAAYd,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,MAGzEE,EAAoB,KAAKsT,IAIpB,SAASlT,EAAQD,EAASH,GAI/B,GAAIa,GAAUb,EAAoB,GAC9B2e,EAAU3e,EAAoB,IAAI,GAClCsT,EAAU,YACVsL,GAAU,CAEXtL,SAAUhR,MAAM,GAAGgR,GAAK,WAAYsL,GAAS,IAChD/d,EAAQA,EAAQwC,EAAIxC,EAAQoD,EAAI2a,EAAQ,SACtCE,UAAW,QAASA,WAAUpX,GAC5B,MAAOiX,GAAMjY,KAAMgB,EAAYd,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,MAGzEE,EAAoB,KAAKsT,IAIpB,SAASlT,EAAQD,EAASH,GAE/B,GAAIY,GAAWZ,EAAoB,GAC/BqK,EAAWrK,EAAoB,GAC/Bya,EAAWza,EAAoB,KAC/B+e,EAAW/e,EAAoB,KAC/Bgf,EAAW3U,EAAO4L,OAClBnB,EAAWkK,EACXnM,EAAWmM,EAAQ5c,UACnB6c,EAAW,KACXC,EAAW,KAEXC,EAAc,GAAIH,GAAQC,KAASA,GAEpCjf,EAAoB,IAAQmf,IAAenf,EAAoB,GAAG,WAGnE,MAFAkf,GAAIlf,EAAoB,IAAI,WAAY,EAEjCgf,EAAQC,IAAQA,GAAOD,EAAQE,IAAQA,GAA4B,QAArBF,EAAQC,EAAK,SAElED,EAAU,QAAS/I,QAAOvV,EAAG2N,GAC3B,GAAI+Q,GAAO3E,EAAS/Z,GAChB2e,EAAOhR,IAAMvO,CACjB,OAAS4G,gBAAgBsY,KAAYI,GAAQ1e,EAAEoF,cAAgBkZ,IAAWK,EACtEF,EACE,GAAIrK,GAAKsK,IAASC,EAAM3e,EAAEmK,OAASnK,EAAG2N,GACtCyG,GAAMsK,EAAO1e,YAAase,IAAWte,EAAEmK,OAASnK,EAAG0e,GAAQC,EAAMN,EAAOxe,KAAKG,GAAK2N,GAHR3N,GAKlFE,EAAEqH,KAAK1H,KAAKK,EAAEoF,SAAS8O,GAAO,SAAStP,GACrCA,IAAOwZ,IAAWpe,EAAEgC,QAAQoc,EAASxZ,GACnCwG,cAAc,EACd9I,IAAK,WAAY,MAAO4R,GAAKtP,IAC7BgL,IAAK,SAAShE,GAAKsI,EAAKtP,GAAOgH,OAGnCqG,EAAM/M,YAAckZ,EACpBA,EAAQ5c,UAAYyQ,EACpB7S,EAAoB,IAAIqK,EAAQ,SAAU2U,IAG5Chf,EAAoB,KAAK,WAIpB,SAASI,EAAQD,EAASH,GAI/B,GAAIsB,GAAWtB,EAAoB,GACnCI,GAAOD,QAAU,WACf,GAAIqG,GAASlF,EAASoF,MAClBjB,EAAS,EAMb,OALGe,GAAK6D,SAAY5E,GAAU,KAC3Be,EAAK8Y,aAAY7Z,GAAU,KAC3Be,EAAK+Y,YAAY9Z,GAAU,KAC3Be,EAAKgZ,UAAY/Z,GAAU,KAC3Be,EAAKiZ,SAAYha,GAAU,KACvBA,IAKJ,SAASrF,EAAQD,EAASH,GAG/B,GAAIY,GAAIZ,EAAoB,EACzBA,GAAoB,IAAoB,KAAd,KAAK0f,OAAa9e,EAAEgC,QAAQqT,OAAO7T,UAAW,SACzE4J,cAAc,EACd9I,IAAKlD,EAAoB,QAKtB,SAASI,EAAQD,EAASH,GAG/BA,EAAoB,KAAK,QAAS,EAAG,SAASsN,EAASoN,GAErD,MAAO,SAASpG,OAAMqL,GAEpB,GAAIvc,GAAKkK,EAAQ5G,MACbD,EAAKkZ,GAAU7f,EAAYA,EAAY6f,EAAOjF,EAClD,OAAOjU,KAAO3G,EAAY2G,EAAGlG,KAAKof,EAAQvc,GAAK,GAAI6S,QAAO0J,GAAQjF,GAAO9N,OAAOxJ,QAM/E,SAAShD,EAAQD,EAASH,GAG/B,GAAIuK,GAAWvK,EAAoB,GAC/BwK,EAAWxK,EAAoB,IAC/BqB,EAAWrB,EAAoB,GAC/BsN,EAAWtN,EAAoB,IAC/BkP,EAAWlP,EAAoB,GAEnCI,GAAOD,QAAU,SAASmT,EAAKxP,EAAQoI,GACrC,GAAI0T,GAAW1Q,EAAIoE,GACf/E,EAAW,GAAG+E,EACfjS,GAAM,WACP,GAAI+B,KAEJ,OADAA,GAAEwc,GAAU,WAAY,MAAO,IACV,GAAd,GAAGtM,GAAKlQ,OAEfoH,EAASoC,OAAOxK,UAAWkR,EAAKpH,EAAKoB,EAASsS,EAAQrR,IACtDhE,EAAK0L,OAAO7T,UAAWwd,EAAkB,GAAV9b,EAG3B,SAASsS,EAAQ3H,GAAM,MAAOF,GAAShO,KAAK6V,EAAQ1P,KAAM+H,IAG1D,SAAS2H,GAAS,MAAO7H,GAAShO,KAAK6V,EAAQ1P,WAOlD,SAAStG,EAAQD,EAASH,GAG/BA,EAAoB,KAAK,UAAW,EAAG,SAASsN,EAASuS,EAASC,GAEhE,MAAO,SAASzJ,SAAQ0J,EAAaC,GAEnC,GAAI5c,GAAKkK,EAAQ5G,MACbD,EAAKsZ,GAAejgB,EAAYA,EAAYigB,EAAYF,EAC5D,OAAOpZ,KAAO3G,EACV2G,EAAGlG,KAAKwf,EAAa3c,EAAG4c,GACxBF,EAASvf,KAAKqM,OAAOxJ,GAAI2c,EAAaC,OAMzC,SAAS5f,EAAQD,EAASH,GAG/BA,EAAoB,KAAK,SAAU,EAAG,SAASsN,EAAS2S,GAEtD,MAAO,SAASzF,QAAOmF,GAErB,GAAIvc,GAAKkK,EAAQ5G,MACbD,EAAKkZ,GAAU7f,EAAYA,EAAY6f,EAAOM,EAClD,OAAOxZ,KAAO3G,EAAY2G,EAAGlG,KAAKof,EAAQvc,GAAK,GAAI6S,QAAO0J,GAAQM,GAAQrT,OAAOxJ,QAMhF,SAAShD,EAAQD,EAASH,GAG/BA,EAAoB,KAAK,QAAS,EAAG,SAASsN,EAAS4S,EAAOC,GAE5D,MAAO,SAAS/b,OAAMkD,EAAW8Y,GAE/B,GAAIhd,GAAKkK,EAAQ5G,MACbD,EAAKa,GAAaxH,EAAYA,EAAYwH,EAAU4Y,EACxD,OAAOzZ,KAAO3G,EACV2G,EAAGlG,KAAK+G,EAAWlE,EAAGgd,GACtBD,EAAO5f,KAAKqM,OAAOxJ,GAAIkE,EAAW8Y,OAMrC,SAAShgB,EAAQD,EAASH,GAG/B,GAoBIqgB,GApBAzf,EAAaZ,EAAoB,GACjCyb,EAAazb,EAAoB,IACjCqK,EAAarK,EAAoB,GACjCyK,EAAazK,EAAoB,IACjCiT,EAAajT,EAAoB,IACjCa,EAAab,EAAoB,GACjCwB,EAAaxB,EAAoB,IACjCsB,EAAatB,EAAoB,IACjCuB,EAAavB,EAAoB,IACjCsgB,EAAatgB,EAAoB,KACjCugB,EAAavgB,EAAoB,KACjCwgB,EAAaxgB,EAAoB,IAAIwQ,IACrCiQ,EAAazgB,EAAoB,IACjCsO,EAAatO,EAAoB,IAAI,WACrC0gB,EAAqB1gB,EAAoB,KACzC2gB,EAAa3gB,EAAoB,KACjC4gB,EAAa,UACbC,EAAaxW,EAAOwW,QACpBC,EAAiC,WAApB7N,EAAQ4N,GACrBxd,EAAagH,EAAOuW,GAGpBG,EAAc,SAASC,GACzB,GAAIlO,GAAO,GAAIzP,GAAE,aAEjB,OADG2d,KAAIlO,EAAKhN,YAAc3D,QACnBkB,EAAE4d,QAAQnO,KAAUA,GAGzBoO,EAAa,WAEf,QAASC,IAAGzO,GACV,GAAI9G,GAAO,GAAIvI,GAAEqP,EAEjB,OADA8N,GAAS5U,EAAMuV,GAAG/e,WACXwJ,EAJT,GAAIwV,IAAQ,CAMZ,KASE,GARAA,EAAQ/d,GAAKA,EAAE4d,SAAWF,IAC1BP,EAASW,GAAI9d,GACb8d,GAAG/e,UAAYxB,EAAEqF,OAAO5C,EAAEjB,WAAY0D;AAAcrC,MAAO0d,MAEtDA,GAAGF,QAAQ,GAAGI,KAAK,uBAAyBF,MAC/CC,GAAQ,GAGPA,GAASphB,EAAoB,GAAG,CACjC,GAAIshB,IAAqB,CACzBje,GAAE4d,QAAQrgB,EAAEgC,WAAY,QACtBM,IAAK,WAAYoe,GAAqB,MAExCF,EAAQE,GAEV,MAAM/d,GAAI6d,GAAQ,EACpB,MAAOA,MAILG,EAAkB,SAASpe,EAAG6J,GAEhC,MAAGyO,IAAWtY,IAAME,GAAK2J,IAAMqT,GAAe,EACvCI,EAAKtd,EAAG6J,IAEbwU,EAAiB,SAAShT,GAC5B,GAAIxK,GAAI1C,EAASkN,GAAGF,EACpB,OAAOtK,IAAKlE,EAAYkE,EAAIwK,GAE1BiT,EAAa,SAASjV,GACxB,GAAI6U,EACJ,OAAO7f,GAASgL,IAAkC,mBAAnB6U,EAAO7U,EAAG6U,MAAsBA,GAAO,GAEpEK,EAAoB,SAASlT,GAC/B,GAAIyS,GAASU,CACbjb,MAAKkb,QAAU,GAAIpT,GAAE,SAASqT,EAAWC,GACvC,GAAGb,IAAYnhB,GAAa6hB,IAAW7hB,EAAU,KAAM0D,WAAU,0BACjEyd,GAAUY,EACVF,EAAUG,IAEZpb,KAAKua,QAAU1f,EAAU0f,GACzBva,KAAKib,OAAUpgB,EAAUogB,IAEvBI,EAAU,SAAS7V,GACrB,IACEA,IACA,MAAM3I,GACN,OAAQye,MAAOze,KAGf0e,EAAS,SAASC,EAAQC,GAC5B,IAAGD,EAAO7b,EAAV,CACA6b,EAAO7b,GAAI,CACX,IAAI+b,GAAQF,EAAOzhB,CACnBkgB,GAAK,WAuBH,IAtBA,GAAIld,GAAQye,EAAOG,EACfC,EAAoB,GAAZJ,EAAOxY,EACf3F,EAAQ,EACRwe,EAAM,SAASC,GACjB,GAGI/c,GAAQ4b,EAHRoB,EAAUH,EAAKE,EAASF,GAAKE,EAASE,KACtCzB,EAAUuB,EAASvB,QACnBU,EAAUa,EAASb,MAEvB,KACKc,GACGH,IAAGJ,EAAOS,GAAI,GAClBld,EAASgd,KAAY,EAAOhf,EAAQgf,EAAQhf,GACzCgC,IAAW+c,EAASZ,QACrBD,EAAOne,UAAU,yBACT6d,EAAOI,EAAWhc,IAC1B4b,EAAK9gB,KAAKkF,EAAQwb,EAASU,GACtBV,EAAQxb,IACVkc,EAAOle,GACd,MAAMF,GACNoe,EAAOpe,KAGL6e,EAAMte,OAASC,GAAEwe,EAAIH,EAAMre,KACjCqe,GAAMte,OAAS,EACfoe,EAAO7b,GAAI,EACR8b,GAASS,WAAW,WACrB,GACIH,GAASI,EADTjB,EAAUM,EAAOxhB,CAElBoiB,GAAYlB,KACVd,EACDD,EAAQkC,KAAK,qBAAsBtf,EAAOme,IAClCa,EAAUpY,EAAO2Y,sBACzBP,GAASb,QAASA,EAASqB,OAAQxf,KAC1Bof,EAAUxY,EAAOwY,UAAYA,EAAQb,OAC9Ca,EAAQb,MAAM,8BAA+Bve,IAE/Cye,EAAO/e,EAAIrD,GACZ,OAGHgjB,EAAc,SAASlB,GACzB,GAGIY,GAHAN,EAASN,EAAQsB,GACjBd,EAASF,EAAO/e,GAAK+e,EAAOzhB,EAC5BsD,EAAS,CAEb,IAAGme,EAAOS,EAAE,OAAO,CACnB,MAAMP,EAAMte,OAASC,GAEnB,GADAye,EAAWJ,EAAMre,KACdye,EAASE,OAASI,EAAYN,EAASZ,SAAS,OAAO,CAC1D,QAAO,GAEPuB,EAAU,SAAS1f,GACrB,GAAIye,GAASxb,IACVwb,GAAO5Y,IACV4Y,EAAO5Y,GAAI,EACX4Y,EAASA,EAAOkB,GAAKlB,EACrBA,EAAOG,EAAI5e,EACXye,EAAOxY,EAAI,EACXwY,EAAO/e,EAAI+e,EAAOzhB,EAAE+B,QACpByf,EAAOC,GAAQ,KAEbmB,EAAW,SAAS5f,GACtB,GACI4d,GADAa,EAASxb,IAEb,KAAGwb,EAAO5Y,EAAV,CACA4Y,EAAO5Y,GAAI,EACX4Y,EAASA,EAAOkB,GAAKlB,CACrB,KACE,GAAGA,EAAOxhB,IAAM+C,EAAM,KAAMD,WAAU,qCACnC6d,EAAOI,EAAWhe,IACnBkd,EAAK,WACH,GAAI2C,IAAWF,EAAGlB,EAAQ5Y,GAAG,EAC7B,KACE+X,EAAK9gB,KAAKkD,EAAOgH,EAAI4Y,EAAUC,EAAS,GAAI7Y,EAAI0Y,EAASG,EAAS,IAClE,MAAM/f,GACN4f,EAAQ5iB,KAAK+iB,EAAS/f,OAI1B2e,EAAOG,EAAI5e,EACXye,EAAOxY,EAAI,EACXuY,EAAOC,GAAQ,IAEjB,MAAM3e,GACN4f,EAAQ5iB,MAAM6iB,EAAGlB,EAAQ5Y,GAAG,GAAQ/F,KAKpC2d,KAEF7d,EAAI,QAASkgB,SAAQC,GACnBjiB,EAAUiiB,EACV,IAAItB,GAASxb,KAAKwc,IAChBxiB,EAAG4f,EAAU5Z,KAAMrD,EAAGud,GACtBngB,KACA0C,EAAGrD,EACH4J,EAAG,EACHJ,GAAG,EACH+Y,EAAGviB,EACH6iB,GAAG,EACHtc,GAAG,EAEL,KACEmd,EAAS/Y,EAAI4Y,EAAUnB,EAAQ,GAAIzX,EAAI0Y,EAASjB,EAAQ,IACxD,MAAMuB,GACNN,EAAQ5iB,KAAK2hB,EAAQuB,KAGzBzjB,EAAoB,KAAKqD,EAAEjB,WAEzBif,KAAM,QAASA,MAAKqC,EAAaC,GAC/B,GAAInB,GAAW,GAAId,GAAkBhB,EAAmBha,KAAMrD,IAC1Due,EAAWY,EAASZ,QACpBM,EAAWxb,KAAKwc,EAMpB,OALAV,GAASF,GAA6B,kBAAfoB,GAA4BA,GAAc,EACjElB,EAASE,KAA4B,kBAAdiB,IAA4BA,EACnDzB,EAAOzhB,EAAEiF,KAAK8c,GACXN,EAAO/e,GAAE+e,EAAO/e,EAAEuC,KAAK8c,GACvBN,EAAOxY,GAAEuY,EAAOC,GAAQ,GACpBN,GAGTgC,QAAS,SAASD,GAChB,MAAOjd,MAAK2a,KAAKvhB,EAAW6jB,OAKlC9iB,EAAQA,EAAQsK,EAAItK,EAAQ6K,EAAI7K,EAAQoD,GAAKid,GAAaqC,QAASlgB,IACnErD,EAAoB,IAAIqD,EAAGud,GAC3B5gB,EAAoB,KAAK4gB,GACzBP,EAAUrgB,EAAoB,GAAG4gB,GAGjC/f,EAAQA,EAAQmD,EAAInD,EAAQoD,GAAKid,EAAYN,GAE3Ce,OAAQ,QAASA,QAAOyB,GACtB,GAAIS,GAAa,GAAInC,GAAkBhb,MACnCob,EAAa+B,EAAWlC,MAE5B,OADAG,GAASsB,GACFS,EAAWjC,WAGtB/gB,EAAQA,EAAQmD,EAAInD,EAAQoD,IAAMid,GAAcH,GAAY,IAAQH,GAElEK,QAAS,QAASA,SAAQvO,GAExB,GAAGA,YAAarP,IAAKke,EAAgB7O,EAAE5M,YAAaY,MAAM,MAAOgM,EACjE,IAAImR,GAAa,GAAInC,GAAkBhb,MACnCmb,EAAagC,EAAW5C,OAE5B,OADAY,GAAUnP,GACHmR,EAAWjC,WAGtB/gB,EAAQA,EAAQmD,EAAInD,EAAQoD,IAAMid,GAAclhB,EAAoB,KAAK,SAASod,GAChF/Z,EAAEygB,IAAI1G,GAAM,SAAS,iBAClBwD,GAEHkD,IAAK,QAASA,KAAIC,GAChB,GAAIvV,GAAagT,EAAe9a,MAC5Bmd,EAAa,GAAInC,GAAkBlT,GACnCyS,EAAa4C,EAAW5C,QACxBU,EAAakC,EAAWlC,OACxBjF,KACAsH,EAASjC,EAAQ,WACnBxB,EAAMwD,GAAU,EAAOrH,EAAOhX,KAAMgX,EACpC,IAAIuH,GAAYvH,EAAO5Y,OACnBogB,EAAY5hB,MAAM2hB,EACnBA,GAAUrjB,EAAEqH,KAAK1H,KAAKmc,EAAQ,SAASkF,EAASha,GACjD,GAAIuc,IAAgB,CACpB3V,GAAEyS,QAAQW,GAASP,KAAK,SAAS5d,GAC5B0gB,IACHA,GAAgB,EAChBD,EAAQtc,GAASnE,IACfwgB,GAAahD,EAAQiD,KACtBvC,KAEAV,EAAQiD,IAGf,OADGF,IAAOrC,EAAOqC,EAAOhC,OACjB6B,EAAWjC,SAGpBwC,KAAM,QAASA,MAAKL,GAClB,GAAIvV,GAAagT,EAAe9a,MAC5Bmd,EAAa,GAAInC,GAAkBlT,GACnCmT,EAAakC,EAAWlC,OACxBqC,EAASjC,EAAQ,WACnBxB,EAAMwD,GAAU,EAAO,SAASnC,GAC9BpT,EAAEyS,QAAQW,GAASP,KAAKwC,EAAW5C,QAASU,MAIhD,OADGqC,IAAOrC,EAAOqC,EAAOhC,OACjB6B,EAAWjC,YAMjB,SAASxhB,EAAQD,GAEtBC,EAAOD,QAAU,SAASqM,EAAI0P,EAAatR,GACzC,KAAK4B,YAAc0P,IAAa,KAAM1Y,WAAUoH,EAAO,4BACvD,OAAO4B,KAKJ,SAASpM,EAAQD,EAASH,GAE/B,GAAIyK,GAAczK,EAAoB,IAClCO,EAAcP,EAAoB,KAClCkd,EAAcld,EAAoB,KAClCsB,EAActB,EAAoB,IAClC6B,EAAc7B,EAAoB,IAClCmd,EAAcnd,EAAoB,IACtCI,GAAOD,QAAU,SAAS4jB,EAAUpH,EAASlW,EAAID,GAC/C,GAGI1C,GAAQyZ,EAAMC,EAHdG,EAASR,EAAU4G,GACnB1V,EAAS5D,EAAIhE,EAAID,EAAMmW,EAAU,EAAI,GACrC/U,EAAS,CAEb,IAAoB,kBAAV+V,GAAqB,KAAMna,WAAUugB,EAAW,oBAE1D,IAAG7G,EAAYS,GAAQ,IAAI7Z,EAASjC,EAASkiB,EAASjgB,QAASA,EAAS8D,EAAOA,IAC7E+U,EAAUtO,EAAE/M,EAASic,EAAOwG,EAASnc,IAAQ,GAAI2V,EAAK,IAAMlP,EAAE0V,EAASnc,QAClE,KAAI4V,EAAWG,EAAOpd,KAAKwjB,KAAaxG,EAAOC,EAASrB,QAAQX,MACrEjb,EAAKid,EAAUnP,EAAGkP,EAAK9Z,MAAOkZ,KAM7B,SAASvc,EAAQD,EAASH,GAG/B,GAAIsB,GAAYtB,EAAoB,IAChCuB,EAAYvB,EAAoB,IAChCsO,EAAYtO,EAAoB,IAAI,UACxCI,GAAOD,QAAU,SAASiD,EAAG8M,GAC3B,GAAiClM,GAA7BwK,EAAIlN,EAAS8B,GAAG0C,WACpB,OAAO0I,KAAM1O,IAAckE,EAAI1C,EAASkN,GAAGF,KAAaxO,EAAYoQ,EAAI3O,EAAUyC,KAK/E,SAAS5D,EAAQD,EAASH,GAE/B,GAMIqkB,GAAMC,EAAMrC,EANZ5X,EAAYrK,EAAoB,GAChCukB,EAAYvkB,EAAoB,KAAKwQ,IACrCgU,EAAYna,EAAOoa,kBAAoBpa,EAAOqa,uBAC9C7D,EAAYxW,EAAOwW,QACnB0C,EAAYlZ,EAAOkZ,QACnBzC,EAAgD,WAApC9gB,EAAoB,IAAI6gB,GAGpC8D,EAAQ,WACV,GAAIC,GAAQC,EAAQpe,CAKpB,KAJGqa,IAAW8D,EAAS/D,EAAQgE,UAC7BhE,EAAQgE,OAAS,KACjBD,EAAOE,QAEHT,GACJQ,EAASR,EAAKQ,OACdpe,EAAS4d,EAAK5d,GACXoe,GAAOA,EAAOE,QACjBte,IACGoe,GAAOA,EAAOC,OACjBT,EAAOA,EAAKlI,IACZmI,GAAOxkB,EACN8kB,GAAOA,EAAOG,QAInB,IAAGjE,EACDmB,EAAS,WACPpB,EAAQmE,SAASL,QAGd,IAAGH,EAAS,CACjB,GAAIS,GAAS,EACTC,EAASjgB,SAASkgB,eAAe,GACrC,IAAIX,GAASG,GAAOS,QAAQF,GAAOG,eAAe,IAClDpD,EAAS,WACPiD,EAAKI,KAAOL,GAAUA,OAIxBhD,GADQsB,GAAWA,EAAQtC,QAClB,WACPsC,EAAQtC,UAAUI,KAAKsD,IAShB,WAEPJ,EAAUhkB,KAAK8J,EAAQsa,GAI3BvkB,GAAOD,QAAU,QAASwgB,MAAKla,GAC7B,GAAI8e,IAAQ9e,GAAIA,EAAI0V,KAAMrc,EAAW+kB,OAAQ/D,GAAUD,EAAQgE,OAC5DP,KAAKA,EAAKnI,KAAOoJ,GAChBlB,IACFA,EAAOkB,EACPtD,KACAqC,EAAOiB,IAKN,SAASnlB,EAAQD,EAASH,GAE/B,GAYIwlB,GAAOC,EAASC,EAZhBjb,EAAqBzK,EAAoB,IACzCoB,EAAqBpB,EAAoB,IACzCgB,EAAqBhB,EAAoB,IACzCiB,EAAqBjB,EAAoB,IACzCqK,EAAqBrK,EAAoB,GACzC6gB,EAAqBxW,EAAOwW,QAC5B8E,EAAqBtb,EAAOub,aAC5BC,EAAqBxb,EAAOyb,eAC5BC,EAAqB1b,EAAO0b,eAC5BC,EAAqB,EACrBC,KACAC,EAAqB,qBAErB3D,EAAM,WACR,GAAIliB,IAAMqG,IACV,IAAGuf,EAAMtZ,eAAetM,GAAI,CAC1B,GAAIoG,GAAKwf,EAAM5lB,SACR4lB,GAAM5lB,GACboG,MAGA0f,EAAU,SAASC,GACrB7D,EAAIhiB,KAAK6lB,EAAMd,MAGbK,IAAYE,IACdF,EAAU,QAASC,cAAanf,GAE9B,IADA,GAAIL,MAAWrC,EAAI,EACb6C,UAAU9C,OAASC,GAAEqC,EAAKV,KAAKkB,UAAU7C,KAK/C,OAJAkiB,KAAQD,GAAW,WACjB5kB,EAAoB,kBAANqF,GAAmBA,EAAKH,SAASG,GAAKL,IAEtDof,EAAMQ,GACCA,GAETH,EAAY,QAASC,gBAAezlB,SAC3B4lB,GAAM5lB,IAGwB,WAApCL,EAAoB,IAAI6gB,GACzB2E,EAAQ,SAASnlB,GACfwgB,EAAQmE,SAASva,EAAI8X,EAAKliB,EAAI,KAGxB0lB,GACRN,EAAU,GAAIM,GACdL,EAAUD,EAAQY,MAClBZ,EAAQa,MAAMC,UAAYJ,EAC1BX,EAAQ/a,EAAIib,EAAKc,YAAad,EAAM,IAG5Brb,EAAOoc,kBAA0C,kBAAfD,eAA8Bnc,EAAOqc,eAC/ElB,EAAQ,SAASnlB,GACfgK,EAAOmc,YAAYnmB,EAAK,GAAI,MAE9BgK,EAAOoc,iBAAiB,UAAWN,GAAS,IAG5CX,EADQU,IAAsBjlB,GAAI,UAC1B,SAASZ,GACfW,EAAK8D,YAAY7D,EAAI,WAAWilB,GAAsB,WACpDllB,EAAK2lB,YAAYjgB,MACjB6b,EAAIhiB,KAAKF,KAKL,SAASA,GACfuiB,WAAWnY,EAAI8X,EAAKliB,EAAI,GAAI,KAIlCD,EAAOD,SACLqQ,IAAOmV,EACPiB,MAAOf,IAKJ,SAASzlB,EAAQD,EAASH,GAE/B,GAAIwK,GAAWxK,EAAoB,GACnCI,GAAOD,QAAU,SAASqL,EAAQzG,GAChC,IAAI,GAAIS,KAAOT,GAAIyF,EAASgB,EAAQhG,EAAKT,EAAIS,GAC7C,OAAOgG,KAKJ,SAASpL,EAAQD,EAASH,GAG/B,GAAI6mB,GAAS7mB,EAAoB,IAGjCA,GAAoB,KAAK,MAAO,SAASkD,GACvC,MAAO,SAAS4jB,OAAO,MAAO5jB,GAAIwD,KAAME,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,MAG9EoD,IAAK,QAASA,KAAIsC,GAChB,GAAIuhB,GAAQF,EAAOG,SAAStgB,KAAMlB,EAClC,OAAOuhB,IAASA,EAAM1E,GAGxB7R,IAAK,QAASA,KAAIhL,EAAK/B,GACrB,MAAOojB,GAAOhV,IAAInL,KAAc,IAARlB,EAAY,EAAIA,EAAK/B,KAE9CojB,GAAQ,IAIN,SAASzmB,EAAQD,EAASH,GAG/B,GAAIY,GAAeZ,EAAoB,GACnCuK,EAAevK,EAAoB,GACnCinB,EAAejnB,EAAoB,KACnCyK,EAAezK,EAAoB,IACnCsgB,EAAetgB,EAAoB,KACnCsN,EAAetN,EAAoB,IACnCugB,EAAevgB,EAAoB,KACnCknB,EAAelnB,EAAoB,KACnCud,EAAevd,EAAoB,KACnCmnB,EAAennB,EAAoB,IAAI,MACvConB,EAAepnB,EAAoB,IACnCwB,EAAexB,EAAoB,IACnCqnB,EAAernB,EAAoB,KACnCc,EAAed,EAAoB,GACnCgU,EAAe7R,OAAO6R,cAAgBxS,EACtC8lB,EAAexmB,EAAc,KAAO,OACpCT,EAAe,EAEfknB,EAAU,SAAS/a,EAAIvG,GAEzB,IAAIzE,EAASgL,GAAI,MAAoB,gBAANA,GAAiBA,GAAmB,gBAANA,GAAiB,IAAM,KAAOA,CAC3F,KAAI4a,EAAK5a,EAAI2a,GAAI,CAEf,IAAInT,EAAaxH,GAAI,MAAO,GAE5B,KAAIvG,EAAO,MAAO,GAElBsE,GAAKiC,EAAI2a,IAAM9mB,GAEf,MAAO,IAAMmM,EAAG2a,IAGhBH,EAAW,SAASxgB,EAAMhB,GAE5B,GAA0BuhB,GAAtBnf,EAAQ2f,EAAQ/hB,EACpB,IAAa,MAAVoC,EAAc,MAAOpB,GAAK8U,GAAG1T,EAEhC,KAAImf,EAAQvgB,EAAKghB,GAAIT,EAAOA,EAAQA,EAAM1gB,EACxC,GAAG0gB,EAAMzU,GAAK9M,EAAI,MAAOuhB,GAI7B3mB,GAAOD,SACLqhB,eAAgB,SAAS8B,EAASjP,EAAMxG,EAAQ4Z,GAC9C,GAAIjZ,GAAI8U,EAAQ,SAAS9c,EAAMud,GAC7BzD,EAAU9Z,EAAMgI,EAAG6F,GACnB7N,EAAK8U,GAAK1a,EAAEqF,OAAO,MACnBO,EAAKghB,GAAK1nB,EACV0G,EAAKkhB,GAAK5nB,EACV0G,EAAK8gB,GAAQ,EACVvD,GAAYjkB,GAAUygB,EAAMwD,EAAUlW,EAAQrH,EAAKihB,GAAQjhB,IAqDhE,OAnDAygB,GAAYzY,EAAEpM,WAGZwkB,MAAO,QAASA,SACd,IAAI,GAAIpgB,GAAOE,KAAM4e,EAAO9e,EAAK8U,GAAIyL,EAAQvgB,EAAKghB,GAAIT,EAAOA,EAAQA,EAAM1gB,EACzE0gB,EAAM3D,GAAI,EACP2D,EAAMrmB,IAAEqmB,EAAMrmB,EAAIqmB,EAAMrmB,EAAE2F,EAAIvG,SAC1BwlB,GAAKyB,EAAMhjB,EAEpByC,GAAKghB,GAAKhhB,EAAKkhB,GAAK5nB,EACpB0G,EAAK8gB,GAAQ,GAIfK,SAAU,SAASniB,GACjB,GAAIgB,GAAQE,KACRqgB,EAAQC,EAASxgB,EAAMhB,EAC3B,IAAGuhB,EAAM,CACP,GAAI5K,GAAO4K,EAAM1gB,EACbuhB,EAAOb,EAAMrmB,QACV8F,GAAK8U,GAAGyL,EAAMhjB,GACrBgjB,EAAM3D,GAAI,EACPwE,IAAKA,EAAKvhB,EAAI8V,GACdA,IAAKA,EAAKzb,EAAIknB,GACdphB,EAAKghB,IAAMT,IAAMvgB,EAAKghB,GAAKrL,GAC3B3V,EAAKkhB,IAAMX,IAAMvgB,EAAKkhB,GAAKE,GAC9BphB,EAAK8gB,KACL,QAASP,GAIb/e,QAAS,QAASA,SAAQN,GAGxB,IAFA,GACIqf,GADA1Y,EAAI5D,EAAI/C,EAAYd,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,EAAW,GAEnEinB,EAAQA,EAAQA,EAAM1gB,EAAIK,KAAK8gB,IAGnC,IAFAnZ,EAAE0Y,EAAM1E,EAAG0E,EAAMzU,EAAG5L,MAEdqgB,GAASA,EAAM3D,GAAE2D,EAAQA,EAAMrmB,GAKzCQ,IAAK,QAASA,KAAIsE,GAChB,QAASwhB,EAAStgB,KAAMlB,MAGzB1E,GAAYF,EAAEgC,QAAQ4L,EAAEpM,UAAW,QACpCc,IAAK,WACH,MAAOoK,GAAQ5G,KAAK4gB,OAGjB9Y,GAETqD,IAAK,SAASrL,EAAMhB,EAAK/B,GACvB,GACImkB,GAAMhgB,EADNmf,EAAQC,EAASxgB,EAAMhB,EAoBzB,OAjBCuhB,GACDA,EAAM1E,EAAI5e,GAGV+C,EAAKkhB,GAAKX,GACRhjB,EAAG6D,EAAQ2f,EAAQ/hB,GAAK,GACxB8M,EAAG9M,EACH6c,EAAG5e,EACH/C,EAAGknB,EAAOphB,EAAKkhB,GACfrhB,EAAGvG,EACHsjB,GAAG,GAED5c,EAAKghB,KAAGhhB,EAAKghB,GAAKT,GACnBa,IAAKA,EAAKvhB,EAAI0gB,GACjBvgB,EAAK8gB,KAEQ,MAAV1f,IAAcpB,EAAK8U,GAAG1T,GAASmf,IAC3BvgB,GAEXwgB,SAAUA,EACVa,UAAW,SAASrZ,EAAG6F,EAAMxG,GAG3BqZ,EAAY1Y,EAAG6F,EAAM,SAAS+G,EAAUqB,GACtC/V,KAAK2U,GAAKD,EACV1U,KAAK6J,GAAKkM,EACV/V,KAAKghB,GAAK5nB,GACT,WAKD,IAJA,GAAI0G,GAAQE,KACR+V,EAAQjW,EAAK+J,GACbwW,EAAQvgB,EAAKkhB,GAEXX,GAASA,EAAM3D,GAAE2D,EAAQA,EAAMrmB,CAErC,OAAI8F,GAAK6U,KAAQ7U,EAAKkhB,GAAKX,EAAQA,EAAQA,EAAM1gB,EAAIG,EAAK6U,GAAGmM,IAMlD,QAAR/K,EAAwBc,EAAK,EAAGwJ,EAAMzU,GAC9B,UAARmK,EAAwBc,EAAK,EAAGwJ,EAAM1E,GAClC9E,EAAK,GAAIwJ,EAAMzU,EAAGyU,EAAM1E,KAN7B7b,EAAK6U,GAAKvb,EACHyd,EAAK,KAMb1P,EAAS,UAAY,UAAYA,GAAQ,GAG5CwZ,EAAWhT,MAMV,SAASjU,EAAQD,EAASH,GAG/B,GAAIqK,GAAiBrK,EAAoB,GACrCa,EAAiBb,EAAoB,GACrCwK,EAAiBxK,EAAoB,IACrCinB,EAAiBjnB,EAAoB,KACrCugB,EAAiBvgB,EAAoB,KACrCsgB,EAAiBtgB,EAAoB,KACrCwB,EAAiBxB,EAAoB,IACrCqB,EAAiBrB,EAAoB,GACrC8nB,EAAiB9nB,EAAoB,KACrCiP,EAAiBjP,EAAoB,GAEzCI,GAAOD,QAAU,SAASkU,EAAMiP,EAAS/G,EAASwL,EAAQla,EAAQma,GAChE,GAAIlT,GAAQzK,EAAOgK,GACf7F,EAAQsG,EACR2S,EAAQ5Z,EAAS,MAAQ,MACzBgF,EAAQrE,GAAKA,EAAEpM,UACfgB,KACA6kB,EAAY,SAAS3U,GACvB,GAAI7M,GAAKoM,EAAMS,EACf9I,GAASqI,EAAOS,EACP,UAAPA,EAAkB,SAASnQ,GACzB,MAAO6kB,KAAYxmB,EAAS2B,IAAK,EAAQsD,EAAGlG,KAAKmG,KAAY,IAANvD,EAAU,EAAIA,IAC5D,OAAPmQ,EAAe,QAASpS,KAAIiC,GAC9B,MAAO6kB,KAAYxmB,EAAS2B,IAAK,EAAQsD,EAAGlG,KAAKmG,KAAY,IAANvD,EAAU,EAAIA,IAC5D,OAAPmQ,EAAe,QAASpQ,KAAIC,GAC9B,MAAO6kB,KAAYxmB,EAAS2B,GAAKrD,EAAY2G,EAAGlG,KAAKmG,KAAY,IAANvD,EAAU,EAAIA,IAChE,OAAPmQ,EAAe,QAAS4U,KAAI/kB,GAAoC,MAAhCsD,GAAGlG,KAAKmG,KAAY,IAANvD,EAAU,EAAIA,GAAWuD,MACvE,QAAS8J,KAAIrN,EAAG6J,GAAuC,MAAnCvG,GAAGlG,KAAKmG,KAAY,IAANvD,EAAU,EAAIA,EAAG6J,GAAWtG,OAGtE,IAAe,kBAAL8H,KAAqBwZ,GAAWnV,EAAM7K,UAAY3G,EAAM,YAChE,GAAImN,IAAImO,UAAUR,UAKb,CACL,GAQIgM,GARAC,EAAuB,GAAI5Z,GAE3B6Z,EAAuBD,EAASX,GAAOO,MAAgB,EAAG,IAAMI,EAEhEE,EAAuBjnB,EAAM,WAAY+mB,EAASlnB,IAAI,KAEtDqnB,EAAuBT,EAAY,SAAS1K,GAAO,GAAI5O,GAAE4O,IAGzDmL,KACF/Z,EAAI8U,EAAQ,SAAS9X,EAAQuY,GAC3BzD,EAAU9U,EAAQgD,EAAG6F,EACrB,IAAI7N,GAAO,GAAIsO,EAEf,OADGiP,IAAYjkB,GAAUygB,EAAMwD,EAAUlW,EAAQrH,EAAKihB,GAAQjhB,GACvDA,IAETgI,EAAEpM,UAAYyQ,EACdA,EAAM/M,YAAc0I,GAEtBwZ,GAAWI,EAASpgB,QAAQ,SAASyE,EAAKjH,GACxC2iB,EAAa,EAAI3iB,MAAS6S,EAAAA,MAEzBiQ,GAAwBH,KACzBF,EAAU,UACVA,EAAU,OACVpa,GAAUoa,EAAU,SAEnBE,GAAcE,IAAeJ,EAAUR,GAEvCO,GAAWnV,EAAM+T,aAAa/T,GAAM+T,UAhCvCpY,GAAIuZ,EAAOvG,eAAe8B,EAASjP,EAAMxG,EAAQ4Z,GACjDR,EAAYzY,EAAEpM,UAAWma,EAyC3B,OAPAtN,GAAeT,EAAG6F,GAElBjR,EAAEiR,GAAQ7F,EACV3N,EAAQA,EAAQsK,EAAItK,EAAQ6K,EAAI7K,EAAQoD,GAAKuK,GAAKsG,GAAO1R,GAErD4kB,GAAQD,EAAOF,UAAUrZ,EAAG6F,EAAMxG,GAE/BW,IAKJ,SAASpO,EAAQD,EAASH,GAG/B,GAAI6mB,GAAS7mB,EAAoB,IAGjCA,GAAoB,KAAK,MAAO,SAASkD,GACvC,MAAO,SAASslB,OAAO,MAAOtlB,GAAIwD,KAAME,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,MAG9EooB,IAAK,QAASA,KAAIzkB,GAChB,MAAOojB,GAAOhV,IAAInL,KAAMjD,EAAkB,IAAVA,EAAc,EAAIA,EAAOA,KAE1DojB,IAIE,SAASzmB,EAAQD,EAASH,GAG/B,GAAIY,GAAeZ,EAAoB,GACnCwK,EAAexK,EAAoB,IACnCyoB,EAAezoB,EAAoB,KACnCwB,EAAexB,EAAoB,IACnCkB,EAAelB,EAAoB,IACnC0oB,EAAeD,EAAKC,YACpBC,EAAeF,EAAKE,KACpB3U,EAAe7R,OAAO6R,cAAgBxS,EACtConB,KAGAC,EAAW7oB,EAAoB,KAAK,UAAW,SAASkD,GAC1D,MAAO,SAAS4lB,WAAW,MAAO5lB,GAAIwD,KAAME,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,MAGlFoD,IAAK,QAASA,KAAIsC,GAChB,GAAGhE,EAASgE,GAAK,CACf,IAAIwO,EAAaxO,GAAK,MAAOkjB,GAAYhiB,MAAMxD,IAAIsC,EACnD,IAAGtE,EAAIsE,EAAKmjB,GAAM,MAAOnjB,GAAImjB,GAAMjiB,KAAK4U,MAI5C9K,IAAK,QAASA,KAAIhL,EAAK/B,GACrB,MAAOglB,GAAK5W,IAAInL,KAAMlB,EAAK/B,KAE5BglB,GAAM,GAAM,EAGsD,KAAlE,GAAII,IAAWrY,KAAKrO,OAAOkR,QAAUlR,QAAQymB,GAAM,GAAG1lB,IAAI0lB,IAC3DhoB,EAAEqH,KAAK1H,MAAM,SAAU,MAAO,MAAO,OAAQ,SAASiF,GACpD,GAAIqN,GAASgW,EAASzmB,UAClB2mB,EAASlW,EAAMrN,EACnBgF,GAASqI,EAAOrN,EAAK,SAASrC,EAAG6J,GAE/B,GAAGxL,EAAS2B,KAAO6Q,EAAa7Q,GAAG,CACjC,GAAIsC,GAASijB,EAAYhiB,MAAMlB,GAAKrC,EAAG6J,EACvC,OAAc,OAAPxH,EAAekB,KAAOjB,EAE7B,MAAOsjB,GAAOxoB,KAAKmG,KAAMvD,EAAG6J,QAO/B,SAAS5M,EAAQD,EAASH,GAG/B,GAAIuK,GAAoBvK,EAAoB,GACxCinB,EAAoBjnB,EAAoB,KACxCsB,EAAoBtB,EAAoB,IACxCwB,EAAoBxB,EAAoB,IACxCsgB,EAAoBtgB,EAAoB,KACxCugB,EAAoBvgB,EAAoB,KACxCgC,EAAoBhC,EAAoB,IACxConB,EAAoBpnB,EAAoB,IACxC2oB,EAAoB3oB,EAAoB,IAAI,QAC5CgU,EAAoB7R,OAAO6R,cAAgBxS,EAC3CwnB,EAAoBhnB,EAAkB,GACtCinB,EAAoBjnB,EAAkB,GACtC3B,EAAoB,EAGpBqoB,EAAc,SAASliB,GACzB,MAAOA,GAAKkhB,KAAOlhB,EAAKkhB,GAAK,GAAIwB,KAE/BA,EAAc,WAChBxiB,KAAKvD,MAEHgmB,EAAa,SAASza,EAAOlJ,GAC/B,MAAOwjB,GAAUta,EAAMvL,EAAG,SAASqJ,GACjC,MAAOA,GAAG,KAAOhH,IAGrB0jB,GAAY9mB,WACVc,IAAK,SAASsC,GACZ,GAAIuhB,GAAQoC,EAAWziB,KAAMlB,EAC7B,OAAGuhB,GAAaA,EAAM,GAAtB,QAEF7lB,IAAK,SAASsE,GACZ,QAAS2jB,EAAWziB,KAAMlB,IAE5BgL,IAAK,SAAShL,EAAK/B,GACjB,GAAIsjB,GAAQoC,EAAWziB,KAAMlB,EAC1BuhB,GAAMA,EAAM,GAAKtjB,EACfiD,KAAKvD,EAAEuC,MAAMF,EAAK/B,KAEzBkkB,SAAU,SAASniB,GACjB,GAAIoC,GAAQqhB,EAAeviB,KAAKvD,EAAG,SAASqJ,GAC1C,MAAOA,GAAG,KAAOhH,GAGnB,QADIoC,GAAMlB,KAAKvD,EAAEimB,OAAOxhB,EAAO,MACrBA,IAIdxH,EAAOD,SACLqhB,eAAgB,SAAS8B,EAASjP,EAAMxG,EAAQ4Z,GAC9C,GAAIjZ,GAAI8U,EAAQ,SAAS9c,EAAMud,GAC7BzD,EAAU9Z,EAAMgI,EAAG6F,GACnB7N,EAAK8U,GAAKjb,IACVmG,EAAKkhB,GAAK5nB,EACPikB,GAAYjkB,GAAUygB,EAAMwD,EAAUlW,EAAQrH,EAAKihB,GAAQjhB,IAkBhE,OAhBAygB,GAAYzY,EAAEpM,WAGZulB,SAAU,SAASniB,GACjB,MAAIhE,GAASgE,GACTwO,EAAaxO,GACV4hB,EAAK5hB,EAAKmjB,IAASvB,EAAK5hB,EAAImjB,GAAOjiB,KAAK4U,WAAc9V,GAAImjB,GAAMjiB,KAAK4U,IAD/CoN,EAAYhiB,MAAM,UAAUlB,IADhC,GAM3BtE,IAAK,QAASA,KAAIsE,GAChB,MAAIhE,GAASgE,GACTwO,EAAaxO,GACV4hB,EAAK5hB,EAAKmjB,IAASvB,EAAK5hB,EAAImjB,GAAOjiB,KAAK4U,IADlBoN,EAAYhiB,MAAMxF,IAAIsE,IAD1B,KAKtBgJ,GAETqD,IAAK,SAASrL,EAAMhB,EAAK/B,GAMrB,MALEuQ,GAAa1S,EAASkE,KAGxB4hB,EAAK5hB,EAAKmjB,IAASpe,EAAK/E,EAAKmjB,MAC7BnjB,EAAImjB,GAAMniB,EAAK8U,IAAM7X,GAHrBilB,EAAYliB,GAAMgK,IAAIhL,EAAK/B,GAIpB+C,GAEXkiB,YAAaA,EACbC,KAAMA,IAKH,SAASvoB,EAAQD,EAASH,GAG/B,GAAIyoB,GAAOzoB,EAAoB,IAG/BA,GAAoB,KAAK,UAAW,SAASkD,GAC3C,MAAO,SAASmmB,WAAW,MAAOnmB,GAAIwD,KAAME,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,MAGlFooB,IAAK,QAASA,KAAIzkB,GAChB,MAAOglB,GAAK5W,IAAInL,KAAMjD,GAAO,KAE9BglB,GAAM,GAAO,IAIX,SAASroB,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9BspB,EAAUhjB,SAAS2G,KAEvBpM,GAAQA,EAAQmD,EAAG,WACjBiJ,MAAO,QAASA,OAAMzB,EAAQ+d,EAAcC,GAC1C,MAAOF,GAAO/oB,KAAKiL,EAAQ+d,EAAcC,OAMxC,SAASppB,EAAQD,EAASH,GAG/B,GAAIY,GAAYZ,EAAoB,GAChCa,EAAYb,EAAoB,GAChCuB,EAAYvB,EAAoB,IAChCsB,EAAYtB,EAAoB,IAChCwB,EAAYxB,EAAoB,IAChCuG,EAAYD,SAASC,MAAQvG,EAAoB,GAAGsG,SAASlE,UAAUmE,IAI3E1F,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAIjE,EAAoB,GAAG,WACrD,QAASiE,MACT,QAASwlB,QAAQvjB,UAAU,gBAAkBjC,YAAcA,MACzD,WACFiC,UAAW,QAASA,WAAUwjB,EAAQtjB,GACpC7E,EAAUmoB,EACV,IAAIC,GAAY/iB,UAAU9C,OAAS,EAAI4lB,EAASnoB,EAAUqF,UAAU,GACpE,IAAG8iB,GAAUC,EAAU,CAErB,GAAGvjB,GAAQtG,EAAU,OAAOwB,EAAS8E,GAAMtC,QACzC,IAAK,GAAG,MAAO,IAAI4lB,EACnB,KAAK,GAAG,MAAO,IAAIA,GAAOtjB,EAAK,GAC/B,KAAK,GAAG,MAAO,IAAIsjB,GAAOtjB,EAAK,GAAIA,EAAK,GACxC,KAAK,GAAG,MAAO,IAAIsjB,GAAOtjB,EAAK,GAAIA,EAAK,GAAIA,EAAK,GACjD,KAAK,GAAG,MAAO,IAAIsjB,GAAOtjB,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAG5D,GAAIwjB,IAAS,KAEb,OADAA,GAAMlkB,KAAKuH,MAAM2c,EAAOxjB,GACjB,IAAKG,EAAK0G,MAAMyc,EAAQE,IAGjC,GAAI/W,GAAW8W,EAAUvnB,UACrBgmB,EAAWxnB,EAAEqF,OAAOzE,EAASqR,GAASA,EAAQ1Q,OAAOC,WACrDqD,EAAWa,SAAS2G,MAAM1M,KAAKmpB,EAAQtB,EAAUhiB,EACrD,OAAO5E,GAASiE,GAAUA,EAAS2iB,MAMlC,SAAShoB,EAAQD,EAASH,GAG/B,GAAIY,GAAWZ,EAAoB,GAC/Ba,EAAWb,EAAoB,GAC/BsB,EAAWtB,EAAoB,GAGnCa,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAIjE,EAAoB,GAAG,WACrDypB,QAAQ9mB,eAAe/B,EAAEgC,WAAY,GAAIa,MAAO,IAAK,GAAIA,MAAO,MAC9D,WACFd,eAAgB,QAASA,gBAAe6I,EAAQqe,EAAaC,GAC3DxoB,EAASkK,EACT,KAEE,MADA5K,GAAEgC,QAAQ4I,EAAQqe,EAAaC,IACxB,EACP,MAAMvmB,GACN,OAAO,OAOR,SAASnD,EAAQD,EAASH,GAG/B,GAAIa,GAAWb,EAAoB,GAC/B8C,EAAW9C,EAAoB,GAAG8C,QAClCxB,EAAWtB,EAAoB,GAEnCa,GAAQA,EAAQmD,EAAG,WACjB+lB,eAAgB,QAASA,gBAAeve,EAAQqe,GAC9C,GAAIG,GAAOlnB,EAAQxB,EAASkK,GAASqe,EACrC,OAAOG,KAASA,EAAKhe,cAAe,QAAeR,GAAOqe,OAMzD,SAASzpB,EAAQD,EAASH,GAI/B,GAAIa,GAAWb,EAAoB,GAC/BsB,EAAWtB,EAAoB,IAC/BiqB,EAAY,SAAS7O,GACvB1U,KAAK2U,GAAK/Z,EAAS8Z,GACnB1U,KAAK4U,GAAK,CACV,IACI9V,GADA5B,EAAO8C,KAAK6J,KAEhB,KAAI/K,IAAO4V,GAASxX,EAAK8B,KAAKF,GAEhCxF,GAAoB,KAAKiqB,EAAW,SAAU,WAC5C,GAEIzkB,GAFAgB,EAAOE,KACP9C,EAAO4C,EAAK+J,EAEhB,GACE,IAAG/J,EAAK8U,IAAM1X,EAAKE,OAAO,OAAQL,MAAO3D,EAAW0b,MAAM,YACjDhW,EAAM5B,EAAK4C,EAAK8U,QAAU9U,GAAK6U,IAC1C,QAAQ5X,MAAO+B,EAAKgW,MAAM,KAG5B3a,EAAQA,EAAQmD,EAAG,WACjBkmB,UAAW,QAASA,WAAU1e,GAC5B,MAAO,IAAIye,GAAUze,OAMpB,SAASpL,EAAQD,EAASH,GAS/B,QAASkD,KAAIsI,EAAQqe,GACnB,GACIG,GAAMnX,EADNsX,EAAWvjB,UAAU9C,OAAS,EAAI0H,EAAS5E,UAAU,EAEzD,OAAGtF,GAASkK,KAAY2e,EAAgB3e,EAAOqe,IAC5CG,EAAOppB,EAAEkC,QAAQ0I,EAAQqe,IAAoB3oB,EAAI8oB,EAAM,SACtDA,EAAKvmB,MACLumB,EAAK9mB,MAAQpD,EACXkqB,EAAK9mB,IAAI3C,KAAK4pB,GACdrqB,EACH0B,EAASqR,EAAQjS,EAAEiF,SAAS2F,IAAgBtI,IAAI2P,EAAOgX,EAAaM,GAAvE,OAfF,GAAIvpB,GAAWZ,EAAoB,GAC/BkB,EAAWlB,EAAoB,IAC/Ba,EAAWb,EAAoB,GAC/BwB,EAAWxB,EAAoB,IAC/BsB,EAAWtB,EAAoB,GAcnCa,GAAQA,EAAQmD,EAAG,WAAYd,IAAKA,OAI/B,SAAS9C,EAAQD,EAASH,GAG/B,GAAIY,GAAWZ,EAAoB,GAC/Ba,EAAWb,EAAoB,GAC/BsB,EAAWtB,EAAoB,GAEnCa,GAAQA,EAAQmD,EAAG,WACjBE,yBAA0B,QAASA,0BAAyBsH,EAAQqe,GAClE,MAAOjpB,GAAEkC,QAAQxB,EAASkK,GAASqe,OAMlC,SAASzpB,EAAQD,EAASH,GAG/B,GAAIa,GAAWb,EAAoB,GAC/B6F,EAAW7F,EAAoB,GAAG6F,SAClCvE,EAAWtB,EAAoB,GAEnCa,GAAQA,EAAQmD,EAAG,WACjB4B,eAAgB,QAASA,gBAAe4F,GACtC,MAAO3F,GAASvE,EAASkK,QAMxB,SAASpL,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,WACjB9C,IAAK,QAASA,KAAIsK,EAAQqe,GACxB,MAAOA,KAAere,OAMrB,SAASpL,EAAQD,EAASH,GAG/B,GAAIa,GAAgBb,EAAoB,GACpCsB,EAAgBtB,EAAoB,IACpC+T,EAAgB5R,OAAO6R,YAE3BnT,GAAQA,EAAQmD,EAAG,WACjBgQ,aAAc,QAASA,cAAaxI,GAElC,MADAlK,GAASkK,GACFuI,EAAgBA,EAAcvI,IAAU,MAM9C,SAASpL,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAG,WAAYomB,QAASpqB,EAAoB,QAIvD,SAASI,EAAQD,EAASH,GAG/B,GAAIY,GAAWZ,EAAoB,GAC/BsB,EAAWtB,EAAoB,IAC/BypB,EAAWzpB,EAAoB,GAAGypB,OACtCrpB,GAAOD,QAAUspB,GAAWA,EAAQW,SAAW,QAASA,SAAQ5d,GAC9D,GAAI5I,GAAahD,EAAEoF,SAAS1E,EAASkL,IACjCrC,EAAavJ,EAAEuJ,UACnB,OAAOA,GAAavG,EAAKU,OAAO6F,EAAWqC,IAAO5I,IAK/C,SAASxD,EAAQD,EAASH,GAG/B,GAAIa,GAAqBb,EAAoB,GACzCsB,EAAqBtB,EAAoB,IACzCyT,EAAqBtR,OAAOuR,iBAEhC7S,GAAQA,EAAQmD,EAAG,WACjB0P,kBAAmB,QAASA,mBAAkBlI,GAC5ClK,EAASkK,EACT,KAEE,MADGiI,IAAmBA,EAAmBjI,IAClC,EACP,MAAMjI,GACN,OAAO,OAOR,SAASnD,EAAQD,EAASH,GAU/B,QAASwQ,KAAIhF,EAAQqe,EAAaQ,GAChC,GAEIC,GAAoBzX,EAFpBsX,EAAWvjB,UAAU9C,OAAS,EAAI0H,EAAS5E,UAAU,GACrD2jB,EAAW3pB,EAAEkC,QAAQxB,EAASkK,GAASqe,EAE3C,KAAIU,EAAQ,CACV,GAAG/oB,EAASqR,EAAQjS,EAAEiF,SAAS2F,IAC7B,MAAOgF,KAAIqC,EAAOgX,EAAaQ,EAAGF,EAEpCI,GAAUxpB,EAAW,GAEvB,MAAGG,GAAIqpB,EAAS,SACXA,EAAQte,YAAa,GAAUzK,EAAS2oB,IAC3CG,EAAqB1pB,EAAEkC,QAAQqnB,EAAUN,IAAgB9oB,EAAW,GACpEupB,EAAmB7mB,MAAQ4mB,EAC3BzpB,EAAEgC,QAAQunB,EAAUN,EAAaS,IAC1B,IAJqD,EAMvDC,EAAQ/Z,MAAQ1Q,GAAY,GAASyqB,EAAQ/Z,IAAIjQ,KAAK4pB,EAAUE,IAAI,GAxB7E,GAAIzpB,GAAaZ,EAAoB,GACjCkB,EAAalB,EAAoB,IACjCa,EAAab,EAAoB,GACjCe,EAAaf,EAAoB,GACjCsB,EAAatB,EAAoB,IACjCwB,EAAaxB,EAAoB,GAsBrCa,GAAQA,EAAQmD,EAAG,WAAYwM,IAAKA,OAI/B,SAASpQ,EAAQD,EAASH,GAG/B,GAAIa,GAAWb,EAAoB,GAC/BwgB,EAAWxgB,EAAoB,GAEhCwgB,IAAS3f,EAAQA,EAAQmD,EAAG,WAC7B2O,eAAgB,QAASA,gBAAenH,EAAQqH,GAC9C2N,EAAS5N,MAAMpH,EAAQqH,EACvB,KAEE,MADA2N,GAAShQ,IAAIhF,EAAQqH,IACd,EACP,MAAMtP,GACN,OAAO,OAOR,SAASnD,EAAQD,EAASH,GAG/B,GAAIa,GAAYb,EAAoB,GAChCwqB,EAAYxqB,EAAoB,KAAI,EAExCa,GAAQA,EAAQwC,EAAG,SAEjBwX,SAAU,QAASA,UAASnS,GAC1B,MAAO8hB,GAAU9jB,KAAMgC,EAAI9B,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,MAIrEE,EAAoB,KAAK,aAIpB,SAASI,EAAQD,EAASH,GAI/B,GAAIa,GAAUb,EAAoB,GAC9B+Z,EAAU/Z,EAAoB,KAAI,EAEtCa,GAAQA,EAAQwC,EAAG,UACjBonB,GAAI,QAASA,IAAGxQ,GACd,MAAOF,GAAIrT,KAAMuT,OAMhB,SAAS7Z,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B0qB,EAAU1qB,EAAoB,IAElCa,GAAQA,EAAQwC,EAAG,UACjBsnB,QAAS,QAASA,SAAQC,GACxB,MAAOF,GAAKhkB,KAAMkkB,EAAWhkB,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,GAAW,OAM7E,SAASM,EAAQD,EAASH,GAG/B,GAAI6B,GAAW7B,EAAoB,IAC/B8a,EAAW9a,EAAoB,KAC/BsN,EAAWtN,EAAoB,GAEnCI,GAAOD,QAAU,SAASqG,EAAMokB,EAAWC,EAAYC,GACrD,GAAI9mB,GAAe4I,OAAOU,EAAQ9G,IAC9BukB,EAAe/mB,EAAEF,OACjBknB,EAAeH,IAAe/qB,EAAY,IAAM8M,OAAOie,GACvDI,EAAeppB,EAAS+oB,EAC5B,IAAmBG,GAAhBE,EAA6B,MAAOjnB,EACzB,KAAXgnB,IAAcA,EAAU,IAC3B,IAAIE,GAAUD,EAAeF,EACzBI,EAAerQ,EAAOva,KAAKyqB,EAASpiB,KAAK2E,KAAK2d,EAAUF,EAAQlnB,QAEpE,OADGqnB,GAAarnB,OAASonB,IAAQC,EAAeA,EAAa3oB,MAAM,EAAG0oB,IAC/DJ,EAAOK,EAAennB,EAAIA,EAAImnB,IAKlC,SAAS/qB,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B0qB,EAAU1qB,EAAoB,IAElCa,GAAQA,EAAQwC,EAAG,UACjB+nB,SAAU,QAASA,UAASR,GAC1B,MAAOF,GAAKhkB,KAAMkkB,EAAWhkB,UAAU9C,OAAS,EAAI8C,UAAU,GAAK9G,GAAW,OAM7E,SAASM,EAAQD,EAASH,GAI/BA,EAAoB,IAAI,WAAY,SAAS0U,GAC3C,MAAO,SAAS2W,YACd,MAAO3W,GAAMhO,KAAM,OAMlB,SAAStG,EAAQD,EAASH,GAI/BA,EAAoB,IAAI,YAAa,SAAS0U,GAC5C,MAAO,SAAS4W,aACd,MAAO5W,GAAMhO,KAAM,OAMlB,SAAStG,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9BurB,EAAUvrB,EAAoB,KAAK,sBAAuB,OAE9Da,GAAQA,EAAQmD,EAAG,UAAWwnB,OAAQ,QAASA,QAAOhf,GAAK,MAAO+e,GAAI/e,OAKjE,SAASpM,EAAQD,GAEtBC,EAAOD,QAAU,SAASsrB,EAAQpV,GAChC,GAAIjF,GAAWiF,IAAYlU,OAAOkU,GAAW,SAASqV,GACpD,MAAOrV,GAAQqV,IACbrV,CACJ,OAAO,UAAS7J,GACd,MAAOI,QAAOJ,GAAI6J,QAAQoV,EAAQra,MAMjC,SAAShR,EAAQD,EAASH,GAG/B,GAAIY,GAAaZ,EAAoB,GACjCa,EAAab,EAAoB,GACjCoqB,EAAapqB,EAAoB,KACjC0B,EAAa1B,EAAoB,IACjCe,EAAaf,EAAoB,EAErCa,GAAQA,EAAQmD,EAAG,UACjB2nB,0BAA2B,QAASA,2BAA0BpmB,GAQ5D,IAPA,GAMIC,GAAK0K,EANL9M,EAAU1B,EAAU6D,GACpB3C,EAAUhC,EAAEgC,QACZE,EAAUlC,EAAEkC,QACZc,EAAUwmB,EAAQhnB,GAClBqC,KACA1B,EAAU,EAERH,EAAKE,OAASC,GAClBmM,EAAIpN,EAAQM,EAAGoC,EAAM5B,EAAKG,MACvByB,IAAOC,GAAO7C,EAAQ6C,EAAQD,EAAKzE,EAAW,EAAGmP,IAC/CzK,EAAOD,GAAO0K,CACnB,OAAOzK,OAMR,SAASrF,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9B4rB,EAAU5rB,EAAoB,MAAK,EAEvCa,GAAQA,EAAQmD,EAAG,UACjB0Y,OAAQ,QAASA,QAAOlQ,GACtB,MAAOof,GAAQpf,OAMd,SAASpM,EAAQD,EAASH,GAE/B,GAAIY,GAAYZ,EAAoB,GAChC0B,EAAY1B,EAAoB,IAChCkK,EAAYtJ,EAAEsJ,MAClB9J,GAAOD,QAAU,SAAS0rB,GACxB,MAAO,UAASrf,GAOd,IANA,GAKIhH,GALApC,EAAS1B,EAAU8K,GACnB5I,EAAShD,EAAEiD,QAAQT,GACnBU,EAASF,EAAKE,OACdC,EAAS,EACT0B,KAEE3B,EAASC,GAAKmG,EAAO3J,KAAK6C,EAAGoC,EAAM5B,EAAKG,OAC5C0B,EAAOC,KAAKmmB,GAAarmB,EAAKpC,EAAEoC,IAAQpC,EAAEoC,GAC1C,OAAOC,MAMR,SAASrF,EAAQD,EAASH,GAG/B,GAAIa,GAAWb,EAAoB,GAC/B8rB,EAAW9rB,EAAoB,MAAK,EAExCa,GAAQA,EAAQmD,EAAG,UACjB2Y,QAAS,QAASA,SAAQnQ,GACxB,MAAOsf,GAAStf,OAMf,SAASpM,EAAQD,EAASH,GAG/B,GAAIa,GAAWb,EAAoB,EAEnCa,GAAQA,EAAQwC,EAAG,OAAQ0oB,OAAQ/rB,EAAoB,KAAK,UAIvD,SAASI,EAAQD,EAASH,GAG/B,GAAIugB,GAAUvgB,EAAoB,KAC9BiT,EAAUjT,EAAoB,GAClCI,GAAOD,QAAU,SAASkU,GACxB,MAAO,SAAS0X,UACd,GAAG9Y,EAAQvM,OAAS2N,EAAK,KAAM7Q,WAAU6Q,EAAO,wBAChD,IAAI4J,KAEJ,OADAsC,GAAM7Z,MAAM,EAAOuX,EAAIvY,KAAMuY,GACtBA,KAMN,SAAS7d,EAAQD,EAASH,GAG/B,GAAIa,GAAWb,EAAoB,EAEnCa,GAAQA,EAAQwC,EAAG,OAAQ0oB,OAAQ/rB,EAAoB,KAAK,UAIvD,SAASI,EAAQD,EAASH,GAE/B,GAAIa,GAAUb,EAAoB,GAC9BgsB,EAAUhsB,EAAoB,IAClCa,GAAQA,EAAQsK,EAAItK,EAAQ0K,GAC1Bqa,aAAgBoG,EAAMxb,IACtBsV,eAAgBkG,EAAMpF,SAKnB,SAASxmB,EAAQD,EAASH,GAE/BA,EAAoB,IACpB,IAAIqK,GAAcrK,EAAoB,GAClCuK,EAAcvK,EAAoB,GAClC0b,EAAc1b,EAAoB,KAClC4b,EAAc5b,EAAoB,IAAI,YACtCisB,EAAc5hB,EAAO6hB,SACrBC,EAAc9hB,EAAO+hB,eACrBC,EAAcJ,GAAMA,EAAG7pB,UACvBkqB,EAAcH,GAAOA,EAAI/pB,UACzBmqB,EAAc7Q,EAAUwQ,SAAWxQ,EAAU0Q,eAAiB1Q,EAAUpZ,KACzE+pB,KAAYA,EAAQzQ,IAAUrR,EAAK8hB,EAASzQ,EAAU2Q,GACtDD,IAAaA,EAAS1Q,IAAUrR,EAAK+hB,EAAU1Q,EAAU2Q,IAIvD,SAASnsB,EAAQD,EAASH,GAG/B,GAAIqK,GAAarK,EAAoB,GACjCa,EAAab,EAAoB,GACjCoB,EAAapB,EAAoB,IACjCwsB,EAAaxsB,EAAoB,KACjCysB,EAAapiB,EAAOoiB,UACpBC,IAAeD,GAAa,WAAW3Z,KAAK2Z,EAAUE,WACtDvc,EAAO,SAASI,GAClB,MAAOkc,GAAO,SAASjmB,EAAImmB,GACzB,MAAOpc,GAAIpP,EACTorB,KACGhqB,MAAMjC,KAAKqG,UAAW,GACZ,kBAANH,GAAmBA,EAAKH,SAASG,IACvCmmB,IACDpc,EAEN3P,GAAQA,EAAQsK,EAAItK,EAAQ0K,EAAI1K,EAAQoD,EAAIyoB,GAC1C9J,WAAaxS,EAAK/F,EAAOuY,YACzBiK,YAAazc,EAAK/F,EAAOwiB,gBAKtB,SAASzsB,EAAQD,EAASH,GAG/B,GAAI8sB,GAAY9sB,EAAoB,KAChCoB,EAAYpB,EAAoB,IAChCuB,EAAYvB,EAAoB,GACpCI,GAAOD,QAAU,WAOf,IANA,GAAIsG,GAASlF,EAAUmF,MACnB5C,EAAS8C,UAAU9C,OACnBipB,EAASzqB,MAAMwB,GACfC,EAAS,EACTipB,EAASF,EAAKE,EACdC,GAAS,EACPnpB,EAASC,IAAMgpB,EAAMhpB,GAAK6C,UAAU7C,QAAUipB,IAAEC,GAAS,EAC/D,OAAO,YACL,GAGkB7mB,GAHdI,EAAQE,KACR4K,EAAQ1K,UACR4L,EAAQlB,EAAGxN,OACX2O,EAAI,EAAGH,EAAI,CACf,KAAI2a,IAAWza,EAAM,MAAOpR,GAAOqF,EAAIsmB,EAAOvmB,EAE9C,IADAJ,EAAO2mB,EAAMvqB,QACVyqB,EAAO,KAAKnpB,EAAS2O,EAAGA,IAAOrM,EAAKqM,KAAOua,IAAE5mB,EAAKqM,GAAKnB,EAAGgB,KAC7D,MAAME,EAAQF,GAAElM,EAAKV,KAAK4L,EAAGgB,KAC7B,OAAOlR,GAAOqF,EAAIL,EAAMI,MAMvB,SAASpG,EAAQD,EAASH,GAE/BI,EAAOD,QAAUH,EAAoB,IAIhC,SAASI,EAAQD,EAASH,GAoF/B,QAASktB,MAAKnJ,GACZ,GAAIoJ,GAAOvsB,EAAEqF,OAAO,KAQpB,OAPG8d,IAAYjkB,IACVstB,EAAWrJ,GACZxD,EAAMwD,GAAU,EAAM,SAASve,EAAK/B,GAClC0pB,EAAK3nB,GAAO/B,IAET0O,EAAOgb,EAAMpJ,IAEfoJ,EAIT,QAAS7kB,QAAO/C,EAAQkY,EAAO4P,GAC7B9rB,EAAUkc,EACV,IAII9V,GAAMnC,EAJNpC,EAAS1B,EAAU6D,GACnB3B,EAASC,EAAQT,GACjBU,EAASF,EAAKE,OACdC,EAAS,CAEb,IAAG6C,UAAU9C,OAAS,EAAE,CACtB,IAAIA,EAAO,KAAMN,WAAU,+CAC3BmE,GAAOvE,EAAEQ,EAAKG,UACT4D,GAAOxF,OAAOkrB,EACrB,MAAMvpB,EAASC,GAAK7C,EAAIkC,EAAGoC,EAAM5B,EAAKG,QACpC4D,EAAO8V,EAAM9V,EAAMvE,EAAEoC,GAAMA,EAAKD,GAElC,OAAOoC,GAGT,QAASkT,UAAStV,EAAQmD,GACxB,OAAQA,GAAMA,EAAKyG,EAAM5J,EAAQmD,GAAM4kB,EAAQ/nB,EAAQ,SAASiH,GAC9D,MAAOA,IAAMA,OACP1M,EAGV,QAASoD,KAAIqC,EAAQC,GACnB,MAAGtE,GAAIqE,EAAQC,GAAYD,EAAOC,GAAlC,OAEF,QAASgL,KAAIjL,EAAQC,EAAK/B,GAGxB,MAFG3C,IAAe0E,IAAOrD,QAAOvB,EAAEgC,QAAQ2C,EAAQC,EAAKzE,EAAW,EAAG0C,IAChE8B,EAAOC,GAAO/B,EACZ8B,EAGT,QAASgoB,QAAO/gB,GACd,MAAOhL,GAASgL,IAAO5L,EAAEiF,SAAS2G,KAAQ0gB,KAAK9qB,UA/HjD,GAAIxB,GAAcZ,EAAoB,GAClCyK,EAAczK,EAAoB,IAClCa,EAAcb,EAAoB,GAClCe,EAAcf,EAAoB,GAClCmS,EAAcnS,EAAoB,IAClCmP,EAAcnP,EAAoB,IAClCuB,EAAcvB,EAAoB,IAClCugB,EAAcvgB,EAAoB,KAClCotB,EAAcptB,EAAoB,KAClC2b,EAAc3b,EAAoB,KAClCud,EAAcvd,EAAoB,KAClCwB,EAAcxB,EAAoB,IAClC0B,EAAc1B,EAAoB,IAClCc,EAAcd,EAAoB,GAClCkB,EAAclB,EAAoB,IAClC6D,EAAcjD,EAAEiD,QAUhB2pB,EAAmB,SAAS5f,GAC9B,GAAIC,GAAmB,GAARD,EACXI,EAAmB,GAARJ,CACf,OAAO,UAASrI,EAAQmC,EAAYlB,GAClC,GAIIhB,GAAKiH,EAAK2B,EAJVC,EAAS5D,EAAI/C,EAAYlB,EAAM,GAC/BpD,EAAS1B,EAAU6D,GACnBE,EAASoI,GAAkB,GAARD,GAAqB,GAARA,EAC5B,IAAoB,kBAARlH,MAAqBA,KAAOwmB,MAAQptB,CAExD,KAAI0F,IAAOpC,GAAE,GAAGlC,EAAIkC,EAAGoC,KACrBiH,EAAMrJ,EAAEoC,GACR4I,EAAMC,EAAE5B,EAAKjH,EAAKD,GACfqI,GACD,GAAGC,EAAOpI,EAAOD,GAAO4I,MACnB,IAAGA,EAAI,OAAOR,GACjB,IAAK,GAAGnI,EAAOD,GAAOiH,CAAK,MAC3B,KAAK,GAAG,OAAO,CACf,KAAK,GAAG,MAAOA,EACf,KAAK,GAAG,MAAOjH,EACf,KAAK,GAAGC,EAAO2I,EAAI,IAAMA,EAAI,OACxB,IAAGJ,EAAS,OAAO,CAG9B,OAAe,IAARJ,GAAaI,EAAWA,EAAWvI,IAG1C6nB,EAAUE,EAAiB,GAE3BC,EAAiB,SAAShR,GAC5B,MAAO,UAASjQ,GACd,MAAO,IAAIkhB,GAAalhB,EAAIiQ,KAG5BiR,EAAe,SAAStS,EAAUqB,GACpC/V,KAAK2U,GAAK3Z,EAAU0Z,GACpB1U,KAAKinB,GAAK9pB,EAAQuX,GAClB1U,KAAK4U,GAAK,EACV5U,KAAK6J,GAAKkM,EAEZd,GAAY+R,EAAc,OAAQ,WAChC,GAIIloB,GAJAgB,EAAOE,KACPtD,EAAOoD,EAAK6U,GACZzX,EAAO4C,EAAKmnB,GACZlR,EAAOjW,EAAK+J,EAEhB,GACE,IAAG/J,EAAK8U,IAAM1X,EAAKE,OAEjB,MADA0C,GAAK6U,GAAKvb,EACHyd,EAAK,UAEPrc,EAAIkC,EAAGoC,EAAM5B,EAAK4C,EAAK8U,OAChC,OAAW,QAARmB,EAAwBc,EAAK,EAAG/X,GACxB,UAARiX,EAAwBc,EAAK,EAAGna,EAAEoC,IAC9B+X,EAAK,GAAI/X,EAAKpC,EAAEoC,OAczB0nB,KAAK9qB,UAAY,KAsCjBvB,EAAQA,EAAQsK,EAAItK,EAAQoD,GAAIipB,KAAMA,OAEtCrsB,EAAQA,EAAQmD,EAAG,QACjBJ,KAAU6pB,EAAe,QACzB/Q,OAAU+Q,EAAe,UACzB9Q,QAAU8Q,EAAe,WACzBzlB,QAAUwlB,EAAiB,GAC3BtlB,IAAUslB,EAAiB,GAC3BrlB,OAAUqlB,EAAiB,GAC3BplB,KAAUolB,EAAiB,GAC3BnlB,MAAUmlB,EAAiB,GAC3B3O,KAAU2O,EAAiB,GAC3BF,QAAUA,EACVM,SAAUJ,EAAiB,GAC3BllB,OAAUA,OACV6G,MAAUA,EACV0L,SAAUA,SACV3Z,IAAUA,EACVgC,IAAUA,IACVsN,IAAUA,IACV+c,OAAUA,UAKP,SAASntB,EAAQD,EAASH,GAE/B,GAAIiT,GAAYjT,EAAoB,IAChC4b,EAAY5b,EAAoB,IAAI,YACpC0b,EAAY1b,EAAoB,IACpCI,GAAOD,QAAUH,EAAoB,GAAGotB,WAAa,SAAS5gB,GAC5D,GAAIpJ,GAAIjB,OAAOqK,EACf,OAAOpJ,GAAEwY,KAAc9b,GAClB,cAAgBsD,IAChBsY,EAAU/O,eAAesG,EAAQ7P,MAKnC,SAAShD,EAAQD,EAASH,GAE/B,GAAIsB,GAAWtB,EAAoB,IAC/BkD,EAAWlD,EAAoB,IACnCI,GAAOD,QAAUH,EAAoB,GAAG6tB,YAAc,SAASrhB,GAC7D,GAAImR,GAASza,EAAIsJ,EACjB,IAAoB,kBAAVmR,GAAqB,KAAMna,WAAUgJ,EAAK,oBACpD,OAAOlL,GAASqc,EAAOpd,KAAKiM,MAKzB,SAASpM,EAAQD,EAASH,GAE/B,GAAIqK,GAAUrK,EAAoB,GAC9BsK,EAAUtK,EAAoB,GAC9Ba,EAAUb,EAAoB,GAC9BwsB,EAAUxsB,EAAoB,IAElCa,GAAQA,EAAQsK,EAAItK,EAAQoD,GAC1B6pB,MAAO,QAASA,OAAMlB,GACpB,MAAO,KAAKtiB,EAAKiZ,SAAWlZ,EAAOkZ,SAAS,SAAStC,GACnD2B,WAAW4J,EAAQjsB,KAAK0gB,GAAS,GAAO2L,SAOzC,SAASxsB,EAAQD,EAASH,GAE/B,GAAI8sB,GAAU9sB,EAAoB,KAC9Ba,EAAUb,EAAoB,EAGlCA,GAAoB,GAAGgtB,EAAIF,EAAKE,EAAIF,EAAKE,MAEzCnsB,EAAQA,EAAQwC,EAAIxC,EAAQoD,EAAG,YAAaynB,KAAM1rB,EAAoB,QAIjE,SAASI,EAAQD,EAASH,GAE/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAG,UAAWzC,SAAUxB,EAAoB,OAInE,SAASI,EAAQD,EAASH,GAE/B,GAAIa,GAAUb,EAAoB,EAElCa,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAG,UAAWgP,QAASjT,EAAoB,OAIlE,SAASI,EAAQD,EAASH,GAE/B,GAAIa,GAAUb,EAAoB,GAC9B+tB,EAAU/tB,EAAoB,IAElCa,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAG,UAAW8pB,OAAQA,KAI7C,SAAS3tB,EAAQD,EAASH,GAE/B,GAAIY,GAAYZ,EAAoB,GAChCoqB,EAAYpqB,EAAoB,KAChC0B,EAAY1B,EAAoB,GAEpCI,GAAOD,QAAU,QAAS4tB,QAAOviB,EAAQwiB,GAIvC,IAHA,GAEWxoB,GAFP5B,EAASwmB,EAAQ1oB,EAAUssB,IAC3BlqB,EAASF,EAAKE,OACdC,EAAI,EACFD,EAASC,GAAEnD,EAAEgC,QAAQ4I,EAAQhG,EAAM5B,EAAKG,KAAMnD,EAAEkC,QAAQkrB,EAAOxoB,GACrE,OAAOgG,KAKJ,SAASpL,EAAQD,EAASH,GAE/B,GAAIa,GAAUb,EAAoB,GAC9B+tB,EAAU/tB,EAAoB,KAC9BiG,EAAUjG,EAAoB,GAAGiG,MAErCpF,GAAQA,EAAQmD,EAAInD,EAAQoD,EAAG,UAC7BgqB,KAAM,SAASpb,EAAOmb,GACpB,MAAOD,GAAO9nB,EAAO4M,GAAQmb,OAM5B,SAAS5tB,EAAQD,EAASH,GAG/BA,EAAoB,KAAK2V,OAAQ,SAAU,SAASyF,GAClD1U,KAAKghB,IAAMtM,EACX1U,KAAK4U,GAAK,GACT,WACD,GAAIvX,GAAO2C,KAAK4U,KACZE,IAAa9U,KAAKghB,GAAT3jB,EACb,QAAQyX,KAAMA,EAAM/X,MAAO+X,EAAO1b,EAAYiE,MAK3C,SAAS3D,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9BurB,EAAMvrB,EAAoB,KAAK,YACjCkuB,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,UAGPztB,GAAQA,EAAQwC,EAAIxC,EAAQoD,EAAG,UAAWsqB,WAAY,QAASA,cAAc,MAAOhD,GAAI7kB,UAInF,SAAStG,EAAQD,EAASH,GAG/B,GAAIa,GAAUb,EAAoB,GAC9BurB,EAAMvrB,EAAoB,KAAK,8BACjCwuB,QAAU,IACVC,OAAU,IACVC,OAAU,IACVC,SAAU,IACVC,SAAU,KAGZ/tB,GAAQA,EAAQwC,EAAIxC,EAAQoD,EAAG,UAAW4qB,aAAe,QAASA,gBAAgB,MAAOtD,GAAI7kB,UAIxF,SAAStG,EAAQD,EAASH,GAE/B,GAAIY,GAAUZ,EAAoB,GAC9BqK,EAAUrK,EAAoB,GAC9Ba,EAAUb,EAAoB,GAC9BoX,KACA0X,GAAU,CAEdluB,GAAEqH,KAAK1H,KAAK,kNAIV6D,MAAM,KAAM,SAASoB,GACrB4R,EAAI5R,GAAO,WACT,GAAIupB,GAAW1kB,EAAOwY,OACtB,OAAGiM,IAAWC,GAAYA,EAASvpB,GAC1Bc,SAAS2G,MAAM1M,KAAKwuB,EAASvpB,GAAMupB,EAAUnoB,WADtD,UAKJ/F,EAAQA,EAAQsK,EAAItK,EAAQoD,GAAImT,IAAKpX,EAAoB,IAAIoX,EAAIA,IAAKA,GACpE4X,OAAQ,WACNF,GAAU,GAEZG,QAAS,WACPH,GAAU,QAMT,SAAS1uB,EAAQD,EAASH,GAG/B,GAAIY,GAAUZ,EAAoB,GAC9Ba,EAAUb,EAAoB,GAC9BkvB,EAAUlvB,EAAoB,IAC9BmvB,EAAUnvB,EAAoB,GAAGsC,OAASA,MAC1C8sB,KACAC,EAAa,SAASzrB,EAAME,GAC9BlD,EAAEqH,KAAK1H,KAAKqD,EAAKQ,MAAM,KAAM,SAASoB,GACjC1B,GAAUhE,GAAa0F,IAAO2pB,GAAOC,EAAQ5pB,GAAO2pB,EAAO3pB,GACtDA,SAAU4pB,EAAQ5pB,GAAO0pB,EAAK5oB,SAAS/F,QAASiF,GAAM1B,MAGlEurB,GAAW,wCAAyC,GACpDA,EAAW,gEAAiE,GAC5EA,EAAW,6FAEXxuB,EAAQA,EAAQmD,EAAG,QAASorB,MAKT,mBAAVhvB,SAAyBA,OAAOD,QAAQC,OAAOD,QAAUP,EAE1C,kBAAVmuB,SAAwBA,OAAOuB,IAAIvB,OAAO,WAAW,MAAOnuB,KAEtEC,EAAIyK,KAAO1K,GACd,EAAG","file":"core.min.js"} \ No newline at end of file diff --git a/react-app/node_modules/core-js/client/library.js b/react-app/node_modules/core-js/client/library.js new file mode 100644 index 0000000000..f54e39c23a --- /dev/null +++ b/react-app/node_modules/core-js/client/library.js @@ -0,0 +1,4544 @@ +/** + * core-js 1.2.6 + * https://github.com/zloirock/core-js + * License: http://rock.mit-license.org + * © 2015 Denis Pushkarev + */ +!function(__e, __g, undefined){ +'use strict'; +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + __webpack_require__(1); + __webpack_require__(32); + __webpack_require__(40); + __webpack_require__(42); + __webpack_require__(44); + __webpack_require__(46); + __webpack_require__(48); + __webpack_require__(49); + __webpack_require__(50); + __webpack_require__(51); + __webpack_require__(52); + __webpack_require__(53); + __webpack_require__(54); + __webpack_require__(55); + __webpack_require__(56); + __webpack_require__(57); + __webpack_require__(58); + __webpack_require__(59); + __webpack_require__(60); + __webpack_require__(62); + __webpack_require__(63); + __webpack_require__(64); + __webpack_require__(65); + __webpack_require__(66); + __webpack_require__(67); + __webpack_require__(68); + __webpack_require__(70); + __webpack_require__(71); + __webpack_require__(72); + __webpack_require__(74); + __webpack_require__(75); + __webpack_require__(76); + __webpack_require__(78); + __webpack_require__(79); + __webpack_require__(80); + __webpack_require__(81); + __webpack_require__(82); + __webpack_require__(83); + __webpack_require__(84); + __webpack_require__(85); + __webpack_require__(86); + __webpack_require__(87); + __webpack_require__(88); + __webpack_require__(89); + __webpack_require__(90); + __webpack_require__(92); + __webpack_require__(94); + __webpack_require__(98); + __webpack_require__(99); + __webpack_require__(101); + __webpack_require__(102); + __webpack_require__(106); + __webpack_require__(112); + __webpack_require__(113); + __webpack_require__(116); + __webpack_require__(118); + __webpack_require__(120); + __webpack_require__(122); + __webpack_require__(123); + __webpack_require__(124); + __webpack_require__(131); + __webpack_require__(134); + __webpack_require__(135); + __webpack_require__(137); + __webpack_require__(138); + __webpack_require__(139); + __webpack_require__(140); + __webpack_require__(141); + __webpack_require__(142); + __webpack_require__(143); + __webpack_require__(144); + __webpack_require__(145); + __webpack_require__(146); + __webpack_require__(147); + __webpack_require__(148); + __webpack_require__(150); + __webpack_require__(151); + __webpack_require__(152); + __webpack_require__(153); + __webpack_require__(154); + __webpack_require__(155); + __webpack_require__(157); + __webpack_require__(158); + __webpack_require__(159); + __webpack_require__(160); + __webpack_require__(162); + __webpack_require__(163); + __webpack_require__(165); + __webpack_require__(166); + __webpack_require__(168); + __webpack_require__(169); + __webpack_require__(170); + __webpack_require__(171); + __webpack_require__(174); + __webpack_require__(109); + __webpack_require__(176); + __webpack_require__(175); + __webpack_require__(177); + __webpack_require__(178); + __webpack_require__(179); + __webpack_require__(180); + __webpack_require__(181); + __webpack_require__(183); + __webpack_require__(184); + __webpack_require__(185); + __webpack_require__(186); + __webpack_require__(187); + module.exports = __webpack_require__(188); + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + var $ = __webpack_require__(2) + , $export = __webpack_require__(3) + , DESCRIPTORS = __webpack_require__(8) + , createDesc = __webpack_require__(10) + , html = __webpack_require__(11) + , cel = __webpack_require__(12) + , has = __webpack_require__(14) + , cof = __webpack_require__(15) + , invoke = __webpack_require__(16) + , fails = __webpack_require__(9) + , anObject = __webpack_require__(17) + , aFunction = __webpack_require__(7) + , isObject = __webpack_require__(13) + , toObject = __webpack_require__(18) + , toIObject = __webpack_require__(20) + , toInteger = __webpack_require__(22) + , toIndex = __webpack_require__(23) + , toLength = __webpack_require__(24) + , IObject = __webpack_require__(21) + , IE_PROTO = __webpack_require__(25)('__proto__') + , createArrayMethod = __webpack_require__(26) + , arrayIndexOf = __webpack_require__(31)(false) + , ObjectProto = Object.prototype + , ArrayProto = Array.prototype + , arraySlice = ArrayProto.slice + , arrayJoin = ArrayProto.join + , defineProperty = $.setDesc + , getOwnDescriptor = $.getDesc + , defineProperties = $.setDescs + , factories = {} + , IE8_DOM_DEFINE; + + if(!DESCRIPTORS){ + IE8_DOM_DEFINE = !fails(function(){ + return defineProperty(cel('div'), 'a', {get: function(){ return 7; }}).a != 7; + }); + $.setDesc = function(O, P, Attributes){ + if(IE8_DOM_DEFINE)try { + return defineProperty(O, P, Attributes); + } catch(e){ /* empty */ } + if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); + if('value' in Attributes)anObject(O)[P] = Attributes.value; + return O; + }; + $.getDesc = function(O, P){ + if(IE8_DOM_DEFINE)try { + return getOwnDescriptor(O, P); + } catch(e){ /* empty */ } + if(has(O, P))return createDesc(!ObjectProto.propertyIsEnumerable.call(O, P), O[P]); + }; + $.setDescs = defineProperties = function(O, Properties){ + anObject(O); + var keys = $.getKeys(Properties) + , length = keys.length + , i = 0 + , P; + while(length > i)$.setDesc(O, P = keys[i++], Properties[P]); + return O; + }; + } + $export($export.S + $export.F * !DESCRIPTORS, 'Object', { + // 19.1.2.6 / 15.2.3.3 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $.getDesc, + // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) + defineProperty: $.setDesc, + // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties) + defineProperties: defineProperties + }); + + // IE 8- don't enum bug keys + var keys1 = ('constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,' + + 'toLocaleString,toString,valueOf').split(',') + // Additional keys for getOwnPropertyNames + , keys2 = keys1.concat('length', 'prototype') + , keysLen1 = keys1.length; + + // Create object with `null` prototype: use iframe Object with cleared prototype + var createDict = function(){ + // Thrash, waste and sodomy: IE GC bug + var iframe = cel('iframe') + , i = keysLen1 + , gt = '>' + , iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(' +``` + +Then in both cases, you can simply replace native `JSON` calls with `JSON5`: + +```js +var obj = JSON5.parse('{unquoted:"key",trailing:"comma",}'); +var str = JSON5.stringify(obj); +``` + +`JSON5.parse` supports all of the JSON5 features listed above (*TODO: except +Unicode*), as well as the native [`reviver` argument][json-parse]. + +[json-parse]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse + +`JSON5.stringify` mainly avoids quoting keys where possible, but we hope to +keep expanding it in the future (e.g. to also output trailing commas). +It supports the native [`replacer` and `space` arguments][json-stringify], +as well. *(TODO: Any implemented `toJSON` methods aren't used today.)* + +[json-stringify]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify + + +### Extras + +If you're running this on Node, you can also register a JSON5 `require()` hook +to let you `require()` `.json5` files just like you can `.json` files: + +```js +require('json5/lib/require'); +require('./path/to/foo'); // tries foo.json5 after foo.js, foo.json, etc. +require('./path/to/bar.json5'); +``` + +This module also provides a `json5` executable (requires Node) for converting +JSON5 files to JSON: + +``` +$ json5 -c path/to/foo.json5 # generates path/to/foo.json +``` + + +## Development + +``` +git clone git://github.com/aseemk/json5.git +cd json5 +npm install +npm test +``` + +As the `package.json5` file states, be sure to run `npm run build` on changes +to `package.json5`, since npm requires `package.json`. + +Feel free to [file issues](https://github.com/aseemk/json5/issues) and submit +[pull requests](https://github.com/aseemk/json5/pulls) — contributions are +welcome. If you do submit a pull request, please be sure to add or update the +tests, and ensure that `npm test` continues to pass. + + +## License + +MIT License. © 2012 Aseem Kishore, and [others]( +https://github.com/aseemk/json5/contributors). + + +## Credits + +[Michael Bolin](http://bolinfest.com/) independently arrived at and published +some of these same ideas with awesome explanations and detail. +Recommended reading: +[Suggested Improvements to JSON](http://bolinfest.com/essays/json.html) + +[Douglas Crockford](http://www.crockford.com/) of course designed and built +JSON, but his state machine diagrams on the [JSON website](http://json.org/), +as cheesy as it may sound, gave me motivation and confidence that building a +new parser to implement these ideas this was within my reach! +This code is also modeled directly off of Doug's open-source [json_parse.js][] +parser. I'm super grateful for that clean and well-documented code. + +[json_parse.js]: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js + +[Max Nanasy](https://github.com/MaxNanasy) has been an early and prolific +supporter, contributing multiple patches and ideas. Thanks Max! + +[Andrew Eisenberg](https://github.com/aeisenberg) has contributed the `stringify` method. diff --git a/react-app/node_modules/json5/lib/cli.js b/react-app/node_modules/json5/lib/cli.js new file mode 100755 index 0000000000..9b72f6d194 --- /dev/null +++ b/react-app/node_modules/json5/lib/cli.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node + +// cli.js +// JSON5 command-line interface. +// +// This is pretty minimal for now; just supports compiling files via `-c`. +// TODO More useful functionality, like output path, watch, etc.? + +var FS = require('fs'); +var JSON5 = require('./json5'); +var Path = require('path'); + +var USAGE = [ + 'Usage: json5 -c path/to/file.json5 ...', + 'Compiles JSON5 files into sibling JSON files with the same basenames.', +].join('\n'); + +// if valid, args look like [node, json5, -c, file1, file2, ...] +var args = process.argv; + +if (args.length < 4 || args[2] !== '-c') { + console.error(USAGE); + process.exit(1); +} + +var cwd = process.cwd(); +var files = args.slice(3); + +// iterate over each file and convert JSON5 files to JSON: +files.forEach(function (file) { + var path = Path.resolve(cwd, file); + var basename = Path.basename(path, '.json5'); + var dirname = Path.dirname(path); + + var json5 = FS.readFileSync(path, 'utf8'); + var obj = JSON5.parse(json5); + var json = JSON.stringify(obj, null, 4); // 4 spaces; TODO configurable? + + path = Path.join(dirname, basename + '.json'); + FS.writeFileSync(path, json, 'utf8'); +}); diff --git a/react-app/node_modules/json5/lib/json5.js b/react-app/node_modules/json5/lib/json5.js new file mode 100644 index 0000000000..54945f3222 --- /dev/null +++ b/react-app/node_modules/json5/lib/json5.js @@ -0,0 +1,754 @@ +// json5.js +// Modern JSON. See README.md for details. +// +// This file is based directly off of Douglas Crockford's json_parse.js: +// https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js + +var JSON5 = (typeof exports === 'object' ? exports : {}); + +JSON5.parse = (function () { + "use strict"; + +// This is a function that can parse a JSON5 text, producing a JavaScript +// data structure. It is a simple, recursive descent parser. It does not use +// eval or regular expressions, so it can be used as a model for implementing +// a JSON5 parser in other languages. + +// We are defining the function inside of another function to avoid creating +// global variables. + + var at, // The index of the current character + ch, // The current character + escapee = { + "'": "'", + '"': '"', + '\\': '\\', + '/': '/', + '\n': '', // Replace escaped newlines in strings w/ empty string + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t' + }, + ws = [ + ' ', + '\t', + '\r', + '\n', + '\v', + '\f', + '\xA0', + '\uFEFF' + ], + text, + + error = function (m) { + +// Call error when something is wrong. + + var error = new SyntaxError(); + error.message = m; + error.at = at; + error.text = text; + throw error; + }, + + next = function (c) { + +// If a c parameter is provided, verify that it matches the current character. + + if (c && c !== ch) { + error("Expected '" + c + "' instead of '" + ch + "'"); + } + +// Get the next character. When there are no more characters, +// return the empty string. + + ch = text.charAt(at); + at += 1; + return ch; + }, + + peek = function () { + +// Get the next character without consuming it or +// assigning it to the ch varaible. + + return text.charAt(at); + }, + + identifier = function () { + +// Parse an identifier. Normally, reserved words are disallowed here, but we +// only use this for unquoted object keys, where reserved words are allowed, +// so we don't check for those here. References: +// - http://es5.github.com/#x7.6 +// - https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Variables +// - http://docstore.mik.ua/orelly/webprog/jscript/ch02_07.htm +// TODO Identifiers can have Unicode "letters" in them; add support for those. + + var key = ch; + + // Identifiers must start with a letter, _ or $. + if ((ch !== '_' && ch !== '$') && + (ch < 'a' || ch > 'z') && + (ch < 'A' || ch > 'Z')) { + error("Bad identifier"); + } + + // Subsequent characters can contain digits. + while (next() && ( + ch === '_' || ch === '$' || + (ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9'))) { + key += ch; + } + + return key; + }, + + number = function () { + +// Parse a number value. + + var number, + sign = '', + string = '', + base = 10; + + if (ch === '-' || ch === '+') { + sign = ch; + next(ch); + } + + // support for Infinity (could tweak to allow other words): + if (ch === 'I') { + number = word(); + if (typeof number !== 'number' || isNaN(number)) { + error('Unexpected word for number'); + } + return (sign === '-') ? -number : number; + } + + // support for NaN + if (ch === 'N' ) { + number = word(); + if (!isNaN(number)) { + error('expected word to be NaN'); + } + // ignore sign as -NaN also is NaN + return number; + } + + if (ch === '0') { + string += ch; + next(); + if (ch === 'x' || ch === 'X') { + string += ch; + next(); + base = 16; + } else if (ch >= '0' && ch <= '9') { + error('Octal literal'); + } + } + + switch (base) { + case 10: + while (ch >= '0' && ch <= '9' ) { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + break; + case 16: + while (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') { + string += ch; + next(); + } + break; + } + + if(sign === '-') { + number = -string; + } else { + number = +string; + } + + if (!isFinite(number)) { + error("Bad number"); + } else { + return number; + } + }, + + string = function () { + +// Parse a string value. + + var hex, + i, + string = '', + delim, // double quote or single quote + uffff; + +// When parsing for string values, we must look for ' or " and \ characters. + + if (ch === '"' || ch === "'") { + delim = ch; + while (next()) { + if (ch === delim) { + next(); + return string; + } else if (ch === '\\') { + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (ch === '\r') { + if (peek() === '\n') { + next(); + } + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + } else if (ch === '\n') { + // unescaped newlines are invalid; see: + // https://github.com/aseemk/json5/issues/24 + // TODO this feels special-cased; are there other + // invalid unescaped chars? + break; + } else { + string += ch; + } + } + } + error("Bad string"); + }, + + inlineComment = function () { + +// Skip an inline comment, assuming this is one. The current character should +// be the second / character in the // pair that begins this inline comment. +// To finish the inline comment, we look for a newline or the end of the text. + + if (ch !== '/') { + error("Not an inline comment"); + } + + do { + next(); + if (ch === '\n' || ch === '\r') { + next(); + return; + } + } while (ch); + }, + + blockComment = function () { + +// Skip a block comment, assuming this is one. The current character should be +// the * character in the /* pair that begins this block comment. +// To finish the block comment, we look for an ending */ pair of characters, +// but we also watch for the end of text before the comment is terminated. + + if (ch !== '*') { + error("Not a block comment"); + } + + do { + next(); + while (ch === '*') { + next('*'); + if (ch === '/') { + next('/'); + return; + } + } + } while (ch); + + error("Unterminated block comment"); + }, + + comment = function () { + +// Skip a comment, whether inline or block-level, assuming this is one. +// Comments always begin with a / character. + + if (ch !== '/') { + error("Not a comment"); + } + + next('/'); + + if (ch === '/') { + inlineComment(); + } else if (ch === '*') { + blockComment(); + } else { + error("Unrecognized comment"); + } + }, + + white = function () { + +// Skip whitespace and comments. +// Note that we're detecting comments by only a single / character. +// This works since regular expressions are not valid JSON(5), but this will +// break if there are other valid values that begin with a / character! + + while (ch) { + if (ch === '/') { + comment(); + } else if (ws.indexOf(ch) >= 0) { + next(); + } else { + return; + } + } + }, + + word = function () { + +// true, false, or null. + + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + case 'I': + next('I'); + next('n'); + next('f'); + next('i'); + next('n'); + next('i'); + next('t'); + next('y'); + return Infinity; + case 'N': + next( 'N' ); + next( 'a' ); + next( 'N' ); + return NaN; + } + error("Unexpected '" + ch + "'"); + }, + + value, // Place holder for the value function. + + array = function () { + +// Parse an array value. + + var array = []; + + if (ch === '[') { + next('['); + white(); + while (ch) { + if (ch === ']') { + next(']'); + return array; // Potentially empty array + } + // ES5 allows omitting elements in arrays, e.g. [,] and + // [,null]. We don't allow this in JSON5. + if (ch === ',') { + error("Missing array element"); + } else { + array.push(value()); + } + white(); + // If there's no comma after this value, this needs to + // be the end of the array. + if (ch !== ',') { + next(']'); + return array; + } + next(','); + white(); + } + } + error("Bad array"); + }, + + object = function () { + +// Parse an object value. + + var key, + object = {}; + + if (ch === '{') { + next('{'); + white(); + while (ch) { + if (ch === '}') { + next('}'); + return object; // Potentially empty object + } + + // Keys can be unquoted. If they are, they need to be + // valid JS identifiers. + if (ch === '"' || ch === "'") { + key = string(); + } else { + key = identifier(); + } + + white(); + next(':'); + object[key] = value(); + white(); + // If there's no comma after this pair, this needs to be + // the end of the object. + if (ch !== ',') { + next('}'); + return object; + } + next(','); + white(); + } + } + error("Bad object"); + }; + + value = function () { + +// Parse a JSON value. It could be an object, an array, a string, a number, +// or a word. + + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array(); + case '"': + case "'": + return string(); + case '-': + case '+': + case '.': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } + }; + +// Return the json_parse function. It will have access to all of the above +// functions and variables. + + return function (source, reviver) { + var result; + + text = String(source); + at = 0; + ch = ' '; + result = value(); + white(); + if (ch) { + error("Syntax error"); + } + +// If there is a reviver function, we recursively walk the new structure, +// passing each name/value pair to the reviver function for possible +// transformation, starting with a temporary root object that holds the result +// in an empty key. If there is not a reviver function, we simply return the +// result. + + return typeof reviver === 'function' ? (function walk(holder, key) { + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + }({'': result}, '')) : result; + }; +}()); + +// JSON5 stringify will not quote keys where appropriate +JSON5.stringify = function (obj, replacer, space) { + if (replacer && (typeof(replacer) !== "function" && !isArray(replacer))) { + throw new Error('Replacer must be a function or an array'); + } + var getReplacedValueOrUndefined = function(holder, key, isTopLevel) { + var value = holder[key]; + + // Replace the value with its toJSON value first, if possible + if (value && value.toJSON && typeof value.toJSON === "function") { + value = value.toJSON(); + } + + // If the user-supplied replacer if a function, call it. If it's an array, check objects' string keys for + // presence in the array (removing the key/value pair from the resulting JSON if the key is missing). + if (typeof(replacer) === "function") { + return replacer.call(holder, key, value); + } else if(replacer) { + if (isTopLevel || isArray(holder) || replacer.indexOf(key) >= 0) { + return value; + } else { + return undefined; + } + } else { + return value; + } + }; + + function isWordChar(char) { + return (char >= 'a' && char <= 'z') || + (char >= 'A' && char <= 'Z') || + (char >= '0' && char <= '9') || + char === '_' || char === '$'; + } + + function isWordStart(char) { + return (char >= 'a' && char <= 'z') || + (char >= 'A' && char <= 'Z') || + char === '_' || char === '$'; + } + + function isWord(key) { + if (typeof key !== 'string') { + return false; + } + if (!isWordStart(key[0])) { + return false; + } + var i = 1, length = key.length; + while (i < length) { + if (!isWordChar(key[i])) { + return false; + } + i++; + } + return true; + } + + // export for use in tests + JSON5.isWord = isWord; + + // polyfills + function isArray(obj) { + if (Array.isArray) { + return Array.isArray(obj); + } else { + return Object.prototype.toString.call(obj) === '[object Array]'; + } + } + + function isDate(obj) { + return Object.prototype.toString.call(obj) === '[object Date]'; + } + + isNaN = isNaN || function(val) { + return typeof val === 'number' && val !== val; + }; + + var objStack = []; + function checkForCircular(obj) { + for (var i = 0; i < objStack.length; i++) { + if (objStack[i] === obj) { + throw new TypeError("Converting circular structure to JSON"); + } + } + } + + function makeIndent(str, num, noNewLine) { + if (!str) { + return ""; + } + // indentation no more than 10 chars + if (str.length > 10) { + str = str.substring(0, 10); + } + + var indent = noNewLine ? "" : "\n"; + for (var i = 0; i < num; i++) { + indent += str; + } + + return indent; + } + + var indentStr; + if (space) { + if (typeof space === "string") { + indentStr = space; + } else if (typeof space === "number" && space >= 0) { + indentStr = makeIndent(" ", space, true); + } else { + // ignore space parameter + } + } + + // Copied from Crokford's implementation of JSON + // See https://github.com/douglascrockford/JSON-js/blob/e39db4b7e6249f04a195e7dd0840e610cc9e941e/json2.js#L195 + // Begin + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + function escapeString(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? + c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + // End + + function internalStringify(holder, key, isTopLevel) { + var buffer, res; + + // Replace the value, if necessary + var obj_part = getReplacedValueOrUndefined(holder, key, isTopLevel); + + if (obj_part && !isDate(obj_part)) { + // unbox objects + // don't unbox dates, since will turn it into number + obj_part = obj_part.valueOf(); + } + switch(typeof obj_part) { + case "boolean": + return obj_part.toString(); + + case "number": + if (isNaN(obj_part) || !isFinite(obj_part)) { + return "null"; + } + return obj_part.toString(); + + case "string": + return escapeString(obj_part.toString()); + + case "object": + if (obj_part === null) { + return "null"; + } else if (isArray(obj_part)) { + checkForCircular(obj_part); + buffer = "["; + objStack.push(obj_part); + + for (var i = 0; i < obj_part.length; i++) { + res = internalStringify(obj_part, i, false); + buffer += makeIndent(indentStr, objStack.length); + if (res === null || typeof res === "undefined") { + buffer += "null"; + } else { + buffer += res; + } + if (i < obj_part.length-1) { + buffer += ","; + } else if (indentStr) { + buffer += "\n"; + } + } + objStack.pop(); + buffer += makeIndent(indentStr, objStack.length, true) + "]"; + } else { + checkForCircular(obj_part); + buffer = "{"; + var nonEmpty = false; + objStack.push(obj_part); + for (var prop in obj_part) { + if (obj_part.hasOwnProperty(prop)) { + var value = internalStringify(obj_part, prop, false); + isTopLevel = false; + if (typeof value !== "undefined" && value !== null) { + buffer += makeIndent(indentStr, objStack.length); + nonEmpty = true; + var key = isWord(prop) ? prop : escapeString(prop); + buffer += key + ":" + (indentStr ? ' ' : '') + value + ","; + } + } + } + objStack.pop(); + if (nonEmpty) { + buffer = buffer.substring(0, buffer.length-1) + makeIndent(indentStr, objStack.length) + "}"; + } else { + buffer = '{}'; + } + } + return buffer; + default: + // functions and undefined should be ignored + return undefined; + } + } + + // special case...when undefined is used inside of + // a compound object/array, return null. + // but when top-level, return undefined + var topLevelHolder = {"":obj}; + if (obj === undefined) { + return getReplacedValueOrUndefined(topLevelHolder, '', true); + } + return internalStringify(topLevelHolder, '', true); +}; diff --git a/react-app/node_modules/json5/lib/require.js b/react-app/node_modules/json5/lib/require.js new file mode 100644 index 0000000000..73e56fe924 --- /dev/null +++ b/react-app/node_modules/json5/lib/require.js @@ -0,0 +1,18 @@ +// require.js +// Node.js only: adds a require() hook for .json5 files, just like the native +// hook for .json files. +// +// Usage: +// require('json5/require'); +// require('./foo'); // will check foo.json5 after foo.js, foo.json, etc. +// require('./bar.json5'); + +var FS = require('fs'); +var JSON5 = require('./json5'); + +// Modeled off of (v0.6.18 link; check latest too): +// https://github.com/joyent/node/blob/v0.6.18/lib/module.js#L468-L472 +require.extensions['.json5'] = function (module, filename) { + var content = FS.readFileSync(filename, 'utf8'); + module.exports = JSON5.parse(content); +}; diff --git a/react-app/node_modules/json5/package.json b/react-app/node_modules/json5/package.json new file mode 100644 index 0000000000..70b3031784 --- /dev/null +++ b/react-app/node_modules/json5/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + "json5@^0.4.0", + "/Users/mromano/dev/react-sfs/node_modules/babel-core" + ] + ], + "_from": "json5@>=0.4.0 <0.5.0", + "_id": "json5@0.4.0", + "_inCache": true, + "_installable": true, + "_location": "/json5", + "_npmUser": { + "email": "aseem.kishore@gmail.com", + "name": "aseemk" + }, + "_npmVersion": "1.3.21", + "_phantomChildren": {}, + "_requested": { + "name": "json5", + "raw": "json5@^0.4.0", + "rawSpec": "^0.4.0", + "scope": null, + "spec": ">=0.4.0 <0.5.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-core" + ], + "_resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "_shasum": "054352e4c4c80c86c0923877d449de176a732c8d", + "_shrinkwrap": null, + "_spec": "json5@^0.4.0", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babel-core", + "author": { + "email": "aseem.kishore@gmail.com", + "name": "Aseem Kishore" + }, + "bin": { + "json5": "lib/cli.js" + }, + "bugs": { + "url": "https://github.com/aseemk/json5/issues" + }, + "contributors": [ + { + "email": "max.nanasy@gmail.com", + "name": "Max Nanasy" + }, + { + "email": "andrew@eisenberg.as", + "name": "Andrew Eisenberg" + } + ], + "dependencies": {}, + "description": "JSON for the ES5 era.", + "devDependencies": { + "mocha": "~1.0.3" + }, + "directories": {}, + "dist": { + "shasum": "054352e4c4c80c86c0923877d449de176a732c8d", + "tarball": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz" + }, + "homepage": "http://json5.org/", + "keywords": [ + "json", + "es5" + ], + "license": "MIT", + "main": "lib/json5.js", + "maintainers": [ + { + "email": "aseem.kishore@gmail.com", + "name": "aseemk" + } + ], + "name": "json5", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/aseemk/json5.git" + }, + "scripts": { + "build": "./lib/cli.js -c package.json5", + "test": "mocha --ui exports --reporter spec" + }, + "version": "0.4.0" +} diff --git a/react-app/node_modules/json5/package.json5 b/react-app/node_modules/json5/package.json5 new file mode 100644 index 0000000000..7502552d90 --- /dev/null +++ b/react-app/node_modules/json5/package.json5 @@ -0,0 +1,30 @@ +// This file is written in JSON5 syntax, naturally, but npm needs a regular +// JSON file, so compile via `npm run build`. Be sure to keep both in sync! + +{ + name: 'json5', + version: '0.4.0', + description: 'JSON for the ES5 era.', + keywords: ['json', 'es5'], + author: 'Aseem Kishore ', + license: 'MIT', + contributors: [ + 'Max Nanasy ', + 'Andrew Eisenberg ', + ], + main: 'lib/json5.js', + bin: 'lib/cli.js', + dependencies: {}, + devDependencies: { + mocha: '~1.0.3', + }, + scripts: { + build: './lib/cli.js -c package.json5', + test: 'mocha --ui exports --reporter spec', + }, + homepage: 'http://json5.org/', + repository: { + type: 'git', + url: 'https://github.com/aseemk/json5.git', + }, +} diff --git a/react-app/node_modules/json5/test/parse-cases/arrays/empty-array.json b/react-app/node_modules/json5/test/parse-cases/arrays/empty-array.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/arrays/empty-array.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/arrays/leading-comma-array.js b/react-app/node_modules/json5/test/parse-cases/arrays/leading-comma-array.js new file mode 100644 index 0000000000..23c097c065 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/arrays/leading-comma-array.js @@ -0,0 +1,3 @@ +[ + ,null +] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/arrays/lone-trailing-comma-array.js b/react-app/node_modules/json5/test/parse-cases/arrays/lone-trailing-comma-array.js new file mode 100644 index 0000000000..013b45c5bb --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/arrays/lone-trailing-comma-array.js @@ -0,0 +1,3 @@ +[ + , +] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/arrays/no-comma-array.txt b/react-app/node_modules/json5/test/parse-cases/arrays/no-comma-array.txt new file mode 100644 index 0000000000..22b41c10c2 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/arrays/no-comma-array.txt @@ -0,0 +1,4 @@ +[ + true + false +] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/arrays/regular-array.json b/react-app/node_modules/json5/test/parse-cases/arrays/regular-array.json new file mode 100644 index 0000000000..9072780299 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/arrays/regular-array.json @@ -0,0 +1,5 @@ +[ + true, + false, + null +] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/arrays/trailing-comma-array.json5 b/react-app/node_modules/json5/test/parse-cases/arrays/trailing-comma-array.json5 new file mode 100644 index 0000000000..6e6b6ede52 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/arrays/trailing-comma-array.json5 @@ -0,0 +1,3 @@ +[ + null, +] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/block-comment-following-array-element.json5 b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-following-array-element.json5 new file mode 100644 index 0000000000..8677f63db3 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-following-array-element.json5 @@ -0,0 +1,6 @@ +[ + false + /* + true + */ +] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/block-comment-following-top-level-value.json5 b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-following-top-level-value.json5 new file mode 100644 index 0000000000..1e6ccfd273 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-following-top-level-value.json5 @@ -0,0 +1,5 @@ +null +/* + Some non-comment top-level value is needed; + we use null above. +*/ \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/block-comment-in-string.json b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-in-string.json new file mode 100644 index 0000000000..7d2916c50c --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-in-string.json @@ -0,0 +1 @@ +"This /* block comment */ isn't really a block comment." \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/block-comment-preceding-top-level-value.json5 b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-preceding-top-level-value.json5 new file mode 100644 index 0000000000..df1e52044e --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-preceding-top-level-value.json5 @@ -0,0 +1,5 @@ +/* + Some non-comment top-level value is needed; + we use null below. +*/ +null \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/block-comment-with-asterisks.json5 b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-with-asterisks.json5 new file mode 100644 index 0000000000..94c44e79e3 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/block-comment-with-asterisks.json5 @@ -0,0 +1,7 @@ +/** + * This is a JavaDoc-like block comment. + * It contains asterisks inside of it. + * It might also be closed with multiple asterisks. + * Like this: + **/ +true \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-following-array-element.json5 b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-following-array-element.json5 new file mode 100644 index 0000000000..d6a3f8c64b --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-following-array-element.json5 @@ -0,0 +1,3 @@ +[ + false // true +] \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-following-top-level-value.json5 b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-following-top-level-value.json5 new file mode 100644 index 0000000000..cf9ed019bb --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-following-top-level-value.json5 @@ -0,0 +1 @@ +null // Some non-comment top-level value is needed; we use null here. \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-in-string.json b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-in-string.json new file mode 100644 index 0000000000..f0fb14f694 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-in-string.json @@ -0,0 +1 @@ +"This inline comment // isn't really an inline comment." \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-preceding-top-level-value.json5 b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-preceding-top-level-value.json5 new file mode 100644 index 0000000000..d4b9b4d13f --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/inline-comment-preceding-top-level-value.json5 @@ -0,0 +1,2 @@ +// Some non-comment top-level value is needed; we use null below. +null \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/top-level-block-comment.txt b/react-app/node_modules/json5/test/parse-cases/comments/top-level-block-comment.txt new file mode 100644 index 0000000000..68590b2297 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/top-level-block-comment.txt @@ -0,0 +1,4 @@ +/* + This should fail; + comments cannot be the top-level value. +*/ \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/top-level-inline-comment.txt b/react-app/node_modules/json5/test/parse-cases/comments/top-level-inline-comment.txt new file mode 100644 index 0000000000..16477b2981 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/top-level-inline-comment.txt @@ -0,0 +1 @@ +// This should fail; comments cannot be the top-level value. \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/comments/unterminated-block-comment.txt b/react-app/node_modules/json5/test/parse-cases/comments/unterminated-block-comment.txt new file mode 100644 index 0000000000..627b7bd17c --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/comments/unterminated-block-comment.txt @@ -0,0 +1,5 @@ +true +/* + This block comment doesn't terminate. + There was a legitimate value before this, + but this is still invalid JS/JSON5. diff --git a/react-app/node_modules/json5/test/parse-cases/misc/empty.txt b/react-app/node_modules/json5/test/parse-cases/misc/empty.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/react-app/node_modules/json5/test/parse-cases/misc/npm-package.json b/react-app/node_modules/json5/test/parse-cases/misc/npm-package.json new file mode 100644 index 0000000000..85568da173 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/misc/npm-package.json @@ -0,0 +1,106 @@ +{ + "name": "npm", + "publishConfig": { + "proprietary-attribs": false + }, + "description": "A package manager for node", + "keywords": [ + "package manager", + "modules", + "install", + "package.json" + ], + "version": "1.1.22", + "preferGlobal": true, + "config": { + "publishtest": false + }, + "homepage": "http://npmjs.org/", + "author": "Isaac Z. Schlueter (http://blog.izs.me)", + "repository": { + "type": "git", + "url": "https://github.com/isaacs/npm" + }, + "bugs": { + "email": "npm-@googlegroups.com", + "url": "http://github.com/isaacs/npm/issues" + }, + "directories": { + "doc": "./doc", + "man": "./man", + "lib": "./lib", + "bin": "./bin" + }, + "main": "./lib/npm.js", + "bin": "./bin/npm-cli.js", + "dependencies": { + "semver": "~1.0.14", + "ini": "1", + "slide": "1", + "abbrev": "1", + "graceful-fs": "~1.1.1", + "minimatch": "~0.2", + "nopt": "1", + "node-uuid": "~1.3", + "proto-list": "1", + "rimraf": "2", + "request": "~2.9", + "which": "1", + "tar": "~0.1.12", + "fstream": "~0.1.17", + "block-stream": "*", + "inherits": "1", + "mkdirp": "0.3", + "read": "0", + "lru-cache": "1", + "node-gyp": "~0.4.1", + "fstream-npm": "0 >=0.0.5", + "uid-number": "0", + "archy": "0", + "chownr": "0" + }, + "bundleDependencies": [ + "slide", + "ini", + "semver", + "abbrev", + "graceful-fs", + "minimatch", + "nopt", + "node-uuid", + "rimraf", + "request", + "proto-list", + "which", + "tar", + "fstream", + "block-stream", + "inherits", + "mkdirp", + "read", + "lru-cache", + "node-gyp", + "fstream-npm", + "uid-number", + "archy", + "chownr" + ], + "devDependencies": { + "ronn": "https://github.com/isaacs/ronnjs/tarball/master" + }, + "engines": { + "node": "0.6 || 0.7 || 0.8", + "npm": "1" + }, + "scripts": { + "test": "node ./test/run.js", + "prepublish": "npm prune; rm -rf node_modules/*/{test,example,bench}*; make -j4 doc", + "dumpconf": "env | grep npm | sort | uniq" + }, + "licenses": [ + { + "type": "MIT +no-false-attribs", + "url": "http://github.com/isaacs/npm/raw/master/LICENSE" + } + ] +} diff --git a/react-app/node_modules/json5/test/parse-cases/misc/npm-package.json5 b/react-app/node_modules/json5/test/parse-cases/misc/npm-package.json5 new file mode 100644 index 0000000000..699440659d --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/misc/npm-package.json5 @@ -0,0 +1,106 @@ +{ + name: 'npm', + publishConfig: { + 'proprietary-attribs': false, + }, + description: 'A package manager for node', + keywords: [ + 'package manager', + 'modules', + 'install', + 'package.json', + ], + version: '1.1.22', + preferGlobal: true, + config: { + publishtest: false, + }, + homepage: 'http://npmjs.org/', + author: 'Isaac Z. Schlueter (http://blog.izs.me)', + repository: { + type: 'git', + url: 'https://github.com/isaacs/npm', + }, + bugs: { + email: 'npm-@googlegroups.com', + url: 'http://github.com/isaacs/npm/issues', + }, + directories: { + doc: './doc', + man: './man', + lib: './lib', + bin: './bin', + }, + main: './lib/npm.js', + bin: './bin/npm-cli.js', + dependencies: { + semver: '~1.0.14', + ini: '1', + slide: '1', + abbrev: '1', + 'graceful-fs': '~1.1.1', + minimatch: '~0.2', + nopt: '1', + 'node-uuid': '~1.3', + 'proto-list': '1', + rimraf: '2', + request: '~2.9', + which: '1', + tar: '~0.1.12', + fstream: '~0.1.17', + 'block-stream': '*', + inherits: '1', + mkdirp: '0.3', + read: '0', + 'lru-cache': '1', + 'node-gyp': '~0.4.1', + 'fstream-npm': '0 >=0.0.5', + 'uid-number': '0', + archy: '0', + chownr: '0', + }, + bundleDependencies: [ + 'slide', + 'ini', + 'semver', + 'abbrev', + 'graceful-fs', + 'minimatch', + 'nopt', + 'node-uuid', + 'rimraf', + 'request', + 'proto-list', + 'which', + 'tar', + 'fstream', + 'block-stream', + 'inherits', + 'mkdirp', + 'read', + 'lru-cache', + 'node-gyp', + 'fstream-npm', + 'uid-number', + 'archy', + 'chownr', + ], + devDependencies: { + ronn: 'https://github.com/isaacs/ronnjs/tarball/master', + }, + engines: { + node: '0.6 || 0.7 || 0.8', + npm: '1', + }, + scripts: { + test: 'node ./test/run.js', + prepublish: 'npm prune; rm -rf node_modules/*/{test,example,bench}*; make -j4 doc', + dumpconf: 'env | grep npm | sort | uniq', + }, + licenses: [ + { + type: 'MIT +no-false-attribs', + url: 'http://github.com/isaacs/npm/raw/master/LICENSE', + }, + ], +} diff --git a/react-app/node_modules/json5/test/parse-cases/misc/readme-example.json5 b/react-app/node_modules/json5/test/parse-cases/misc/readme-example.json5 new file mode 100644 index 0000000000..25c920a3ce --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/misc/readme-example.json5 @@ -0,0 +1,25 @@ +{ + foo: 'bar', + while: true, + + this: 'is a \ +multi-line string', + + // this is an inline comment + here: 'is another', // inline comment + + /* this is a block comment + that continues on another line */ + + hex: 0xDEADbeef, + half: .5, + delta: +10, + to: Infinity, // and beyond! + + finally: 'a trailing comma', + oh: [ + "we shouldn't forget", + 'arrays can have', + 'trailing commas too', + ], +} diff --git a/react-app/node_modules/json5/test/parse-cases/misc/valid-whitespace.json5 b/react-app/node_modules/json5/test/parse-cases/misc/valid-whitespace.json5 new file mode 100644 index 0000000000..5cb57d3648 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/misc/valid-whitespace.json5 @@ -0,0 +1,5 @@ +{ + // An invalid form feed character (\x0c) has been entered before this comment. + // Be careful not to delete it. + "a": true +} diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/.editorconfig b/react-app/node_modules/json5/test/parse-cases/new-lines/.editorconfig new file mode 100644 index 0000000000..1784f9e321 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/.editorconfig @@ -0,0 +1,13 @@ +# Since we're testing different representations of new lines, +# make sure the editor doesn't mangle line endings. +# Don't commit files in this directory unless you've checked +# their escaped new lines. + +[*-lf.*] +end_of_line = lf + +[*-cr.*] +end_of_line = cr + +[*-crlf.*] +end_of_line = crlf diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/.gitattributes b/react-app/node_modules/json5/test/parse-cases/new-lines/.gitattributes new file mode 100644 index 0000000000..2b3eea6957 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/.gitattributes @@ -0,0 +1,4 @@ +# Since we're testing different representations of new lines, +# treat all tests in this folder as binary files. + +* binary diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/comment-cr.json5 b/react-app/node_modules/json5/test/parse-cases/new-lines/comment-cr.json5 new file mode 100644 index 0000000000..e55aff8832 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/comment-cr.json5 @@ -0,0 +1 @@ +{ // This comment is terminated with `\r`. } \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/comment-crlf.json5 b/react-app/node_modules/json5/test/parse-cases/new-lines/comment-crlf.json5 new file mode 100644 index 0000000000..3791ee6bda --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/comment-crlf.json5 @@ -0,0 +1,3 @@ +{ + // This comment is terminated with `\r\n`. +} diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/comment-lf.json5 b/react-app/node_modules/json5/test/parse-cases/new-lines/comment-lf.json5 new file mode 100644 index 0000000000..e17dd72c6e --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/comment-lf.json5 @@ -0,0 +1,3 @@ +{ + // This comment is terminated with `\n`. +} diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-cr.json5 b/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-cr.json5 new file mode 100644 index 0000000000..38e55b6cc3 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-cr.json5 @@ -0,0 +1 @@ +{ // the following string contains an escaped `\r` a: 'line 1 \ line 2' } \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-crlf.json5 b/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-crlf.json5 new file mode 100644 index 0000000000..7e3f1ce4d5 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-crlf.json5 @@ -0,0 +1,5 @@ +{ + // the following string contains an escaped `\r\n` + a: 'line 1 \ +line 2' +} diff --git a/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-lf.json5 b/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-lf.json5 new file mode 100644 index 0000000000..2235e8c7fe --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/new-lines/escaped-lf.json5 @@ -0,0 +1,5 @@ +{ + // the following string contains an escaped `\n` + a: 'line 1 \ +line 2' +} diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/binary-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/binary-coffeescript.txt new file mode 100644 index 0000000000..d77076d449 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/binary-coffeescript.txt @@ -0,0 +1 @@ +0b100 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/float-leading-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/float-leading-decimal-point.json5 new file mode 100644 index 0000000000..d6c9fff3d7 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/float-leading-decimal-point.json5 @@ -0,0 +1 @@ +.5 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/float-leading-zero.json b/react-app/node_modules/json5/test/parse-cases/numbers/float-leading-zero.json new file mode 100644 index 0000000000..2eb3c4fe4e --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/float-leading-zero.json @@ -0,0 +1 @@ +0.5 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/float-trailing-decimal-point-with-integer-exponent.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/float-trailing-decimal-point-with-integer-exponent.json5 new file mode 100644 index 0000000000..70b872070d --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/float-trailing-decimal-point-with-integer-exponent.json5 @@ -0,0 +1 @@ +5.e4 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/float-trailing-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/float-trailing-decimal-point.json5 new file mode 100644 index 0000000000..e4c8c3130a --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/float-trailing-decimal-point.json5 @@ -0,0 +1 @@ +5. diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/float-with-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/float-with-integer-exponent.json new file mode 100644 index 0000000000..0e957c6332 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/float-with-integer-exponent.json @@ -0,0 +1 @@ +1.2e3 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/float.json b/react-app/node_modules/json5/test/parse-cases/numbers/float.json new file mode 100644 index 0000000000..5625e59da8 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/float.json @@ -0,0 +1 @@ +1.2 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-empty.txt b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-empty.txt new file mode 100644 index 0000000000..ec687260b8 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-empty.txt @@ -0,0 +1 @@ +0x diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-lowercase-letter.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-lowercase-letter.json5 new file mode 100644 index 0000000000..57e27eede0 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-lowercase-letter.json5 @@ -0,0 +1 @@ +0xc8 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-uppercase-x.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-uppercase-x.json5 new file mode 100644 index 0000000000..1a35066be7 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-uppercase-x.json5 @@ -0,0 +1 @@ +0XC8 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-with-integer-exponent.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-with-integer-exponent.json5 new file mode 100644 index 0000000000..3c2204af84 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal-with-integer-exponent.json5 @@ -0,0 +1 @@ +0xc8e4 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal.json5 new file mode 100644 index 0000000000..cf832ed1da --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/hexadecimal.json5 @@ -0,0 +1 @@ +0xC8 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/infinity.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/infinity.json5 new file mode 100644 index 0000000000..3c62151db7 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/infinity.json5 @@ -0,0 +1 @@ +Infinity diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-float-exponent.txt b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-float-exponent.txt new file mode 100644 index 0000000000..fa0688c933 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-float-exponent.txt @@ -0,0 +1 @@ +1e2.3 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-hexadecimal-exponent.txt b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-hexadecimal-exponent.txt new file mode 100644 index 0000000000..0f58237dcf --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-hexadecimal-exponent.txt @@ -0,0 +1 @@ +1e0x4 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-integer-exponent.json new file mode 100644 index 0000000000..0d5cde84b5 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-integer-exponent.json @@ -0,0 +1 @@ +2e23 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-float-exponent.txt b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-float-exponent.txt new file mode 100644 index 0000000000..5be09158f5 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-float-exponent.txt @@ -0,0 +1 @@ +1e-2.3 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-hexadecimal-exponent.txt b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-hexadecimal-exponent.txt new file mode 100644 index 0000000000..adeb2b9836 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-hexadecimal-exponent.txt @@ -0,0 +1 @@ +1e-0x4 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-integer-exponent.json new file mode 100644 index 0000000000..6118c3ecd3 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-integer-exponent.json @@ -0,0 +1 @@ +2e-23 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-zero-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-zero-integer-exponent.json new file mode 100644 index 0000000000..eb67bf46c2 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-negative-zero-integer-exponent.json @@ -0,0 +1 @@ +5e-0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-float-exponent.txt b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-float-exponent.txt new file mode 100644 index 0000000000..f89d55ecf3 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-float-exponent.txt @@ -0,0 +1 @@ +1e+2.3 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-hexadecimal-exponent.txt b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-hexadecimal-exponent.txt new file mode 100644 index 0000000000..a6c75d9495 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-hexadecimal-exponent.txt @@ -0,0 +1 @@ +1e+0x4 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-integer-exponent.json new file mode 100644 index 0000000000..90c0616f53 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-integer-exponent.json @@ -0,0 +1 @@ +1e+2 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-zero-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-zero-integer-exponent.json new file mode 100644 index 0000000000..1d7002f9f2 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-positive-zero-integer-exponent.json @@ -0,0 +1 @@ +5e+0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-zero-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-zero-integer-exponent.json new file mode 100644 index 0000000000..a5e3196e3a --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer-with-zero-integer-exponent.json @@ -0,0 +1 @@ +5e0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/integer.json b/react-app/node_modules/json5/test/parse-cases/numbers/integer.json new file mode 100644 index 0000000000..60d3b2f4a4 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/integer.json @@ -0,0 +1 @@ +15 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/lone-decimal-point.txt b/react-app/node_modules/json5/test/parse-cases/numbers/lone-decimal-point.txt new file mode 100644 index 0000000000..9c558e357c --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/lone-decimal-point.txt @@ -0,0 +1 @@ +. diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/nan.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/nan.json5 new file mode 100644 index 0000000000..736991a138 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/nan.json5 @@ -0,0 +1 @@ +NaN diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-binary-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/negative-binary-coffeescript.txt new file mode 100644 index 0000000000..ee13908b10 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-binary-coffeescript.txt @@ -0,0 +1 @@ +-0b10 \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-leading-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-leading-decimal-point.json5 new file mode 100644 index 0000000000..c6eaee5ce7 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-leading-decimal-point.json5 @@ -0,0 +1 @@ +-.5 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-leading-zero.json b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-leading-zero.json new file mode 100644 index 0000000000..e118203f34 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-leading-zero.json @@ -0,0 +1 @@ +-0.5 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-trailing-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-trailing-decimal-point.json5 new file mode 100644 index 0000000000..52e52459fc --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float-trailing-decimal-point.json5 @@ -0,0 +1 @@ +-5. diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-float.json b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float.json new file mode 100644 index 0000000000..1d94c8a014 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-float.json @@ -0,0 +1 @@ +-1.2 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-hexadecimal.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/negative-hexadecimal.json5 new file mode 100644 index 0000000000..8882fae361 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-hexadecimal.json5 @@ -0,0 +1 @@ +-0xC8 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-infinity.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/negative-infinity.json5 new file mode 100644 index 0000000000..879e80ee34 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-infinity.json5 @@ -0,0 +1 @@ +-Infinity diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-integer.json b/react-app/node_modules/json5/test/parse-cases/numbers/negative-integer.json new file mode 100644 index 0000000000..21922364cc --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-integer.json @@ -0,0 +1 @@ +-15 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-noctal.js b/react-app/node_modules/json5/test/parse-cases/numbers/negative-noctal.js new file mode 100644 index 0000000000..8826f48663 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-noctal.js @@ -0,0 +1 @@ +-098 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-octal-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/negative-octal-coffeescript.txt new file mode 100644 index 0000000000..7ae46ea5b9 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-octal-coffeescript.txt @@ -0,0 +1 @@ +-0o123 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-octal.txt b/react-app/node_modules/json5/test/parse-cases/numbers/negative-octal.txt new file mode 100644 index 0000000000..2e7a4b4500 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-octal.txt @@ -0,0 +1 @@ +-0123 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-binary-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-binary-coffeescript.txt new file mode 100644 index 0000000000..db227a3be6 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-binary-coffeescript.txt @@ -0,0 +1 @@ +-0b0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float-leading-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float-leading-decimal-point.json5 new file mode 100644 index 0000000000..8dd8e037eb --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float-leading-decimal-point.json5 @@ -0,0 +1 @@ +-.0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float-trailing-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float-trailing-decimal-point.json5 new file mode 100644 index 0000000000..90cc048c59 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float-trailing-decimal-point.json5 @@ -0,0 +1 @@ +-0. diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float.json b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float.json new file mode 100644 index 0000000000..1344bfd9db --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-float.json @@ -0,0 +1 @@ +-0.0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-hexadecimal.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-hexadecimal.json5 new file mode 100644 index 0000000000..8847d0524d --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-hexadecimal.json5 @@ -0,0 +1 @@ +-0x0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-integer.json b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-integer.json new file mode 100644 index 0000000000..ec064f61ba --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-integer.json @@ -0,0 +1 @@ +-0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-octal-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-octal-coffeescript.txt new file mode 100644 index 0000000000..45989b8826 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-octal-coffeescript.txt @@ -0,0 +1 @@ +-0o0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-octal.txt b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-octal.txt new file mode 100644 index 0000000000..200a801846 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/negative-zero-octal.txt @@ -0,0 +1 @@ +-00 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/noctal-with-leading-octal-digit.js b/react-app/node_modules/json5/test/parse-cases/numbers/noctal-with-leading-octal-digit.js new file mode 100644 index 0000000000..1fd7c08c14 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/noctal-with-leading-octal-digit.js @@ -0,0 +1 @@ +0780 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/noctal.js b/react-app/node_modules/json5/test/parse-cases/numbers/noctal.js new file mode 100644 index 0000000000..fa5c7835bd --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/noctal.js @@ -0,0 +1 @@ +080 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/octal-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/octal-coffeescript.txt new file mode 100644 index 0000000000..2faf5c9619 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/octal-coffeescript.txt @@ -0,0 +1 @@ +0o200 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/octal.txt b/react-app/node_modules/json5/test/parse-cases/numbers/octal.txt new file mode 100644 index 0000000000..9e8493eaee --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/octal.txt @@ -0,0 +1 @@ +010 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-binary-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/positive-binary-coffeescript.txt new file mode 100644 index 0000000000..42318cbf53 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-binary-coffeescript.txt @@ -0,0 +1 @@ ++0b10 \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-leading-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-leading-decimal-point.json5 new file mode 100644 index 0000000000..043460803c --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-leading-decimal-point.json5 @@ -0,0 +1 @@ ++.5 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-leading-zero.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-leading-zero.json5 new file mode 100644 index 0000000000..d89b45d161 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-leading-zero.json5 @@ -0,0 +1 @@ ++0.5 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-trailing-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-trailing-decimal-point.json5 new file mode 100644 index 0000000000..bee758a7bc --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float-trailing-decimal-point.json5 @@ -0,0 +1 @@ ++5. diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-float.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float.json5 new file mode 100644 index 0000000000..c5732cbcfb --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-float.json5 @@ -0,0 +1 @@ ++1.2 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-hexadecimal.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-hexadecimal.json5 new file mode 100644 index 0000000000..c91ede9698 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-hexadecimal.json5 @@ -0,0 +1 @@ ++0xC8 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-infinity.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-infinity.json5 new file mode 100644 index 0000000000..9bcb989f10 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-infinity.json5 @@ -0,0 +1 @@ ++Infinity diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-integer.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-integer.json5 new file mode 100644 index 0000000000..8ed01e070e --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-integer.json5 @@ -0,0 +1 @@ ++15 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-noctal.js b/react-app/node_modules/json5/test/parse-cases/numbers/positive-noctal.js new file mode 100644 index 0000000000..2f450fce46 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-noctal.js @@ -0,0 +1 @@ ++098 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-octal-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/positive-octal-coffeescript.txt new file mode 100644 index 0000000000..8933e8c063 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-octal-coffeescript.txt @@ -0,0 +1 @@ ++0o123 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-octal.txt b/react-app/node_modules/json5/test/parse-cases/numbers/positive-octal.txt new file mode 100644 index 0000000000..faa86009c5 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-octal.txt @@ -0,0 +1 @@ ++0123 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-binary-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-binary-coffeescript.txt new file mode 100644 index 0000000000..98b45e3dee --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-binary-coffeescript.txt @@ -0,0 +1 @@ ++0b0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float-leading-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float-leading-decimal-point.json5 new file mode 100644 index 0000000000..557bcde17b --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float-leading-decimal-point.json5 @@ -0,0 +1 @@ ++.0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float-trailing-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float-trailing-decimal-point.json5 new file mode 100644 index 0000000000..d8912d161a --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float-trailing-decimal-point.json5 @@ -0,0 +1 @@ ++0. diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float.json5 new file mode 100644 index 0000000000..11e8402c56 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-float.json5 @@ -0,0 +1 @@ ++0.0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-hexadecimal.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-hexadecimal.json5 new file mode 100644 index 0000000000..40a9ce6374 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-hexadecimal.json5 @@ -0,0 +1 @@ ++0x0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-integer.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-integer.json5 new file mode 100644 index 0000000000..9317bcb621 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-integer.json5 @@ -0,0 +1 @@ ++0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-octal-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-octal-coffeescript.txt new file mode 100644 index 0000000000..2fad8f37d9 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-octal-coffeescript.txt @@ -0,0 +1 @@ ++0o0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-octal.txt b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-octal.txt new file mode 100644 index 0000000000..80959e57a5 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/positive-zero-octal.txt @@ -0,0 +1 @@ ++00 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-binary-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/zero-binary-coffeescript.txt new file mode 100644 index 0000000000..315efbae83 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-binary-coffeescript.txt @@ -0,0 +1 @@ +0b0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-float-leading-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/zero-float-leading-decimal-point.json5 new file mode 100644 index 0000000000..7d856fdb3f --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-float-leading-decimal-point.json5 @@ -0,0 +1 @@ +.0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-float-trailing-decimal-point.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/zero-float-trailing-decimal-point.json5 new file mode 100644 index 0000000000..17a5757b17 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-float-trailing-decimal-point.json5 @@ -0,0 +1 @@ +0. diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-float.json b/react-app/node_modules/json5/test/parse-cases/numbers/zero-float.json new file mode 100644 index 0000000000..ba66466c2a --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-float.json @@ -0,0 +1 @@ +0.0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-hexadecimal.json5 b/react-app/node_modules/json5/test/parse-cases/numbers/zero-hexadecimal.json5 new file mode 100644 index 0000000000..9982566dc0 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-hexadecimal.json5 @@ -0,0 +1 @@ +0x0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-integer-with-integer-exponent.json b/react-app/node_modules/json5/test/parse-cases/numbers/zero-integer-with-integer-exponent.json new file mode 100644 index 0000000000..da219e3f10 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-integer-with-integer-exponent.json @@ -0,0 +1 @@ +0e23 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-integer.json b/react-app/node_modules/json5/test/parse-cases/numbers/zero-integer.json new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-integer.json @@ -0,0 +1 @@ +0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-octal-coffeescript.txt b/react-app/node_modules/json5/test/parse-cases/numbers/zero-octal-coffeescript.txt new file mode 100644 index 0000000000..8893f6d11d --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-octal-coffeescript.txt @@ -0,0 +1 @@ +0o0 diff --git a/react-app/node_modules/json5/test/parse-cases/numbers/zero-octal.txt b/react-app/node_modules/json5/test/parse-cases/numbers/zero-octal.txt new file mode 100644 index 0000000000..4daddb72ff --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/numbers/zero-octal.txt @@ -0,0 +1 @@ +00 diff --git a/react-app/node_modules/json5/test/parse-cases/objects/duplicate-keys.json b/react-app/node_modules/json5/test/parse-cases/objects/duplicate-keys.json new file mode 100644 index 0000000000..bb0e4cc3d3 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/duplicate-keys.json @@ -0,0 +1,4 @@ +{ + "a": true, + "a": false +} diff --git a/react-app/node_modules/json5/test/parse-cases/objects/empty-object.json b/react-app/node_modules/json5/test/parse-cases/objects/empty-object.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/empty-object.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/illegal-unquoted-key-number.txt b/react-app/node_modules/json5/test/parse-cases/objects/illegal-unquoted-key-number.txt new file mode 100644 index 0000000000..aebcac2cde --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/illegal-unquoted-key-number.txt @@ -0,0 +1,3 @@ +{ + 10twenty: "ten twenty" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/illegal-unquoted-key-symbol.txt b/react-app/node_modules/json5/test/parse-cases/objects/illegal-unquoted-key-symbol.txt new file mode 100644 index 0000000000..4cb2bd5c0e --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/illegal-unquoted-key-symbol.txt @@ -0,0 +1,3 @@ +{ + multi-word: "multi-word" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/leading-comma-object.txt b/react-app/node_modules/json5/test/parse-cases/objects/leading-comma-object.txt new file mode 100644 index 0000000000..bfb3c51fa4 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/leading-comma-object.txt @@ -0,0 +1,3 @@ +{ + ,"foo": "bar" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/lone-trailing-comma-object.txt b/react-app/node_modules/json5/test/parse-cases/objects/lone-trailing-comma-object.txt new file mode 100644 index 0000000000..3f3f9f796b --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/lone-trailing-comma-object.txt @@ -0,0 +1,3 @@ +{ + , +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/no-comma-object.txt b/react-app/node_modules/json5/test/parse-cases/objects/no-comma-object.txt new file mode 100644 index 0000000000..c0738750db --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/no-comma-object.txt @@ -0,0 +1,4 @@ +{ + "foo": "bar" + "hello": "world" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/reserved-unquoted-key.json5 b/react-app/node_modules/json5/test/parse-cases/objects/reserved-unquoted-key.json5 new file mode 100644 index 0000000000..4b80a63b4c --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/reserved-unquoted-key.json5 @@ -0,0 +1,3 @@ +{ + while: true +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/single-quoted-key.json5 b/react-app/node_modules/json5/test/parse-cases/objects/single-quoted-key.json5 new file mode 100644 index 0000000000..842ca19c6a --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/single-quoted-key.json5 @@ -0,0 +1,3 @@ +{ + 'hello': "world" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/trailing-comma-object.json5 b/react-app/node_modules/json5/test/parse-cases/objects/trailing-comma-object.json5 new file mode 100644 index 0000000000..ab61ba76e1 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/trailing-comma-object.json5 @@ -0,0 +1,3 @@ +{ + "foo": "bar", +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/objects/unquoted-keys.json5 b/react-app/node_modules/json5/test/parse-cases/objects/unquoted-keys.json5 new file mode 100644 index 0000000000..0c06f3fc76 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/objects/unquoted-keys.json5 @@ -0,0 +1,8 @@ +{ + hello: "world", + _: "underscore", + $: "dollar sign", + one1: "numerals", + _$_: "multiple symbols", + $_$hello123world_$_: "mixed" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/strings/escaped-single-quoted-string.json5 b/react-app/node_modules/json5/test/parse-cases/strings/escaped-single-quoted-string.json5 new file mode 100644 index 0000000000..1c799101b7 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/strings/escaped-single-quoted-string.json5 @@ -0,0 +1 @@ +'I can\'t wait' \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/strings/multi-line-string.json5 b/react-app/node_modules/json5/test/parse-cases/strings/multi-line-string.json5 new file mode 100644 index 0000000000..964dc2decb --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/strings/multi-line-string.json5 @@ -0,0 +1,2 @@ +'hello\ + world' \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/strings/single-quoted-string.json5 b/react-app/node_modules/json5/test/parse-cases/strings/single-quoted-string.json5 new file mode 100644 index 0000000000..5dadd333cc --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/strings/single-quoted-string.json5 @@ -0,0 +1 @@ +'hello world' \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/strings/unescaped-multi-line-string.txt b/react-app/node_modules/json5/test/parse-cases/strings/unescaped-multi-line-string.txt new file mode 100644 index 0000000000..7325139a82 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/strings/unescaped-multi-line-string.txt @@ -0,0 +1,2 @@ +"foo +bar" diff --git a/react-app/node_modules/json5/test/parse-cases/todo/unicode-escaped-unquoted-key.json5 b/react-app/node_modules/json5/test/parse-cases/todo/unicode-escaped-unquoted-key.json5 new file mode 100644 index 0000000000..56c3457113 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/todo/unicode-escaped-unquoted-key.json5 @@ -0,0 +1,3 @@ +{ + sig\u03A3ma: "the sum of all things" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse-cases/todo/unicode-unquoted-key.json5 b/react-app/node_modules/json5/test/parse-cases/todo/unicode-unquoted-key.json5 new file mode 100644 index 0000000000..98382e6997 --- /dev/null +++ b/react-app/node_modules/json5/test/parse-cases/todo/unicode-unquoted-key.json5 @@ -0,0 +1,3 @@ +{ + ümlåût: "that's not really an ümlaüt, but this is" +} \ No newline at end of file diff --git a/react-app/node_modules/json5/test/parse.js b/react-app/node_modules/json5/test/parse.js new file mode 100644 index 0000000000..ef4e6112ad --- /dev/null +++ b/react-app/node_modules/json5/test/parse.js @@ -0,0 +1,89 @@ +// parse.js +// Tests parse(). See readme.txt for details. + +var assert = require('assert'); +var FS = require('fs'); +var JSON5 = require('..'); +var Path = require('path'); + +// Test JSON5.parse() by comparing its output for each case with either the +// native JSON.parse() or ES5 strict-mode eval(). See readme.txt for details. +// For eval(), remember to wrap the input in parentheses before eval()'ing, +// since {...} is ambiguous in JavaScript. Also ensure the parentheses are on +// lines of their own, to support inline comments. + +// TODO More test cases, and ones that test specific features and edge cases. +// Mozilla's test cases are a great inspiration and reference here: +// http://mxr.mozilla.org/mozilla-central/source/js/src/tests/ecma_5/JSON/ + +var dirsPath = Path.resolve(__dirname, 'parse-cases'); +var dirs = FS.readdirSync(dirsPath); + +function createTest(fileName, dir) { + var ext = Path.extname(fileName); + var filePath = Path.join(dirsPath, dir, fileName); + var str = FS.readFileSync(filePath, 'utf8'); + + function parseJSON5() { + return JSON5.parse(str); + } + + function parseJSON() { + return JSON.parse(str); + } + + function parseES5() { + return eval('"use strict"; (\n' + str + '\n)'); + } + + exports[dir][fileName] = function test() { + switch (ext) { + case '.json': + assert.deepEqual(parseJSON5(), parseJSON(), + 'Expected parsed JSON5 to equal parsed JSON.'); + break; + case '.json5': + assert.throws(parseJSON, // test validation + 'Test case bug: expected JSON parsing to fail.'); + // Need special case for NaN as NaN != NaN + if ( fileName === 'nan.json5' ) { + assert.equal( isNaN( parseJSON5() ), isNaN( parseES5() ), + 'Expected parsed JSON5 to equal parsed ES5.'); + } + else { + assert.deepEqual( parseJSON5(), parseES5(), + 'Expected parsed JSON5 to equal parsed ES5.'); + } + break; + case '.js': + assert.throws(parseJSON, // test validation + 'Test case bug: expected JSON parsing to fail.'); + assert.doesNotThrow(parseES5, // test validation + 'Test case bug: expected ES5 parsing not to fail.'); + assert.throws(parseJSON5, + 'Expected JSON5 parsing to fail.'); + break; + case '.txt': + assert.throws(parseES5, // test validation + 'Test case bug: expected ES5 parsing to fail.'); + assert.throws(parseJSON5, + 'Expected JSON5 parsing to fail.'); + break; + } + }; +} + +dirs.forEach(function (dir) { + // create a test suite for this group of tests: + exports[dir] = {}; + + // skip the TODO directory -- these tests are expected to fail: + if (dir === 'todo') { + return; + } + + // otherwise create a test for each file in this group: + FS.readdirSync(Path.join(dirsPath, dir)).forEach(function (file) { + createTest(file, dir); + }); +}); diff --git a/react-app/node_modules/json5/test/readme.md b/react-app/node_modules/json5/test/readme.md new file mode 100644 index 0000000000..c8af4e892c --- /dev/null +++ b/react-app/node_modules/json5/test/readme.md @@ -0,0 +1,23 @@ +These tests are written for [Mocha][] using the [exports][] interface. + +[Mocha]: http://visionmedia.github.com/mocha/ +[exports]: http://visionmedia.github.com/mocha/#exports-interface + +The `parse()` tests are run by comparing the output of `JSON5.parse()` with +that of the native `JSON.parse()` and ES5's `eval()` in strict mode. The test +cases' file extension signals the expected behavior: + +- Valid JSON should remain valid JSON5. These cases have a `.json` extension + and are tested via `JSON.parse()`. + +- JSON5's new features should remain valid ES5. These cases have a `.json5` + extension are tested via `eval()`. + +- Valid ES5 that's explicitly disallowed by JSON5 is also invalid JSON. These + cases have a `.js` extension and are expected to fail. + +- Invalid ES5 should remain invalid JSON5. These cases have a `.txt` extension + and are expected to fail. + +This should cover all our bases. Most of the cases are unit tests for each +supported data type, but aggregate test cases are welcome, too. diff --git a/react-app/node_modules/json5/test/require.js b/react-app/node_modules/json5/test/require.js new file mode 100644 index 0000000000..50ded708fc --- /dev/null +++ b/react-app/node_modules/json5/test/require.js @@ -0,0 +1,18 @@ +// require.js +// Tests JSON5's require() hook. +// +// Important: expects the following test cases to be present: +// - /parse-cases/misc/npm-package.json +// - /parse-cases/misc/npm-package.json5 + +var assert = require('assert'); + +exports['misc'] = {}; +exports['misc']['require hook'] = function () { + require('../lib/require'); + + var json = require('./parse-cases/misc/npm-package.json'); + var json5 = require('./parse-cases/misc/npm-package.json5'); + + assert.deepEqual(json5, json); +}; diff --git a/react-app/node_modules/json5/test/stringify.js b/react-app/node_modules/json5/test/stringify.js new file mode 100644 index 0000000000..593fef02ec --- /dev/null +++ b/react-app/node_modules/json5/test/stringify.js @@ -0,0 +1,498 @@ +// tests stringify() + +/*global require console exports */ + +// set to true to show performance stats +var DEBUG = false; + +var assert = require('assert'); +var JSON5 = require('../lib/json5'); + +// Test JSON5.stringify() by comparing its output for each case with +// native JSON.stringify(). The only differences will be in how object keys are +// handled. + +var simpleCases = [ + null, + 9, -9, +9, +9.878, + '', "''", '999', '9aa', 'aaa', 'aa a', 'aa\na', 'aa\\a', '\'', '\\\'', '\\"', + undefined, + true, false, + {}, [], function(){}, + Date.now(), new Date(Date.now()) +]; + +exports.stringify = {}; +exports.stringify.simple = function test() { + for (var i=0; i ES5 transforms + +NOTE: If you're looking for a library for writing new greenfield JS transformations, consider looking at the [Recast](https://github.com/benjamn/recast) library instead of jstransform. We are still actively supporting jstransform (and intend to for the foreseeable future), but longer term we would like to direct efforts toward Recast. Recast does a far better job of supporting a multi-pass JS transformation pipeline, and this is important when attempting to apply many transformations to a source file. + +## Examples +Using a pre-bundled or existing transform: +```js +/** + * Reads a source file that may (or may not) contain ES6 classes, transforms it + * to ES5 compatible code using the pre-bundled ES6 class visitors, and prints + * out the result. + */ +var es6ClassVisitors = require('jstransform/visitors/es6-class-visitors').visitorList; +var fs = require('fs'); +var jstransform = require('jstransform'); + +var originalFileContents = fs.readFileSync('path/to/original/file.js', 'utf-8'); + +var transformedFileData = jstransform.transform( + es6ClassVisitors, + originalFileContents +); + +console.log(transformedFileData.code); +``` + +Using multiple pre-bundled or existing transforms at once: +```js +/** + * Reads a source file that may (or may not) contain ES6 classes *or* arrow + * functions, transforms them to ES5 compatible code using the pre-bundled ES6 + * visitors, and prints out the result. + */ +var es6ArrowFuncVisitors = require('jstransform/visitors/es6-arrow-function-visitors').visitorList; +var es6ClassVisitors = require('jstransform/visitors/es6-class-visitors').visitorList; +var jstransform = require('jstransform'); + +// Normally you'd read this from the filesystem, but I'll just use a string here +// to simplify the example. +var originalFileContents = "var a = (param1) => param1; class FooClass {}"; + +var transformedFileData = jstransform.transform( + es6ClassVisitors.concat(es6ArrowFuncVisitors), + originalFileContents +); + +// var a = function(param1) {return param1;}; function FooClass(){"use strict";} +console.log(transformedFileData.code); +``` + +Writing a simple custom transform: +```js +/** + * Creates a custom transformation visitor that prefixes all calls to the + * `eval()` function with a call to `alert()` saying how much of a clown you are + * for using eval. + */ +var jstransform = require('jstransform'); +var utils = require('jstransform/src/utils'); + +var Syntax = jstransform.Syntax; + +function visitEvalCallExpressions(traverse, node, path, state) { + // Appends an alert() call to the output buffer *before* the visited node + // (in this case the eval call) is appended to the output buffer + utils.append('alert("...eval?...really?...");', state); + + // Now we copy the eval expression to the output buffer from the original + // source + utils.catchup(node.range[1], state); +} +visitEvalCallExpressions.test = function(node, path, state) { + return node.type === Syntax.CallExpression + && node.callee.type === Syntax.Identifier + && node.callee.name === 'eval'; +}; + +// Normally you'd read this from the filesystem, but I'll just use a string here +// to simplify the example. +var originalFileContents = "eval('foo');"; + +var transformedFileData = jstransform.transform( + [visitEvalCallExpressions], // Multiple visitors may be applied at once, so an + // array is always expected for the first argument + originalFileContents +); + +// alert("...eval?...really?...");eval('foo'); +console.log(transformedFileData.code); +``` diff --git a/react-app/node_modules/jstransform/jestEnvironment.js b/react-app/node_modules/jstransform/jestEnvironment.js new file mode 100644 index 0000000000..cda8c4ce9d --- /dev/null +++ b/react-app/node_modules/jstransform/jestEnvironment.js @@ -0,0 +1 @@ +require.requireActual('./polyfill/Object.es6.js'); diff --git a/react-app/node_modules/jstransform/jestPreprocessor.js b/react-app/node_modules/jstransform/jestPreprocessor.js new file mode 100644 index 0000000000..6b273b8039 --- /dev/null +++ b/react-app/node_modules/jstransform/jestPreprocessor.js @@ -0,0 +1,13 @@ +var jstransform = require('./src/jstransform'); +var arrowFuncVisitors = require('./visitors/es6-arrow-function-visitors'); +var restParamVisitors = require('./visitors/es6-rest-param-visitors'); +var es7SpreadPropertyVisitors = require('./visitors/es7-spread-property-visitors'); + +exports.process = function(sourceText, sourcePath) { + return jstransform.transform( + arrowFuncVisitors.visitorList + .concat(restParamVisitors.visitorList) + .concat(es7SpreadPropertyVisitors.visitorList), + sourceText + ).code; +}; diff --git a/react-app/node_modules/jstransform/node_modules/source-map/.npmignore b/react-app/node_modules/jstransform/node_modules/source-map/.npmignore new file mode 100644 index 0000000000..3dddf3f670 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/.npmignore @@ -0,0 +1,2 @@ +dist/* +node_modules/* diff --git a/react-app/node_modules/jstransform/node_modules/source-map/.travis.yml b/react-app/node_modules/jstransform/node_modules/source-map/.travis.yml new file mode 100644 index 0000000000..ddc9c4f989 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.8 + - "0.10" \ No newline at end of file diff --git a/react-app/node_modules/jstransform/node_modules/source-map/CHANGELOG.md b/react-app/node_modules/jstransform/node_modules/source-map/CHANGELOG.md new file mode 100644 index 0000000000..98b90d52b7 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/CHANGELOG.md @@ -0,0 +1,112 @@ +# Change Log + +## 0.1.31 + +* Delay parsing the mappings in SourceMapConsumer until queried for a source + location. + +* Support Sass source maps (which at the time of writing deviate from the spec + in small ways) in SourceMapConsumer. + +## 0.1.30 + +* Do not join source root with a source, when the source is a data URI. + +* Extend the test runner to allow running single specific test files at a time. + +* Performance improvements in `SourceNode.prototype.walk` and + `SourceMapConsumer.prototype.eachMapping`. + +* Source map browser builds will now work inside Workers. + +* Better error messages when attempting to add an invalid mapping to a + `SourceMapGenerator`. + +## 0.1.29 + +* Allow duplicate entries in the `names` and `sources` arrays of source maps + (usually from TypeScript) we are parsing. Fixes github isse 72. + +## 0.1.28 + +* Skip duplicate mappings when creating source maps from SourceNode; github + issue 75. + +## 0.1.27 + +* Don't throw an error when the `file` property is missing in SourceMapConsumer, + we don't use it anyway. + +## 0.1.26 + +* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. + +## 0.1.25 + +* Make compatible with browserify + +## 0.1.24 + +* Fix issue with absolute paths and `file://` URIs. See + https://bugzilla.mozilla.org/show_bug.cgi?id=885597 + +## 0.1.23 + +* Fix issue with absolute paths and sourcesContent, github issue 64. + +## 0.1.22 + +* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. + +## 0.1.21 + +* Fixed handling of sources that start with a slash so that they are relative to + the source root's host. + +## 0.1.20 + +* Fixed github issue #43: absolute URLs aren't joined with the source root + anymore. + +## 0.1.19 + +* Using Travis CI to run tests. + +## 0.1.18 + +* Fixed a bug in the handling of sourceRoot. + +## 0.1.17 + +* Added SourceNode.fromStringWithSourceMap. + +## 0.1.16 + +* Added missing documentation. + +* Fixed the generating of empty mappings in SourceNode. + +## 0.1.15 + +* Added SourceMapGenerator.applySourceMap. + +## 0.1.14 + +* The sourceRoot is now handled consistently. + +## 0.1.13 + +* Added SourceMapGenerator.fromSourceMap. + +## 0.1.12 + +* SourceNode now generates empty mappings too. + +## 0.1.11 + +* Added name support to SourceNode. + +## 0.1.10 + +* Added sourcesContent support to the customer and generator. + diff --git a/react-app/node_modules/jstransform/node_modules/source-map/LICENSE b/react-app/node_modules/jstransform/node_modules/source-map/LICENSE new file mode 100644 index 0000000000..ed1b7cf27e --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/LICENSE @@ -0,0 +1,28 @@ + +Copyright (c) 2009-2011, Mozilla Foundation and contributors +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 names of the Mozilla Foundation nor the names of project + 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 HOLDER 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. diff --git a/react-app/node_modules/jstransform/node_modules/source-map/Makefile.dryice.js b/react-app/node_modules/jstransform/node_modules/source-map/Makefile.dryice.js new file mode 100644 index 0000000000..d6fc26a790 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/Makefile.dryice.js @@ -0,0 +1,166 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var path = require('path'); +var fs = require('fs'); +var copy = require('dryice').copy; + +function removeAmdefine(src) { + src = String(src).replace( + /if\s*\(typeof\s*define\s*!==\s*'function'\)\s*{\s*var\s*define\s*=\s*require\('amdefine'\)\(module,\s*require\);\s*}\s*/g, + ''); + src = src.replace( + /\b(define\(.*)('amdefine',?)/gm, + '$1'); + return src; +} +removeAmdefine.onRead = true; + +function makeNonRelative(src) { + return src + .replace(/require\('.\//g, 'require(\'source-map/') + .replace(/\.\.\/\.\.\/lib\//g, ''); +} +makeNonRelative.onRead = true; + +function buildBrowser() { + console.log('\nCreating dist/source-map.js'); + + var project = copy.createCommonJsProject({ + roots: [ path.join(__dirname, 'lib') ] + }); + + copy({ + source: [ + 'build/mini-require.js', + { + project: project, + require: [ 'source-map/source-map-generator', + 'source-map/source-map-consumer', + 'source-map/source-node'] + }, + 'build/suffix-browser.js' + ], + filter: [ + copy.filter.moduleDefines, + removeAmdefine + ], + dest: 'dist/source-map.js' + }); +} + +function buildBrowserMin() { + console.log('\nCreating dist/source-map.min.js'); + + copy({ + source: 'dist/source-map.js', + filter: copy.filter.uglifyjs, + dest: 'dist/source-map.min.js' + }); +} + +function buildFirefox() { + console.log('\nCreating dist/SourceMap.jsm'); + + var project = copy.createCommonJsProject({ + roots: [ path.join(__dirname, 'lib') ] + }); + + copy({ + source: [ + 'build/prefix-source-map.jsm', + { + project: project, + require: [ 'source-map/source-map-consumer', + 'source-map/source-map-generator', + 'source-map/source-node' ] + }, + 'build/suffix-source-map.jsm' + ], + filter: [ + copy.filter.moduleDefines, + removeAmdefine, + makeNonRelative + ], + dest: 'dist/SourceMap.jsm' + }); + + // Create dist/test/Utils.jsm + console.log('\nCreating dist/test/Utils.jsm'); + + project = copy.createCommonJsProject({ + roots: [ __dirname, path.join(__dirname, 'lib') ] + }); + + copy({ + source: [ + 'build/prefix-utils.jsm', + 'build/assert-shim.js', + { + project: project, + require: [ 'test/source-map/util' ] + }, + 'build/suffix-utils.jsm' + ], + filter: [ + copy.filter.moduleDefines, + removeAmdefine, + makeNonRelative + ], + dest: 'dist/test/Utils.jsm' + }); + + function isTestFile(f) { + return /^test\-.*?\.js/.test(f); + } + + var testFiles = fs.readdirSync(path.join(__dirname, 'test', 'source-map')).filter(isTestFile); + + testFiles.forEach(function (testFile) { + console.log('\nCreating', path.join('dist', 'test', testFile.replace(/\-/g, '_'))); + + copy({ + source: [ + 'build/test-prefix.js', + path.join('test', 'source-map', testFile), + 'build/test-suffix.js' + ], + filter: [ + removeAmdefine, + makeNonRelative, + function (input, source) { + return input.replace('define(', + 'define("' + + path.join('test', 'source-map', testFile.replace(/\.js$/, '')) + + '", ["require", "exports", "module"], '); + }, + function (input, source) { + return input.replace('{THIS_MODULE}', function () { + return "test/source-map/" + testFile.replace(/\.js$/, ''); + }); + } + ], + dest: path.join('dist', 'test', testFile.replace(/\-/g, '_')) + }); + }); +} + +function ensureDir(name) { + var dirExists = false; + try { + dirExists = fs.statSync(name).isDirectory(); + } catch (err) {} + + if (!dirExists) { + fs.mkdirSync(name, 0777); + } +} + +ensureDir("dist"); +ensureDir("dist/test"); +buildFirefox(); +buildBrowser(); +buildBrowserMin(); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/README.md b/react-app/node_modules/jstransform/node_modules/source-map/README.md new file mode 100644 index 0000000000..c20437bc60 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/README.md @@ -0,0 +1,434 @@ +# Source Map + +This is a library to generate and consume the source map format +[described here][format]. + +This library is written in the Asynchronous Module Definition format, and works +in the following environments: + +* Modern Browsers supporting ECMAScript 5 (either after the build, or with an + AMD loader such as RequireJS) + +* Inside Firefox (as a JSM file, after the build) + +* With NodeJS versions 0.8.X and higher + +## Node + + $ npm install source-map + +## Building from Source (for everywhere else) + +Install Node and then run + + $ git clone https://fitzgen@github.com/mozilla/source-map.git + $ cd source-map + $ npm link . + +Next, run + + $ node Makefile.dryice.js + +This should spew a bunch of stuff to stdout, and create the following files: + +* `dist/source-map.js` - The unminified browser version. + +* `dist/source-map.min.js` - The minified browser version. + +* `dist/SourceMap.jsm` - The JavaScript Module for inclusion in Firefox source. + +## Examples + +### Consuming a source map + + var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' + }; + + var smc = new SourceMapConsumer(rawSourceMap); + + console.log(smc.sources); + // [ 'http://example.com/www/js/one.js', + // 'http://example.com/www/js/two.js' ] + + console.log(smc.originalPositionFor({ + line: 2, + column: 28 + })); + // { source: 'http://example.com/www/js/two.js', + // line: 2, + // column: 10, + // name: 'n' } + + console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 + })); + // { line: 2, column: 28 } + + smc.eachMapping(function (m) { + // ... + }); + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + + function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } + } + + var ast = parse("40 + 2", "add.js"); + console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' + })); + // { code: '40 + 2', + // map: [object SourceMapGenerator] } + +#### With SourceMapGenerator (low level API) + + var map = new SourceMapGenerator({ + file: "source-mapped.js" + }); + + map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" + }); + + console.log(map.toString()); + // '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' + +## API + +Get a reference to the module: + + // NodeJS + var sourceMap = require('source-map'); + + // Browser builds + var sourceMap = window.sourceMap; + + // Inside Firefox + let sourceMap = {}; + Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referrenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: The generated filename this source map is associated with. + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. + +* `column`: The column number in the generated source. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. + +* `column`: The column number in the original source, or null or null if this + information is not available. + +* `name`: The original identifier, or null if this information is not available. + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: The column number in the original source. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +#### SourceMapConsumer.prototype.sourceContentFor(source) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator(startOfSourceMap) + +To create a new one, you must pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: An optional root for all relative URLs in this source map. + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new SourceMapGenerator based on a SourceMapConsumer + +* `sourceMapConsumer` The SourceMap. + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimium of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used. + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode(line, column, source[, chunk[, name]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. + +* `source`: The original source's filename. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming whitespace from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +### SourceNode.prototype.toStringWithSourceMap(startOfSourceMap) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +## Tests + +[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) + +Install NodeJS version 0.8.0 or greater, then run `node test/run-tests.js`. + +To add new tests, create a new file named `test/test-.js` +and export your test functions with names that start with "test", for example + + exports["test doing the foo bar"] = function (assert, util) { + ... + }; + +The new test will be located automatically when you run the suite. + +The `util` argument is the test utility module located at `test/source-map/util`. + +The `assert` argument is a cut down version of node's assert module. You have +access to the following assertion functions: + +* `doesNotThrow` + +* `equal` + +* `ok` + +* `strictEqual` + +* `throws` + +(The reason for the restricted set of test functions is because we need the +tests to run inside Firefox's test suite as well and so the assert module is +shimmed in that environment. See `build/assert-shim.js`.) + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit +[feature]: https://wiki.mozilla.org/DevTools/Features/SourceMap +[Dryice]: https://github.com/mozilla/dryice diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/assert-shim.js b/react-app/node_modules/jstransform/node_modules/source-map/build/assert-shim.js new file mode 100644 index 0000000000..daa1a623c7 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/assert-shim.js @@ -0,0 +1,56 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +define('test/source-map/assert', ['exports'], function (exports) { + + let do_throw = function (msg) { + throw new Error(msg); + }; + + exports.init = function (throw_fn) { + do_throw = throw_fn; + }; + + exports.doesNotThrow = function (fn) { + try { + fn(); + } + catch (e) { + do_throw(e.message); + } + }; + + exports.equal = function (actual, expected, msg) { + msg = msg || String(actual) + ' != ' + String(expected); + if (actual != expected) { + do_throw(msg); + } + }; + + exports.ok = function (val, msg) { + msg = msg || String(val) + ' is falsey'; + if (!Boolean(val)) { + do_throw(msg); + } + }; + + exports.strictEqual = function (actual, expected, msg) { + msg = msg || String(actual) + ' !== ' + String(expected); + if (actual !== expected) { + do_throw(msg); + } + }; + + exports.throws = function (fn) { + try { + fn(); + do_throw('Expected an error to be thrown, but it wasn\'t.'); + } + catch (e) { + } + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/mini-require.js b/react-app/node_modules/jstransform/node_modules/source-map/build/mini-require.js new file mode 100644 index 0000000000..0daf453773 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/mini-require.js @@ -0,0 +1,152 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/** + * Define a module along with a payload. + * @param {string} moduleName Name for the payload + * @param {ignored} deps Ignored. For compatibility with CommonJS AMD Spec + * @param {function} payload Function with (require, exports, module) params + */ +function define(moduleName, deps, payload) { + if (typeof moduleName != "string") { + throw new TypeError('Expected string, got: ' + moduleName); + } + + if (arguments.length == 2) { + payload = deps; + } + + if (moduleName in define.modules) { + throw new Error("Module already defined: " + moduleName); + } + define.modules[moduleName] = payload; +}; + +/** + * The global store of un-instantiated modules + */ +define.modules = {}; + + +/** + * We invoke require() in the context of a Domain so we can have multiple + * sets of modules running separate from each other. + * This contrasts with JSMs which are singletons, Domains allows us to + * optionally load a CommonJS module twice with separate data each time. + * Perhaps you want 2 command lines with a different set of commands in each, + * for example. + */ +function Domain() { + this.modules = {}; + this._currentModule = null; +} + +(function () { + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * There are 2 ways to call this, either with an array of dependencies and a + * callback to call when the dependencies are found (which can happen + * asynchronously in an in-page context) or with a single string an no callback + * where the dependency is resolved synchronously and returned. + * The API is designed to be compatible with the CommonJS AMD spec and + * RequireJS. + * @param {string[]|string} deps A name, or names for the payload + * @param {function|undefined} callback Function to call when the dependencies + * are resolved + * @return {undefined|object} The module required or undefined for + * array/callback method + */ + Domain.prototype.require = function(deps, callback) { + if (Array.isArray(deps)) { + var params = deps.map(function(dep) { + return this.lookup(dep); + }, this); + if (callback) { + callback.apply(null, params); + } + return undefined; + } + else { + return this.lookup(deps); + } + }; + + function normalize(path) { + var bits = path.split('/'); + var i = 1; + while (i < bits.length) { + if (bits[i] === '..') { + bits.splice(i-1, 1); + } else if (bits[i] === '.') { + bits.splice(i, 1); + } else { + i++; + } + } + return bits.join('/'); + } + + function join(a, b) { + a = a.trim(); + b = b.trim(); + if (/^\//.test(b)) { + return b; + } else { + return a.replace(/\/*$/, '/') + b; + } + } + + function dirname(path) { + var bits = path.split('/'); + bits.pop(); + return bits.join('/'); + } + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * @param {string} moduleName A name for the payload to lookup + * @return {object} The module specified by aModuleName or null if not found. + */ + Domain.prototype.lookup = function(moduleName) { + if (/^\./.test(moduleName)) { + moduleName = normalize(join(dirname(this._currentModule), moduleName)); + } + + if (moduleName in this.modules) { + var module = this.modules[moduleName]; + return module; + } + + if (!(moduleName in define.modules)) { + throw new Error("Module not defined: " + moduleName); + } + + var module = define.modules[moduleName]; + + if (typeof module == "function") { + var exports = {}; + var previousModule = this._currentModule; + this._currentModule = moduleName; + module(this.require.bind(this), exports, { id: moduleName, uri: "" }); + this._currentModule = previousModule; + module = exports; + } + + // cache the resulting module object for next time + this.modules[moduleName] = module; + + return module; + }; + +}()); + +define.Domain = Domain; +define.globalDomain = new Domain(); +var require = define.globalDomain.require.bind(define.globalDomain); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/prefix-source-map.jsm b/react-app/node_modules/jstransform/node_modules/source-map/build/prefix-source-map.jsm new file mode 100644 index 0000000000..ee2539d815 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/prefix-source-map.jsm @@ -0,0 +1,20 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +/////////////////////////////////////////////////////////////////////////////// + + +this.EXPORTED_SYMBOLS = [ "SourceMapConsumer", "SourceMapGenerator", "SourceNode" ]; + +Components.utils.import('resource://gre/modules/devtools/Require.jsm'); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/prefix-utils.jsm b/react-app/node_modules/jstransform/node_modules/source-map/build/prefix-utils.jsm new file mode 100644 index 0000000000..80341d4528 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/prefix-utils.jsm @@ -0,0 +1,18 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +Components.utils.import('resource://gre/modules/devtools/Require.jsm'); +Components.utils.import('resource://gre/modules/devtools/SourceMap.jsm'); + +this.EXPORTED_SYMBOLS = [ "define", "runSourceMapTests" ]; diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-browser.js b/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-browser.js new file mode 100644 index 0000000000..fb29ff5fd2 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-browser.js @@ -0,0 +1,8 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/////////////////////////////////////////////////////////////////////////////// + +this.sourceMap = { + SourceMapConsumer: require('source-map/source-map-consumer').SourceMapConsumer, + SourceMapGenerator: require('source-map/source-map-generator').SourceMapGenerator, + SourceNode: require('source-map/source-node').SourceNode +}; diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-source-map.jsm b/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-source-map.jsm new file mode 100644 index 0000000000..cf3c2d8d30 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-source-map.jsm @@ -0,0 +1,6 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/////////////////////////////////////////////////////////////////////////////// + +this.SourceMapConsumer = require('source-map/source-map-consumer').SourceMapConsumer; +this.SourceMapGenerator = require('source-map/source-map-generator').SourceMapGenerator; +this.SourceNode = require('source-map/source-node').SourceNode; diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-utils.jsm b/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-utils.jsm new file mode 100644 index 0000000000..b31b84cb61 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/suffix-utils.jsm @@ -0,0 +1,21 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +function runSourceMapTests(modName, do_throw) { + let mod = require(modName); + let assert = require('test/source-map/assert'); + let util = require('test/source-map/util'); + + assert.init(do_throw); + + for (let k in mod) { + if (/^test/.test(k)) { + mod[k](assert, util); + } + } + +} +this.runSourceMapTests = runSourceMapTests; diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/test-prefix.js b/react-app/node_modules/jstransform/node_modules/source-map/build/test-prefix.js new file mode 100644 index 0000000000..1b13f300e5 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/test-prefix.js @@ -0,0 +1,8 @@ +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +Components.utils.import('resource://test/Utils.jsm'); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/build/test-suffix.js b/react-app/node_modules/jstransform/node_modules/source-map/build/test-suffix.js new file mode 100644 index 0000000000..bec2de3f26 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/build/test-suffix.js @@ -0,0 +1,3 @@ +function run_test() { + runSourceMapTests('{THIS_MODULE}', do_throw); +} diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map.js new file mode 100644 index 0000000000..121ad24163 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./source-map/source-node').SourceNode; diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/array-set.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/array-set.js new file mode 100644 index 0000000000..40f9a18b18 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/array-set.js @@ -0,0 +1,97 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var util = require('./util'); + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = {}; + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var isDuplicate = this.has(aStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + this._set[util.toSetString(aStr)] = idx; + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + return Object.prototype.hasOwnProperty.call(this._set, + util.toSetString(aStr)); + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (this.has(aStr)) { + return this._set[util.toSetString(aStr)]; + } + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/base64-vlq.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/base64-vlq.js new file mode 100644 index 0000000000..1b67bb375f --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/base64-vlq.js @@ -0,0 +1,144 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler 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. + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64 = require('./base64'); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string. + */ + exports.decode = function base64VLQ_decode(aStr) { + var i = 0; + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (i >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + digit = base64.decode(aStr.charAt(i++)); + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + return { + value: fromVLQSigned(result), + rest: aStr.slice(i) + }; + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/base64.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/base64.js new file mode 100644 index 0000000000..863cc4650c --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/base64.js @@ -0,0 +1,42 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var charToIntMap = {}; + var intToCharMap = {}; + + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + .split('') + .forEach(function (ch, index) { + charToIntMap[ch] = index; + intToCharMap[index] = ch; + }); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function base64_encode(aNumber) { + if (aNumber in intToCharMap) { + return intToCharMap[aNumber]; + } + throw new TypeError("Must be between 0 and 63: " + aNumber); + }; + + /** + * Decode a single base 64 digit to an integer. + */ + exports.decode = function base64_decode(aChar) { + if (aChar in charToIntMap) { + return charToIntMap[aChar]; + } + throw new TypeError("Not a valid base 64 digit: " + aChar); + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/binary-search.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/binary-search.js new file mode 100644 index 0000000000..ff347c68ba --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/binary-search.js @@ -0,0 +1,81 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the next + // closest element that is less than that element. + // + // 3. We did not find the exact element, and there is no next-closest + // element which is less than the one we are searching for, so we + // return null. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return aHaystack[mid]; + } + else if (cmp > 0) { + // aHaystack[mid] is greater than our needle. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare); + } + // We did not find an exact match, return the next closest one + // (termination case 2). + return aHaystack[mid]; + } + else { + // aHaystack[mid] is less than our needle. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare); + } + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (2) or (3) and return the appropriate thing. + return aLow < 0 + ? null + : aHaystack[aLow]; + } + } + + /** + * This is an implementation of binary search which will always try and return + * the next lowest value checked if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + */ + exports.search = function search(aNeedle, aHaystack, aCompare) { + return aHaystack.length > 0 + ? recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare) + : null; + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-map-consumer.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-map-consumer.js new file mode 100644 index 0000000000..a3b9dc0860 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-map-consumer.js @@ -0,0 +1,477 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var util = require('./util'); + var binarySearch = require('./binary-search'); + var ArraySet = require('./array-set').ArraySet; + var base64VLQ = require('./base64-vlq'); + + /** + * A SourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names, true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + /** + * Create a SourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns SourceMapConsumer + */ + SourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(SourceMapConsumer.prototype); + + smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + smc.__generatedMappings = aSourceMap._mappings.slice() + .sort(util.compareByGeneratedPositions); + smc.__originalMappings = aSourceMap._mappings.slice() + .sort(util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(SourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this.__generatedMappings = []; + this.__originalMappings = []; + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this.__generatedMappings = []; + this.__originalMappings = []; + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var mappingSeparator = /^[,;]/; + var str = aStr; + var mapping; + var temp; + + while (str.length > 0) { + if (str.charAt(0) === ';') { + generatedLine++; + str = str.slice(1); + previousGeneratedColumn = 0; + } + else if (str.charAt(0) === ',') { + str = str.slice(1); + } + else { + mapping = {}; + mapping.generatedLine = generatedLine; + + // Generated column. + temp = base64VLQ.decode(str); + mapping.generatedColumn = previousGeneratedColumn + temp.value; + previousGeneratedColumn = mapping.generatedColumn; + str = temp.rest; + + if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { + // Original source. + temp = base64VLQ.decode(str); + mapping.source = this._sources.at(previousSource + temp.value); + previousSource += temp.value; + str = temp.rest; + if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { + throw new Error('Found a source, but no line and column'); + } + + // Original line. + temp = base64VLQ.decode(str); + mapping.originalLine = previousOriginalLine + temp.value; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + str = temp.rest; + if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { + throw new Error('Found a source and line, but no column'); + } + + // Original column. + temp = base64VLQ.decode(str); + mapping.originalColumn = previousOriginalColumn + temp.value; + previousOriginalColumn = mapping.originalColumn; + str = temp.rest; + + if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { + // Original name. + temp = base64VLQ.decode(str); + mapping.name = this._names.at(previousName + temp.value); + previousName += temp.value; + str = temp.rest; + } + } + + this.__generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + this.__originalMappings.push(mapping); + } + } + } + + this.__originalMappings.sort(util.compareByOriginalPositions); + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + SourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator); + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + SourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var mapping = this._findMapping(needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositions); + + if (mapping) { + var source = util.getArg(mapping, 'source', null); + if (source && this.sourceRoot) { + source = util.join(this.sourceRoot, source); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: util.getArg(mapping, 'name', null) + }; + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * availible. + */ + SourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + throw new Error('"' + aSource + '" is not in the SourceMap.'); + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + if (this.sourceRoot) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + + var mapping = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions); + + if (mapping) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null) + }; + } + + return { + line: null, + column: null + }; + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source; + if (source && sourceRoot) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name + }; + }).forEach(aCallback, context); + }; + + exports.SourceMapConsumer = SourceMapConsumer; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-map-generator.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-map-generator.js new file mode 100644 index 0000000000..48ead7ddce --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-map-generator.js @@ -0,0 +1,380 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64VLQ = require('./base64-vlq'); + var util = require('./util'); + var ArraySet = require('./array-set').ArraySet; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. To create a new one, you must pass an object + * with the following properties: + * + * - file: The filename of the generated source. + * - sourceRoot: An optional root for all URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + this._file = util.getArg(aArgs, 'file'); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = []; + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source) { + newMapping.source = mapping.source; + if (sourceRoot) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + this._validateMapping(generated, original, source, name); + + if (source && !this._sources.has(source)) { + this._sources.add(source); + } + + if (name && !this._names.has(name)) { + this._names.add(name); + } + + this._mappings.push({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent !== null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = {}; + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile) { + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (!aSourceFile) { + aSourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "aSourceFile" relative if an absolute Url is passed. + if (sourceRoot) { + aSourceFile = util.relative(sourceRoot, aSourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "aSourceFile" + this._mappings.forEach(function (mapping) { + if (mapping.source === aSourceFile && mapping.originalLine) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source !== null) { + // Copy mapping + if (sourceRoot) { + mapping.source = util.relative(sourceRoot, original.source); + } else { + mapping.source = original.source; + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name !== null && mapping.name !== null) { + // Only use the identifier name if it's an identifier + // in both SourceMaps + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + if (sourceRoot) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + orginal: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var mapping; + + // The mappings must be guaranteed to be in sorted order before we start + // serializing them or else the generated line numbers (which are defined + // via the ';' separators) will be all messed up. Note: it might be more + // performant to maintain the sorting as we insert them, rather than as we + // serialize them, but the big O is the same either way. + this._mappings.sort(util.compareByGeneratedPositions); + + for (var i = 0, len = this._mappings.length; i < len; i++) { + mapping = this._mappings[i]; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + result += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositions(mapping, this._mappings[i - 1])) { + continue; + } + result += ','; + } + } + + result += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source) { + result += base64VLQ.encode(this._sources.indexOf(mapping.source) + - previousSource); + previousSource = this._sources.indexOf(mapping.source); + + // lines are stored 0-based in SourceMap spec version 3 + result += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + result += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name) { + result += base64VLQ.encode(this._names.indexOf(mapping.name) + - previousName); + previousName = this._names.indexOf(mapping.name); + } + } + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, + key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + file: this._file, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._sourceRoot) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-node.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-node.js new file mode 100644 index 0000000000..626cb65743 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/source-node.js @@ -0,0 +1,371 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; + var util = require('./util'); + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine === undefined ? null : aLine; + this.column = aColumn === undefined ? null : aColumn; + this.source = aSource === undefined ? null : aSource; + this.name = aName === undefined ? null : aName; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // The generated code + // Processed fragments are removed from this array. + var remainingLines = aGeneratedCode.split('\n'); + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping === null) { + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(remainingLines.shift() + "\n"); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + } else { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + var code = ""; + // Associate full lines with "lastMapping" + do { + code += remainingLines.shift() + "\n"; + lastGeneratedLine++; + lastGeneratedColumn = 0; + } while (lastGeneratedLine < mapping.generatedLine); + // When we reached the correct line, we add code until we + // reach the correct column too. + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + code += nextLine.substr(0, mapping.generatedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + // Create the SourceNode. + addMappingWithCode(lastMapping, code); + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[0]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + } + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + // Associate the remaining code in the current line with "lastMapping" + // and add the remaining lines without any mapping + addMappingWithCode(lastMapping, remainingLines.join("\n")); + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + mapping.source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk instanceof SourceNode || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk instanceof SourceNode || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk instanceof SourceNode) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild instanceof SourceNode) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i] instanceof SourceNode) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + chunk.split('').forEach(function (ch) { + if (ch === '\n') { + generated.line++; + generated.column = 0; + } else { + generated.column++; + } + }); + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/util.js b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/util.js new file mode 100644 index 0000000000..87946d3f78 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/lib/source-map/util.js @@ -0,0 +1,205 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/; + var dataUrlRegexp = /^data:.+\,.+/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[3], + host: match[4], + port: match[6], + path: match[7] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = aParsedUrl.scheme + "://"; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + "@" + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + function join(aRoot, aPath) { + var url; + + if (aPath.match(urlRegexp) || aPath.match(dataUrlRegexp)) { + return aPath; + } + + if (aPath.charAt(0) === '/' && (url = urlParse(aRoot))) { + url.path = aPath; + return urlGenerate(url); + } + + return aRoot.replace(/\/$/, '') + '/' + aPath; + } + exports.join = join; + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + return '$' + aStr; + } + exports.toSetString = toSetString; + + function fromSetString(aStr) { + return aStr.substr(1); + } + exports.fromSetString = fromSetString; + + function relative(aRoot, aPath) { + aRoot = aRoot.replace(/\/$/, ''); + + var url = urlParse(aRoot); + if (aPath.charAt(0) == "/" && url && url.path == "/") { + return aPath.slice(1); + } + + return aPath.indexOf(aRoot + '/') === 0 + ? aPath.substr(aRoot.length + 1) + : aPath; + } + exports.relative = relative; + + function strcmp(aStr1, aStr2) { + var s1 = aStr1 || ""; + var s2 = aStr2 || ""; + return (s1 > s2) - (s1 < s2); + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp; + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp || onlyCompareOriginal) { + return cmp; + } + + cmp = strcmp(mappingA.name, mappingB.name); + if (cmp) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp) { + return cmp; + } + + return mappingA.generatedColumn - mappingB.generatedColumn; + }; + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings where the generated positions are + * compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) { + var cmp; + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp || onlyCompareGenerated) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + }; + exports.compareByGeneratedPositions = compareByGeneratedPositions; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/package.json b/react-app/node_modules/jstransform/node_modules/source-map/package.json new file mode 100644 index 0000000000..8a58dc27aa --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/package.json @@ -0,0 +1,159 @@ +{ + "_args": [ + [ + "source-map@0.1.31", + "/Users/mromano/dev/react-sfs/node_modules/jstransform" + ] + ], + "_from": "source-map@0.1.31", + "_id": "source-map@0.1.31", + "_inCache": true, + "_installable": true, + "_location": "/jstransform/source-map", + "_npmUser": { + "email": "fitzgen@gmail.com", + "name": "nickfitzgerald" + }, + "_npmVersion": "1.2.18", + "_phantomChildren": {}, + "_requested": { + "name": "source-map", + "raw": "source-map@0.1.31", + "rawSpec": "0.1.31", + "scope": null, + "spec": "0.1.31", + "type": "version" + }, + "_requiredBy": [ + "/jstransform" + ], + "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", + "_shasum": "9f704d0d69d9e138a81badf6ebb4fde33d151c61", + "_shrinkwrap": null, + "_spec": "source-map@0.1.31", + "_where": "/Users/mromano/dev/react-sfs/node_modules/jstransform", + "author": { + "email": "nfitzgerald@mozilla.com", + "name": "Nick Fitzgerald" + }, + "bugs": { + "url": "https://github.com/mozilla/source-map/issues" + }, + "contributors": [ + { + "email": "tobias.koppers@googlemail.com", + "name": "Tobias Koppers" + }, + { + "email": "duncan@dweebd.com", + "name": "Duncan Beevers" + }, + { + "email": "scrane@mozilla.com", + "name": "Stephen Crane" + }, + { + "email": "seddon.ryan@gmail.com", + "name": "Ryan Seddon" + }, + { + "email": "miles.elam@deem.com", + "name": "Miles Elam" + }, + { + "email": "mihai.bazon@gmail.com", + "name": "Mihai Bazon" + }, + { + "email": "github.public.email@michael.ficarra.me", + "name": "Michael Ficarra" + }, + { + "email": "todd@twolfson.com", + "name": "Todd Wolfson" + }, + { + "email": "alexander@solovyov.net", + "name": "Alexander Solovyov" + }, + { + "email": "fgnass@gmail.com", + "name": "Felix Gnass" + }, + { + "email": "conrad.irwin@gmail.com", + "name": "Conrad Irwin" + }, + { + "email": "usrbincc@yahoo.com", + "name": "usrbincc" + }, + { + "email": "glasser@davidglasser.net", + "name": "David Glasser" + }, + { + "email": "chase@newrelic.com", + "name": "Chase Douglas" + }, + { + "email": "evan.exe@gmail.com", + "name": "Evan Wallace" + }, + { + "email": "fayearthur@gmail.com", + "name": "Heather Arthur" + } + ], + "dependencies": { + "amdefine": ">=0.0.4" + }, + "description": "Generates and consumes source maps", + "devDependencies": { + "dryice": ">=0.4.8" + }, + "directories": { + "lib": "./lib" + }, + "dist": { + "shasum": "9f704d0d69d9e138a81badf6ebb4fde33d151c61", + "tarball": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz" + }, + "engines": { + "node": ">=0.8.0" + }, + "homepage": "https://github.com/mozilla/source-map", + "licenses": [ + { + "type": "BSD", + "url": "http://opensource.org/licenses/BSD-3-Clause" + } + ], + "main": "./lib/source-map.js", + "maintainers": [ + { + "email": "mozilla-developer-tools@googlegroups.com", + "name": "mozilla-devtools" + }, + { + "email": "dherman@mozilla.com", + "name": "mozilla" + }, + { + "email": "fitzgen@gmail.com", + "name": "nickfitzgerald" + } + ], + "name": "source-map", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/mozilla/source-map.git" + }, + "scripts": { + "build": "node Makefile.dryice.js", + "test": "node test/run-tests.js" + }, + "version": "0.1.31" +} diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/run-tests.js b/react-app/node_modules/jstransform/node_modules/source-map/test/run-tests.js new file mode 100755 index 0000000000..626c53f702 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/run-tests.js @@ -0,0 +1,71 @@ +#!/usr/bin/env node +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var assert = require('assert'); +var fs = require('fs'); +var path = require('path'); +var util = require('./source-map/util'); + +function run(tests) { + var failures = []; + var total = 0; + var passed = 0; + + for (var i = 0; i < tests.length; i++) { + for (var k in tests[i].testCase) { + if (/^test/.test(k)) { + total++; + try { + tests[i].testCase[k](assert, util); + passed++; + } + catch (e) { + console.log('FAILED ' + tests[i].name + ': ' + k + '!'); + console.log(e.stack); + } + } + } + } + + console.log(""); + console.log(passed + ' / ' + total + ' tests passed.'); + console.log(""); + + failures.forEach(function (f) { + }); + + return failures.length; +} + +var code; + +process.stdout.on('close', function () { + process.exit(code); +}); + +function isTestFile(f) { + var testToRun = process.argv[2]; + return testToRun + ? path.basename(testToRun) === f + : /^test\-.*?\.js/.test(f); +} + +function toModule(f) { + return './source-map/' + f.replace(/\.js$/, ''); +} + +var requires = fs.readdirSync(path.join(__dirname, 'source-map')) + .filter(isTestFile) + .map(toModule); + +code = run(requires.map(require).map(function (mod, i) { + return { + name: requires[i], + testCase: mod + }; +})); +process.exit(code); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-api.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-api.js new file mode 100644 index 0000000000..3801233c0e --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-api.js @@ -0,0 +1,26 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2012 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var sourceMap; + try { + sourceMap = require('../../lib/source-map'); + } catch (e) { + sourceMap = {}; + Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); + } + + exports['test that the api is properly exposed in the top level'] = function (assert, util) { + assert.equal(typeof sourceMap.SourceMapGenerator, "function"); + assert.equal(typeof sourceMap.SourceMapConsumer, "function"); + assert.equal(typeof sourceMap.SourceNode, "function"); + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-array-set.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-array-set.js new file mode 100644 index 0000000000..b5797edd54 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-array-set.js @@ -0,0 +1,104 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var ArraySet = require('../../lib/source-map/array-set').ArraySet; + + function makeTestSet() { + var set = new ArraySet(); + for (var i = 0; i < 100; i++) { + set.add(String(i)); + } + return set; + } + + exports['test .has() membership'] = function (assert, util) { + var set = makeTestSet(); + for (var i = 0; i < 100; i++) { + assert.ok(set.has(String(i))); + } + }; + + exports['test .indexOf() elements'] = function (assert, util) { + var set = makeTestSet(); + for (var i = 0; i < 100; i++) { + assert.strictEqual(set.indexOf(String(i)), i); + } + }; + + exports['test .at() indexing'] = function (assert, util) { + var set = makeTestSet(); + for (var i = 0; i < 100; i++) { + assert.strictEqual(set.at(i), String(i)); + } + }; + + exports['test creating from an array'] = function (assert, util) { + var set = ArraySet.fromArray(['foo', 'bar', 'baz', 'quux', 'hasOwnProperty']); + + assert.ok(set.has('foo')); + assert.ok(set.has('bar')); + assert.ok(set.has('baz')); + assert.ok(set.has('quux')); + assert.ok(set.has('hasOwnProperty')); + + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.indexOf('bar'), 1); + assert.strictEqual(set.indexOf('baz'), 2); + assert.strictEqual(set.indexOf('quux'), 3); + + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.at(1), 'bar'); + assert.strictEqual(set.at(2), 'baz'); + assert.strictEqual(set.at(3), 'quux'); + }; + + exports['test that you can add __proto__; see github issue #30'] = function (assert, util) { + var set = new ArraySet(); + set.add('__proto__'); + assert.ok(set.has('__proto__')); + assert.strictEqual(set.at(0), '__proto__'); + assert.strictEqual(set.indexOf('__proto__'), 0); + }; + + exports['test .fromArray() with duplicates'] = function (assert, util) { + var set = ArraySet.fromArray(['foo', 'foo']); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 1); + + set = ArraySet.fromArray(['foo', 'foo'], true); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.at(1), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 2); + }; + + exports['test .add() with duplicates'] = function (assert, util) { + var set = new ArraySet(); + set.add('foo'); + + set.add('foo'); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 1); + + set.add('foo', true); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.at(1), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 2); + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-base64-vlq.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-base64-vlq.js new file mode 100644 index 0000000000..653a874e93 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-base64-vlq.js @@ -0,0 +1,24 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64VLQ = require('../../lib/source-map/base64-vlq'); + + exports['test normal encoding and decoding'] = function (assert, util) { + var result; + for (var i = -255; i < 256; i++) { + result = base64VLQ.decode(base64VLQ.encode(i)); + assert.ok(result); + assert.equal(result.value, i); + assert.equal(result.rest, ""); + } + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-base64.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-base64.js new file mode 100644 index 0000000000..ff3a24456d --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-base64.js @@ -0,0 +1,35 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64 = require('../../lib/source-map/base64'); + + exports['test out of range encoding'] = function (assert, util) { + assert.throws(function () { + base64.encode(-1); + }); + assert.throws(function () { + base64.encode(64); + }); + }; + + exports['test out of range decoding'] = function (assert, util) { + assert.throws(function () { + base64.decode('='); + }); + }; + + exports['test normal encoding and decoding'] = function (assert, util) { + for (var i = 0; i < 64; i++) { + assert.equal(base64.decode(base64.encode(i)), i); + } + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-binary-search.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-binary-search.js new file mode 100644 index 0000000000..ee306830dd --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-binary-search.js @@ -0,0 +1,54 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var binarySearch = require('../../lib/source-map/binary-search'); + + function numberCompare(a, b) { + return a - b; + } + + exports['test too high'] = function (assert, util) { + var needle = 30; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.doesNotThrow(function () { + binarySearch.search(needle, haystack, numberCompare); + }); + + assert.equal(binarySearch.search(needle, haystack, numberCompare), 20); + }; + + exports['test too low'] = function (assert, util) { + var needle = 1; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.doesNotThrow(function () { + binarySearch.search(needle, haystack, numberCompare); + }); + + assert.equal(binarySearch.search(needle, haystack, numberCompare), null); + }; + + exports['test exact search'] = function (assert, util) { + var needle = 4; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.equal(binarySearch.search(needle, haystack, numberCompare), 4); + }; + + exports['test fuzzy search'] = function (assert, util) { + var needle = 19; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.equal(binarySearch.search(needle, haystack, numberCompare), 18); + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-dog-fooding.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-dog-fooding.js new file mode 100644 index 0000000000..d831b9262a --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-dog-fooding.js @@ -0,0 +1,72 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + + exports['test eating our own dog food'] = function (assert, util) { + var smg = new SourceMapGenerator({ + file: 'testing.js', + sourceRoot: '/wu/tang' + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 1, column: 0 }, + generated: { line: 2, column: 2 } + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 2, column: 0 }, + generated: { line: 3, column: 2 } + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 3, column: 0 }, + generated: { line: 4, column: 2 } + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 4, column: 0 }, + generated: { line: 5, column: 2 } + }); + + var smc = new SourceMapConsumer(smg.toString()); + + // Exact + util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 0, null, smc, assert); + util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 0, null, smc, assert); + util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 0, null, smc, assert); + util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 0, null, smc, assert); + + // Fuzzy + + // Original to generated + util.assertMapping(2, 0, null, null, null, null, smc, assert, true); + util.assertMapping(2, 9, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true); + util.assertMapping(3, 0, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true); + util.assertMapping(3, 9, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true); + util.assertMapping(4, 0, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true); + util.assertMapping(4, 9, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true); + util.assertMapping(5, 0, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true); + util.assertMapping(5, 9, '/wu/tang/gza.coffee', 4, 0, null, smc, assert, true); + + // Generated to original + util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 1, null, smc, assert, null, true); + util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 3, null, smc, assert, null, true); + util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 6, null, smc, assert, null, true); + util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 9, null, smc, assert, null, true); + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-map-consumer.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-map-consumer.js new file mode 100644 index 0000000000..f2c65a7f09 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-map-consumer.js @@ -0,0 +1,451 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + + exports['test that we can instantiate with a string or an objects'] = function (assert, util) { + assert.doesNotThrow(function () { + var map = new SourceMapConsumer(util.testMap); + }); + assert.doesNotThrow(function () { + var map = new SourceMapConsumer(JSON.stringify(util.testMap)); + }); + }; + + exports['test that the `sources` field has the original sources'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var sources = map.sources; + + assert.equal(sources[0], '/the/root/one.js'); + assert.equal(sources[1], '/the/root/two.js'); + assert.equal(sources.length, 2); + }; + + exports['test that the source root is reflected in a mapping\'s source field'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var mapping; + + mapping = map.originalPositionFor({ + line: 2, + column: 1 + }); + assert.equal(mapping.source, '/the/root/two.js'); + + mapping = map.originalPositionFor({ + line: 1, + column: 1 + }); + assert.equal(mapping.source, '/the/root/one.js'); + }; + + exports['test mapping tokens back exactly'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + + util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, map, assert); + util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, map, assert); + util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, map, assert); + util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', map, assert); + util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, map, assert); + util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', map, assert); + util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', map, assert); + + util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, map, assert); + util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, map, assert); + util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, map, assert); + util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', map, assert); + util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, map, assert); + util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', map, assert); + }; + + exports['test mapping tokens fuzzy'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + + // Finding original positions + util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', map, assert, true); + util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', map, assert, true); + util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, map, assert, true); + + // Finding generated positions + util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', map, assert, null, true); + util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', map, assert, null, true); + util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, map, assert, null, true); + }; + + exports['test creating source map consumers with )]}\' prefix'] = function (assert, util) { + assert.doesNotThrow(function () { + var map = new SourceMapConsumer(")]}'" + JSON.stringify(util.testMap)); + }); + }; + + exports['test eachMapping'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var previousLine = -Infinity; + var previousColumn = -Infinity; + map.eachMapping(function (mapping) { + assert.ok(mapping.generatedLine >= previousLine); + + if (mapping.source) { + assert.equal(mapping.source.indexOf(util.testMap.sourceRoot), 0); + } + + if (mapping.generatedLine === previousLine) { + assert.ok(mapping.generatedColumn >= previousColumn); + previousColumn = mapping.generatedColumn; + } + else { + previousLine = mapping.generatedLine; + previousColumn = -Infinity; + } + }); + }; + + exports['test iterating over mappings in a different order'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var previousLine = -Infinity; + var previousColumn = -Infinity; + var previousSource = ""; + map.eachMapping(function (mapping) { + assert.ok(mapping.source >= previousSource); + + if (mapping.source === previousSource) { + assert.ok(mapping.originalLine >= previousLine); + + if (mapping.originalLine === previousLine) { + assert.ok(mapping.originalColumn >= previousColumn); + previousColumn = mapping.originalColumn; + } + else { + previousLine = mapping.originalLine; + previousColumn = -Infinity; + } + } + else { + previousSource = mapping.source; + previousLine = -Infinity; + previousColumn = -Infinity; + } + }, null, SourceMapConsumer.ORIGINAL_ORDER); + }; + + exports['test that we can set the context for `this` in eachMapping'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var context = {}; + map.eachMapping(function () { + assert.equal(this, context); + }, context); + }; + + exports['test that the `sourcesContent` field has the original sources'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMapWithSourcesContent); + var sourcesContent = map.sourcesContent; + + assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };'); + assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };'); + assert.equal(sourcesContent.length, 2); + }; + + exports['test that we can get the original sources for the sources'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMapWithSourcesContent); + var sources = map.sources; + + assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); + assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); + assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); + assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); + assert.throws(function () { + map.sourceContentFor(""); + }, Error); + assert.throws(function () { + map.sourceContentFor("/the/root/three.js"); + }, Error); + assert.throws(function () { + map.sourceContentFor("three.js"); + }, Error); + }; + + exports['test sourceRoot + generatedPositionFor'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'foo/bar', + file: 'baz.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'bang.coffee' + }); + map.addMapping({ + original: { line: 5, column: 5 }, + generated: { line: 6, column: 6 }, + source: 'bang.coffee' + }); + map = new SourceMapConsumer(map.toString()); + + // Should handle without sourceRoot. + var pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: 'bang.coffee' + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + // Should handle with sourceRoot. + var pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: 'foo/bar/bang.coffee' + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + }; + + exports['test sourceRoot + originalPositionFor'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'foo/bar', + file: 'baz.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'bang.coffee' + }); + map = new SourceMapConsumer(map.toString()); + + var pos = map.originalPositionFor({ + line: 2, + column: 2, + }); + + // Should always have the prepended source root + assert.equal(pos.source, 'foo/bar/bang.coffee'); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + }; + + exports['test github issue #56'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'http://', + file: 'www.example.com/foo.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'www.example.com/original.js' + }); + map = new SourceMapConsumer(map.toString()); + + var sources = map.sources; + assert.equal(sources.length, 1); + assert.equal(sources[0], 'http://www.example.com/original.js'); + }; + + exports['test github issue #43'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'http://example.com', + file: 'foo.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'http://cdn.example.com/original.js' + }); + map = new SourceMapConsumer(map.toString()); + + var sources = map.sources; + assert.equal(sources.length, 1, + 'Should only be one source.'); + assert.equal(sources[0], 'http://cdn.example.com/original.js', + 'Should not be joined with the sourceRoot.'); + }; + + exports['test absolute path, but same host sources'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'http://example.com/foo/bar', + file: 'foo.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: '/original.js' + }); + map = new SourceMapConsumer(map.toString()); + + var sources = map.sources; + assert.equal(sources.length, 1, + 'Should only be one source.'); + assert.equal(sources[0], 'http://example.com/original.js', + 'Source should be relative the host of the source root.'); + }; + + exports['test github issue #64'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sourceRoot": "http://example.com/", + "sources": ["/a"], + "names": [], + "mappings": "AACA", + "sourcesContent": ["foo"] + }); + + assert.equal(map.sourceContentFor("a"), "foo"); + assert.equal(map.sourceContentFor("/a"), "foo"); + }; + + exports['test bug 885597'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/", + "sources": ["/a"], + "names": [], + "mappings": "AACA", + "sourcesContent": ["foo"] + }); + + var s = map.sources[0]; + assert.equal(map.sourceContentFor(s), "foo"); + }; + + exports['test github issue #72, duplicate sources'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sources": ["source1.js", "source1.js", "source3.js"], + "names": [], + "mappings": ";EAAC;;IAEE;;MEEE", + "sourceRoot": "http://example.com" + }); + + var pos = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.source, 'http://example.com/source1.js'); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + + var pos = map.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.source, 'http://example.com/source1.js'); + assert.equal(pos.line, 3); + assert.equal(pos.column, 3); + + var pos = map.originalPositionFor({ + line: 6, + column: 6 + }); + assert.equal(pos.source, 'http://example.com/source3.js'); + assert.equal(pos.line, 5); + assert.equal(pos.column, 5); + }; + + exports['test github issue #72, duplicate names'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sources": ["source.js"], + "names": ["name1", "name1", "name3"], + "mappings": ";EAACA;;IAEEA;;MAEEE", + "sourceRoot": "http://example.com" + }); + + var pos = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.name, 'name1'); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + + var pos = map.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.name, 'name1'); + assert.equal(pos.line, 3); + assert.equal(pos.column, 3); + + var pos = map.originalPositionFor({ + line: 6, + column: 6 + }); + assert.equal(pos.name, 'name3'); + assert.equal(pos.line, 5); + assert.equal(pos.column, 5); + }; + + exports['test SourceMapConsumer.fromSourceMap'] = function (assert, util) { + var smg = new SourceMapGenerator({ + sourceRoot: 'http://example.com/', + file: 'foo.js' + }); + smg.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'bar.js' + }); + smg.addMapping({ + original: { line: 2, column: 2 }, + generated: { line: 4, column: 4 }, + source: 'baz.js', + name: 'dirtMcGirt' + }); + smg.setSourceContent('baz.js', 'baz.js content'); + + var smc = SourceMapConsumer.fromSourceMap(smg); + assert.equal(smc.file, 'foo.js'); + assert.equal(smc.sourceRoot, 'http://example.com/'); + assert.equal(smc.sources.length, 2); + assert.equal(smc.sources[0], 'http://example.com/bar.js'); + assert.equal(smc.sources[1], 'http://example.com/baz.js'); + assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content'); + + var pos = smc.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + assert.equal(pos.source, 'http://example.com/bar.js'); + assert.equal(pos.name, null); + + pos = smc.generatedPositionFor({ + line: 1, + column: 1, + source: 'http://example.com/bar.js' + }); + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + pos = smc.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + assert.equal(pos.source, 'http://example.com/baz.js'); + assert.equal(pos.name, 'dirtMcGirt'); + + pos = smc.generatedPositionFor({ + line: 2, + column: 2, + source: 'http://example.com/baz.js' + }); + assert.equal(pos.line, 4); + assert.equal(pos.column, 4); + }; +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-map-generator.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-map-generator.js new file mode 100644 index 0000000000..ba292f5484 --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-map-generator.js @@ -0,0 +1,417 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceNode = require('../../lib/source-map/source-node').SourceNode; + var util = require('./util'); + + exports['test some simple stuff'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'foo.js', + sourceRoot: '.' + }); + assert.ok(true); + }; + + exports['test JSON serialization'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'foo.js', + sourceRoot: '.' + }); + assert.equal(map.toString(), JSON.stringify(map)); + }; + + exports['test adding mappings (case 1)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + assert.doesNotThrow(function () { + map.addMapping({ + generated: { line: 1, column: 1 } + }); + }); + }; + + exports['test adding mappings (case 2)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + assert.doesNotThrow(function () { + map.addMapping({ + generated: { line: 1, column: 1 }, + source: 'bar.js', + original: { line: 1, column: 1 } + }); + }); + }; + + exports['test adding mappings (case 3)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + assert.doesNotThrow(function () { + map.addMapping({ + generated: { line: 1, column: 1 }, + source: 'bar.js', + original: { line: 1, column: 1 }, + name: 'someToken' + }); + }); + }; + + exports['test adding mappings (invalid)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + // Not enough info. + assert.throws(function () { + map.addMapping({}); + }); + + // Original file position, but no source. + assert.throws(function () { + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 1, column: 1 } + }); + }); + }; + + exports['test that the correct mappings are being generated'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'min.js', + sourceRoot: '/the/root' + }); + + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 1, column: 1 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 5 }, + original: { line: 1, column: 5 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 9 }, + original: { line: 1, column: 11 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 18 }, + original: { line: 1, column: 21 }, + source: 'one.js', + name: 'bar' + }); + map.addMapping({ + generated: { line: 1, column: 21 }, + original: { line: 2, column: 3 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 28 }, + original: { line: 2, column: 10 }, + source: 'one.js', + name: 'baz' + }); + map.addMapping({ + generated: { line: 1, column: 32 }, + original: { line: 2, column: 14 }, + source: 'one.js', + name: 'bar' + }); + + map.addMapping({ + generated: { line: 2, column: 1 }, + original: { line: 1, column: 1 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 5 }, + original: { line: 1, column: 5 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 9 }, + original: { line: 1, column: 11 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 18 }, + original: { line: 1, column: 21 }, + source: 'two.js', + name: 'n' + }); + map.addMapping({ + generated: { line: 2, column: 21 }, + original: { line: 2, column: 3 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 28 }, + original: { line: 2, column: 10 }, + source: 'two.js', + name: 'n' + }); + + map = JSON.parse(map.toString()); + + util.assertEqualMaps(assert, map, util.testMap); + }; + + exports['test that source content can be set'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'min.js', + sourceRoot: '/the/root' + }); + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 1, column: 1 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 2, column: 1 }, + original: { line: 1, column: 1 }, + source: 'two.js' + }); + map.setSourceContent('one.js', 'one file content'); + + map = JSON.parse(map.toString()); + assert.equal(map.sources[0], 'one.js'); + assert.equal(map.sources[1], 'two.js'); + assert.equal(map.sourcesContent[0], 'one file content'); + assert.equal(map.sourcesContent[1], null); + }; + + exports['test .fromSourceMap'] = function (assert, util) { + var map = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(util.testMap)); + util.assertEqualMaps(assert, map.toJSON(), util.testMap); + }; + + exports['test .fromSourceMap with sourcesContent'] = function (assert, util) { + var map = SourceMapGenerator.fromSourceMap( + new SourceMapConsumer(util.testMapWithSourcesContent)); + util.assertEqualMaps(assert, map.toJSON(), util.testMapWithSourcesContent); + }; + + exports['test applySourceMap'] = function (assert, util) { + var node = new SourceNode(null, null, null, [ + new SourceNode(2, 0, 'fileX', 'lineX2\n'), + 'genA1\n', + new SourceNode(2, 0, 'fileY', 'lineY2\n'), + 'genA2\n', + new SourceNode(1, 0, 'fileX', 'lineX1\n'), + 'genA3\n', + new SourceNode(1, 0, 'fileY', 'lineY1\n') + ]); + var mapStep1 = node.toStringWithSourceMap({ + file: 'fileA' + }).map; + mapStep1.setSourceContent('fileX', 'lineX1\nlineX2\n'); + mapStep1 = mapStep1.toJSON(); + + node = new SourceNode(null, null, null, [ + 'gen1\n', + new SourceNode(1, 0, 'fileA', 'lineA1\n'), + new SourceNode(2, 0, 'fileA', 'lineA2\n'), + new SourceNode(3, 0, 'fileA', 'lineA3\n'), + new SourceNode(4, 0, 'fileA', 'lineA4\n'), + new SourceNode(1, 0, 'fileB', 'lineB1\n'), + new SourceNode(2, 0, 'fileB', 'lineB2\n'), + 'gen2\n' + ]); + var mapStep2 = node.toStringWithSourceMap({ + file: 'fileGen' + }).map; + mapStep2.setSourceContent('fileB', 'lineB1\nlineB2\n'); + mapStep2 = mapStep2.toJSON(); + + node = new SourceNode(null, null, null, [ + 'gen1\n', + new SourceNode(2, 0, 'fileX', 'lineA1\n'), + new SourceNode(2, 0, 'fileA', 'lineA2\n'), + new SourceNode(2, 0, 'fileY', 'lineA3\n'), + new SourceNode(4, 0, 'fileA', 'lineA4\n'), + new SourceNode(1, 0, 'fileB', 'lineB1\n'), + new SourceNode(2, 0, 'fileB', 'lineB2\n'), + 'gen2\n' + ]); + var expectedMap = node.toStringWithSourceMap({ + file: 'fileGen' + }).map; + expectedMap.setSourceContent('fileX', 'lineX1\nlineX2\n'); + expectedMap.setSourceContent('fileB', 'lineB1\nlineB2\n'); + expectedMap = expectedMap.toJSON(); + + // apply source map "mapStep1" to "mapStep2" + var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(mapStep2)); + generator.applySourceMap(new SourceMapConsumer(mapStep1)); + var actualMap = generator.toJSON(); + + util.assertEqualMaps(assert, actualMap, expectedMap); + }; + + exports['test sorting with duplicate generated mappings'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'test.js' + }); + map.addMapping({ + generated: { line: 3, column: 0 }, + original: { line: 2, column: 0 }, + source: 'a.js' + }); + map.addMapping({ + generated: { line: 2, column: 0 } + }); + map.addMapping({ + generated: { line: 2, column: 0 } + }); + map.addMapping({ + generated: { line: 1, column: 0 }, + original: { line: 1, column: 0 }, + source: 'a.js' + }); + + util.assertEqualMaps(assert, map.toJSON(), { + version: 3, + file: 'test.js', + sources: ['a.js'], + names: [], + mappings: 'AAAA;A;AACA' + }); + }; + + exports['test ignore duplicate mappings.'] = function (assert, util) { + var init = { file: 'min.js', sourceRoot: '/the/root' }; + var map1, map2; + + // null original source location + var nullMapping1 = { + generated: { line: 1, column: 0 } + }; + var nullMapping2 = { + generated: { line: 2, column: 2 } + }; + + map1 = new SourceMapGenerator(init); + map2 = new SourceMapGenerator(init); + + map1.addMapping(nullMapping1); + map1.addMapping(nullMapping1); + + map2.addMapping(nullMapping1); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + map1.addMapping(nullMapping2); + map1.addMapping(nullMapping1); + + map2.addMapping(nullMapping2); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + // original source location + var srcMapping1 = { + generated: { line: 1, column: 0 }, + original: { line: 11, column: 0 }, + source: 'srcMapping1.js' + }; + var srcMapping2 = { + generated: { line: 2, column: 2 }, + original: { line: 11, column: 0 }, + source: 'srcMapping2.js' + }; + + map1 = new SourceMapGenerator(init); + map2 = new SourceMapGenerator(init); + + map1.addMapping(srcMapping1); + map1.addMapping(srcMapping1); + + map2.addMapping(srcMapping1); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + map1.addMapping(srcMapping2); + map1.addMapping(srcMapping1); + + map2.addMapping(srcMapping2); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + // full original source and name information + var fullMapping1 = { + generated: { line: 1, column: 0 }, + original: { line: 11, column: 0 }, + source: 'fullMapping1.js', + name: 'fullMapping1' + }; + var fullMapping2 = { + generated: { line: 2, column: 2 }, + original: { line: 11, column: 0 }, + source: 'fullMapping2.js', + name: 'fullMapping2' + }; + + map1 = new SourceMapGenerator(init); + map2 = new SourceMapGenerator(init); + + map1.addMapping(fullMapping1); + map1.addMapping(fullMapping1); + + map2.addMapping(fullMapping1); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + map1.addMapping(fullMapping2); + map1.addMapping(fullMapping1); + + map2.addMapping(fullMapping2); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + }; + + exports['test github issue #72, check for duplicate names or sources'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'test.js' + }); + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 2, column: 2 }, + source: 'a.js', + name: 'foo' + }); + map.addMapping({ + generated: { line: 3, column: 3 }, + original: { line: 4, column: 4 }, + source: 'a.js', + name: 'foo' + }); + util.assertEqualMaps(assert, map.toJSON(), { + version: 3, + file: 'test.js', + sources: ['a.js'], + names: ['foo'], + mappings: 'CACEA;;GAEEA' + }); + }; + +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-node.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-node.js new file mode 100644 index 0000000000..6e0eca82df --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/test-source-node.js @@ -0,0 +1,365 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceNode = require('../../lib/source-map/source-node').SourceNode; + + exports['test .add()'] = function (assert, util) { + var node = new SourceNode(null, null, null); + + // Adding a string works. + node.add('function noop() {}'); + + // Adding another source node works. + node.add(new SourceNode(null, null, null)); + + // Adding an array works. + node.add(['function foo() {', + new SourceNode(null, null, null, + 'return 10;'), + '}']); + + // Adding other stuff doesn't. + assert.throws(function () { + node.add({}); + }); + assert.throws(function () { + node.add(function () {}); + }); + }; + + exports['test .prepend()'] = function (assert, util) { + var node = new SourceNode(null, null, null); + + // Prepending a string works. + node.prepend('function noop() {}'); + assert.equal(node.children[0], 'function noop() {}'); + assert.equal(node.children.length, 1); + + // Prepending another source node works. + node.prepend(new SourceNode(null, null, null)); + assert.equal(node.children[0], ''); + assert.equal(node.children[1], 'function noop() {}'); + assert.equal(node.children.length, 2); + + // Prepending an array works. + node.prepend(['function foo() {', + new SourceNode(null, null, null, + 'return 10;'), + '}']); + assert.equal(node.children[0], 'function foo() {'); + assert.equal(node.children[1], 'return 10;'); + assert.equal(node.children[2], '}'); + assert.equal(node.children[3], ''); + assert.equal(node.children[4], 'function noop() {}'); + assert.equal(node.children.length, 5); + + // Prepending other stuff doesn't. + assert.throws(function () { + node.prepend({}); + }); + assert.throws(function () { + node.prepend(function () {}); + }); + }; + + exports['test .toString()'] = function (assert, util) { + assert.equal((new SourceNode(null, null, null, + ['function foo() {', + new SourceNode(null, null, null, 'return 10;'), + '}'])).toString(), + 'function foo() {return 10;}'); + }; + + exports['test .join()'] = function (assert, util) { + assert.equal((new SourceNode(null, null, null, + ['a', 'b', 'c', 'd'])).join(', ').toString(), + 'a, b, c, d'); + }; + + exports['test .walk()'] = function (assert, util) { + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', new SourceNode(1, 0, 'a.js', ['someCall()']), ';\n', + ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n', + '}());']); + var expected = [ + { str: '(function () {\n', source: null, line: null, column: null }, + { str: ' ', source: null, line: null, column: null }, + { str: 'someCall()', source: 'a.js', line: 1, column: 0 }, + { str: ';\n', source: null, line: null, column: null }, + { str: ' ', source: null, line: null, column: null }, + { str: 'if (foo) bar()', source: 'b.js', line: 2, column: 0 }, + { str: ';\n', source: null, line: null, column: null }, + { str: '}());', source: null, line: null, column: null }, + ]; + var i = 0; + node.walk(function (chunk, loc) { + assert.equal(expected[i].str, chunk); + assert.equal(expected[i].source, loc.source); + assert.equal(expected[i].line, loc.line); + assert.equal(expected[i].column, loc.column); + i++; + }); + }; + + exports['test .replaceRight'] = function (assert, util) { + var node; + + // Not nested + node = new SourceNode(null, null, null, 'hello world'); + node.replaceRight(/world/, 'universe'); + assert.equal(node.toString(), 'hello universe'); + + // Nested + node = new SourceNode(null, null, null, + [new SourceNode(null, null, null, 'hey sexy mama, '), + new SourceNode(null, null, null, 'want to kill all humans?')]); + node.replaceRight(/kill all humans/, 'watch Futurama'); + assert.equal(node.toString(), 'hey sexy mama, want to watch Futurama?'); + }; + + exports['test .toStringWithSourceMap()'] = function (assert, util) { + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', + new SourceNode(1, 0, 'a.js', 'someCall', 'originalCall'), + new SourceNode(1, 8, 'a.js', '()'), + ';\n', + ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n', + '}());']); + var map = node.toStringWithSourceMap({ + file: 'foo.js' + }).map; + + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = new SourceMapConsumer(map.toString()); + + var actual; + + actual = map.originalPositionFor({ + line: 1, + column: 4 + }); + assert.equal(actual.source, null); + assert.equal(actual.line, null); + assert.equal(actual.column, null); + + actual = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(actual.source, 'a.js'); + assert.equal(actual.line, 1); + assert.equal(actual.column, 0); + assert.equal(actual.name, 'originalCall'); + + actual = map.originalPositionFor({ + line: 3, + column: 2 + }); + assert.equal(actual.source, 'b.js'); + assert.equal(actual.line, 2); + assert.equal(actual.column, 0); + + actual = map.originalPositionFor({ + line: 3, + column: 16 + }); + assert.equal(actual.source, null); + assert.equal(actual.line, null); + assert.equal(actual.column, null); + + actual = map.originalPositionFor({ + line: 4, + column: 2 + }); + assert.equal(actual.source, null); + assert.equal(actual.line, null); + assert.equal(actual.column, null); + }; + + exports['test .fromStringWithSourceMap()'] = function (assert, util) { + var node = SourceNode.fromStringWithSourceMap( + util.testGeneratedCode, + new SourceMapConsumer(util.testMap)); + + var result = node.toStringWithSourceMap({ + file: 'min.js' + }); + var map = result.map; + var code = result.code; + + assert.equal(code, util.testGeneratedCode); + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = map.toJSON(); + assert.equal(map.version, util.testMap.version); + assert.equal(map.file, util.testMap.file); + assert.equal(map.mappings, util.testMap.mappings); + }; + + exports['test .fromStringWithSourceMap() empty map'] = function (assert, util) { + var node = SourceNode.fromStringWithSourceMap( + util.testGeneratedCode, + new SourceMapConsumer(util.emptyMap)); + var result = node.toStringWithSourceMap({ + file: 'min.js' + }); + var map = result.map; + var code = result.code; + + assert.equal(code, util.testGeneratedCode); + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = map.toJSON(); + assert.equal(map.version, util.emptyMap.version); + assert.equal(map.file, util.emptyMap.file); + assert.equal(map.mappings.length, util.emptyMap.mappings.length); + assert.equal(map.mappings, util.emptyMap.mappings); + }; + + exports['test .fromStringWithSourceMap() complex version'] = function (assert, util) { + var input = new SourceNode(null, null, null, [ + "(function() {\n", + " var Test = {};\n", + " ", new SourceNode(1, 0, "a.js", "Test.A = { value: 1234 };\n"), + " ", new SourceNode(2, 0, "a.js", "Test.A.x = 'xyz';"), "\n", + "}());\n", + "/* Generated Source */"]); + input = input.toStringWithSourceMap({ + file: 'foo.js' + }); + + var node = SourceNode.fromStringWithSourceMap( + input.code, + new SourceMapConsumer(input.map.toString())); + + var result = node.toStringWithSourceMap({ + file: 'foo.js' + }); + var map = result.map; + var code = result.code; + + assert.equal(code, input.code); + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = map.toJSON(); + var inputMap = input.map.toJSON(); + util.assertEqualMaps(assert, map, inputMap); + }; + + exports['test .fromStringWithSourceMap() merging duplicate mappings'] = function (assert, util) { + var input = new SourceNode(null, null, null, [ + new SourceNode(1, 0, "a.js", "(function"), + new SourceNode(1, 0, "a.js", "() {\n"), + " ", + new SourceNode(1, 0, "a.js", "var Test = "), + new SourceNode(1, 0, "b.js", "{};\n"), + new SourceNode(2, 0, "b.js", "Test"), + new SourceNode(2, 0, "b.js", ".A", "A"), + new SourceNode(2, 20, "b.js", " = { value: 1234 };\n", "A"), + "}());\n", + "/* Generated Source */" + ]); + input = input.toStringWithSourceMap({ + file: 'foo.js' + }); + + var correctMap = new SourceMapGenerator({ + file: 'foo.js' + }); + correctMap.addMapping({ + generated: { line: 1, column: 0 }, + source: 'a.js', + original: { line: 1, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 2, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 2, column: 2 }, + source: 'a.js', + original: { line: 1, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 2, column: 13 }, + source: 'b.js', + original: { line: 1, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 3, column: 0 }, + source: 'b.js', + original: { line: 2, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 3, column: 4 }, + source: 'b.js', + name: 'A', + original: { line: 2, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 3, column: 6 }, + source: 'b.js', + name: 'A', + original: { line: 2, column: 20 } + }); + correctMap.addMapping({ + generated: { line: 4, column: 0 } + }); + + var inputMap = input.map.toJSON(); + correctMap = correctMap.toJSON(); + util.assertEqualMaps(assert, correctMap, inputMap); + }; + + exports['test setSourceContent with toStringWithSourceMap'] = function (assert, util) { + var aNode = new SourceNode(1, 1, 'a.js', 'a'); + aNode.setSourceContent('a.js', 'someContent'); + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', aNode, + ' ', new SourceNode(1, 1, 'b.js', 'b'), + '}());']); + node.setSourceContent('b.js', 'otherContent'); + var map = node.toStringWithSourceMap({ + file: 'foo.js' + }).map; + + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = new SourceMapConsumer(map.toString()); + + assert.equal(map.sources.length, 2); + assert.equal(map.sources[0], 'a.js'); + assert.equal(map.sources[1], 'b.js'); + assert.equal(map.sourcesContent.length, 2); + assert.equal(map.sourcesContent[0], 'someContent'); + assert.equal(map.sourcesContent[1], 'otherContent'); + }; + + exports['test walkSourceContents'] = function (assert, util) { + var aNode = new SourceNode(1, 1, 'a.js', 'a'); + aNode.setSourceContent('a.js', 'someContent'); + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', aNode, + ' ', new SourceNode(1, 1, 'b.js', 'b'), + '}());']); + node.setSourceContent('b.js', 'otherContent'); + var results = []; + node.walkSourceContents(function (sourceFile, sourceContent) { + results.push([sourceFile, sourceContent]); + }); + assert.equal(results.length, 2); + assert.equal(results[0][0], 'a.js'); + assert.equal(results[0][1], 'someContent'); + assert.equal(results[1][0], 'b.js'); + assert.equal(results[1][1], 'otherContent'); + }; +}); diff --git a/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/util.js b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/util.js new file mode 100644 index 0000000000..288046bfaa --- /dev/null +++ b/react-app/node_modules/jstransform/node_modules/source-map/test/source-map/util.js @@ -0,0 +1,161 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var util = require('../../lib/source-map/util'); + + // This is a test mapping which maps functions from two different files + // (one.js and two.js) to a minified generated source. + // + // Here is one.js: + // + // ONE.foo = function (bar) { + // return baz(bar); + // }; + // + // Here is two.js: + // + // TWO.inc = function (n) { + // return n + 1; + // }; + // + // And here is the generated code (min.js): + // + // ONE.foo=function(a){return baz(a);}; + // TWO.inc=function(a){return a+1;}; + exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+ + " TWO.inc=function(a){return a+1;};"; + exports.testMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: '/the/root', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' + }; + exports.testMapWithSourcesContent = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourcesContent: [ + ' ONE.foo = function (bar) {\n' + + ' return baz(bar);\n' + + ' };', + ' TWO.inc = function (n) {\n' + + ' return n + 1;\n' + + ' };' + ], + sourceRoot: '/the/root', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' + }; + exports.emptyMap = { + version: 3, + file: 'min.js', + names: [], + sources: [], + mappings: '' + }; + + + function assertMapping(generatedLine, generatedColumn, originalSource, + originalLine, originalColumn, name, map, assert, + dontTestGenerated, dontTestOriginal) { + if (!dontTestOriginal) { + var origMapping = map.originalPositionFor({ + line: generatedLine, + column: generatedColumn + }); + assert.equal(origMapping.name, name, + 'Incorrect name, expected ' + JSON.stringify(name) + + ', got ' + JSON.stringify(origMapping.name)); + assert.equal(origMapping.line, originalLine, + 'Incorrect line, expected ' + JSON.stringify(originalLine) + + ', got ' + JSON.stringify(origMapping.line)); + assert.equal(origMapping.column, originalColumn, + 'Incorrect column, expected ' + JSON.stringify(originalColumn) + + ', got ' + JSON.stringify(origMapping.column)); + + var expectedSource; + + if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) { + expectedSource = originalSource; + } else if (originalSource) { + expectedSource = map.sourceRoot + ? util.join(map.sourceRoot, originalSource) + : originalSource; + } else { + expectedSource = null; + } + + assert.equal(origMapping.source, expectedSource, + 'Incorrect source, expected ' + JSON.stringify(expectedSource) + + ', got ' + JSON.stringify(origMapping.source)); + } + + if (!dontTestGenerated) { + var genMapping = map.generatedPositionFor({ + source: originalSource, + line: originalLine, + column: originalColumn + }); + assert.equal(genMapping.line, generatedLine, + 'Incorrect line, expected ' + JSON.stringify(generatedLine) + + ', got ' + JSON.stringify(genMapping.line)); + assert.equal(genMapping.column, generatedColumn, + 'Incorrect column, expected ' + JSON.stringify(generatedColumn) + + ', got ' + JSON.stringify(genMapping.column)); + } + } + exports.assertMapping = assertMapping; + + function assertEqualMaps(assert, actualMap, expectedMap) { + assert.equal(actualMap.version, expectedMap.version, "version mismatch"); + assert.equal(actualMap.file, expectedMap.file, "file mismatch"); + assert.equal(actualMap.names.length, + expectedMap.names.length, + "names length mismatch: " + + actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); + for (var i = 0; i < actualMap.names.length; i++) { + assert.equal(actualMap.names[i], + expectedMap.names[i], + "names[" + i + "] mismatch: " + + actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); + } + assert.equal(actualMap.sources.length, + expectedMap.sources.length, + "sources length mismatch: " + + actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); + for (var i = 0; i < actualMap.sources.length; i++) { + assert.equal(actualMap.sources[i], + expectedMap.sources[i], + "sources[" + i + "] length mismatch: " + + actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); + } + assert.equal(actualMap.sourceRoot, + expectedMap.sourceRoot, + "sourceRoot mismatch: " + + actualMap.sourceRoot + " != " + expectedMap.sourceRoot); + assert.equal(actualMap.mappings, expectedMap.mappings, + "mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings); + if (actualMap.sourcesContent) { + assert.equal(actualMap.sourcesContent.length, + expectedMap.sourcesContent.length, + "sourcesContent length mismatch"); + for (var i = 0; i < actualMap.sourcesContent.length; i++) { + assert.equal(actualMap.sourcesContent[i], + expectedMap.sourcesContent[i], + "sourcesContent[" + i + "] mismatch"); + } + } + } + exports.assertEqualMaps = assertEqualMaps; + +}); diff --git a/react-app/node_modules/jstransform/package.json b/react-app/node_modules/jstransform/package.json new file mode 100644 index 0000000000..57295f2ac0 --- /dev/null +++ b/react-app/node_modules/jstransform/package.json @@ -0,0 +1,117 @@ +{ + "_args": [ + [ + "jstransform@^10.0.1", + "/Users/mromano/dev/react-sfs/node_modules/envify" + ] + ], + "_from": "jstransform@>=10.0.1 <11.0.0", + "_id": "jstransform@10.1.0", + "_inCache": true, + "_installable": true, + "_location": "/jstransform", + "_npmUser": { + "email": "gabelevi@gmail.com", + "name": "gabelevi" + }, + "_npmVersion": "1.4.16", + "_phantomChildren": { + "amdefine": "1.0.0" + }, + "_requested": { + "name": "jstransform", + "raw": "jstransform@^10.0.1", + "rawSpec": "^10.0.1", + "scope": null, + "spec": ">=10.0.1 <11.0.0", + "type": "range" + }, + "_requiredBy": [ + "/envify" + ], + "_resolved": "https://registry.npmjs.org/jstransform/-/jstransform-10.1.0.tgz", + "_shasum": "b4c49bf63f162c108b0348399a8737c713b0a83a", + "_shrinkwrap": null, + "_spec": "jstransform@^10.0.1", + "_where": "/Users/mromano/dev/react-sfs/node_modules/envify", + "bugs": { + "url": "https://github.com/facebook/jstransform/issues" + }, + "contributors": [ + { + "email": "jeffmo@fb.com", + "name": "Jeff Morrison" + } + ], + "dependencies": { + "base62": "0.1.1", + "esprima-fb": "13001.1001.0-dev-harmony-fb", + "source-map": "0.1.31" + }, + "description": "A simple AST visitor-based JS transformer", + "devDependencies": { + "jest-cli": "^0.2", + "jshint": "^2.5.10" + }, + "directories": {}, + "dist": { + "shasum": "b4c49bf63f162c108b0348399a8737c713b0a83a", + "tarball": "https://registry.npmjs.org/jstransform/-/jstransform-10.1.0.tgz" + }, + "engines": { + "node": ">=0.8.8" + }, + "gitHead": "90201cf6e40549bacf0efe8915600658a9564471", + "homepage": "https://github.com/facebook/jstransform", + "jest": { + "scriptPreprocessor": "/jestPreprocessor.js", + "setupEnvScriptFile": "/jestEnvironment.js", + "testPathIgnorePatterns": [ + "/node_modules/", + "/__tests__/[^/]*/.+" + ] + }, + "keywords": [ + "transformer", + "compiler", + "syntax", + "visitor" + ], + "licenses": [ + { + "type": "Apache-2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0" + } + ], + "main": "src/jstransform", + "maintainers": [ + { + "email": "jeff@anafx.com", + "name": "jeffmo" + }, + { + "email": "paul@oshannessy.com", + "name": "zpao" + }, + { + "email": "amjad.masad@gmail.com", + "name": "amasad" + }, + { + "email": "gabelevi@gmail.com", + "name": "gabelevi" + } + ], + "name": "jstransform", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/facebook/jstransform.git" + }, + "scripts": { + "prepublish": "jest && jshint --config=.jshintrc --exclude=node_modules .", + "test": "jest && jshint --config=.jshintrc --exclude=node_modules ." + }, + "version": "10.1.0" +} diff --git a/react-app/node_modules/jstransform/polyfill/Object.es6.js b/react-app/node_modules/jstransform/polyfill/Object.es6.js new file mode 100644 index 0000000000..77663fb94c --- /dev/null +++ b/react-app/node_modules/jstransform/polyfill/Object.es6.js @@ -0,0 +1,52 @@ +/** + * Copyright 2014 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @provides Object.es6 + * @polyfill + */ + +// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign + +if (!Object.assign) { + Object.assign = function(target, sources) { + if (target === null || target === undefined) { + throw new TypeError('Object.assign target cannot be null or undefined'); + } + + var to = Object(target); + var hasOwnProperty = Object.prototype.hasOwnProperty; + + for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) { + var nextSource = arguments[nextIndex]; + if (nextSource === null || nextSource === undefined) { + continue; + } + + var from = Object(nextSource); + + // We don't currently support accessors nor proxies. Therefore this + // copy cannot throw. If we ever supported this then we must handle + // exceptions and side-effects. + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + } + + return to; + }; +} diff --git a/react-app/node_modules/jstransform/src/__tests__/jstransform-test.js b/react-app/node_modules/jstransform/src/__tests__/jstransform-test.js new file mode 100644 index 0000000000..226b0bae2e --- /dev/null +++ b/react-app/node_modules/jstransform/src/__tests__/jstransform-test.js @@ -0,0 +1,481 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @emails jeffmo@fb.com + */ + +require('mock-modules').autoMockOff(); + +describe('jstransform', function() { + var transformFn; + var Syntax = require('esprima-fb').Syntax; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transformFn = require('../jstransform').transform; + }); + + function _runVisitor(source, nodeCount, visitor) { + var actualVisitationCount = 0; + function shimVisitor(traverse, node, path, state) { + actualVisitationCount++; + return visitor(traverse, node, path, state); + } + shimVisitor.test = visitor.test; + transformFn([shimVisitor], source); + expect(actualVisitationCount).toBe(nodeCount); + } + + function testScopeBoundary(source, localIdents, nodeCount, visitorTest) { + function visitor(traverse, node, path, state) { + var actualLocalIdents = Object.keys(state.localScope.identifiers); + expect(actualLocalIdents.sort()).toEqual(localIdents.sort()); + } + visitor.test = visitorTest; + _runVisitor(source, nodeCount, visitor); + } + + function testParentScope(source, parentIdents, nodeCount, visitorTest) { + function visitor(traverse, node, path, state) { + parentIdents = parentIdents && parentIdents.sort(); + var parentScope = state.localScope.parentScope; + var actualParentIdents = + parentScope && Object.keys(parentScope.identifiers).sort(); + expect(actualParentIdents).toEqual(parentIdents); + } + visitor.test = visitorTest; + _runVisitor(source, nodeCount, visitor); + } + + describe('closure scope boundaries', function() { + it('creates a scope boundary around Program scope', function() { + var source = + 'var foo;' + + 'var bar, baz;' + + 'function blah() {}'; + var idents = ['foo', 'bar', 'baz', 'blah']; + + testScopeBoundary(source, idents, 3, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + }); + + it('creates a scope boundary around FunctionDeclarations', function() { + var source = + 'var foo;' + + 'function blah() {' + + ' var bar;' + + ' function nested() {' + + ' var baz;' + + ' }' + + '}'; + var programIdents = ['foo', 'blah']; + var blahIdents = ['arguments', 'bar', 'nested']; + var nestedIdents = ['arguments', 'baz']; + + testScopeBoundary(source, programIdents, 2, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, blahIdents, 2, function(node, path) { + // All direct children of blah() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'blah'; + }); + + testScopeBoundary(source, nestedIdents, 1, function(node, path) { + // All direct children of nested() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'nested'; + }); + }); + + it('creates a scope boundary around MethodDefinitions', function() { + var source = + 'var foo;' + + 'class ClassA {' + + ' blah() {' + + ' var bar;' + + ' }' + + ' another() {' + + ' var baz;' + + ' }' + + '}'; + var programIdents = ['foo', 'ClassA']; + var blahIdents = ['arguments', 'bar']; + var anotherIdents = ['arguments', 'baz']; + + testScopeBoundary(source, programIdents, 2, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, blahIdents, 1, function(node, path) { + // All direct children of blah() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionExpression && + path[2] && path[2].type === Syntax.MethodDefinition && + path[2].key.name === 'blah'; + }); + + testScopeBoundary(source, anotherIdents, 1, function(node, path) { + // All direct children of another() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionExpression && + path[2] && path[2].type === Syntax.MethodDefinition && + path[2].key.name === 'another'; + }); + }); + + it('creates a scope boundary around concise ArrowFunc exprs', function() { + var source = + 'var foo;' + + 'var bar = baz => baz;'; + + var programIdents = ['foo', 'bar']; + var barIdents = ['arguments', 'baz']; + + testScopeBoundary(source, programIdents, 2, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, barIdents, 1, function(node, path) { + return path[0] && path[0].type === Syntax.ArrowFunctionExpression + && path[0].body === node; + }); + }); + + it('uses VariableDeclarations to determine scope boundary', function() { + var source = + 'var foo = 1;' + + 'function bar() {' + + ' foo++;' + + ' function baz() {' + + ' var foo = 2;' + + ' }' + + '}'; + var programIdents = ['foo', 'bar']; + var barIdents = ['arguments', 'baz']; + var bazIdents = ['arguments', 'foo']; + + testScopeBoundary(source, programIdents, 2, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, barIdents, 2, function(node, path) { + // All direct children of blah() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'bar'; + }); + + testScopeBoundary(source, bazIdents, 1, function(node, path) { + // All direct children of baz() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'baz'; + }); + }); + + it('includes function args in functions scope boundary', function() { + var source = + 'var foo;' + + 'function blah(bar) {' + + ' var baz;' + + '}' + + 'var blah2 = bar2 => {var baz;};' + + 'var blah3 = bar3 => bar3;'; + var programIdents = ['foo', 'blah', 'blah2', 'blah3']; + var blahIdents = ['arguments', 'bar', 'baz']; + var blah2Idents = ['arguments', 'bar2', 'baz']; + var blah3Idents = ['arguments', 'bar3']; + + testScopeBoundary(source, programIdents, 4, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, blahIdents, 1, function(node, path) { + // All direct children of blah() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'blah'; + }); + + testScopeBoundary(source, blah2Idents, 1, function(node, path) { + // All direct children of blah2() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.ArrowFunctionExpression && + path[2].id.name === 'blah2'; + }); + + testScopeBoundary(source, blah3Idents, 1, function(node, path) { + // All direct children of blah3() + return path[0] && path[0].type === Syntax.ArrowFunctionExpression && + path[0].body === node && + path[1].id.name === 'blah3'; + }); + }); + + it('includes rest param args in function scope boundaries', function() { + var source = + 'var foo;' + + 'function blah(...bar) {' + + ' var baz;' + + '}' + + 'var blah2 = (...bar2) => {var baz;};' + + 'var blah3 = (...bar3) => bar3;'; + var programIdents = ['foo', 'blah', 'blah2', 'blah3']; + var blahIdents = ['arguments', 'bar', 'baz']; + var blah2Idents = ['arguments', 'bar2', 'baz']; + var blah3Idents = ['arguments', 'bar3']; + + testScopeBoundary(source, programIdents, 4, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, blahIdents, 1, function(node, path) { + // All direct children of blah() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'blah'; + }); + + testScopeBoundary(source, blah2Idents, 1, function(node, path) { + // All direct children of blah2() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.ArrowFunctionExpression && + path[2].id.name === 'blah2'; + }); + + testScopeBoundary(source, blah3Idents, 1, function(node, path) { + // All direct children of blah3() + return path[0] && path[0].type === Syntax.ArrowFunctionExpression && + path[0].body === node && + path[1].id.name === 'blah3'; + }); + }); + + it('puts FunctionExpression names within function scope', function() { + var source = + 'var foo;' + + 'var bar = function baz() {' + + ' var blah;' + + '};'; + var programIdents = ['foo', 'bar']; + var bazIdents = ['arguments', 'baz', 'blah']; + + testScopeBoundary(source, programIdents, 2, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, bazIdents, 1, function(node, path) { + // All direct children of baz() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionExpression && + path[1].id.name === 'baz'; + }); + }); + }); + + describe('block scope boundaries', function() { + it('creates a scope boundary around CatchClauses with params', function() { + var source = + 'var blah = 0;' + + 'try {' + + '} catch (e) {' + + ' blah++;' + + '}'; + var programIdents = ['blah']; + var catchIdents = ['e']; + + testScopeBoundary(source, programIdents, 2, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, catchIdents, 1, function(node, path) { + // All direct children of catch(e) block + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.CatchClause; + }); + }); + + it('includes vars defined in CatchClauses in the parent scope', function() { + var source = + 'try {' + + '} catch (e) {' + + ' var blah;' + + '}'; + var programIdents = ['blah']; + var catchIdents = ['e']; + + testScopeBoundary(source, programIdents, 1, function(node, path) { + return path[0] && path[0].type === Syntax.Program; + }); + + testScopeBoundary(source, catchIdents, 1, function(node, path) { + // All direct children of catch(e) block + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.CatchClause; + }); + }); + }); + + describe('scope chain linking', function() { + it('links parent scope boundaries', function() { + var source = + 'var foo;' + + 'function blah() {' + + ' var bar;' + + ' function nested() {' + + ' var baz;' + + ' }' + + '}'; + var programIdents = ['foo', 'blah']; + var blahIdents = ['arguments', 'bar', 'nested']; + + testParentScope(source, programIdents, 2, function(node, path) { + // All direct children of blah() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'blah'; + }); + + testParentScope(source, blahIdents, 1, function(node, path) { + // All direct children of nested() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionDeclaration && + path[1].id.name === 'nested'; + }); + }); + + it('nests MethodDefinition boundaries under parent scope', function() { + var source = + 'var foo;' + + 'class ClassA {' + + ' blah() {' + + ' var bar;' + + ' }' + + '}'; + var programIdents = ['foo', 'ClassA']; + + testParentScope(source, programIdents, 1, function(node, path) { + // All direct children of blah() + return path[0] && path[0].type === Syntax.BlockStatement && + path[1] && path[1].type === Syntax.FunctionExpression && + path[2] && path[2].type === Syntax.MethodDefinition && + path[2].key.name === 'blah'; + }); + }); + }); + + describe('"use strict" tracking', function() { + function testStrictness(expectedStrict, source) { + var visitedNodes = 0; + function visitor(traverse, node, path, state) { + visitedNodes++; + expect(state.scopeIsStrict).toBe(expectedStrict); + } + visitor.test = function(node, path, state) { + return node.type === Syntax.Literal + && node.value === 'testStr'; + }; + transformFn([visitor], source); + expect(visitedNodes).toBe(1); + } + + it('detects program-level strictness', function() { + testStrictness(false, '"testStr";'); + testStrictness(true, '"use strict"; "testStr";'); + }); + + it('detects non-inherited strictness', function() { + testStrictness(true, [ + 'function foo() {', + ' "use strict";', + ' "testStr";', + '}' + ].join('\n')); + }); + + it('detects program-inherited strictness', function() { + testStrictness(true, [ + '"use strict";', + 'function foo() {', + ' "testStr";', + '}' + ].join('\n')); + }); + + it('detects function-inherited strictness', function() { + testStrictness(true, [ + 'function foo() {', + ' "use strict";', + ' function bar() {', + ' "testStr";', + ' }', + '}' + ].join('\n')); + }); + + it('does not detect sibling strictness', function() { + testStrictness(false, [ + 'function foo() {', + ' "use strict";', + '}', + 'function bar() {', + ' "testStr";', + '}' + ].join('\n')); + }); + }); + + describe('visitors', function() { + it('should visit nodes in order', function() { + var source = [ + '// Foo comment', + 'function foo() {}', + '', + '// Bar comment', + 'function bar() {}' + ].join('\n'); + + var actualNodes = []; + + function visitFunction(traverse, node, path, state) { + actualNodes.push([node.id.name, node.range[0]]); + } + visitFunction.test = function(node, path, state) { + return node.type === Syntax.FunctionDeclaration; + }; + + function visitComments(traverse, node, path, state) { + actualNodes.push([node.value, node.range[0]]); + } + visitComments.test = function(node, path, state) { + return node.type === 'Line'; + }; + + transformFn([visitComments, visitFunction], source); + + expect(actualNodes).toEqual([ + [' Foo comment', 0], + ['foo', 15], + [' Bar comment', 34], + ['bar', 49] + ]); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/src/__tests__/jstransform-utils-test.js b/react-app/node_modules/jstransform/src/__tests__/jstransform-utils-test.js new file mode 100644 index 0000000000..dda1a014b2 --- /dev/null +++ b/react-app/node_modules/jstransform/src/__tests__/jstransform-utils-test.js @@ -0,0 +1,66 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @emails jeffmo@fb.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('jstransform-utils', function() { + var transform, utils; + var Syntax = require('esprima-fb').Syntax; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transform = require('../jstransform').transform; + utils = require('../utils'); + }); + + describe('temporary variables', function() { + it('should inject temporary variables at the start of functions', function() { + function visitFunctionBlock(traverse, node, path, state) { + utils.catchup(node.range[0] + 1, state); + var x = utils.injectTempVar(state); + var y = utils.injectTempVar(state); + traverse(node.body, path, state); + utils.append('return ' + x + ' + ' + y + ';', state); + utils.catchup(node.range[1], state); + return false; + } + visitFunctionBlock.test = function(node, path, state) { + var parentType = path.length && path[0].type; + return node.type === Syntax.BlockStatement && ( + parentType === Syntax.FunctionDeclaration || + parentType === Syntax.FunctionExpression + ); + }; + + expect(transform( + [visitFunctionBlock], + 'var x = function() {};' + ).code).toEqual( + 'var x = function() {var $__0, $__1;return $__0 + $__1;};' + ); + + expect(eval(transform( + [visitFunctionBlock], + '2 + (function sum(x, y)\t{ $__0 = x; $__1 = y; }(3, 5))' + ).code)).toEqual(10); + }); + }); + +}); diff --git a/react-app/node_modules/jstransform/src/docblock.js b/react-app/node_modules/jstransform/src/docblock.js new file mode 100644 index 0000000000..7a2d29cda1 --- /dev/null +++ b/react-app/node_modules/jstransform/src/docblock.js @@ -0,0 +1,86 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var docblockRe = /^\s*(\/\*\*(.|\r?\n)*?\*\/)/; +var ltrimRe = /^\s*/; +/** + * @param {String} contents + * @return {String} + */ +function extract(contents) { + var match = contents.match(docblockRe); + if (match) { + return match[0].replace(ltrimRe, '') || ''; + } + return ''; +} + + +var commentStartRe = /^\/\*\*?/; +var commentEndRe = /\*+\/$/; +var wsRe = /[\t ]+/g; +var stringStartRe = /(\r?\n|^) *\*/g; +var multilineRe = /(?:^|\r?\n) *(@[^\r\n]*?) *\r?\n *([^@\r\n\s][^@\r\n]+?) *\r?\n/g; +var propertyRe = /(?:^|\r?\n) *@(\S+) *([^\r\n]*)/g; + +/** + * @param {String} contents + * @return {Array} + */ +function parse(docblock) { + docblock = docblock + .replace(commentStartRe, '') + .replace(commentEndRe, '') + .replace(wsRe, ' ') + .replace(stringStartRe, '$1'); + + // Normalize multi-line directives + var prev = ''; + while (prev != docblock) { + prev = docblock; + docblock = docblock.replace(multilineRe, "\n$1 $2\n"); + } + docblock = docblock.trim(); + + var result = []; + var match; + while (match = propertyRe.exec(docblock)) { + result.push([match[1], match[2]]); + } + + return result; +} + +/** + * Same as parse but returns an object of prop: value instead of array of paris + * If a property appers more than once the last one will be returned + * + * @param {String} contents + * @return {Object} + */ +function parseAsObject(docblock) { + var pairs = parse(docblock); + var result = {}; + for (var i = 0; i < pairs.length; i++) { + result[pairs[i][0]] = pairs[i][1]; + } + return result; +} + + +exports.extract = extract; +exports.parse = parse; +exports.parseAsObject = parseAsObject; diff --git a/react-app/node_modules/jstransform/src/jstransform.js b/react-app/node_modules/jstransform/src/jstransform.js new file mode 100644 index 0000000000..f188e69516 --- /dev/null +++ b/react-app/node_modules/jstransform/src/jstransform.js @@ -0,0 +1,299 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/*jslint node: true*/ +"use strict"; + +var esprima = require('esprima-fb'); +var utils = require('./utils'); + +var getBoundaryNode = utils.getBoundaryNode; +var declareIdentInScope = utils.declareIdentInLocalScope; +var initScopeMetadata = utils.initScopeMetadata; +var Syntax = esprima.Syntax; + +/** + * @param {object} node + * @param {object} parentNode + * @return {boolean} + */ +function _nodeIsClosureScopeBoundary(node, parentNode) { + if (node.type === Syntax.Program) { + return true; + } + + var parentIsFunction = + parentNode.type === Syntax.FunctionDeclaration + || parentNode.type === Syntax.FunctionExpression + || parentNode.type === Syntax.ArrowFunctionExpression; + + var parentIsCurlylessArrowFunc = + parentNode.type === Syntax.ArrowFunctionExpression + && node === parentNode.body; + + return parentIsFunction + && (node.type === Syntax.BlockStatement || parentIsCurlylessArrowFunc); +} + +function _nodeIsBlockScopeBoundary(node, parentNode) { + if (node.type === Syntax.Program) { + return false; + } + + return node.type === Syntax.BlockStatement + && parentNode.type === Syntax.CatchClause; +} + +/** + * @param {object} node + * @param {array} path + * @param {object} state + */ +function traverse(node, path, state) { + /*jshint -W004*/ + // Create a scope stack entry if this is the first node we've encountered in + // its local scope + var startIndex = null; + var parentNode = path[0]; + if (!Array.isArray(node) && state.localScope.parentNode !== parentNode) { + if (_nodeIsClosureScopeBoundary(node, parentNode)) { + var scopeIsStrict = state.scopeIsStrict; + if (!scopeIsStrict + && (node.type === Syntax.BlockStatement + || node.type === Syntax.Program)) { + scopeIsStrict = + node.body.length > 0 + && node.body[0].type === Syntax.ExpressionStatement + && node.body[0].expression.type === Syntax.Literal + && node.body[0].expression.value === 'use strict'; + } + + if (node.type === Syntax.Program) { + startIndex = state.g.buffer.length; + state = utils.updateState(state, { + scopeIsStrict: scopeIsStrict + }); + } else { + startIndex = state.g.buffer.length + 1; + state = utils.updateState(state, { + localScope: { + parentNode: parentNode, + parentScope: state.localScope, + identifiers: {}, + tempVarIndex: 0, + tempVars: [] + }, + scopeIsStrict: scopeIsStrict + }); + + // All functions have an implicit 'arguments' object in scope + declareIdentInScope('arguments', initScopeMetadata(node), state); + + // Include function arg identifiers in the scope boundaries of the + // function + if (parentNode.params.length > 0) { + var param; + var metadata = initScopeMetadata(parentNode, path.slice(1), path[0]); + for (var i = 0; i < parentNode.params.length; i++) { + param = parentNode.params[i]; + if (param.type === Syntax.Identifier) { + declareIdentInScope(param.name, metadata, state); + } + } + } + + // Include rest arg identifiers in the scope boundaries of their + // functions + if (parentNode.rest) { + var metadata = initScopeMetadata( + parentNode, + path.slice(1), + path[0] + ); + declareIdentInScope(parentNode.rest.name, metadata, state); + } + + // Named FunctionExpressions scope their name within the body block of + // themselves only + if (parentNode.type === Syntax.FunctionExpression && parentNode.id) { + var metaData = + initScopeMetadata(parentNode, path.parentNodeslice, parentNode); + declareIdentInScope(parentNode.id.name, metaData, state); + } + } + + // Traverse and find all local identifiers in this closure first to + // account for function/variable declaration hoisting + collectClosureIdentsAndTraverse(node, path, state); + } + + if (_nodeIsBlockScopeBoundary(node, parentNode)) { + startIndex = state.g.buffer.length; + state = utils.updateState(state, { + localScope: { + parentNode: parentNode, + parentScope: state.localScope, + identifiers: {}, + tempVarIndex: 0, + tempVars: [] + } + }); + + if (parentNode.type === Syntax.CatchClause) { + var metadata = initScopeMetadata( + parentNode, + path.slice(1), + parentNode + ); + declareIdentInScope(parentNode.param.name, metadata, state); + } + collectBlockIdentsAndTraverse(node, path, state); + } + } + + // Only catchup() before and after traversing a child node + function traverser(node, path, state) { + node.range && utils.catchup(node.range[0], state); + traverse(node, path, state); + node.range && utils.catchup(node.range[1], state); + } + + utils.analyzeAndTraverse(walker, traverser, node, path, state); + + // Inject temp variables into the scope. + if (startIndex !== null) { + utils.injectTempVarDeclarations(state, startIndex); + } +} + +function collectClosureIdentsAndTraverse(node, path, state) { + utils.analyzeAndTraverse( + visitLocalClosureIdentifiers, + collectClosureIdentsAndTraverse, + node, + path, + state + ); +} + +function collectBlockIdentsAndTraverse(node, path, state) { + utils.analyzeAndTraverse( + visitLocalBlockIdentifiers, + collectBlockIdentsAndTraverse, + node, + path, + state + ); +} + +function visitLocalClosureIdentifiers(node, path, state) { + var metaData; + switch (node.type) { + case Syntax.ArrowFunctionExpression: + case Syntax.FunctionExpression: + // Function expressions don't get their names (if there is one) added to + // the closure scope they're defined in + return false; + case Syntax.ClassDeclaration: + case Syntax.ClassExpression: + case Syntax.FunctionDeclaration: + if (node.id) { + metaData = initScopeMetadata(getBoundaryNode(path), path.slice(), node); + declareIdentInScope(node.id.name, metaData, state); + } + return false; + case Syntax.VariableDeclarator: + // Variables have function-local scope + if (path[0].kind === 'var') { + metaData = initScopeMetadata(getBoundaryNode(path), path.slice(), node); + declareIdentInScope(node.id.name, metaData, state); + } + break; + } +} + +function visitLocalBlockIdentifiers(node, path, state) { + // TODO: Support 'let' here...maybe...one day...or something... + if (node.type === Syntax.CatchClause) { + return false; + } +} + +function walker(node, path, state) { + var visitors = state.g.visitors; + for (var i = 0; i < visitors.length; i++) { + if (visitors[i].test(node, path, state)) { + return visitors[i](traverse, node, path, state); + } + } +} + +var _astCache = {}; + +function getAstForSource(source, options) { + if (_astCache[source] && !options.disableAstCache) { + return _astCache[source]; + } + var ast = esprima.parse(source, { + comment: true, + loc: true, + range: true, + sourceType: options.sourceType + }); + if (!options.disableAstCache) { + _astCache[source] = ast; + } + return ast; +} + +/** + * Applies all available transformations to the source + * @param {array} visitors + * @param {string} source + * @param {?object} options + * @return {object} + */ +function transform(visitors, source, options) { + options = options || {}; + var ast; + try { + ast = getAstForSource(source, options); + } catch (e) { + e.message = 'Parse Error: ' + e.message; + throw e; + } + var state = utils.createState(source, ast, options); + state.g.visitors = visitors; + + if (options.sourceMap) { + var SourceMapGenerator = require('source-map').SourceMapGenerator; + state.g.sourceMap = new SourceMapGenerator({file: options.filename || 'transformed.js'}); + } + + traverse(ast, [], state); + utils.catchup(source.length, state); + + var ret = {code: state.g.buffer, extra: state.g.extra}; + if (options.sourceMap) { + ret.sourceMap = state.g.sourceMap; + ret.sourceMapFilename = options.filename || 'source.js'; + } + return ret; +} + +exports.transform = transform; +exports.Syntax = Syntax; diff --git a/react-app/node_modules/jstransform/src/utils.js b/react-app/node_modules/jstransform/src/utils.js new file mode 100644 index 0000000000..e9c544cffe --- /dev/null +++ b/react-app/node_modules/jstransform/src/utils.js @@ -0,0 +1,708 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/*jslint node: true*/ +var Syntax = require('esprima-fb').Syntax; +var leadingIndentRegexp = /(^|\n)( {2}|\t)/g; +var nonWhiteRegexp = /(\S)/g; + +/** + * A `state` object represents the state of the parser. It has "local" and + * "global" parts. Global contains parser position, source, etc. Local contains + * scope based properties like current class name. State should contain all the + * info required for transformation. It's the only mandatory object that is + * being passed to every function in transform chain. + * + * @param {string} source + * @param {object} transformOptions + * @return {object} + */ +function createState(source, rootNode, transformOptions) { + return { + /** + * A tree representing the current local scope (and its lexical scope chain) + * Useful for tracking identifiers from parent scopes, etc. + * @type {Object} + */ + localScope: { + parentNode: rootNode, + parentScope: null, + identifiers: {}, + tempVarIndex: 0, + tempVars: [] + }, + /** + * The name (and, if applicable, expression) of the super class + * @type {Object} + */ + superClass: null, + /** + * The namespace to use when munging identifiers + * @type {String} + */ + mungeNamespace: '', + /** + * Ref to the node for the current MethodDefinition + * @type {Object} + */ + methodNode: null, + /** + * Ref to the node for the FunctionExpression of the enclosing + * MethodDefinition + * @type {Object} + */ + methodFuncNode: null, + /** + * Name of the enclosing class + * @type {String} + */ + className: null, + /** + * Whether we're currently within a `strict` scope + * @type {Bool} + */ + scopeIsStrict: null, + /** + * Indentation offset + * @type {Number} + */ + indentBy: 0, + /** + * Global state (not affected by updateState) + * @type {Object} + */ + g: { + /** + * A set of general options that transformations can consider while doing + * a transformation: + * + * - minify + * Specifies that transformation steps should do their best to minify + * the output source when possible. This is useful for places where + * minification optimizations are possible with higher-level context + * info than what jsxmin can provide. + * + * For example, the ES6 class transform will minify munged private + * variables if this flag is set. + */ + opts: transformOptions, + /** + * Current position in the source code + * @type {Number} + */ + position: 0, + /** + * Auxiliary data to be returned by transforms + * @type {Object} + */ + extra: {}, + /** + * Buffer containing the result + * @type {String} + */ + buffer: '', + /** + * Source that is being transformed + * @type {String} + */ + source: source, + + /** + * Cached parsed docblock (see getDocblock) + * @type {object} + */ + docblock: null, + + /** + * Whether the thing was used + * @type {Boolean} + */ + tagNamespaceUsed: false, + + /** + * If using bolt xjs transformation + * @type {Boolean} + */ + isBolt: undefined, + + /** + * Whether to record source map (expensive) or not + * @type {SourceMapGenerator|null} + */ + sourceMap: null, + + /** + * Filename of the file being processed. Will be returned as a source + * attribute in the source map + */ + sourceMapFilename: 'source.js', + + /** + * Only when source map is used: last line in the source for which + * source map was generated + * @type {Number} + */ + sourceLine: 1, + + /** + * Only when source map is used: last line in the buffer for which + * source map was generated + * @type {Number} + */ + bufferLine: 1, + + /** + * The top-level Program AST for the original file. + */ + originalProgramAST: null, + + sourceColumn: 0, + bufferColumn: 0 + } + }; +} + +/** + * Updates a copy of a given state with "update" and returns an updated state. + * + * @param {object} state + * @param {object} update + * @return {object} + */ +function updateState(state, update) { + var ret = Object.create(state); + Object.keys(update).forEach(function(updatedKey) { + ret[updatedKey] = update[updatedKey]; + }); + return ret; +} + +/** + * Given a state fill the resulting buffer from the original source up to + * the end + * + * @param {number} end + * @param {object} state + * @param {?function} contentTransformer Optional callback to transform newly + * added content. + */ +function catchup(end, state, contentTransformer) { + if (end < state.g.position) { + // cannot move backwards + return; + } + var source = state.g.source.substring(state.g.position, end); + var transformed = updateIndent(source, state); + if (state.g.sourceMap && transformed) { + // record where we are + state.g.sourceMap.addMapping({ + generated: { line: state.g.bufferLine, column: state.g.bufferColumn }, + original: { line: state.g.sourceLine, column: state.g.sourceColumn }, + source: state.g.sourceMapFilename + }); + + // record line breaks in transformed source + var sourceLines = source.split('\n'); + var transformedLines = transformed.split('\n'); + // Add line break mappings between last known mapping and the end of the + // added piece. So for the code piece + // (foo, bar); + // > var x = 2; + // > var b = 3; + // var c = + // only add lines marked with ">": 2, 3. + for (var i = 1; i < sourceLines.length - 1; i++) { + state.g.sourceMap.addMapping({ + generated: { line: state.g.bufferLine, column: 0 }, + original: { line: state.g.sourceLine, column: 0 }, + source: state.g.sourceMapFilename + }); + state.g.sourceLine++; + state.g.bufferLine++; + } + // offset for the last piece + if (sourceLines.length > 1) { + state.g.sourceLine++; + state.g.bufferLine++; + state.g.sourceColumn = 0; + state.g.bufferColumn = 0; + } + state.g.sourceColumn += sourceLines[sourceLines.length - 1].length; + state.g.bufferColumn += + transformedLines[transformedLines.length - 1].length; + } + state.g.buffer += + contentTransformer ? contentTransformer(transformed) : transformed; + state.g.position = end; +} + +/** + * Returns original source for an AST node. + * @param {object} node + * @param {object} state + * @return {string} + */ +function getNodeSourceText(node, state) { + return state.g.source.substring(node.range[0], node.range[1]); +} + +function _replaceNonWhite(value) { + return value.replace(nonWhiteRegexp, ' '); +} + +/** + * Removes all non-whitespace characters + */ +function _stripNonWhite(value) { + return value.replace(nonWhiteRegexp, ''); +} + +/** + * Finds the position of the next instance of the specified syntactic char in + * the pending source. + * + * NOTE: This will skip instances of the specified char if they sit inside a + * comment body. + * + * NOTE: This function also assumes that the buffer's current position is not + * already within a comment or a string. This is rarely the case since all + * of the buffer-advancement utility methods tend to be used on syntactic + * nodes' range values -- but it's a small gotcha that's worth mentioning. + */ +function getNextSyntacticCharOffset(char, state) { + var pendingSource = state.g.source.substring(state.g.position); + var pendingSourceLines = pendingSource.split('\n'); + + var charOffset = 0; + var line; + var withinBlockComment = false; + var withinString = false; + lineLoop: while ((line = pendingSourceLines.shift()) !== undefined) { + var lineEndPos = charOffset + line.length; + charLoop: for (; charOffset < lineEndPos; charOffset++) { + var currChar = pendingSource[charOffset]; + if (currChar === '"' || currChar === '\'') { + withinString = !withinString; + continue charLoop; + } else if (withinString) { + continue charLoop; + } else if (charOffset + 1 < lineEndPos) { + var nextTwoChars = currChar + line[charOffset + 1]; + if (nextTwoChars === '//') { + charOffset = lineEndPos + 1; + continue lineLoop; + } else if (nextTwoChars === '/*') { + withinBlockComment = true; + charOffset += 1; + continue charLoop; + } else if (nextTwoChars === '*/') { + withinBlockComment = false; + charOffset += 1; + continue charLoop; + } + } + + if (!withinBlockComment && currChar === char) { + return charOffset + state.g.position; + } + } + + // Account for '\n' + charOffset++; + withinString = false; + } + + throw new Error('`' + char + '` not found!'); +} + +/** + * Catches up as `catchup` but replaces non-whitespace chars with spaces. + */ +function catchupWhiteOut(end, state) { + catchup(end, state, _replaceNonWhite); +} + +/** + * Catches up as `catchup` but removes all non-whitespace characters. + */ +function catchupWhiteSpace(end, state) { + catchup(end, state, _stripNonWhite); +} + +/** + * Removes all non-newline characters + */ +var reNonNewline = /[^\n]/g; +function stripNonNewline(value) { + return value.replace(reNonNewline, function() { + return ''; + }); +} + +/** + * Catches up as `catchup` but removes all non-newline characters. + * + * Equivalent to appending as many newlines as there are in the original source + * between the current position and `end`. + */ +function catchupNewlines(end, state) { + catchup(end, state, stripNonNewline); +} + + +/** + * Same as catchup but does not touch the buffer + * + * @param {number} end + * @param {object} state + */ +function move(end, state) { + // move the internal cursors + if (state.g.sourceMap) { + if (end < state.g.position) { + state.g.position = 0; + state.g.sourceLine = 1; + state.g.sourceColumn = 0; + } + + var source = state.g.source.substring(state.g.position, end); + var sourceLines = source.split('\n'); + if (sourceLines.length > 1) { + state.g.sourceLine += sourceLines.length - 1; + state.g.sourceColumn = 0; + } + state.g.sourceColumn += sourceLines[sourceLines.length - 1].length; + } + state.g.position = end; +} + +/** + * Appends a string of text to the buffer + * + * @param {string} str + * @param {object} state + */ +function append(str, state) { + if (state.g.sourceMap && str) { + state.g.sourceMap.addMapping({ + generated: { line: state.g.bufferLine, column: state.g.bufferColumn }, + original: { line: state.g.sourceLine, column: state.g.sourceColumn }, + source: state.g.sourceMapFilename + }); + var transformedLines = str.split('\n'); + if (transformedLines.length > 1) { + state.g.bufferLine += transformedLines.length - 1; + state.g.bufferColumn = 0; + } + state.g.bufferColumn += + transformedLines[transformedLines.length - 1].length; + } + state.g.buffer += str; +} + +/** + * Update indent using state.indentBy property. Indent is measured in + * double spaces. Updates a single line only. + * + * @param {string} str + * @param {object} state + * @return {string} + */ +function updateIndent(str, state) { + /*jshint -W004*/ + var indentBy = state.indentBy; + if (indentBy < 0) { + for (var i = 0; i < -indentBy; i++) { + str = str.replace(leadingIndentRegexp, '$1'); + } + } else { + for (var i = 0; i < indentBy; i++) { + str = str.replace(leadingIndentRegexp, '$1$2$2'); + } + } + return str; +} + +/** + * Calculates indent from the beginning of the line until "start" or the first + * character before start. + * @example + * " foo.bar()" + * ^ + * start + * indent will be " " + * + * @param {number} start + * @param {object} state + * @return {string} + */ +function indentBefore(start, state) { + var end = start; + start = start - 1; + + while (start > 0 && state.g.source[start] != '\n') { + if (!state.g.source[start].match(/[ \t]/)) { + end = start; + } + start--; + } + return state.g.source.substring(start + 1, end); +} + +function getDocblock(state) { + if (!state.g.docblock) { + var docblock = require('./docblock'); + state.g.docblock = + docblock.parseAsObject(docblock.extract(state.g.source)); + } + return state.g.docblock; +} + +function identWithinLexicalScope(identName, state, stopBeforeNode) { + var currScope = state.localScope; + while (currScope) { + if (currScope.identifiers[identName] !== undefined) { + return true; + } + + if (stopBeforeNode && currScope.parentNode === stopBeforeNode) { + break; + } + + currScope = currScope.parentScope; + } + return false; +} + +function identInLocalScope(identName, state) { + return state.localScope.identifiers[identName] !== undefined; +} + +/** + * @param {object} boundaryNode + * @param {?array} path + * @return {?object} node + */ +function initScopeMetadata(boundaryNode, path, node) { + return { + boundaryNode: boundaryNode, + bindingPath: path, + bindingNode: node + }; +} + +function declareIdentInLocalScope(identName, metaData, state) { + state.localScope.identifiers[identName] = { + boundaryNode: metaData.boundaryNode, + path: metaData.bindingPath, + node: metaData.bindingNode, + state: Object.create(state) + }; +} + +function getLexicalBindingMetadata(identName, state) { + var currScope = state.localScope; + while (currScope) { + if (currScope.identifiers[identName] !== undefined) { + return currScope.identifiers[identName]; + } + + currScope = currScope.parentScope; + } +} + +function getLocalBindingMetadata(identName, state) { + return state.localScope.identifiers[identName]; +} + +/** + * Apply the given analyzer function to the current node. If the analyzer + * doesn't return false, traverse each child of the current node using the given + * traverser function. + * + * @param {function} analyzer + * @param {function} traverser + * @param {object} node + * @param {array} path + * @param {object} state + */ +function analyzeAndTraverse(analyzer, traverser, node, path, state) { + if (node.type) { + if (analyzer(node, path, state) === false) { + return; + } + path.unshift(node); + } + + getOrderedChildren(node).forEach(function(child) { + traverser(child, path, state); + }); + + node.type && path.shift(); +} + +/** + * It is crucial that we traverse in order, or else catchup() on a later + * node that is processed out of order can move the buffer past a node + * that we haven't handled yet, preventing us from modifying that node. + * + * This can happen when a node has multiple properties containing children. + * For example, XJSElement nodes have `openingElement`, `closingElement` and + * `children`. If we traverse `openingElement`, then `closingElement`, then + * when we get to `children`, the buffer has already caught up to the end of + * the closing element, after the children. + * + * This is basically a Schwartzian transform. Collects an array of children, + * each one represented as [child, startIndex]; sorts the array by start + * index; then traverses the children in that order. + */ +function getOrderedChildren(node) { + var queue = []; + for (var key in node) { + if (node.hasOwnProperty(key)) { + enqueueNodeWithStartIndex(queue, node[key]); + } + } + queue.sort(function(a, b) { return a[1] - b[1]; }); + return queue.map(function(pair) { return pair[0]; }); +} + +/** + * Helper function for analyzeAndTraverse which queues up all of the children + * of the given node. + * + * Children can also be found in arrays, so we basically want to merge all of + * those arrays together so we can sort them and then traverse the children + * in order. + * + * One example is the Program node. It contains `body` and `comments`, both + * arrays. Lexographically, comments are interspersed throughout the body + * nodes, but esprima's AST groups them together. + */ +function enqueueNodeWithStartIndex(queue, node) { + if (typeof node !== 'object' || node === null) { + return; + } + if (node.range) { + queue.push([node, node.range[0]]); + } else if (Array.isArray(node)) { + for (var ii = 0; ii < node.length; ii++) { + enqueueNodeWithStartIndex(queue, node[ii]); + } + } +} + +/** + * Checks whether a node or any of its sub-nodes contains + * a syntactic construct of the passed type. + * @param {object} node - AST node to test. + * @param {string} type - node type to lookup. + */ +function containsChildOfType(node, type) { + return containsChildMatching(node, function(node) { + return node.type === type; + }); +} + +function containsChildMatching(node, matcher) { + var foundMatchingChild = false; + function nodeTypeAnalyzer(node) { + if (matcher(node) === true) { + foundMatchingChild = true; + return false; + } + } + function nodeTypeTraverser(child, path, state) { + if (!foundMatchingChild) { + foundMatchingChild = containsChildMatching(child, matcher); + } + } + analyzeAndTraverse( + nodeTypeAnalyzer, + nodeTypeTraverser, + node, + [] + ); + return foundMatchingChild; +} + +var scopeTypes = {}; +scopeTypes[Syntax.ArrowFunctionExpression] = true; +scopeTypes[Syntax.FunctionExpression] = true; +scopeTypes[Syntax.FunctionDeclaration] = true; +scopeTypes[Syntax.Program] = true; + +function getBoundaryNode(path) { + for (var ii = 0; ii < path.length; ++ii) { + if (scopeTypes[path[ii].type]) { + return path[ii]; + } + } + throw new Error( + 'Expected to find a node with one of the following types in path:\n' + + JSON.stringify(Object.keys(scopeTypes)) + ); +} + +function getTempVar(tempVarIndex) { + return '$__' + tempVarIndex; +} + +function injectTempVar(state) { + var tempVar = '$__' + (state.localScope.tempVarIndex++); + state.localScope.tempVars.push(tempVar); + return tempVar; +} + +function injectTempVarDeclarations(state, index) { + if (state.localScope.tempVars.length) { + state.g.buffer = + state.g.buffer.slice(0, index) + + 'var ' + state.localScope.tempVars.join(', ') + ';' + + state.g.buffer.slice(index); + state.localScope.tempVars = []; + } +} + +exports.analyzeAndTraverse = analyzeAndTraverse; +exports.append = append; +exports.catchup = catchup; +exports.catchupNewlines = catchupNewlines; +exports.catchupWhiteOut = catchupWhiteOut; +exports.catchupWhiteSpace = catchupWhiteSpace; +exports.containsChildMatching = containsChildMatching; +exports.containsChildOfType = containsChildOfType; +exports.createState = createState; +exports.declareIdentInLocalScope = declareIdentInLocalScope; +exports.getBoundaryNode = getBoundaryNode; +exports.getDocblock = getDocblock; +exports.getLexicalBindingMetadata = getLexicalBindingMetadata; +exports.getLocalBindingMetadata = getLocalBindingMetadata; +exports.getNextSyntacticCharOffset = getNextSyntacticCharOffset; +exports.getNodeSourceText = getNodeSourceText; +exports.getOrderedChildren = getOrderedChildren; +exports.getTempVar = getTempVar; +exports.identInLocalScope = identInLocalScope; +exports.identWithinLexicalScope = identWithinLexicalScope; +exports.indentBefore = indentBefore; +exports.initScopeMetadata = initScopeMetadata; +exports.injectTempVar = injectTempVar; +exports.injectTempVarDeclarations = injectTempVarDeclarations; +exports.move = move; +exports.scopeTypes = scopeTypes; +exports.updateIndent = updateIndent; +exports.updateState = updateState; diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-arrow-function-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-arrow-function-visitors-test.js new file mode 100644 index 0000000000..f6592bc499 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-arrow-function-visitors-test.js @@ -0,0 +1,239 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @emails dmitrys@fb.com + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('es6ArrowFunctionsTransform', function() { + var transformFn; + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + visitors = require('../es6-arrow-function-visitors').visitorList; + transformFn = require('../../src/jstransform').transform; + }); + + function transform(code) { + return transformFn(visitors, code).code; + } + + function expectTransform(code, result) { + expect(transform(code)).toEqual(result); + } + + it('should capture correct this value at different levels', function() { + var code = transform([ + 'var foo = {', + ' createFooGetter: function() {', + ' return (x) => [x, this];', // captures foo + ' },', + ' getParentThis: () => this', // captures parent this + '};' + ].join('\n')); + + eval(code); + + expect(typeof foo.createFooGetter).toBe('function'); + expect(typeof foo.createFooGetter()).toBe('function'); + expect(typeof foo.getParentThis).toBe('function'); + + expect(foo.getParentThis()).toEqual(this); + expect(foo.createFooGetter()(10)).toEqual([10, foo]); + }); + + it('should map an array using arrow capturing this value', function() { + this.factor = 10; + + var code = transform( + '[1, 2, 3].map(x => x * x * this.factor);' + ); + + expect(eval(code)).toEqual([10, 40, 90]); + }); + + it('binds if any `super` keyword is referenced', function() { + var code = transform( + 'var fn=x=>super;' + ); + + // We have to do a source text comparison here because `super` is a reserved + // keyword (so we can't eval it). + expect(code).toEqual('var fn=function(x){return super;}.bind(this);'); + }); + + it('should filter an array using arrow with two params', function() { + this.factor = 0; + + var code = transform([ + '[1, 2, 3].filter((v, idx) => {', + ' if (idx > 1 && this.factor > 0) {', + ' return true;', + ' }', + ' this.factor++;', + ' return false;', + '});' + ].join('\n')); + + expect(eval(code)).toEqual([3]); + }); + + it('should fetch this value data from nested arrow', function() { + var code = transform([ + '({', + ' bird: 22,', + ' run: function() {', + ' return () => () => this.bird;', + ' }', + '}).run()()();' + ].join('\n')); + + expect(eval(code)).toEqual(22); + }); + + // Syntax tests. + + it('should correctly transform arrows', function() { + // 0 params, expression. + expectTransform( + '() => this.value;', + '(function() {return this.value;}.bind(this));' + ); + + // 0 params, expression wrapped in parens + expectTransform( + '() => (this.value);', + '(function() {return this.value;}.bind(this));' + ); + + // 1 param, no-parens, expression, no this. + expectTransform( + 'x => x * x;', + '(function(x) {return x * x;});' + ); + + // 1 param, parens, expression, as argument, no this. + expectTransform( + 'map((x) => x * x);', + 'map(function(x) {return x * x;});' + ); + + // 2 params, block, as argument, nested. + expectTransform( + 'makeRequest((response, error) => {'.concat( + ' return this.update(data => this.onData(data), response);', + '});'), + 'makeRequest(function(response, error) {'.concat( + ' return this.update(function(data) {return this.onData(data);}.bind(this), response);', + '}.bind(this));') + ); + + // Assignment to a var, simple, 1 param. + expectTransform( + 'var action = (value) => this.performAction(value);', + 'var action = function(value) {return this.performAction(value);}.bind(this);' + ); + + // Preserve lines transforming ugly code. + expectTransform([ + '(', + '', + '', + ' x,', + ' y', + '', + ')', + '', + ' =>', + '', + ' {', + ' return x + y;', + '};' + ].join('\n'), [ + '(function(', + '', + '', + ' x,', + ' y)', + '', + '', + '', + ' ', + '', + ' {', + ' return x + y;', + '});' + ].join('\n')); + + // Preserve line numbers with single parens-free param ugly code. + expectTransform([ + 'x', + '', + ' =>', + ' x;' + ].join('\n'), [ + '(function(x)', + '', + ' ', + ' {return x;});' + ].join('\n')); + + // Preserve line numbers with single parens param ugly code. + expectTransform([ + '(', + '', + ' x', + '', + ')', + '', + ' =>', + ' x;' + ].join('\n'), [ + '(function(', + '', + ' x)', + '', + '', + '', + ' ', + ' {return x;});' + ].join('\n')); + + // Preserve line numbers with parens around expression. + expectTransform([ + '(x) => (', + ' x', + ');' + ].join('\n'), [ + '(function(x) ', + ' {return x;}', + ');' + ].join('\n')); + + // Preserve typechecker annotation. + expectTransform( + '(/*string*/foo, /*bool*/bar) => foo;', + '(function(/*string*/foo, /*bool*/bar) {return foo;});' + ); + }); +}); + diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-call-spread-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-call-spread-visitors-test.js new file mode 100644 index 0000000000..3161f7486a --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-call-spread-visitors-test.js @@ -0,0 +1,96 @@ +/** + * @emails sema@fb.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('es6-call-spread-visitors', function() { + var transformFn; + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transformFn = require('../../src/jstransform').transform; + + visitors = require('../es6-call-spread-visitors').visitorList; + }); + + function transform(code, options) { + return transformFn(visitors, code, options).code; + } + + it('should spread given data with context', function() { + expect(transform('Math.max(1,\t[2], 3, ...[4, 5, 6])')) + .toEqual('var $__0;($__0 = Math).max.apply($__0, [1,\t[2], 3].concat([4, 5, 6]))'); + }); + + it('should avoid unnecessary concat call', function() { + expect(transform('window.Math.max(...list)')) + .toEqual('var $__0;($__0 = window.Math).max.apply($__0, list)'); + }); + + it('should default to null context', function() { + expect(transform('max(1, 2, ...list)')) + .toEqual('max.apply(null, [1, 2].concat(list))'); + }); + + it('should handle computed method names', function() { + expect(transform('Math["m" + (0 ? "in" : "ax")](1, 2, ...list)')) + .toEqual('var $__0;($__0 = Math)["m" + (0 ? "in" : "ax")].apply($__0, [1, 2].concat(list))'); + }); + + it('should handle immediately invoked function expressions', function() { + expect(transform('(function(a, b, c) { return a+b+c; })(1, 2, ...more)')) + .toEqual('(function(a, b, c) { return a+b+c; }).apply(null, [1, 2].concat(more))'); + }); + + it('should spread while creating new instances', function() { + expect(transform('new Set(1, 2, ...list)')) + .toEqual('new (Function.prototype.bind.apply(Set, [null, 1, 2].concat(list)))'); + }); + + it('should create temporary variables when necessary in program scope', function() { + expect(transform('foo().bar(arg1, arg2, ...more)')) + .toEqual('var $__0;($__0 = foo()).bar.apply($__0, [arg1, arg2].concat(more))'); + }); + + it('should create temporary variables when necessary in function scope', function() { + expect(transform('function fn(){ return foo().bar(arg1, arg2, ...more); }')) + .toEqual('function fn(){var $__0; return ($__0 = foo()).bar.apply($__0, [arg1, arg2].concat(more)); }'); + }); + + it('should not evaluate context more than once', function() { + var code = transform([ + 'var obj = {', + ' calls: 0,', + ' get context() {', + ' this.calls++;', + ' return {', + ' add: function(a, b) { return a + b; }', + ' };', + ' }', + '};', + 'var nums = [1, 2];', + 'obj.context.add(...nums);', + 'obj.calls === 1;', + ].join('\n')); + expect(eval(code)).toEqual(true); + }); + + it('should transform nested spread expressions', function() { + var code = transform([ + 'function getBase() {', + ' return {', + ' getParams: function(a, b) {', + ' return [a, b];', + ' }', + ' };', + '}', + '[].concat(...getBase().getParams(...[1, 2, 3])).join(" ");', + ].join('\n')); + expect(eval(code)).toEqual("1 2"); + }); + +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-class-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-class-visitors-test.js new file mode 100644 index 0000000000..3555024203 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-class-visitors-test.js @@ -0,0 +1,1515 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @emails jeffmo@fb.com + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +jest.autoMockOff(); + +describe('es6-classes', function() { + var transformFn; + var classVisitors; + var arrowFunctionVisitors; + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + transformFn = require('../../src/jstransform').transform; + + classVisitors = require('../es6-class-visitors').visitorList; + arrowFunctionVisitors = require('../es6-arrow-function-visitors').visitorList; + + visitors = classVisitors.concat(arrowFunctionVisitors); + }); + + function transform(code, opts) { + return transformFn(visitors, code, opts).code; + } + + describe('ClassDeclarations', function() { + describe('preserves line numbers', function() { + it('does not add "use strict" unless necessary', function() { + var code = [ + 'function strictStuff() {', + ' "use strict";', + ' class A {', + ' foo() {}', + ' }', + '}', + 'class B {', + ' bar() {', + ' class C {}', + ' }', + '}' + ].join('\n'); + + var expected = [ + 'function strictStuff() {', + ' "use strict";', + ' function A(){}', + ' Object.defineProperty(A.prototype,"foo",{writable:true,configurable:true,value:function() {}});', + ' ', + '}', + 'function B(){"use strict";}', + ' Object.defineProperty(B.prototype,"bar",{writable:true,configurable:true,value:function() {"use strict";', + ' function C(){}', + ' }});', + '' + ].join('\n'); + + expect(transform(code)).toBe(expected); + }); + + it('preserves lines with no inheritance', function() { + var code = [ + '"use strict";', + 'class Foo {', + ' foo() {', + ' ', + ' ', + ' }', + '', + ' constructor(p1,', + ' p2) {', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' bar(){}', + ' static baz() {', + '}', + '}' + ].join('\n'); + + var expected = [ + '"use strict";', + '', + ' Object.defineProperty(Foo.prototype,"foo",{writable:true,configurable:true,value:function() {', + ' ', + ' ', + ' }});', + '', + ' function Foo(p1,', + ' p2) {', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' Object.defineProperty(Foo.prototype,"bar",{writable:true,configurable:true,value:function(){}});', + ' Object.defineProperty(Foo,"baz",{writable:true,configurable:true,value:function() {', + '}});', + '' + ].join('\n'); + + expect(transform(code)).toBe(expected); + }); + + it('preserves lines with inheritance from identifier', function() { + var code = [ + 'class Foo extends Bar {', + ' foo() {', + ' ', + ' ', + ' super(p1,', + ' p2);', + ' }', + '', + ' constructor(p1,', + ' p2) {', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' super.blah(p1,', + ' p2);', + ' }', + '', + ' bar(){}', + ' static baz() {', + '}', + '}' + ].join('\n'); + + var expected = [ + 'for(var Bar____Key in Bar){' + + 'if(Bar.hasOwnProperty(Bar____Key)){' + + 'Foo[Bar____Key]=Bar[Bar____Key];' + + '}' + + '}' + + 'var ____SuperProtoOfBar=' + + 'Bar===null' + + '?null:' + + 'Bar.prototype;' + + 'Foo.prototype=Object.create(____SuperProtoOfBar);' + + 'Foo.prototype.constructor=Foo;' + + 'Foo.__superConstructor__=Bar;', + + ' Object.defineProperty(Foo.prototype,"foo",{writable:true,configurable:true,value:function() {"use strict";', + ' ', + ' ', + ' ____SuperProtoOfBar.foo.call(this,p1,', + ' p2);', + ' }});', + '', + ' function Foo(p1,', + ' p2) {"use strict";', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' ____SuperProtoOfBar.blah.call(this,p1,', + ' p2);', + ' }', + '', + ' Object.defineProperty(Foo.prototype,"bar",{writable:true,configurable:true,value:function(){"use strict";}});', + ' Object.defineProperty(Foo,"baz",{writable:true,configurable:true,value:function() {"use strict";', + '}});', + '' + ].join('\n'); + + expect(transform(code)).toBe(expected); + }); + + it('preserves lines with inheritance from expression', function() { + var code = [ + 'class Foo extends mixin(Bar, Baz) {', + ' foo() {', + ' ', + ' ', + ' }', + '', + ' constructor(p1,', + ' p2) {', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' bar(){}', + ' static baz() {', + '}', + '}' + ].join('\n'); + + var expected = [ + 'var ____Class0=mixin(Bar, Baz);' + + 'for(var ____Class0____Key in ____Class0){' + + 'if(____Class0.hasOwnProperty(____Class0____Key)){' + + 'Foo[____Class0____Key]=____Class0[____Class0____Key];' + + '}' + + '}' + + 'var ____SuperProtoOf____Class0=' + + '____Class0===null' + + '?null' + + ':____Class0.prototype;' + + 'Foo.prototype=Object.create(____SuperProtoOf____Class0);' + + 'Foo.prototype.constructor=Foo;' + + 'Foo.__superConstructor__=____Class0;', + + ' Object.defineProperty(Foo.prototype,"foo",{writable:true,configurable:true,value:function() {"use strict";', + ' ', + ' ', + ' }});', + '', + ' function Foo(p1,', + ' p2) {"use strict";', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' Object.defineProperty(Foo.prototype,"bar",{writable:true,configurable:true,value:function(){"use strict";}});', + ' Object.defineProperty(Foo,"baz",{writable:true,configurable:true,value:function() {"use strict";', + '}});', + '' + ].join('\n'); + + expect(transform(code)).toBe(expected); + }); + }); + + describe('functional tests', function() { + it('handles an empty body', function() { + var code = transform( + 'class Foo {}' + ); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst instanceof Foo).toBe(true); + }); + + it('handles constructors without params', function() { + var code = transform([ + 'class Foo {', + ' constructor() {', + ' this.test = "testValue";', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.test).toBe('testValue'); + }); + + it('handles constructors with params', function() { + var code = transform([ + 'class Foo {', + ' constructor(p1, p2) {', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo('a', 'b'); + expect(fooInst.p1).toBe('a'); + expect(fooInst.p2).toBe('b'); + }); + + it('handles prototype methods without params', function() { + var code = transform([ + 'class Foo {', + ' bar() {', + ' return "stuff";', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.bar()).toBe('stuff'); + }); + + it('handles prototype methods with params', function() { + var code = transform([ + 'class Foo {', + ' bar(p1, p2) {', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + fooInst.bar('a', 'b'); + expect(fooInst.p1).toBe('a'); + expect(fooInst.p2).toBe('b'); + }); + + it('handles static methods without params', function() { + var code = transform([ + 'class Foo {', + ' static bar() {', + ' return "stuff";', + ' }', + '}' + ].join('\n')); + + eval(code); + + expect(Foo.bar()).toBe('stuff'); + var fooInst = new Foo(); + expect(fooInst.bar).toBe(undefined); + }); + + it('handles static methods with params', function() { + var code = transform([ + 'class Foo {', + ' static bar(p1, p2) {', + ' return [p1, p2];', + ' }', + '}' + ].join('\n')); + + eval(code); + + expect(Foo.bar('a', 'b')).toEqual(['a', 'b']); + var fooInst = new Foo(); + expect(fooInst.bar).toBe(undefined); + }); + + it('handles extension from an identifier', function() { + var code = transform([ + 'function Parent() {}', + 'Parent.prototype.protoProp = "protoProp";', + 'Parent.staticProp = "staticProp";', + + 'class Child extends Parent {}' + ].join('\n')); + + var exports = new Function( + code + 'return {Child: Child, Parent: Parent};' + )(); + var Child = exports.Child; + var Parent = exports.Parent; + + expect(Child.protoProp).toBe(undefined); + expect(Child.staticProp).toBe('staticProp'); + var childInst = new Child(); + expect(childInst instanceof Child).toBe(true); + expect(childInst instanceof Parent).toBe(true); + expect(childInst.protoProp).toBe('protoProp'); + }); + + // ES6 draft section 14.5 + it('handles extension from a left hand expression', function() { + var code = transform([ + 'function Parent1() {}', + 'Parent1.prototype.protoProp = "protoProp";', + 'Parent1.staticProp = "staticProp";', + + 'function Parent2() {}', + + 'class Child extends (true ? Parent1 : Parent2) {}' + ].join('\n')); + + var exports = new Function( + code + 'return {Parent1: Parent1, Child: Child};' + )(); + var Child = exports.Child; + var Parent1 = exports.Parent1; + + expect(Child.protoProp).toBe(undefined); + expect(Child.staticProp).toBe('staticProp'); + var childInst = new Child(); + expect(childInst instanceof Child).toBe(true); + expect(childInst instanceof Parent1).toBe(true); + expect(childInst.protoProp).toBe('protoProp'); + expect(childInst.staticProp).toBe(undefined); + }); + + it('runs parent constructor when child constructor absent', function() { + var code = transform([ + 'class Parent {', + ' constructor(p1, p2) {', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '}', + + 'class Child extends Parent {}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child('a', 'b'); + expect(childInst.p1).toBe('a'); + expect(childInst.p2).toBe('b'); + }); + + it('sets constructor property to point at constructor func', function() { + var code = transform([ + 'class Parent {}', + 'class Child extends Parent {}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.constructor).toBe(Child); + }); + + it('handles super CallExpressions within constructors', function() { + var code = transform([ + 'class Parent {', + ' constructor(p1, p2) {', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '}', + + 'class Child extends Parent {', + ' constructor() {', + ' super("a", "b");', + ' this.childRan = true;', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.p1).toBe('a'); + expect(childInst.p2).toBe('b'); + expect(childInst.childRan).toBe(true); + }); + + it('handles super CallExpressions within proto methods', function() { + var code = transform([ + 'class Parent {', + ' bar(p1, p2) {', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + ' "baz qux"(p3) {', + ' this.p3 = p3;', + ' }', + '}', + + 'class Child extends Parent {', + ' bar() {', + ' super("a", "b");', + ' this.barRan = true;', + ' }', + ' "baz qux"() {', + ' super("c");', + ' this["baz qux run"] = true;', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.p1).toBe(undefined); + expect(childInst.p2).toBe(undefined); + expect(childInst.barRan).toBe(undefined); + + childInst.bar(); + expect(childInst.p1).toBe('a'); + expect(childInst.p2).toBe('b'); + expect(childInst.barRan).toBe(true); + + expect(childInst.p3).toBe(undefined); + expect(childInst['baz qux run']).toBe(undefined); + + childInst['baz qux'](); + expect(childInst.p3).toBe('c'); + expect(childInst['baz qux run']).toBe(true); + }); + + it('handles computed super MemberExpressions', + function() { + var code = transform([ + 'class Parent {', + ' constructor() {', + ' this.counter = 0;', + ' }', + ' incrementCounter(amount) {', + ' this.counter += amount;', + ' }', + '}', + + 'class Child extends Parent {', + ' childIncrement() {', + ' super["increment" + "Counter"](2);', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.counter).toBe(0); + childInst.childIncrement(); + expect(childInst.counter).toBe(2); + }); + + it('handles simple super MemberExpression access', function() { + var code = transform([ + 'class Parent {', + ' getFoo(p) {', + ' return "foo" + p;', + ' }', + '}', + + 'class Child extends Parent {', + ' getChildFoo() {', + ' var x = super.getFoo;', + ' return x("bar");', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.getChildFoo()).toBe('foobar'); + }); + + it('handles CallExpression on a super MemberExpression', function() { + var code = transform([ + 'class Parent {', + ' getFoo(p) {', + ' this.fooValue = "foo";', + ' return this.fooValue + p;', + ' }', + '}', + + 'class Child extends Parent {', + ' getChildFoo() {', + ' return super.getFoo.call(this, "bar");', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.getChildFoo()).toBe('foobar'); + expect(childInst.fooValue).toBe('foo'); + }); + + it('handles super MemberExpressions within constructors', function() { + var code = transform([ + 'class Parent {', + ' setParams(p1, p2) {', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '}', + + 'class Child extends Parent {', + ' constructor() {', + ' super.setParams("a", "b");', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.p1).toBe('a'); + expect(childInst.p2).toBe('b'); + }); + + it('handles super MemberExpressions within proto methods', function() { + var code = transform([ + 'class Parent {', + ' setParams(p1, p2) {', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '}', + + 'class Child extends Parent {', + ' bar() {', + ' super.setParams("a", "b");', + ' this.barRan = true;', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + expect(childInst.p1).toBe(undefined); + expect(childInst.p2).toBe(undefined); + expect(childInst.barRan).toBe(undefined); + childInst.bar(); + expect(childInst.p1).toBe('a'); + expect(childInst.p2).toBe('b'); + expect(childInst.barRan).toBe(true); + }); + + it('consistently munges private property identifiers', function() { + var code = transform([ + 'class Foo {', + ' constructor(p1) {', + ' this._p1 = p1;', + ' }', + ' getP1() {', + ' return this._p1;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo('a'); + expect(fooInst._p1).toBe(undefined); + expect(fooInst.getP1()).toBe('a'); + }); + + it('stores munged private properties on the instance', function() { + // Protects against subtle transform bugs like: + // `this._p1 = 42` -> `this$Foo_p1 = 42` + var code = transform([ + 'class Foo {', + ' constructor(p1) {', + ' this._p1 = p1;', + ' }', + ' getP1() {', + ' return this._p1;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst1 = new Foo('a'); + var fooInst2 = new Foo('b'); + expect(fooInst1.getP1()).toBe('a'); + expect(fooInst2.getP1()).toBe('b'); + }); + + it('consistently munges nested private property identifiers', function() { + var code = transform([ + 'class Foo {', + ' constructor(p1) {', + ' this._data = {_p1: null};', + ' this._data._p1 = p1;', + ' }', + ' getData() {', + ' return this._data;', + ' }', + ' getP1() {', + ' return this._data._p1;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo('a'); + expect(fooInst.getData()._p1).toBe(undefined); + expect(fooInst.getP1()).toBe('a'); + }); + + it('consistently munges private method identifiers', function() { + var code = transform([ + 'class Foo {', + ' getBar() {', + ' return this._getBar();', + ' }', + ' _getBar() {', + ' return 42;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst._getBar).toBe(undefined); + expect(fooInst.getBar()).toBe(42); + }); + + it('consistently munges private method params', function() { + var code = transform([ + 'class Foo {', + ' bar(_counter, _function) {', + ' this.counter = _counter;', + ' _function();', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + var callbackCalled = false; + fooInst.bar(42, function() { callbackCalled = true; }); + expect(fooInst.counter).toBe(42); + expect(callbackCalled).toBe(true); + }); + + it('consistently munges private idents in super call params', function() { + var code = transform([ + 'class Parent {', + ' constructor(foo) {', + ' this.foo = foo;', + ' }', + ' setBar(bar) {', + ' this.bar = bar;', + ' }', + '}', + 'class Child extends Parent {', + ' constructor(_foo, _bar) {', + ' super(_foo);', + ' super.setBar(_bar);', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child('foo', 'bar'); + expect(childInst.foo).toBe('foo'); + expect(childInst.bar).toBe('bar'); + }); + + it('consistently munges private idents in nested funcs', function() { + var code = transform([ + 'class Foo {', + ' bar(_p1, p2) {', + ' return function(_a) {', + ' return [_p1, p2, _a];', + ' };', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.bar('a', 'b')('c')).toEqual(['a', 'b', 'c']); + }); + + it('consistently munges private idents in nested arrow funcs', function() { + var code = transform([ + 'class Foo {', + ' bar(_p1, p2) {', + ' return (_a, b) => {', + ' return [_p1, p2, _a, b];', + ' };', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.bar('a', 'b')('c', 'd')).toEqual(['a', 'b', 'c', 'd']); + }); + + it('does not munge dunder-scored properties', function() { + var code = transform([ + 'class Foo {', + ' constructor(p1) {', + ' this.__p1 = p1;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo('a'); + expect(fooInst.__p1).toBe('a'); + }); + + it('does not munge dunder-scored methods', function() { + var code = transform([ + 'class Foo {', + ' __getBar() {', + ' return 42;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.__getBar()).toBe(42); + }); + + it('properly handles private vars declared in outer scope', function() { + var code = transform([ + 'var _bar = "outer";', + 'class Foo {', + ' getOuterBar() {', + ' return _bar;', + ' }', + '}' + ].join('\n')); + + var Foo = new Function(code + 'return Foo;')(); + + var fooInst = new Foo(); + expect(fooInst.getOuterBar()).toBe('outer'); + }); + + it('does not munge outer-declared private vars when used to calculate ' + + 'a computed member expression', function() { + var code = transform([ + 'var _privateObjKey = "pvt";', + 'var outerDataStore = {pvt: 42};', + 'class Foo {', + ' getStuff() {', + ' return outerDataStore[_privateObjKey];', + ' }', + '}' + ].join('\n')); + + var Foo = new Function(code + 'return Foo;')(); + + var fooInst = new Foo(); + expect(fooInst.getStuff()).toBe(42); + }); + + it('properly handles private vars declared in inner scope', function() { + var code = transform([ + 'var _bar = {_private: 42};', + 'class Foo {', + ' getBarPrivate(p1) {', + ' var _bar = {_private: p1};', + ' return _bar._private;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.getBarPrivate('a')).toBe('a'); + }); + + it('munges properties of private vars declared out of scope', function() { + var code = transform([ + 'var _bar = {_private: 42}', + 'class Foo {', + ' getOuterPrivate() {', + ' return _bar._private;', + ' }', + '}' + ].join('\n')); + + var exports = new Function(code + 'return {_bar: _bar, Foo: Foo};')(); + var _bar = exports._bar; + var Foo = exports.Foo; + + var fooInst = new Foo(); + expect(_bar._private).toBe(42); + expect(fooInst.getOuterPrivate()).toBe(undefined); + }); + + it('does not munge when @preventMunge is specified', function() { + var code = transform([ + '/**', + ' * @preventMunge', + ' */', + 'class Foo {', + ' constructor(p1) {', + ' this._p1 = p1;', + ' }', + ' _privateMethod() {', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo('a'); + expect(fooInst._p1).toBe('a'); + expect(fooInst._privateMethod).not.toBe(undefined); + }); + + it('minifies private properties when minify opt is set', function() { + var code = transform([ + 'class Foo {', + ' constructor(p1) {', + ' this._p1 = p1;', + ' }', + '}' + ].join('\n'), {minify: true}); + + eval(code); + + var fooInst = new Foo('a'); + expect(fooInst.$Foo0).toBe('a'); + }); + + it('minifies private methods when minify opt is set', function() { + var code = transform([ + 'class Foo {', + ' _bar() {', + ' return 42;', + ' }', + '}' + ].join('\n'), {minify: true}); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.$Foo0()).toBe(42); + }); + + it('munges child class different from parent in same file', function() { + var code = transform([ + 'class Parent {', + ' setParentFoo(foo) {', + ' this._foo = foo;', + ' }', + ' getParentFoo() {', + ' return this._foo;', + ' }', + '}', + + 'class Child extends Parent {', + ' setChildFoo(foo) {', + ' this._foo = foo;', + ' }', + ' getChildFoo() {', + ' return this._foo;', + ' }', + '}' + ].join('\n')); + + var Child = new Function(code + 'return Child;')(); + + var childInst = new Child(); + childInst.setParentFoo('parent'); + childInst.setChildFoo('child'); + expect(childInst.getParentFoo()).toBe('parent'); + expect(childInst.getChildFoo()).toBe('child'); + }); + + it('munges child class different from parent in other file', function() { + var code1 = transform([ + 'class Parent {', + ' setParentFoo(foo) {', + ' this._foo = foo;', + ' }', + ' getParentFoo() {', + ' return this._foo;', + ' }', + '}' + ].join('\n')); + + var code2 = transform([ + 'class Child extends Parent {', + ' setChildFoo(foo) {', + ' this._foo = foo;', + ' }', + ' getChildFoo() {', + ' return this._foo;', + ' }', + '}' + ].join('\n')); + + var exports = new Function( + code1 + code2 + 'return {Parent: Parent, Child: Child};' + )(); + var Child = exports.Child; + + var childInst = new Child(); + childInst.setParentFoo('parent'); + childInst.setChildFoo('child'); + expect(childInst.getParentFoo()).toBe('parent'); + expect(childInst.getChildFoo()).toBe('child'); + }); + + it('makes class methods implicitly "use strict"', function() { + var code = transform([ + 'class Foo {', + ' constructor() {', + ' this.constructorIsStrict = ' + + '(function() {return this === undefined;})();', + ' }', + ' protoFn() {', + ' return (function() {return this === undefined;})();', + ' }', + ' static staticFn() {', + ' return (function() {return this === undefined;})();', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.constructorIsStrict).toBe(true); + expect(fooInst.protoFn()).toBe(true); + expect(Foo.staticFn()).toBe(true); + }); + + it('preserves generators', function() { + var code = transform([ + 'class Foo {', + ' static *title() {', + ' yield 21;', + ' }', + '', + ' *gen() {', + ' yield 42;', + ' }', + '}' + ].join('\n')); + + expect(code).toMatch(/function\*\(/); + expect(code).toMatch(/function\*\(/); + }); + + it('properly handles methods in ES3 compat mode', function() { + var code = transform([ + 'class Foo {', + ' title() {', + ' return 42;', + ' }', + '}' + ].join('\n'), {es3: true}); + + eval(code); + + var fooInst = new Foo(); + var descriptor = + Object.getOwnPropertyDescriptor(Foo.prototype, 'title'); + + expect(fooInst.title()).toBe(42); + expect(descriptor.enumerable).toBe(true); + expect(descriptor.configurable).toBe(true); + }); + + it('properly handles static methods in ES3 compat mode', function() { + var code = transform([ + 'class Foo {', + ' static title() {', + ' return 42;', + ' }', + '}' + ].join('\n'), {es3: true}); + + eval(code); + + var descriptor = + Object.getOwnPropertyDescriptor(Foo, 'title'); + + expect(Foo.title()).toBe(42); + expect(descriptor.enumerable).toBe(true); + expect(descriptor.configurable).toBe(true); + }); + + it('properly handles getter methods in ES5 compat mode', function() { + var code = transform([ + 'class Foo {', + ' get title() {', + ' return 42;', + ' }', + ' get "foo bar"() {', + ' return 21;', + ' }', + '}' + ].join('\n'), {es5: true}); + + eval(code); + + var fooInst = new Foo(); + var descriptor = + Object.getOwnPropertyDescriptor(Foo.prototype, 'title'); + + expect(fooInst.title).toBe(42); + expect(descriptor.enumerable).toBe(false); + expect(descriptor.configurable).toBe(true); + expect(fooInst['foo bar']).toBe(21); + }); + + it('properly handles setter methods in ES5 compat mode', function() { + var code = transform([ + 'class Foo {', + ' set title(value) {', + ' this.__title = 42;', + ' }', + ' set "foo bar"(value) {', + ' this.__fooBar = 21;', + ' }', + '}' + ].join('\n'), {es5: true}); + + eval(code); + + var fooInst = new Foo(); + fooInst.title = 42; + fooInst['foo bar'] = 21; + var descriptor = + Object.getOwnPropertyDescriptor(Foo.prototype, 'title'); + + expect(fooInst.__title).toBe(42); + expect(descriptor.enumerable).toBe(false); + expect(descriptor.configurable).toBe(true); + expect(fooInst.__fooBar).toBe(21); + }); + + it('properly handles getters and setters in ES5 compat mode', function() { + var code = transform([ + 'class Foo {', + ' get title() {', + ' return this.__title;', + ' }', + '', + ' set title(value) {', + ' this.__title = value;', + ' }', + '}' + ].join('\n'), {es5: true}); + + eval(code); + + var fooInst = new Foo(); + var descriptor = + Object.getOwnPropertyDescriptor(Foo.prototype, 'title'); + fooInst.title = 42; + + expect(fooInst.__title).toBe(42); + expect(fooInst.title).toBe(42); + expect(descriptor.enumerable).toBe(false); + expect(descriptor.configurable).toBe(true); + }); + + it('properly handles static and non-static getters and setters ' + + 'with the same name in ES5 compat mode', function() { + var code = transform([ + 'class Foo {', + ' static get title() {', + ' return this._title;', + ' }', + '', + ' static set title(value) {', + ' this._title = value;', + ' }', + '', + ' get title() {', + ' return this.__title;', + ' }', + '', + ' set title(value) {', + ' this.__title = value;', + ' }', + '}' + ].join('\n'), {es5: true}); + + eval(code); + + var fooInst = new Foo(); + Foo.title = 21; + fooInst.title = 42; + + expect(Foo.title).toBe(21); + expect(fooInst.title).toBe(42); + }); + + it('properly handles private getters and setters in ES5 compat mode', + function() { + var code = transform([ + 'class Foo {', + ' get title() {', + ' return this._private;', + ' }', + '', + ' set title(value) {', + ' this._private = value;', + ' }', + '', + ' get _private() {', + ' return this.__superPrivate;', + ' }', + '', + ' set _private(value) {', + ' this.__superPrivate = value;', + ' }', + '}' + ].join('\n'), {es5: true}); + + eval(code); + + var fooInst = new Foo(); + fooInst.title = 42; + + expect(fooInst.__superPrivate).toBe(42); + }); + + it('throws upon encountering getter methods', function() { + expect(function() { + transform([ + 'class Foo {', + ' get title() {', + ' return 42;', + ' }', + '}' + ].join('\n')); + }).toThrow( + 'This transform does not support getter methods for ES6 classes. ' + + '(line: 2, col: 2)' + ); + }); + + it('throws upon encountering setter methods', function() { + expect(function() { + transform([ + 'class Foo {', + ' set title(value) {', + ' this._title = value;', + ' }', + '}' + ].join('\n')); + }).toThrow( + 'This transform does not support setter methods for ES6 classes. ' + + '(line: 2, col: 2)' + ); + }); + }); + }); + + describe('ClassExpressions', function() { + describe('preserves line numbers', function() { + it('preserves lines with no inheritance', function() { + var code = [ + 'var Foo = class {', + ' foo() {', + ' ', + ' ', + ' }', + '', + ' constructor(p1,', + ' p2) {', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' bar(){}', + ' static baz() {', + '}', + '}' + ].join('\n'); + + var expected = [ + 'var Foo = (function(){', + ' Object.defineProperty(____Class0.prototype,"foo",{writable:true,configurable:true,value:function() {"use strict";', + ' ', + ' ', + ' }});', + '', + ' function ____Class0(p1,', + ' p2) {"use strict";', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' Object.defineProperty(____Class0.prototype,"bar",{writable:true,configurable:true,value:function(){"use strict";}});', + ' Object.defineProperty(____Class0,"baz",{writable:true,configurable:true,value:function() {"use strict";', + '}});', + 'return ____Class0;})()' + ].join('\n'); + + expect(transform(code)).toBe(expected); + }); + + it('preserves lines with inheritance from identifier', function() { + var code = [ + 'var Foo = class extends Bar {', + ' foo() {', + ' ', + ' ', + ' super(p1,', + ' p2);', + ' }', + '', + ' constructor(p1,', + ' p2) {', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' super.blah(p1,', + ' p2);', + ' }', + '', + ' bar(){}', + ' static baz() {', + '}', + '}' + ].join('\n'); + + var expected = [ + 'var Foo = (function(){' + + 'for(var Bar____Key in Bar){' + + 'if(Bar.hasOwnProperty(Bar____Key)){' + + '____Class0[Bar____Key]=Bar[Bar____Key];' + + '}' + + '}' + + 'var ____SuperProtoOfBar=' + + 'Bar===null' + + '?null' + + ':Bar.prototype;' + + '____Class0.prototype=Object.create(____SuperProtoOfBar);' + + '____Class0.prototype.constructor=____Class0;' + + '____Class0.__superConstructor__=Bar;', + + ' Object.defineProperty(____Class0.prototype,"foo",{writable:true,configurable:true,value:function() {"use strict";', + ' ', + ' ', + ' ____SuperProtoOfBar.foo.call(this,p1,', + ' p2);', + ' }});', + '', + ' function ____Class0(p1,', + ' p2) {"use strict";', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' ____SuperProtoOfBar.blah.call(this,p1,', + ' p2);', + ' }', + '', + ' Object.defineProperty(____Class0.prototype,"bar",{writable:true,configurable:true,value:function(){"use strict";}});', + ' Object.defineProperty(____Class0,"baz",{writable:true,configurable:true,value:function() {"use strict";', + '}});', + 'return ____Class0;})()' + ].join('\n'); + + expect(transform(code)).toBe(expected); + }); + + it('preserves lines with inheritance from expression', function() { + var code = [ + 'var Foo = class extends mixin(Bar, Baz) {', + ' foo() {', + ' ', + ' ', + ' }', + '', + ' constructor(p1,', + ' p2) {', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' bar(){}', + ' static baz() {', + '}', + '}' + ].join('\n'); + + var expected = [ + 'var Foo = (function(){' + + 'var ____Class1=mixin(Bar, Baz);' + + 'for(var ____Class1____Key in ____Class1){' + + 'if(____Class1.hasOwnProperty(____Class1____Key)){' + + '____Class0[____Class1____Key]=____Class1[____Class1____Key];' + + '}' + + '}' + + 'var ____SuperProtoOf____Class1=' + + '____Class1===null' + + '?null' + + ':____Class1.prototype;' + + '____Class0.prototype=Object.create(____SuperProtoOf____Class1);' + + '____Class0.prototype.constructor=____Class0;' + + '____Class0.__superConstructor__=____Class1;', + + ' Object.defineProperty(____Class0.prototype,"foo",{writable:true,configurable:true,value:function() {"use strict";', + ' ', + ' ', + ' }});', + '', + ' function ____Class0(p1,', + ' p2) {"use strict";', + '', + ' this.p1 = p1;', + ' this.p2 = p2;', + ' }', + '', + ' Object.defineProperty(____Class0.prototype,"bar",{writable:true,configurable:true,value:function(){"use strict";}});', + ' Object.defineProperty(____Class0,"baz",{writable:true,configurable:true,value:function() {"use strict";', + '}});', + 'return ____Class0;})()' + ].join('\n'); + + expect(transform(code)).toBe(expected); + }); + }); + + describe('functional tests', function() { + it('scopes each anonymous class separately', function() { + var code = transform([ + 'var Foo = class {', + ' constructor() {', + ' this._name = "foo";', + ' var properties = [];', + ' for (var key in this) {', + ' properties.push(key);', + ' }', + ' this.properties = properties', + ' }', + '};', + + 'var Bar = class {', + ' constructor() {', + ' this._name = "bar";', + ' var properties = [];', + ' for (var key in this) {', + ' properties.push(key);', + ' }', + ' this.properties = properties', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + var barInst = new Bar(); + expect(fooInst.properties).not.toEqual(barInst.properties); + expect(fooInst[fooInst.properties[0]]).toBe('foo'); + expect(barInst[barInst.properties[0]]).toBe('bar'); + }); + }); + }); + + describe('handles reserved words', function() { + it('handles reserved words', function() { + expect(transform([ + 'class Foo {', + ' delete(x, y) {', + ' bar();', + ' }', + '}' + ].join('\n'))).toBe([ + 'function Foo(){"use strict";}', + ' Object.defineProperty(Foo.prototype,"delete",{writable:true,configurable:true,value:function(x, y) {"use strict";', + ' bar();', + ' }});', + '' + ].join('\n')); + }); + }); + + describe('preserves non-class syntax/style', function() { + it('preserve newlines', function() { + expect(transform([ + 'class Foo {', + ' A', + ' (', + ' x, y) {', + ' bar();', + ' }', + '}' + ].join('\n'))).toBe([ + 'function Foo(){"use strict";}', + ' Object.defineProperty(Foo.prototype,"A",{writable:true,configurable:true,value:function(', + '', + 'x, y) {"use strict";', + ' bar();', + ' }});', + '' + ].join('\n')); + }); + + it('preserves comments between method params and open-bracket', function() { + expect(transform([ + 'class Foo {', + ' testMethod() /* comment */ {}', + '}', + ].join('\n'))).toBe([ + 'function Foo(){"use strict";}', + ' Object.defineProperty(Foo.prototype,"testMethod",{writable:true,configurable:true,value:function() /* comment */ {"use strict";}});', + '' + ].join('\n')); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-destructuring-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-destructuring-visitors-test.js new file mode 100644 index 0000000000..8723657563 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-destructuring-visitors-test.js @@ -0,0 +1,279 @@ +/** + * @emails dmitrys@fb.com + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('es6-destructuring-visitors', function() { + var transformFn; + + var destructuringVisitors; + var conciseMethodVisitors; + var shortObjectsVisitors; + var reservedWordsVisitors; + var restParamVisitors; + var classVisitorsVisitors; + var arrowFunctionVisitors; + + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transformFn = require('../../src/jstransform').transform; + + destructuringVisitors = require('../es6-destructuring-visitors').visitorList; + conciseMethodVisitors = require('../es6-object-concise-method-visitors').visitorList; + shortObjectsVisitors = require('../es6-object-short-notation-visitors').visitorList; + reservedWordsVisitors = require('../reserved-words-visitors').visitorList; + restParamVisitors = require('../es6-rest-param-visitors').visitorList; + classVisitorsVisitors = require('../es6-class-visitors').visitorList; + arrowFunctionVisitors = require('../es6-arrow-function-visitors').visitorList; + + visitors = destructuringVisitors.concat( + conciseMethodVisitors, + shortObjectsVisitors, + restParamVisitors, + classVisitorsVisitors, + arrowFunctionVisitors, + reservedWordsVisitors + ); + }); + + function transform(code) { + return transformFn(visitors, code).code; + } + + function expectTransform(code, result) { + expect(transform(code)).toEqual(result); + } + + it('should handle simple object pattern', function() { + var code = transform([ + 'var {x, y} = {x: 10, y: 20};', + '(x + y);' + ].join('\n')); + + expect(eval(code)).toEqual(30); + }); + + it('should handle literal property names', function() { + var code = transform([ + 'var {x, "y y": yy, 0: z} = {x: 10, "y y": 20, 0: 30};', + '([x, yy, z]);' + ].join('\n')); + + expect(eval(code)).toEqual([10, 20, 30]); + }); + + it('should handle array pattern assignment expression', function() { + var code = transform([ + 'var x = 10, y = 20;', + '[x, y] = [y, x];', + '([x, y]);' + ].join('\n')); + + expect(eval(code)).toEqual([20, 10]); + }); + + it('should should not redeclare vars with assignment expression', function() { + var code = transform([ + 'var x = 10, y = 20;', + '(function() {', + ' [x, y] = [y, x];', + '})();', + '([x, y]);' + ].join('\n')); + + expect(eval(code)).toEqual([20, 10]); + }); + + it('should handle object pattern assignment expression', function() { + var code = transform([ + 'var x = 10, y = 20;', + '({x, y} = {y, x});', + '({x, y});' + ].join('\n')); + + expect(eval(code)).toEqual({x: 10, y: 20}); + }); + + it('should destructure result of a function', function() { + var code = transform([ + 'var [x, y] = (function({x, y}) { return [x, y]; })({x: 1, y: 2});', + '([x, y]);' + ].join('\n')); + + expect(eval(code)).toEqual([1, 2]); + }); + + it('should handle skipped array elements', function() { + var code = transform([ + 'var [x, , y] = [1, 2, 3];', + '([x, y]);' + ].join('\n')); + + expect(eval(code)).toEqual([1, 3]); + }); + + it('should handle rest elements of an array', function() { + var code = transform([ + 'var [x, ...xs] = [1, 2, 3];' + ].join('\n')); + + eval(code); + + expect(x).toEqual(1); + expect(xs).toEqual([2, 3]); + }); + + it('should swap two variables w/o third using pattern', function() { + var code = transform([ + 'var x = 10, y = 20;', + 'var [x, y] = [y, x];', + '([x, y]);' + ].join('\n')); + + expect(eval(code)).toEqual([20, 10]); + }); + + it('should transform complex pattern argument', function() { + var code = transform([ + 'function init(user, {ip, coords: [x, y], port}) {', + ' return [user, ip, x, y, port].join(", ");', + '}' + ].join('\n')); + + eval(code); + + expect(init( + 'John Doe', { + ip: '127.0.0.1', + coords: [1, 2], + port: 8080 + } + )).toBe('John Doe, 127.0.0.1, 1, 2, 8080'); + }); + + it('should work with rest params', function() { + var code = transform([ + 'function foo({bar, baz}, ...rest) {', + ' return {bar, baz, qux: rest[0]};', + '}' + ].join('\n')); + + eval(code); + + expect(foo({bar: 10, baz: 20}, 30)) + .toEqual({bar: 10, baz: 20, qux: 30}); + }); + + it('should work with class methods', function() { + var code = transform([ + 'class Point {', + ' constructor({x, y}) {', + ' this._x = x;', + ' this._y = y;', + ' }', + '', + ' getData([deltaX, deltaY]) {', + ' return this._x + deltaX + this._y + deltaY', + ' }', + '}' + ].join('\n')); + + eval(code); + + var x = 10, y = 20; + var foo = new Point({x: x, y: y}); + var data = foo.getData([30, 40]); + + expect(data).toBe(100); + }); + + it('should work with object concise methods', function() { + var code = transform([ + 'var foo = {', + ' bar({x, y}) {', + ' return {x, y};', + ' }', + '}' + ].join('\n')); + + eval(code); + + expect(foo.bar({x: 10, y: 20})) + .toEqual({x: 10, y: 20}); + }); + + it('should work with arrows', function() { + var code = transform([ + 'var foo = ({x, y}, z) => x + y + z;' + ].join('\n')); + + eval(code); + + expect(foo({x: 10, y: 20}, 30)) + .toEqual(60); + }); + + // Auto-generated temp vars test. + it('should allocate correct temp index', function() { + var code = transform([ + 'function foo(x, {y}, {z}) {', + ' var {q} = {q: 30};', + ' return [$__0, $__1, $__2];', + '}' + ].join('\n')); + + eval(code); + + expect(foo(1, {y: 10}, {z: 20})) + .toEqual([{y: 10}, {z: 20}, {q: 30}]); + }); + + it('should allocate correct temp nested index', function() { + var code = transform([ + 'var foo = function(x, {y}, {z}) {', + ' var {q, m: {v}} = {q: 30, m: {v: 40}};', + ' var {a} = (function({a}) { return $__0; })({a: 50});', + ' return [$__0, $__1, $__2, $__3, a];', + '}' + ].join('\n')); + + eval(code); + + expect(foo(1, {y: 10}, {z: 20})) + .toEqual([{y: 10}, {z: 20}, {q: 30, m: {v: 40}}, {v: 40}, 50]); + }); + + + + // Syntax tests. + + it('should correctly transform structured patterns', function() { + + // Variable declaration. + expectTransform( + 'var a, {x, data: [y, , z]} = {x: 10, data: [1, 2, 3]};', + 'var a, $__0= {x: 10, data: [1, 2, 3]},x=$__0.x,$__1=$__0.data,y=$__1[0],z=$__1[2];' + ); + + // Function parameters. + expectTransform( + 'function f(a, {x, data: [y, z]}, b) {}', + 'function f(a, $__0 , b) {var x=$__0.x,$__1=$__0.data,y=$__1[0],z=$__1[1];}' + ); + }); + + it('should handle reserved words', function() { + expectTransform( + 'var {delete: x} = {delete: 1};', + 'var $__0= {"delete": 1},x=$__0["delete"];' + ); + }); +}); + + diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-es7-object-integration-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-es7-object-integration-test.js new file mode 100644 index 0000000000..b9e9c445f0 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-es7-object-integration-test.js @@ -0,0 +1,62 @@ +/** + * @emails sema@fb.com javascript@lists.facebook.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('es6-es7-object-integration-test', function() { + var transformFn; + + var visitors; + + // These are placeholder variables in scope that we can use to assert that a + // specific variable reference was passed, rather than an object clone of it. + var x = 123456; + var z = 345678; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transformFn = require('../../src/jstransform').transform; + + var conciseMethodVisitors = require('../es6-object-concise-method-visitors').visitorList; + var shortObjectsVisitors = require('../es6-object-short-notation-visitors').visitorList; + var spreadPropertyVisitors = require('../es7-spread-property-visitors').visitorList; + + visitors = spreadPropertyVisitors.concat( + shortObjectsVisitors, + conciseMethodVisitors + ); + }); + + function transform(code) { + return transformFn(visitors, code).code; + } + + it('handles spread with concise methods and short notation', function() { + var code = 'var xyz = { ...x, y() { return 42; }, z }'; + var objectAssignMock = jest.genMockFunction(); + Object.assign = objectAssignMock; + eval(transform(code)); + + var assignCalls = objectAssignMock.mock.calls; + expect(assignCalls.length).toBe(1); + expect(assignCalls[0].length).toBe(3); + expect(assignCalls[0][0]).toEqual({}); + expect(assignCalls[0][1]).toEqual(x); + + var trailingObject = assignCalls[0][2]; + expect(trailingObject.y()).toEqual(42); + expect(trailingObject.z).toEqual(z); + }); + + it('does not call assign when there are no spread properties', function() { + var code = 'var xyz = { x, y() { return 42 }, z }'; + var objectAssignMock = jest.genMockFunction(); + Object.assign = objectAssignMock; + eval(transform(code)); + expect(objectAssignMock).not.toBeCalled(); + }); + +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-object-concise-method-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-object-concise-method-visitors-test.js new file mode 100644 index 0000000000..33359df972 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-object-concise-method-visitors-test.js @@ -0,0 +1,133 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @emails dmitrys@fb.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('es6-object-concise-method-visitors', function() { + var transformFn; + var conciseMethodVisitors; + var restParamVisitors; + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + conciseMethodVisitors = require('../es6-object-concise-method-visitors').visitorList; + restParamVisitors = require('../es6-rest-param-visitors').visitorList; + transformFn = require('../../src/jstransform').transform; + visitors = conciseMethodVisitors.concat(restParamVisitors); + }); + + function transform(code) { + return transformFn(visitors, code).code; + } + + function expectTransform(code, result) { + expect(transform(code)).toEqual(result); + } + + // Functional tests. + + it('should transform concise method and return 42', function() { + /*global foo*/ + var code = transform([ + 'var foo = {', + ' bar(x) {', + ' return x;', + ' }', + '};' + ].join('\n')); + + eval(code); + expect(foo.bar(42)).toEqual(42); + }); + + it('should transform concise method with literal property', function() { + var code = transform([ + 'var foo = {', + ' "bar 1"(x) {', + ' return x;', + ' }', + '};' + ].join('\n')); + + eval(code); + expect(foo['bar 1'](42)).toEqual(42); + }); + + + it('should work with rest params', function() { + var code = transform([ + '({', + ' init(x, ...rest) {', + ' return rest.concat(x);', + ' }', + '}).init(1, 2, 3);' + ].join('\n')); + + expect(eval(code)).toEqual([2, 3, 1]); + }); + + // Source code tests. + it('should transform concise methods', function() { + + // Should transform simple concise method. + expectTransform( + 'var foo = {bar() {}};', + 'var foo = {bar:function() {}};' + ); + + // Should transform inner objects. + expectTransform( + '({bar(x) { return {baz(y) {}}; }});', + '({bar:function(x) { return {baz:function(y) {}}; }});' + ); + }); + + it('should preserve generators', function() { + // Identifier properties + expectTransform( + 'var foo = {*bar(x) {yield x;}};', + 'var foo = {bar:function*(x) {yield x;}};' + ); + + // Literal properties + expectTransform( + 'var foo = {*"abc"(x) {yield x;}, *42(x) {yield x;}};', + 'var foo = {"abc":function*(x) {yield x;}, 42:function*(x) {yield x;}};' + ); + + // Dynamic properties + expectTransform( + 'var foo = {*[a+b](x) {yield x;}}', + 'var foo = {[a+b]:function*(x) {yield x;}}' + ); + }); + + it('should handle reserved words', function() { + expectTransform( + '({delete(x) {}})', + '({"delete":function(x) {}})' + ); + }); +}); + + diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-object-short-notation-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-object-short-notation-visitors-test.js new file mode 100644 index 0000000000..d483922d80 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-object-short-notation-visitors-test.js @@ -0,0 +1,119 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @emails dmitrys@fb.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('es6-object-short-notation-visitors', function() { + var transformFn; + + var destructuringVisitors; + var shortObjectsVisitors; + + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transformFn = require('../../src/jstransform').transform; + + shortObjectsVisitors = require('../es6-object-short-notation-visitors').visitorList; + destructuringVisitors = require('../es6-destructuring-visitors').visitorList; + + visitors = shortObjectsVisitors.concat(destructuringVisitors); + }); + + function transform(code) { + return transformFn(visitors, code).code; + } + + function expectTransform(code, result) { + expect(transform(code)).toEqual(result); + } + + // Functional tests. + + it('should transform short notation and return 5', function() { + var code = transform([ + '(function(x, y) {', + ' var data = {x, y};', + ' return data.x + data.y;', + '})(2, 3);' + ].join('\n')); + + expect(eval(code)).toEqual(5); + }); + + it('should transform work with destructuring and return 10', function() { + var code = transform([ + 'var x = 5, y = 5;', + '(function({x, y}) {', + ' var data = {x, y};', + ' return data.x + data.y;', + '})({x, y});' + ].join('\n')); + + expect(eval(code)).toEqual(10); + }); + + // Source code tests. + it('should transform simple short notation', function() { + + // Should transform simple short notation. + expectTransform( + 'function foo(x, y) { return {x, y}; }', + 'function foo(x, y) { return {x:x, y:y}; }' + ); + + // Should preserve lines transforming ugly code. + expectTransform([ + 'function', + '', + 'foo (', + ' x,', + ' y', + '', + ')', + '', + ' {', + ' return {', + ' x,', + ' y};', + '}' + ].join('\n'), [ + 'function', + '', + 'foo (', + ' x,', + ' y', + '', + ')', + '', + ' {', + ' return {', + ' x:x,', + ' y:y};', + '}' + ].join('\n')); + }); + +}); + + diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-rest-param-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-rest-param-visitors-test.js new file mode 100644 index 0000000000..68a5eafcb1 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-rest-param-visitors-test.js @@ -0,0 +1,328 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @emails dmitrys@fb.com + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('es6-rest-param-visitors', () => { + var transformFn; + var visitorSet; + var arrowFuncVisitors; + var classVisitors; + var restParamVisitors; + + beforeEach(() => { + require('mock-modules').dumpCache(); + arrowFuncVisitors = require('../es6-arrow-function-visitors').visitorList; + classVisitors = require('../es6-class-visitors').visitorList; + restParamVisitors = require('../es6-rest-param-visitors').visitorList; + transformFn = require('../../src/jstransform').transform; + + visitorSet = + arrowFuncVisitors + .concat(classVisitors) + .concat(restParamVisitors); + }); + + function transform(code) { + return transformFn(visitorSet, code).code; + } + + function expectTransform(code, result) { + expect(transform(code)).toEqual(result); + } + + describe('function expressions', () => { + it('should capture 2 rest params, having 2 args', () => { + var code = transform([ + '(function(x, y, ...args) {', + ' return [x, y, args.length, args[0], args[1]];', + '})(1, 2, 3, 4);' + ].join('\n')); + + expect(eval(code)).toEqual([1, 2, 2, 3, 4]); + }); + + it('should transform rest parameters in nested functions', () => { + var code = transform([ + '(function(x, ...args) {', + ' return function(...params) {', + ' return args.concat(params);', + ' };', + '})(1, 2, 3)(4, 5);' + ].join('\n')); + + expect(eval(code)).toEqual([2, 3, 4, 5]); + }); + + it('should supply an array object', () => { + var code = transform([ + '(function(...args) {', + ' return Array.isArray(args);', + '})()' + ].join('\n')); + + expect(eval(code)).toBe(true); + }); + }); + + describe('function declarations', () => { + it('should capture 2 rest params, having 2 args', () => { + var code = transform([ + 'function test(x, y, ...args) {', + ' return [x, y, args.length, args[0], args[1]];', + '}' + ].join('\n')); + + eval(code); + + expect(test(1, 2, 3, 4)).toEqual([1, 2, 2, 3, 4]); + }); + + it('should transform rest parameters in nested functions', () => { + var code = transform([ + 'function testOuter(x, ...args) {', + ' function testInner(...params) {', + ' return args.concat(params);', + ' }', + ' return testInner;', + '}' + ].join('\n')); + + eval(code); + + expect(testOuter(1, 2, 3)(4, 5)).toEqual([2, 3, 4, 5]); + }); + + it('should supply an array object', () => { + var code = transform([ + 'function test(...args) {', + ' return Array.isArray(args);', + '}' + ].join('\n')); + + eval(code); + + expect(test()).toBe(true); + }); + }); + + describe('arrow functions', () => { + it('should transform non-block bodied arrow functions', () => { + var code = transform([ + 'var test = (...args) => args;' + ].join('\n')); + + eval(code); + + expect(test('foo', 'bar')).toEqual(['foo', 'bar']); + }); + + it('should capture 2 rest params, having 2 args', () => { + var code = transform([ + 'var test = (x, y, ...args) => {', + ' return [x, y, args.length, args[0], args[1]];', + '}' + ].join('\n')); + + eval(code); + + expect(test(1, 2, 3, 4)).toEqual([1, 2, 2, 3, 4]); + }); + + it('should transform rest parameters in nested arrow functions', () => { + var code = transform([ + 'var testOuter = (x, ...args) => {', + ' var testInner = (...params) => {', + ' return args.concat(params);', + ' };', + ' return testInner;', + '};' + ].join('\n')); + + eval(code); + + expect(testOuter(1, 2, 3)(4, 5)).toEqual([2, 3, 4, 5]); + }); + + it('should supply an array object', () => { + var code = transform([ + 'var test = (...args) => {', + ' return Array.isArray(args);', + '};' + ].join('\n')); + + eval(code); + + expect(test()).toBe(true); + }); + }); + + describe('class methods', () => { + it('should capture 2 rest params, having 2 args', () => { + var code = transform([ + 'class Foo {', + ' constructor(x, y, ...args) {', + ' this.ctor = [x, y, args.length, args[0], args[1]];', + ' }', + ' testMethod(x, y, ...args) {', + ' return [x, y, args.length, args[0], args[1]];', + ' }', + ' static testMethod(x, y, ...args) {', + ' return [x, y, args.length, args[0], args[1]];', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(1, 2, 3, 4); + expect(fooInst.ctor).toEqual([1, 2, 2, 3, 4]); + expect(fooInst.testMethod(1, 2, 3, 4)).toEqual([1, 2, 2, 3, 4]); + expect(Foo.testMethod(1, 2, 3, 4)).toEqual([1, 2, 2, 3, 4]); + }); + + it('should transform rest parameters in nested functions', () => { + var code = transform([ + 'class Foo {', + ' constructor(x, ...args) {', + ' function inner(...params) {', + ' return args.concat(params);', + ' }', + ' this.ctor = inner;', + ' }', + ' testMethod(x, ...args) {', + ' function inner(...params) {', + ' return args.concat(params);', + ' }', + ' return inner;', + ' }', + ' static testMethod(x, ...args) {', + ' function inner(...params) {', + ' return args.concat(params);', + ' }', + ' return inner;', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(1, 2, 3); + expect(fooInst.ctor(4, 5)).toEqual([2, 3, 4, 5]); + expect(fooInst.testMethod(1, 2, 3)(4, 5)).toEqual([2, 3, 4, 5]); + expect(Foo.testMethod(1, 2, 3)(4, 5)).toEqual([2, 3, 4, 5]); + }); + + it('should supply an array object', () => { + var code = transform([ + 'class Foo {', + ' constructor(...args) {', + ' this.ctor = Array.isArray(args);', + ' }', + ' testMethod(...args) {', + ' return Array.isArray(args);', + ' }', + ' static testMethod(...args) {', + ' return Array.isArray(args);', + ' }', + '}' + ].join('\n')); + + eval(code); + + var fooInst = new Foo(); + expect(fooInst.ctor).toBe(true); + expect(fooInst.testMethod()).toBe(true); + expect(Foo.testMethod()).toBe(true); + }); + }); + + describe('whitespace preservation', () => { + it('1-line function decl with 2 args', () => { + expectTransform( + 'function foo(x, y, ...args) { return x + y + args[0]; }', + 'function foo(x, y ) {for (var args=[],$__0=2,$__1=arguments.length;' + + '$__0<$__1;$__0++) args.push(arguments[$__0]); return x + y + ' + + 'args[0]; }' + ); + }); + + it('1-line function expression with 1 arg', () => { + expectTransform( + '(function(x, ...args) { return args;});', + '(function(x ) {for (var args=[],$__0=1,$__1=arguments.length;' + + '$__0<$__1;$__0++) args.push(arguments[$__0]); return args;});' + ); + }); + + it('1-line function expression with no args', () => { + expectTransform( + 'map(function(...args) { return args.map(log); });', + 'map(function() {for (var args=[],$__0=0,$__1=arguments.length;' + + '$__0<$__1;$__0++) args.push(arguments[$__0]); ' + + 'return args.map(log); });' + ); + }); + + it('preserves lines for ugly code', () => { + expectTransform([ + 'function', + '', + 'foo (', + ' x,', + ' ...args', + '', + ')', + '', + ' {', + ' return args;', + '}' + ].join('\n'), [ + 'function', + '', + 'foo (', + ' x', + ' ', + '', + ')', + '', + ' {for (var args=[],$__0=1,$__1=arguments.length;$__0<$__1;' + + '$__0++) args.push(arguments[$__0]);', + ' return args;', + '}' + ].join('\n')); + }); + + it('preserves inline comments', () => { + expectTransform( + 'function foo(/*string*/foo, /*bool*/bar, ...args) { return args; }', + 'function foo(/*string*/foo, /*bool*/bar ) {' + + 'for (var args=[],$__0=2,$__1=arguments.length;$__0<$__1;$__0++) ' + + 'args.push(arguments[$__0]); ' + + 'return args; ' + + '}' + ); + }); + }); +}); + diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es6-template-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es6-template-visitors-test.js new file mode 100644 index 0000000000..b914b5c70c --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es6-template-visitors-test.js @@ -0,0 +1,208 @@ +/** + * @emails mroch@fb.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('ES6 Template Visitor', function() { + var transformFn; + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + visitors = require('../es6-template-visitors').visitorList; + transformFn = require('../../src/jstransform').transform; + }); + + function transform(code) { + return transformFn(visitors, code).code; + } + + function expectTransform(code, result) { + expect(transform(code)).toEqual(result); + } + + function expectEval(code, result, setupFn) { + var actual; + if (setupFn) { + eval(setupFn); + } + eval('actual = ' + transform(code)); + expect(actual).toEqual(result); + } + + function expectEvalTag(code, tagFn, scope) { + /*jshint unused:false*/ + if (scope) { + Object.keys(scope).forEach((key) => this[key] = scope[key]); + } + + var tagCalls = 0; + var tag = function(...args) { + tagCalls++; + return tagFn.apply(this, args); + }; + var result = transform(code); + expect(result.split('\n').length).toBe(code.split('\n').length); + eval(result); + expect(tagCalls).toBe(1); + } + + function expectSiteObj(siteObj, cooked, raw) { + expect(Array.isArray(siteObj)).toBe(true); + expect(Object.isFrozen(siteObj)).toBe(true); + expect(Array.isArray(siteObj.raw)).toBe(true); + expect(Object.isFrozen(siteObj.raw)).toBe(true); + expect(siteObj.length).toBe(cooked.length); + expect(siteObj.raw.length).toBe(raw.length); + for (var ii = 0; ii < cooked.length; ii++) { + expect(siteObj[ii]).toEqual(cooked[ii]); + } + expect(siteObj.raw).toEqual(raw); + } + + it('should transform simple literals', function() { + expectTransform('`foo bar`', '("foo bar")'); + + expectEval('`foo bar`', 'foo bar'); + expectEval('`$`', '$'); + expectEval('`$foo`', '$foo'); + }); + + it('should properly escape templates containing quotes', function() { + expectTransform('`foo "bar"`', '("foo \\"bar\\"")'); + expectEval('`foo "bar"`', 'foo "bar"'); + + expectTransform("`foo 'bar'`", '("foo \'bar\'")'); + expectEval("`foo 'bar'`", "foo 'bar'"); + + // `foo \\"bar\\"` (foo, literal slash, "bar", literal slash) + expectTransform('`foo \\\\"bar\\\\"`', '("foo \\\\\\"bar\\\\\\"")'); + expectEval('`foo \\\\\\"bar\\\\\\"`', 'foo \\"bar\\"'); + }); + + it('should transform simple substitutions', function() { + expectTransform('`foo ${bar}`', '("foo " + bar)'); + expectTransform('`${foo} bar`', '(foo + " bar")'); + expectTransform('`${foo} ${bar}`', '(foo + " " + bar)'); + expectTransform('`${foo}${bar}`', '(foo + bar)'); + }); + + it('should transform expressions', function() { + expectTransform('`foo ${bar()}`', '("foo " + bar())'); + expectTransform('`foo ${bar.baz}`', '("foo " + bar.baz)'); + expectTransform('`foo ${bar + 5}`', '("foo " + (bar + 5))'); + expectTransform('`${foo + 5} bar`', '((foo + 5) + " bar")'); + expectTransform('`${foo + 5} ${bar}`', '((foo + 5) + " " + bar)'); + expectTransform( + '`${(function(b) {alert(4);})(a)}`', + '((function(b) {alert(4);})(a))'); + }); + + it('should transform tags with simple templates', function() { + /*jshint unused:false*/ + var tag = function(elements) { + expectSiteObj(elements, ['foo bar'], ['foo bar']); + }; + var result = transform("tag`foo bar`"); + expect(result.split('\n').length).toBe(1); + eval(result); + + var a = { b: tag }; + eval(transform("a.b`foo bar`")); + eval(transform("a['b']`foo bar`")); + + var getTag = function() { return tag; }; + eval(transform("getTag()`foo bar`")); + eval(transform("(getTag())`foo bar`")); + }); + + it('should transform tags with substitutions', function() { + expectTransform( + "tag`foo ${bar} baz`", + 'tag(function() { var siteObj = ["foo ", " baz"]; ' + + 'siteObj.raw = ["foo ", " baz"]; Object.freeze(siteObj.raw); ' + + 'Object.freeze(siteObj); return siteObj; }(), bar)' + ); + + expectEvalTag( + "tag`foo ${bar + 'abc'} baz`", + function(elements, ...args) { + expectSiteObj(elements, ['foo ', ' baz'], ['foo ', ' baz']); + expect(args.length).toBe(1); + expect(args[0]).toBe('barabc'); + }, + {bar: 'bar'} + ); + + expectEvalTag( + "tag`foo ${bar + 'abc'}`", + function(elements, ...args) { + expectSiteObj(elements, ['foo ', ''], ['foo ', '']); + expect(args.length).toBe(1); + expect(args[0]).toBe('barabc'); + }, + {bar: 'bar'} + ); + + expectEvalTag( + "tag`foo\n\n\nbar`", + (elements) => { + expectSiteObj(elements, ['foo\n\n\nbar'], ['foo\n\n\nbar']); + } + ); + + expectEvalTag( + "tag`a\nb\n${c}\nd`", + (elements, ...args) => { + expectSiteObj(elements, ['a\nb\n', '\nd'], ['a\nb\n', '\nd']); + expect(args.length).toBe(1); + expect(args[0]).toBe('c'); + }, + {c: 'c'} + ); + }); + + it('should maintain line numbers', function() { + expectTransform("`foo\n\nbar`", '("foo\\n\\nbar"\n\n)'); + expectTransform("`foo\n${bar}\nbaz`", '("foo\\n" + \nbar + "\\nbaz"\n)'); + expectTransform("`foo\\nbar`", '("foo\\nbar")'); + + expectTransform( + "tag`a\nb\n${c}${d}\ne`", + 'tag(function() { var siteObj = ["a\\nb\\n", "", "\\ne"]; ' + + 'siteObj.raw = ["a\\nb\\n", "", "\\ne"]; Object.freeze(siteObj.raw); ' + + 'Object.freeze(siteObj); return siteObj; }(), \n\nc, d\n)' + ); + }); + + it('should handle multiple lines', function() { + expectEval("`foo\n\nbar`", 'foo\n\nbar'); + expectEval("`foo\\nbar`", 'foo\nbar'); + expectEval("`foo\\\\nbar`", 'foo\\nbar'); + expectEval("`foo\n${bar}\nbaz`", 'foo\nabc\nbaz', 'var bar = "abc";'); + }); + + it('should canonicalize line endings', function() { + // TODO: should this be '("foo\\nbar"\r\n)' to maintain the number of lines + // for editors that break on \r\n? I don't think we care in the transformed + // code. + expectTransform("`foo\r\nbar`", '("foo\\nbar"\n)'); + // TODO: same as above but with trailing \r + expectTransform("`foo\rbar`", '("foo\\nbar")'); + + expectEval("`foo\r\nbar`", 'foo\nbar'); + expectEval("`foo\rbar`", 'foo\nbar'); + expectEval("`foo\r\n${bar}\r\nbaz`", 'foo\nabc\nbaz', 'var bar = "abc";'); + + expectEvalTag( + "tag`foo\rbar`", + (elements) => { + expectSiteObj(elements, ['foo\nbar'], ['foo\rbar']); + } + ); + }); +}); + diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es7-rest-property-helpers-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es7-rest-property-helpers-test.js new file mode 100644 index 0000000000..fd0b112902 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es7-rest-property-helpers-test.js @@ -0,0 +1,97 @@ +/** + * @emails sema@fb.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('es7-rest-property-visitors', function() { + var transformFn; + + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transformFn = require('../../src/jstransform').transform; + + visitors = require('../es6-destructuring-visitors').visitorList; + }); + + function transform(code) { + var lines = Array.prototype.join.call(arguments, '\n'); + return transformFn(visitors, lines).code; + } + + // Semantic tests. + + it('picks off remaining properties from an object', function() { + var code = transform( + '({ x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 });', + '([ x, y, z ]);' + ); + expect(eval(code)).toEqual([1, 2, { a: 3, b: 4 }]); + }); + + it('picks off remaining properties from a nested object', function() { + var code = transform( + 'var complex = {', + ' x: { a: 1, b: 2, c: 3 },', + ' y: [4, 5, 6]', + '};', + 'var {', + ' x: { a: xa, ...xbc },', + ' y: [y0, ...y12]', + '} = complex;', + '([ xa, xbc, y0, y12 ]);' + ); + expect(eval(code)).toEqual([ 1, { b: 2, c: 3 }, 4, [5, 6] ]); + }); + + it('only extracts own properties', function() { + var code = transform( + 'var obj = Object.create({ x: 1 });', + 'obj.y = 2;', + '({ ...y } = obj);', + '(y);' + ); + expect(eval(code)).toEqual({ y: 2 }); + }); + + it('only extracts own properties, except when they are explicit', function() { + var code = transform( + 'var obj = Object.create({ x: 1, y: 2 });', + 'obj.z = 3;', + '({ y, ...z } = obj);', + '([ y, z ]);' + ); + expect(eval(code)).toEqual([ 2, { z: 3 } ]); + }); + + it('avoids passing extra properties when they are picked off', function() { + var code = transform( + 'function base({ a, b, x }) { return [ a, b, x ]; }', + 'function wrapper({ x, y, ...restConfig }) {', + ' return base(restConfig);', + '}', + 'wrapper({ x: 1, y: 2, a: 3, b: 4 });' + ); + expect(eval(code)).toEqual([ 3, 4, undefined ]); + }); + + // Syntax tests. + + it('throws on leading rest properties', function () { + expect(() => transform('({ ...x, y, z } = obj)')).toThrow(); + }); + + it('throws on multiple rest properties', function () { + expect(() => transform('({ x, ...y, ...z } = obj)')).toThrow(); + }); + + // TODO: Ideally identifier reuse should fail to transform + // it('throws on identifier reuse', function () { + // expect(() => transform('({ x: { ...z }, y: { ...z } } = obj)')).toThrow(); + // }); + +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/es7-spread-property-visitors-test.js b/react-app/node_modules/jstransform/visitors/__tests__/es7-spread-property-visitors-test.js new file mode 100644 index 0000000000..f313311d29 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/es7-spread-property-visitors-test.js @@ -0,0 +1,160 @@ +/** + * @emails sema@fb.com + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('es7-spread-property-visitors', function() { + var transformFn; + var originalAssign = Object.assign; + var visitors; + + // These are placeholder variables in scope that we can use to assert that a + // specific variable reference was passed, rather than an object clone of it. + var x = 123456; + var y = 789012; + var z = 345678; + + beforeEach(function() { + require('mock-modules').dumpCache(); + transformFn = require('../../src/jstransform').transform; + + visitors = require('../es7-spread-property-visitors').visitorList; + }); + + function transform(code) { + return transformFn(visitors, code).code; + } + + function expectTransform(code, result) { + expect(transform(code)).toEqual(result); + } + + function expectObjectAssign(code) { + var objectAssignMock = jest.genMockFunction(); + Object.assign = objectAssignMock; + eval(transform(code)); + return expect(objectAssignMock); + } + + afterEach(function() { + Object.assign = originalAssign; + }); + + // Polyfill sanity checks + + it('has access to a working Object.assign implementation', function() { + expect(typeof Object.assign).toBe('function'); + expect(Object.assign({ b: 2 }, null, { a: 1 })).toEqual({ a: 1, b: 2 }); + }); + + // Semantic tests. + + it('uses Object.assign with an empty new target object', function() { + expectObjectAssign( + 'var xy = { ...x, y: 2 }' + ).toBeCalledWith({}, x, { y: 2 }); + }); + + it('coalesces consecutive properties into a single object', function() { + expectObjectAssign( + 'var xyz = { ...x, y: 2, z: z }' + ).toBeCalledWith({}, x, { y: 2, z: z }); + + }); + + it('avoids an unnecessary empty object when spread is not first', function() { + expectObjectAssign( + 'var xy = { x: 1, ...y }' + ).toBeCalledWith({ x: 1}, y); + }); + + it('passes the same value multiple times to Object.assign', function() { + expectObjectAssign( + 'var xyz = { x: 1, y: 2, ...z, ...z }' + ).toBeCalledWith({ x: 1, y: 2}, z, z); + }); + + it('keeps object literals as separate arguments to assign', function() { + expectObjectAssign( + 'var xyz = { x: 1, ...({ y: 2 }), z: 3 }' + ).toBeCalledWith({ x: 1}, { y: 2 }, {z: 3 }); + }); + + it('does not call assign when there are no spread properties', function() { + expectObjectAssign( + 'var xy = { x: 1, y: 2 }' + ).not.toBeCalled(); + }); + + // Syntax tests. + + it('should preserve extra whitespace', function() { + expectTransform( + 'let xyz = { x: 1, y : \n 2, ... \nz, ... z }', + 'let xyz = Object.assign({ x: 1, y : \n 2}, \nz, z )' + ); + }); + + it('should preserve parenthesis', function() { + expectTransform( + 'let xyz = { x: 1, ...({ y: 2 }), z: 3 }', + 'let xyz = Object.assign({ x: 1}, ({ y: 2 }), {z: 3 })' + ); + }); + + it('should remove trailing commas after properties', function() { + expectTransform( + 'let xyz = { ...x, y: 1, }', + 'let xyz = Object.assign({}, x, {y: 1 })' + ); + }); + + it('should remove trailing commas after spread', function() { + expectTransform( + 'let xyz = { x: 1, ...y, }', + 'let xyz = Object.assign({ x: 1}, y )' + ); + }); + + // Don't transform + + it('should not transform destructuring assignment', function() { + expectTransform( + 'let { x, ...y } = z', + 'let { x, ...y } = z' + ); + }); + + // Accessors are unsupported. We leave it unprocessed so that other, + // chained transforms, can take over. + + it('should not transform when there are getters', function() { + expectTransform( + 'let xy = { ...x, get x() { } }', + 'let xy = { ...x, get x() { } }' + ); + }); + + it('should not transform when there are setters', function() { + expectTransform( + 'let xy = { set x(v) { }, ...y }', + 'let xy = { set x(v) { }, ...y }' + ); + }); + + it('should silently ignore falsy values', function() { + /*globals obj*/ + var code = transform([ + 'var x = null;', + 'var y = { y: "y" };', + 'var obj = { ...x, ...y, ...{ ...false, z: "z", ...y } };' + ].join('\n')); + + eval(code); + + expect(obj).toEqual({ y: 'y', z: 'z' }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/gen/generate-type-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/gen/generate-type-syntax-test.js new file mode 100644 index 0000000000..8cc0943124 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/gen/generate-type-syntax-test.js @@ -0,0 +1,52 @@ +/*jshint evil:true*/ + +var tests = require("./../type-syntax-test"); +var jstransform = require('../../../src/jstransform'); +var visitors = require('../../type-syntax').visitorList; +var fs = require("fs"); + +var out = "/*\n"; +out += "* WARNING: This file is autogenerated by visitors/__tests__/gen/generate-type-syntax-test.js\n"; +out += "* Do NOT modify this file directly! Instead, add your tests to \n"; +out += "* visitors/__tests__/type-syntax-test.js and run visitors/__tests__/gen/generate-type-syntax-test.js\n"; +out += "*/\n\n"; + +function escape_content(content) { + return content + .replace(/[\\]/g, '\\\\') + .replace(/[\b]/g, '\\b') + .replace(/[\f]/g, '\\f') + .replace(/[\n]/g, '\\n') + .replace(/[\r]/g, '\\r') + .replace(/[\t]/g, '\\t') + .replace(/[']/g, "\\'"); +} + +out += "module.exports = {\n"; +for (var section in tests) { + out += " '"+section+"': {\n"; + for (var test in tests[section]) { + test = tests[section][test]; + out += " '"+escape_content(test)+"': {\n"; + try { + var transformed = jstransform.transform(visitors, test).code; + out += " raworiginal: '"+escape_content(test)+"',\n"; + out += " transformed: '"+escape_content(transformed)+"',\n"; + try { + eval(transformed); + out += " eval: 'No error',\n"; + } catch (e) { + out += " eval: '"+e.message+"',\n"; + } + } catch (e) { + out += " error: '"+e.message+"',\n"; + } + out += "\n"; + out += " },\n"; + } + out += " },\n"; +} +out += "};\n"; + +fs.writeFileSync(__dirname+'/type-syntax-test.rec.js', out); +console.log("Recorded type-syntax-test.js output into type-syntax-test.rec.js"); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/gen/type-syntax-test.rec.js b/react-app/node_modules/jstransform/visitors/__tests__/gen/type-syntax-test.rec.js new file mode 100644 index 0000000000..3fde5fdba6 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/gen/type-syntax-test.rec.js @@ -0,0 +1,846 @@ +/* +* WARNING: This file is autogenerated by visitors/__tests__/gen/generate-type-syntax-test.js +* Do NOT modify this file directly! Instead, add your tests to +* visitors/__tests__/type-syntax-test.js and run visitors/__tests__/gen/generate-type-syntax-test.js +*/ + +module.exports = { + 'TypeAnnotations': { + 'function foo(numVal: any){}': { + raworiginal: 'function foo(numVal: any){}', + transformed: 'function foo(numVal ){}', + eval: 'No error', + + }, + 'function foo(numVal: number){}': { + raworiginal: 'function foo(numVal: number){}', + transformed: 'function foo(numVal ){}', + eval: 'No error', + + }, + 'function foo(numVal: number, strVal: string){}': { + raworiginal: 'function foo(numVal: number, strVal: string){}', + transformed: 'function foo(numVal , strVal ){}', + eval: 'No error', + + }, + 'function foo(numVal: number, untypedVal){}': { + raworiginal: 'function foo(numVal: number, untypedVal){}', + transformed: 'function foo(numVal , untypedVal){}', + eval: 'No error', + + }, + 'function foo(untypedVal, numVal: number){}': { + raworiginal: 'function foo(untypedVal, numVal: number){}', + transformed: 'function foo(untypedVal, numVal ){}', + eval: 'No error', + + }, + 'function foo(nullableNum: ?number){}': { + raworiginal: 'function foo(nullableNum: ?number){}', + transformed: 'function foo(nullableNum ){}', + eval: 'No error', + + }, + 'function foo(callback: () => void){}': { + raworiginal: 'function foo(callback: () => void){}', + transformed: 'function foo(callback ){}', + eval: 'No error', + + }, + 'function foo(callback: () => number){}': { + raworiginal: 'function foo(callback: () => number){}', + transformed: 'function foo(callback ){}', + eval: 'No error', + + }, + 'function foo(callback: (_:bool) => number){}': { + raworiginal: 'function foo(callback: (_:bool) => number){}', + transformed: 'function foo(callback ){}', + eval: 'No error', + + }, + 'function foo(callback: (_1:bool, _2:string) => number){}': { + raworiginal: 'function foo(callback: (_1:bool, _2:string) => number){}', + transformed: 'function foo(callback ){}', + eval: 'No error', + + }, + 'function foo(callback: (_1:bool, ...foo:Array) => number){}': { + raworiginal: 'function foo(callback: (_1:bool, ...foo:Array) => number){}', + transformed: 'function foo(callback ){}', + eval: 'No error', + + }, + 'function foo():number{}': { + raworiginal: 'function foo():number{}', + transformed: 'function foo() {}', + eval: 'No error', + + }, + 'function foo():() => void{}': { + raworiginal: 'function foo():() => void{}', + transformed: 'function foo() {}', + eval: 'No error', + + }, + 'function foo():(_:bool) => number{}': { + raworiginal: 'function foo():(_:bool) => number{}', + transformed: 'function foo() {}', + eval: 'No error', + + }, + 'function foo():(_?:bool) => number{}': { + raworiginal: 'function foo():(_?:bool) => number{}', + transformed: 'function foo() {}', + eval: 'No error', + + }, + 'function foo(): {} {}': { + raworiginal: 'function foo(): {} {}', + transformed: 'function foo() {}', + eval: 'No error', + + }, + 'function foo() {}': { + raworiginal: 'function foo() {}', + transformed: 'function foo () {}', + eval: 'No error', + + }, + 'function foo() {}': { + raworiginal: 'function foo() {}', + transformed: 'function foo () {}', + eval: 'No error', + + }, + 'function foo() {}': { + raworiginal: 'function foo() {}', + transformed: 'function foo () {}', + eval: 'No error', + + }, + 'a=function() {}': { + raworiginal: 'a=function() {}', + transformed: 'a=function () {}', + eval: 'No error', + + }, + 'a={set fooProp(value:number){}}': { + raworiginal: 'a={set fooProp(value:number){}}', + transformed: 'a={set fooProp(value ){}}', + eval: 'No error', + + }, + 'a={set fooProp(value:number): void{}}': { + raworiginal: 'a={set fooProp(value:number): void{}}', + transformed: 'a={set fooProp(value ) {}}', + eval: 'No error', + + }, + 'a={get fooProp(): number {}}': { + raworiginal: 'a={get fooProp(): number {}}', + transformed: 'a={get fooProp() {}}', + eval: 'No error', + + }, + 'class Foo {set fooProp(value:number){}}': { + raworiginal: 'class Foo {set fooProp(value:number){}}', + transformed: 'class Foo {set fooProp(value ){}}', + eval: 'Unexpected reserved word', + + }, + 'class Foo {set fooProp(value:number): void{}}': { + raworiginal: 'class Foo {set fooProp(value:number): void{}}', + transformed: 'class Foo {set fooProp(value ) {}}', + eval: 'Unexpected reserved word', + + }, + 'class Foo {get fooProp(): number{}}': { + raworiginal: 'class Foo {get fooProp(): number{}}', + transformed: 'class Foo {get fooProp() {}}', + eval: 'Unexpected reserved word', + + }, + 'var numVal:number;': { + raworiginal: 'var numVal:number;', + transformed: 'var numVal ;', + eval: 'No error', + + }, + 'var numVal:number = otherNumVal;': { + raworiginal: 'var numVal:number = otherNumVal;', + transformed: 'var numVal = otherNumVal;', + eval: 'otherNumVal is not defined', + + }, + 'var a: {numVal: number};': { + raworiginal: 'var a: {numVal: number};', + transformed: 'var a ;', + eval: 'No error', + + }, + 'var a: {numVal: number;};': { + raworiginal: 'var a: {numVal: number;};', + transformed: 'var a ;', + eval: 'No error', + + }, + 'var a: {numVal: number; [indexer: string]: number};': { + raworiginal: 'var a: {numVal: number; [indexer: string]: number};', + transformed: 'var a ;', + eval: 'No error', + + }, + 'var a: ?{numVal: number};': { + raworiginal: 'var a: ?{numVal: number};', + transformed: 'var a ;', + eval: 'No error', + + }, + 'var a: {numVal: number; strVal: string}': { + raworiginal: 'var a: {numVal: number; strVal: string}', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: {subObj: {strVal: string}}': { + raworiginal: 'var a: {subObj: {strVal: string}}', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: {subObj: ?{strVal: string}}': { + raworiginal: 'var a: {subObj: ?{strVal: string}}', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: {param1: number; param2: string}': { + raworiginal: 'var a: {param1: number; param2: string}', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: {param1: number; param2?: string}': { + raworiginal: 'var a: {param1: number; param2?: string}', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: {add(x:number, ...y:Array): void}': { + raworiginal: 'var a: {add(x:number, ...y:Array): void}', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: { id(x: T): T; }': { + raworiginal: 'var a: { id(x: T): T; }', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a:Array = [1, 2, 3]': { + raworiginal: 'var a:Array = [1, 2, 3]', + transformed: 'var a = [1, 2, 3]', + eval: 'No error', + + }, + 'a = class Foo { }': { + raworiginal: 'a = class Foo { }', + transformed: 'a = class Foo { }', + eval: 'Unexpected reserved word', + + }, + 'a = class Foo extends Bar { }': { + raworiginal: 'a = class Foo extends Bar { }', + transformed: 'a = class Foo extends Bar { }', + eval: 'Unexpected reserved word', + + }, + 'class Foo {}': { + raworiginal: 'class Foo {}', + transformed: 'class Foo {}', + eval: 'Unexpected reserved word', + + }, + 'class Foo {}': { + raworiginal: 'class Foo {}', + transformed: 'class Foo {}', + eval: 'Unexpected reserved word', + + }, + 'class Foo extends Bar { }': { + raworiginal: 'class Foo extends Bar { }', + transformed: 'class Foo extends Bar { }', + eval: 'Unexpected reserved word', + + }, + 'class Foo extends mixin(Bar) { }': { + raworiginal: 'class Foo extends mixin(Bar) { }', + transformed: 'class Foo extends mixin(Bar) { }', + eval: 'Unexpected reserved word', + + }, + 'class Foo { bar():number { return 42; }}': { + raworiginal: 'class Foo { bar():number { return 42; }}', + transformed: 'class Foo { bar() { return 42; }}', + eval: 'Unexpected reserved word', + + }, + 'class Foo { "bar"() { } }': { + raworiginal: 'class Foo { "bar"() { } }', + transformed: 'class Foo { "bar"() { } }', + eval: 'Unexpected reserved word', + + }, + 'function foo(requiredParam, optParam?) {}': { + raworiginal: 'function foo(requiredParam, optParam?) {}', + transformed: 'function foo(requiredParam, optParam ) {}', + eval: 'No error', + + }, + 'class Foo { prop1:string; prop2:number; }': { + raworiginal: 'class Foo { prop1:string; prop2:number; }', + transformed: 'class Foo { }', + eval: 'Unexpected reserved word', + + }, + 'var x : number | string = 4;': { + raworiginal: 'var x : number | string = 4;', + transformed: 'var x = 4;', + eval: 'No error', + + }, + 'class Array { concat(items:number | string) {}; }': { + raworiginal: 'class Array { concat(items:number | string) {}; }', + transformed: 'class Array { concat(items ) {}; }', + eval: 'Unexpected reserved word', + + }, + 'var x : () => number | () => string = fn;': { + raworiginal: 'var x : () => number | () => string = fn;', + transformed: 'var x = fn;', + eval: 'fn is not defined', + + }, + 'var x: typeof Y = Y;': { + raworiginal: 'var x: typeof Y = Y;', + transformed: 'var x = Y;', + eval: 'Y is not defined', + + }, + 'var x: typeof Y | number = Y;': { + raworiginal: 'var x: typeof Y | number = Y;', + transformed: 'var x = Y;', + eval: 'Y is not defined', + + }, + 'var {x}: {x: string; } = { x: "hello" };': { + raworiginal: 'var {x}: {x: string; } = { x: "hello" };', + transformed: 'var {x} = { x: "hello" };', + eval: 'Unexpected token {', + + }, + 'var {x}: {x: string } = { x: "hello" };': { + raworiginal: 'var {x}: {x: string } = { x: "hello" };', + transformed: 'var {x} = { x: "hello" };', + eval: 'Unexpected token {', + + }, + 'var [x]: Array = [ "hello" ];': { + raworiginal: 'var [x]: Array = [ "hello" ];', + transformed: 'var [x] = [ "hello" ];', + eval: 'Unexpected token [', + + }, + 'function foo({x}: { x: string; }) {}': { + raworiginal: 'function foo({x}: { x: string; }) {}', + transformed: 'function foo({x} ) {}', + eval: 'Unexpected token {', + + }, + 'function foo([x]: Array) {}': { + raworiginal: 'function foo([x]: Array) {}', + transformed: 'function foo([x] ) {}', + eval: 'Unexpected token [', + + }, + 'function foo(...rest: Array) {}': { + raworiginal: 'function foo(...rest: Array) {}', + transformed: 'function foo(...rest ) {}', + eval: 'Unexpected token .', + + }, + '(function (...rest: Array) {})': { + raworiginal: '(function (...rest: Array) {})', + transformed: '(function (...rest ) {})', + eval: 'Unexpected token .', + + }, + '((...rest: Array) => rest)': { + raworiginal: '((...rest: Array) => rest)', + transformed: '((...rest ) => rest)', + eval: 'Unexpected token .', + + }, + 'var a: Map >': { + raworiginal: 'var a: Map >', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: Map>': { + raworiginal: 'var a: Map>', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: number[]': { + raworiginal: 'var a: number[]', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: ?string[]': { + raworiginal: 'var a: ?string[]', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: Promise[]': { + raworiginal: 'var a: Promise[]', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a:(...rest:Array) => number': { + raworiginal: 'var a:(...rest:Array) => number', + transformed: 'var a ', + eval: 'No error', + + }, + }, + 'Type Alias': { + 'type FBID = number;': { + raworiginal: 'type FBID = number;', + transformed: ' ', + eval: 'No error', + + }, + 'type Foo = Bar': { + raworiginal: 'type Foo = Bar', + transformed: ' ', + eval: 'No error', + + }, + }, + 'Interfaces': { + 'interface A {}': { + raworiginal: 'interface A {}', + transformed: ' ', + eval: 'No error', + + }, + 'interface A extends B {}': { + raworiginal: 'interface A extends B {}', + transformed: ' ', + eval: 'No error', + + }, + 'interface A extends B, C {}': { + raworiginal: 'interface A extends B, C {}', + transformed: ' ', + eval: 'No error', + + }, + 'interface A { foo: () => number; }': { + raworiginal: 'interface A { foo: () => number; }', + transformed: ' ', + eval: 'No error', + + }, + 'interface Dictionary { [index: string]: string; length: number; }': { + raworiginal: 'interface Dictionary { [index: string]: string; length: number; }', + transformed: ' ', + eval: 'No error', + + }, + 'class Foo implements Bar {}': { + raworiginal: 'class Foo implements Bar {}', + transformed: 'class Foo implements Bar {}', + eval: 'Unexpected reserved word', + + }, + 'class Foo extends Bar implements Bat, Man {}': { + raworiginal: 'class Foo extends Bar implements Bat, Man {}', + transformed: 'class Foo extends Bar implements Bat, Man {}', + eval: 'Unexpected reserved word', + + }, + 'class Foo extends class Bar implements Bat {} {}': { + raworiginal: 'class Foo extends class Bar implements Bat {} {}', + transformed: 'class Foo extends class Bar implements Bat {} {}', + eval: 'Unexpected reserved word', + + }, + 'class Foo extends class Bar implements Bat {} implements Man {}': { + raworiginal: 'class Foo extends class Bar implements Bat {} implements Man {}', + transformed: 'class Foo extends class Bar implements Bat {} implements Man {}', + eval: 'Unexpected reserved word', + + }, + }, + 'Type Grouping': { + 'var a: (number)': { + raworiginal: 'var a: (number)', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: (() => number) | () => string': { + raworiginal: 'var a: (() => number) | () => string', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: number & (string | bool)': { + raworiginal: 'var a: number & (string | bool)', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a: (typeof A)': { + raworiginal: 'var a: (typeof A)', + transformed: 'var a ', + eval: 'No error', + + }, + }, + 'XJS': { + '': { + raworiginal: '', + transformed: '', + eval: 'Unexpected token <', + + }, + '': { + raworiginal: '', + transformed: '', + eval: 'Unexpected token <', + + }, + ' {value} ': { + raworiginal: ' {value} ', + transformed: ' {value} ', + eval: 'Unexpected token <', + + }, + '': { + raworiginal: '', + transformed: '', + eval: 'Unexpected token <', + + }, + '': { + raworiginal: '', + transformed: '', + eval: 'Unexpected token <', + + }, + '<日本語>': { + raworiginal: '<日本語>', + transformed: '<日本語>', + eval: 'Unexpected token <', + + }, + '\nbar\nbaz\r\n': { + raworiginal: '\nbar\nbaz\r\n', + transformed: '\nbar\nbaz\r\n', + eval: 'Unexpected token <', + + }, + ' : } />': { + raworiginal: ' : } />', + transformed: ' : } />', + eval: 'Unexpected token <', + + }, + '{}': { + raworiginal: '{}', + transformed: '{}', + eval: 'Unexpected token <', + + }, + '{/* this is a comment */}': { + raworiginal: '{/* this is a comment */}', + transformed: '{/* this is a comment */}', + eval: 'Unexpected token <', + + }, + '
@test content
': { + raworiginal: '
@test content
', + transformed: '
@test content
', + eval: 'Unexpected token <', + + }, + '

7x invalid-js-identifier
': { + raworiginal: '

7x invalid-js-identifier
', + transformed: '

7x invalid-js-identifier
', + eval: 'Unexpected token <', + + }, + ' right=monkeys />': { + raworiginal: ' right=monkeys />', + transformed: ' right=monkeys />', + eval: 'Unexpected token <', + + }, + '': { + raworiginal: '', + transformed: '', + eval: 'Unexpected token <', + + }, + '': { + raworiginal: '', + transformed: '', + eval: 'Unexpected token <', + + }, + '(
) < x;': { + raworiginal: '(
) < x;', + transformed: '(
) < x;', + eval: 'Unexpected token <', + + }, + '
': { + raworiginal: '
', + transformed: '
', + eval: 'Unexpected token <', + + }, + '
': { + raworiginal: '
', + transformed: '
', + eval: 'Unexpected token <', + + }, + '
': { + raworiginal: '
', + transformed: '
', + eval: 'Unexpected token <', + + }, + ' ': { + raworiginal: ' ', + transformed: ' ', + eval: 'Unexpected token <', + + }, + }, + 'Call Properties': { + 'var a : { (): number }': { + raworiginal: 'var a : { (): number }', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a : { (): number; }': { + raworiginal: 'var a : { (): number; }', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a : { (): number; y: string; (x: string): string }': { + raworiginal: 'var a : { (): number; y: string; (x: string): string }', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a : { (x: T): number; }': { + raworiginal: 'var a : { (x: T): number; }', + transformed: 'var a ', + eval: 'No error', + + }, + 'interface A { (): number; }': { + raworiginal: 'interface A { (): number; }', + transformed: ' ', + eval: 'No error', + + }, + }, + 'String Literal Types': { + 'function createElement(tagName: "div"): HTMLDivElement {}': { + raworiginal: 'function createElement(tagName: "div"): HTMLDivElement {}', + transformed: 'function createElement(tagName ) {}', + eval: 'No error', + + }, + 'function createElement(tagName: \'div\'): HTMLDivElement {}': { + raworiginal: 'function createElement(tagName: \'div\'): HTMLDivElement {}', + transformed: 'function createElement(tagName ) {}', + eval: 'No error', + + }, + }, + 'Qualified Generic Type': { + 'var a : A.B': { + raworiginal: 'var a : A.B', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a : A.B.C': { + raworiginal: 'var a : A.B.C', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a : A.B': { + raworiginal: 'var a : A.B', + transformed: 'var a ', + eval: 'No error', + + }, + 'var a : typeof A.B': { + raworiginal: 'var a : typeof A.B', + transformed: 'var a ', + eval: 'No error', + + }, + }, + 'Declare Statements': { + 'declare var foo': { + raworiginal: 'declare var foo', + transformed: ' ', + eval: 'No error', + + }, + 'declare var foo;': { + raworiginal: 'declare var foo;', + transformed: ' ', + eval: 'No error', + + }, + 'declare function foo(): void': { + raworiginal: 'declare function foo(): void', + transformed: ' ', + eval: 'No error', + + }, + 'declare function foo(): void;': { + raworiginal: 'declare function foo(): void;', + transformed: ' ', + eval: 'No error', + + }, + 'declare function foo(): void;': { + raworiginal: 'declare function foo(): void;', + transformed: ' ', + eval: 'No error', + + }, + 'declare function foo(x: number, y: string): void;': { + raworiginal: 'declare function foo(x: number, y: string): void;', + transformed: ' ', + eval: 'No error', + + }, + 'declare class A {}': { + raworiginal: 'declare class A {}', + transformed: ' ', + eval: 'No error', + + }, + 'declare class A extends B { x: number }': { + raworiginal: 'declare class A extends B { x: number }', + transformed: ' ', + eval: 'No error', + + }, + 'declare class A { static foo(): number; static x : string }': { + raworiginal: 'declare class A { static foo(): number; static x : string }', + transformed: ' ', + eval: 'No error', + + }, + 'declare class A { static [ indexer: number]: string }': { + raworiginal: 'declare class A { static [ indexer: number]: string }', + transformed: ' ', + eval: 'No error', + + }, + 'declare class A { static () : number }': { + raworiginal: 'declare class A { static () : number }', + transformed: ' ', + eval: 'No error', + + }, + }, + 'Declare Module': { + 'declare module A {}': { + raworiginal: 'declare module A {}', + transformed: ' ', + eval: 'No error', + + }, + 'declare module "./a/b.js" {}': { + raworiginal: 'declare module "./a/b.js" {}', + transformed: ' ', + eval: 'No error', + + }, + 'declare module A { declare var x: number; }': { + raworiginal: 'declare module A { declare var x: number; }', + transformed: ' ', + eval: 'No error', + + }, + 'declare module A { declare function foo(): number; }': { + raworiginal: 'declare module A { declare function foo(): number; }', + transformed: ' ', + eval: 'No error', + + }, + 'declare module A { declare class B { foo(): number; } }': { + raworiginal: 'declare module A { declare class B { foo(): number; } }', + transformed: ' ', + eval: 'No error', + + }, + }, + 'Typecasts': { + '(xxx: number)': { + raworiginal: '(xxx: number)', + transformed: '(xxx )', + eval: 'xxx is not defined', + + }, + '({xxx: 0, yyy: "hey"}: {xxx: number; yyy: string})': { + raworiginal: '({xxx: 0, yyy: "hey"}: {xxx: number; yyy: string})', + transformed: '({xxx: 0, yyy: "hey"} )', + eval: 'No error', + + }, + '((xxx) => xxx + 1: (xxx: number) => number)': { + raworiginal: '((xxx) => xxx + 1: (xxx: number) => number)', + transformed: '((xxx) => xxx + 1 )', + eval: 'Unexpected token >', + + }, + '((xxx: number), (yyy: string))': { + raworiginal: '((xxx: number), (yyy: string))', + transformed: '((xxx ), (yyy ))', + eval: 'xxx is not defined', + + }, + '((xxx: any): number)': { + raworiginal: '((xxx: any): number)', + transformed: '((xxx ) )', + eval: 'xxx is not defined', + + }, + }, +}; diff --git a/react-app/node_modules/jstransform/visitors/__tests__/reserved-words-test.js b/react-app/node_modules/jstransform/visitors/__tests__/reserved-words-test.js new file mode 100644 index 0000000000..36a44a3289 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/reserved-words-test.js @@ -0,0 +1,74 @@ +/** + * Copyright 2014 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @emails jeffmo@fb.com + */ + +/*jshint evil:true*/ + +jest.autoMockOff(); + +describe('reserved-words', function() { + var transformFn; + var visitors; + + beforeEach(function() { + require('mock-modules').dumpCache(); + visitors = require('../reserved-words-visitors').visitorList; + transformFn = require('../../src/jstransform').transform; + }); + + function transform(code, opts) { + // No need for visitors as long as we are not in es5 mode. + return transformFn(visitors, code, opts).code; + } + + describe('reserved words in member expressions', function() { + it('should transform to reserved word members to computed', function() { + var code = 'foo.delete;'; + + expect(transform(code)).toEqual('foo["delete"];'); + + code = '(foo++).delete;'; + expect(transform(code)).toEqual('(foo++)["delete"];'); + }); + + it('should handle call expressions', function() { + var code = 'foo.return();'; + + expect(transform(code)).toEqual('foo["return"]();'); + }); + + it('should only quote ES3 reserved words', function() { + var code = 'foo.await();'; + + expect(transform(code)).toEqual('foo.await();'); + }); + }); + + describe('reserved words in properties', function() { + it('should quote reserved words in properties', function() { + var code = 'var x = {null: 1};'; + + expect(transform(code)).toEqual('var x = {"null": 1};'); + }); + + it('should only quote ES3 reserved words', function() { + var code = 'var x = {await: 1};'; + + expect(transform(code)).toEqual('var x = {await: 1};'); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-alias-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-alias-syntax-test.js new file mode 100644 index 0000000000..4c06aaa78e --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-alias-syntax-test.js @@ -0,0 +1,83 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('static type syntax syntax', function() { + var flowSyntaxVisitors; + var jstransform; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + flowSyntaxVisitors = require('../type-syntax.js').visitorList; + jstransform = require('jstransform'); + }); + + function transform(code, visitors) { + code = jstransform.transform( + flowSyntaxVisitors, + code.join('\n'), + {sourceType: 'nonStrictModule'} + ).code; + + if (visitors) { + code = jstransform.transform( + visitors, + code + ).code; + } + + return code; + } + + describe('type alias', () => { + it('strips type aliases', () => { + /*global type*/ + /*global sanityCheck*/ + var code = transform([ + 'var type = 42;', + 'type FBID = number;', + 'type type = string', + 'type += 42;' + ]); + eval(code); + expect(type).toBe(84); + }); + + it('strips import-type declarations', () => { + var code = transform([ + 'import type DefaultExport from "MyModule";', + 'var sanityCheck = 42;', + ]); + eval(code); + expect(sanityCheck).toBe(42); + }); + + it('catches up correctly', () => { + var code = transform([ + "var X = require('X');", + 'type FBID = number;', + ]); + expect(code).toBe([ + "var X = require('X');", + ' ' + ].join('\n')); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-class-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-class-syntax-test.js new file mode 100644 index 0000000000..de8a6d41f2 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-class-syntax-test.js @@ -0,0 +1,298 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('static type class syntax', function() { + var classSyntaxVisitors; + var visitorList; + var flowSyntaxVisitors; + var jstransform; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + classSyntaxVisitors = + require('../es6-class-visitors').visitorList; + flowSyntaxVisitors = require('../type-syntax.js').visitorList; + jstransform = require('jstransform'); + + visitorList = classSyntaxVisitors; + }); + + function transform(code, visitors) { + visitors = visitors ? visitorList.concat(visitors) : visitorList; + + code = jstransform.transform( + flowSyntaxVisitors, + code.join('\n') + ).code; + + return jstransform.transform( + visitors, + code + ).code; + } + + describe('param type annotations', () => { + it('strips single param annotation', () => { + var code = transform([ + 'class Foo {', + ' method1(param1: bool) {', + ' return param1;', + ' }', + '}', + '', + 'var Bar = class {', + ' method1(param1: bool) {', + ' return param1;', + ' }', + '}' + ]); + eval(code); + expect((new Foo()).method1(42)).toBe(42); + expect((new Bar()).method1(42)).toBe(42); + }); + + it('strips multiple param annotations', () => { + var code = transform([ + 'class Foo {', + ' method1(param1: bool, param2: number) {', + ' return [param1, param2];', + ' }', + '}', + '', + 'var Bar = class {', + ' method1(param1: bool, param2: number) {', + ' return [param1, param2];', + ' }', + '}' + ]); + eval(code); + expect((new Foo()).method1(true, 42)).toEqual([true, 42]); + expect((new Bar()).method1(true, 42)).toEqual([true, 42]); + }); + + it('strips higher-order param annotations', () => { + var code = transform([ + 'class Foo {', + ' method1(param1: (_:bool) => number) {', + ' return param1;', + ' }', + '}', + '', + 'var Bar = class {', + ' method1(param1: (_:bool) => number) {', + ' return param1;', + ' }', + '}' + ]); + eval(code); + + var callback = function(param) { + return param ? 42 : 0; + }; + expect((new Foo()).method1(callback)).toBe(callback); + expect((new Bar()).method1(callback)).toBe(callback); + }); + + it('strips annotated params next to non-annotated params', () => { + var code = transform([ + 'class Foo {', + ' method1(param1, param2: number) {', + ' return [param1, param2];', + ' }', + '}', + '', + 'var Bar = class {', + ' method1(param1, param2: number) {', + ' return [param1, param2];', + ' }', + '}' + ]); + eval(code); + expect((new Foo()).method1('p1', 42)).toEqual(['p1', 42]); + expect((new Bar()).method1('p1', 42)).toEqual(['p1', 42]); + }); + + it('strips annotated params before a rest parameter', () => { + var restParamVisitors = + require('../es6-rest-param-visitors').visitorList; + + var code = transform([ + 'class Foo {', + ' method1(param1: number, ...args) {', + ' return [param1, args];', + ' }', + '}', + '', + 'var Bar = class {', + ' method1(param1: number, ...args) {', + ' return [param1, args];', + ' }', + '}' + ], restParamVisitors); + eval(code); + expect((new Foo()).method1(42, 43, 44)).toEqual([42, [43, 44]]); + expect((new Bar()).method1(42, 43, 44)).toEqual([42, [43, 44]]); + }); + }); + + describe('return type annotations', () => { + it('strips method return types', () => { + var code = transform([ + 'class Foo {', + ' method1(param1:number): () => number {', + ' return function() { return param1; };', + ' }', + '}', + '', + 'var Bar = class {', + ' method1(param1:number): () => number {', + ' return function() { return param1; };', + ' }', + '}' + ]); + eval(code); + expect((new Foo()).method1(42)()).toBe(42); + expect((new Bar()).method1(42)()).toBe(42); + }); + }); + + describe('parametric type annotation', () => { + it('strips parametric class type annotations', () => { + var code = transform([ + 'class Foo {', + ' method1(param1) {', + ' return param1;', + ' }', + '}', + '', + // TODO: Need to add support to esprima for this + // 'var Bar = class {', + // ' method1(param1) {', + // ' return param1;', + // ' }', + // '}' + ]); + eval(code); + expect((new Foo()).method1(42)).toBe(42); + // expect((new Bar()).method1(42)).toBe(42); + }); + + it('strips multi-parameter class type annotations', () => { + var code = transform([ + 'class Foo {', + ' method1(param1) {', + ' return param1;', + ' }', + '}', + '', + // TODO: Need to add support to esprima for this + // 'var Bar = class {', + // ' method1(param1) {', + // ' return param1;', + // ' }', + // '}' + ]); + eval(code); + expect((new Foo()).method1(42)).toBe(42); + // expect(bar(42)).toBe(42); + }); + + it('strips parametric method type annotations', () => { + var code = transform([ + 'class Foo {', + ' method1(param1) {', + ' return param1;', + ' }', + '}', + '', + // TODO: Need to add support to esprima for this + // 'var Bar = class {', + // ' method1(param1) {', + // ' return param1;', + // ' }', + // '}' + ]); + eval(code); + expect((new Foo()).method1(42)).toBe(42); + // expect((new Bar()).method1(42)).toBe(42); + }); + + it('strips multi-parameter class type annotations', () => { + var code = transform([ + 'class Foo {', + ' method1(param1) {', + ' return param1;', + ' }', + '}', + '', + // TODO: Need to add support to esprima for this + // 'var Bar = class {', + // ' method1(param1) {', + // ' return param1;', + // ' }', + // '}' + ]); + eval(code); + expect((new Foo()).method1(42)).toBe(42); + // expect(bar(42)).toBe(42); + }); + }); + + describe('class property annotations', () => { + it('strips single class property', () => { + var code = transform([ + 'class Foo {', + ' prop1: T;', + '}' + ]); + eval(code); + expect((new Foo()).prop1).toEqual(undefined); + }); + + it('strips multiple adjacent class properties', () => { + var code = transform([ + 'class Foo {', + ' prop1: T;', + ' prop2: U;', + '}' + ]); + eval(code); + expect((new Foo()).prop1).toEqual(undefined); + expect((new Foo()).prop2).toEqual(undefined); + }); + + it('strips class properties between methods', () => { + var code = transform([ + 'class Foo {', + ' method1() {}', + ' prop1: T;', + ' method2() {}', + ' prop2: U;', + ' method3() {}', + '}' + ]); + eval(code); + expect((new Foo()).prop1).toEqual(undefined); + expect((new Foo()).prop2).toEqual(undefined); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-function-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-function-syntax-test.js new file mode 100644 index 0000000000..ed465a3c4a --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-function-syntax-test.js @@ -0,0 +1,298 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('static type function syntax', function() { + var flowSyntaxVisitors; + var jstransform; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + flowSyntaxVisitors = require('../type-syntax.js').visitorList; + jstransform = require('jstransform'); + }); + + function transform(code, visitors) { + code = code.join('\n'); + + // We run the flow transform first + code = jstransform.transform( + flowSyntaxVisitors, + code + ).code; + + if (visitors) { + code = jstransform.transform( + visitors, + code + ).code; + } + return code; + } + + describe('param type annotations', () => { + it('strips single param annotation', () => { + var code = transform([ + 'function foo(param1: bool) {', + ' return param1;', + '}', + '', + 'var bar = function(param1: bool) {', + ' return param1;', + '}' + ]); + eval(code); + expect(foo(42)).toBe(42); + expect(bar(42)).toBe(42); + }); + + it('strips multiple param annotations', () => { + var code = transform([ + 'function foo(param1: bool, param2: number) {', + ' return [param1, param2];', + '}', + '', + 'var bar = function(param1: bool, param2: number) {', + ' return [param1, param2];', + '}' + ]); + eval(code); + expect(foo(true, 42)).toEqual([true, 42]); + expect(bar(true, 42)).toEqual([true, 42]); + }); + + it('strips higher-order param annotations', () => { + var code = transform([ + 'function foo(param1: (_:bool) => number) {', + ' return param1;', + '}', + '', + 'var bar = function(param1: (_:bool) => number) {', + ' return param1;', + '}' + ]); + eval(code); + + var callback = function(param) { + return param ? 42 : 0; + }; + expect(foo(callback)).toBe(callback); + expect(bar(callback)).toBe(callback); + }); + + it('strips annotated params next to non-annotated params', () => { + var code = transform([ + 'function foo(param1, param2: number) {', + ' return [param1, param2];', + '}', + '', + 'var bar = function(param1, param2: number) {', + ' return [param1, param2];', + '}' + ]); + eval(code); + expect(foo('p1', 42)).toEqual(['p1', 42]); + expect(bar('p1', 42)).toEqual(['p1', 42]); + }); + + it('strips annotated params before a rest parameter', () => { + var restParamVisitors = + require('../es6-rest-param-visitors').visitorList; + + var code = transform([ + 'function foo(param1: number, ...args) {', + ' return [param1, args];', + '}', + '', + 'var bar = function(param1: number, ...args) {', + ' return [param1, args];', + '}' + ], restParamVisitors); + eval(code); + expect(foo(42, 43, 44)).toEqual([42, [43, 44]]); + expect(bar(42, 43, 44)).toEqual([42, [43, 44]]); + }); + + it('strips annotated rest parameter', () => { + var restParamVisitors = + require('../es6-rest-param-visitors').visitorList; + + var code = transform([ + 'function foo(param1: number, ...args: Array) {', + ' return [param1, args];', + '}', + '', + 'var bar = function(param1: number, ...args: Array) {', + ' return [param1, args];', + '}' + ], restParamVisitors); + eval(code); + expect(foo(42, 43, 44)).toEqual([42, [43, 44]]); + expect(bar(42, 43, 44)).toEqual([42, [43, 44]]); + }); + + it('strips optional param marker without type annotation', () => { + var code = transform([ + 'function foo(param1?, param2 ?) {', + ' return 42;', + '}' + ]); + eval(code); + expect(foo()).toBe(42); + }); + + it('strips optional param marker with type annotation', () => { + var code = transform([ + 'function foo(param1?:number, param2 ?: string, param3 ? : bool) {', + ' return 42;', + '}' + ]); + eval(code); + expect(foo()).toBe(42); + }); + }); + + describe('return type annotations', () => { + it('strips function return types', () => { + var code = transform([ + 'function foo(param1:number): () => number {', + ' return function() { return param1; };', + '}', + '', + 'var bar = function(param1:number): () => number {', + ' return function() { return param1; };', + '}' + ]); + eval(code); + expect(foo(42)()).toBe(42); + expect(bar(42)()).toBe(42); + }); + + it('strips void return types', () => { + var code = transform([ + 'function foo(param1): void {', + ' param1();', + '}', + '', + 'var bar = function(param1): void {', + ' param1();', + '}' + ]); + eval(code); + + var counter = 0; + function testFn() { + counter++; + } + + foo(testFn); + expect(counter).toBe(1); + + bar(testFn); + expect(counter).toBe(2); + }); + + it('strips void return types with rest params', () => { + var code = transform( + [ + 'function foo(param1, ...rest): void {', + ' param1();', + '}', + '', + 'var bar = function(param1, ...rest): void {', + ' param1();', + '}' + ], + require('../es6-rest-param-visitors').visitorList + ); + eval(code); + + var counter = 0; + function testFn() { + counter++; + } + + foo(testFn); + expect(counter).toBe(1); + + bar(testFn); + expect(counter).toBe(2); + }); + + it('strips object return types', () => { + var code = transform([ + 'function foo(param1:number): {num: number} {', + ' return {num: param1};', + '}', + '', + 'var bar = function(param1:number): {num: number} {', + ' return {num: param1};', + '}' + ]); + + eval(code); + expect(foo(42)).toEqual({num: 42}); + expect(bar(42)).toEqual({num: 42}); + }); + }); + + describe('parametric type annotation', () => { + it('strips parametric type annotations', () => { + var code = transform([ + 'function foo(param1) {', + ' return param1;', + '}', + '', + 'var bar = function(param1) {', + ' return param1;', + '}', + ]); + eval(code); + expect(foo(42)).toBe(42); + expect(bar(42)).toBe(42); + }); + + it('strips multi-parameter type annotations', () => { + var restParamVisitors = + require('../es6-rest-param-visitors').visitorList; + + var code = transform([ + 'function foo(param1) {', + ' return param1;', + '}', + '', + 'var bar = function(param1) {', + ' return param1;', + '}' + ], restParamVisitors); + eval(code); + expect(foo(42)).toBe(42); + expect(bar(42)).toBe(42); + }); + }); + + describe('arrow functions', () => { + // TODO: We don't currently support arrow functions, but we should + // soon! The only reason we don't now is because we don't + // need it at this very moment and I'm in a rush to get the + // basics in. + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-interface-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-interface-syntax-test.js new file mode 100644 index 0000000000..46d946188e --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-interface-syntax-test.js @@ -0,0 +1,72 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jshint evil:true*/ + +require('mock-modules').autoMockOff(); + +describe('static type interface syntax', function() { + var flowSyntaxVisitors; + var jstransform; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + flowSyntaxVisitors = require('../type-syntax.js').visitorList; + jstransform = require('jstransform'); + }); + + function transform(code, visitors) { + code = jstransform.transform( + flowSyntaxVisitors, + code.join('\n') + ).code; + + if (visitors) { + code = jstransform.transform( + visitors, + code + ).code; + } + return code; + } + + describe('Interface Declaration', () => { + it('strips interface declarations', () => { + /*global interface*/ + var code = transform([ + 'var interface = 42;', + 'interface A { foo: () => number; }', + 'if (true) interface += 42;', + 'interface A extends B, C { foo: () => number; }', + 'interface += 42;' + ]); + eval(code); + expect(interface).toBe(126); + }); + + it('catches up correctly', () => { + var code = transform([ + "var X = require('X');", + 'interface A { foo: () => number; }', + ]); + expect(code).toBe([ + "var X = require('X');", + ' ' + ].join('\n')); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-object-method-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-object-method-syntax-test.js new file mode 100644 index 0000000000..27947d0bf6 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-object-method-syntax-test.js @@ -0,0 +1,186 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('static type object-method syntax', function() { + var flowSyntaxVisitors; + var jstransform; + var visitorList; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + flowSyntaxVisitors = require('../type-syntax.js').visitorList; + jstransform = require('jstransform'); + objMethodVisitors = + require('../es6-object-concise-method-visitors'); + + visitorList = objMethodVisitors.visitorList; + }); + + function transform(code, visitors) { + visitors = visitors ? visitorList.concat(visitors) : visitorList; + + // We run the flow transform first + code = jstransform.transform( + flowSyntaxVisitors, + code.join('\n') + ).code; + + code = jstransform.transform( + visitors, + code + ).code; + + return code; + } + + describe('param type annotations', () => { + it('strips single param annotation', () => { + var code = transform([ + 'var foo = {', + ' bar(param1: bool) {', + ' return param1;', + ' }', + '};', + ]); + eval(code); + expect(foo.bar(42)).toBe(42); + }); + + it('strips multiple param annotations', () => { + var code = transform([ + 'var foo = {', + ' bar(param1: bool, param2: number) {', + ' return [param1, param2];', + ' }', + '};' + ]); + eval(code); + expect(foo.bar(true, 42)).toEqual([true, 42]); + }); + + it('strips higher-order param annotations', () => { + var code = transform([ + 'var foo = {', + ' bar(param1: (_:bool) => number) {', + ' return param1;', + ' }', + '};' + ]); + eval(code); + + var callback = function(param) { + return param ? 42 : 0; + }; + expect(foo.bar(callback)).toBe(callback); + }); + + it('strips annotated params next to non-annotated params', () => { + var code = transform([ + 'var foo = {', + ' bar(param1, param2: number) {', + ' return [param1, param2];', + ' }', + '}', + ]); + eval(code); + expect(foo.bar('p1', 42)).toEqual(['p1', 42]); + }); + + it('strips annotated params before a rest parameter', () => { + var restParamVisitors = + require('../es6-rest-param-visitors').visitorList; + + var code = transform([ + 'var foo = {', + ' bar(param1: number, ...args) {', + ' return [param1, args];', + ' }', + '}', + ], restParamVisitors); + eval(code); + expect(foo.bar(42, 43, 44)).toEqual([42, [43, 44]]); + }); + + it('strips annotated rest parameter', () => { + var restParamVisitors = + require('../es6-rest-param-visitors').visitorList; + + var code = transform([ + 'var foo = {', + ' bar(param1: number, ...args: Array): Array {', + ' return [param1, args];', + ' }', + '}', + ], restParamVisitors); + eval(code); + expect(foo.bar(42, 43, 44)).toEqual([42, [43, 44]]); + }); + }); + + describe('return type annotations', () => { + it('strips function return types', () => { + var code = transform([ + 'var foo = {', + ' bar(param1:number): () => number {', + ' return function() { return param1; };', + ' }', + '}', + ]); + eval(code); + expect(foo.bar(42)()).toBe(42); + }); + }); + + describe('parametric type annotation', () => { + // TODO: Fix esprima parsing for these cases + /* + it('strips parametric type annotations', () => { + // TODO: Doesnt parse + var code = transform([ + 'var foo = {', + ' bar(param1) {', + ' return param1;', + ' }', + '}', + ]); + eval(code); + expect(foo.bar(42)).toBe(42); + }); + + it('strips multi-parameter type annotations', () => { + // TODO: Doesnt parse + var restParamVisitors = + require('../es6-rest-param-visitors').visitorList; + + var code = transform([ + 'var foo = {', + ' bar(param1) {', + ' return param1;', + ' }', + '}', + ], restParamVisitors); + eval(code); + expect(foo.bar(42)).toBe(42); + }); + */ + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-pattern-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-pattern-syntax-test.js new file mode 100644 index 0000000000..4460dca0ac --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-pattern-syntax-test.js @@ -0,0 +1,91 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('static type pattern syntax', function() { + var flowSyntaxVisitors; + var jstransform; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + flowSyntaxVisitors = require('../type-syntax.js').visitorList; + jstransform = require('jstransform'); + destructuringVisitors = + require('../es6-destructuring-visitors'); + + visitorList = destructuringVisitors.visitorList; + }); + + function transform(code, visitors) { + visitors = visitors ? visitorList.concat(visitors) : visitorList; + + // We run the flow transform first + code = jstransform.transform( + flowSyntaxVisitors, + code.join('\n') + ).code; + + code = jstransform.transform( + visitors, + code + ).code; + + return code; + } + + describe('Object Pattern', () => { + it('strips function argument type annotation', () => { + var code = transform([ + 'function foo({x, y}: {x: number; y: number}) { return x+y; }', + 'var thirty = foo({x: 10, y: 20});' + ]); + eval(code); + expect(thirty).toBe(30); + }); + it('strips var declaration type annotation', () => { + var code = transform([ + 'var {x, y}: {x: number; y: string} = { x: 42, y: "hello" };' + ]); + eval(code); + expect(x).toBe(42); + expect(y).toBe("hello"); + }); + }); + + describe('Array Pattern', () => { + it('strips function argument type annotation', () => { + var code = transform([ + 'function foo([x, y]: Array) { return x+y; }', + 'var thirty = foo([10, 20]);' + ]); + eval(code); + expect(thirty).toBe(30); + }); + it('strips var declaration type annotation', () => { + var code = transform([ + 'var [x, y]: Array = [42, "hello"];' + ]); + eval(code); + expect(x).toBe(42); + expect(y).toBe("hello"); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-syntax-test.js new file mode 100644 index 0000000000..76002aa6fd --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-syntax-test.js @@ -0,0 +1,194 @@ +/*jshint evil: true*/ +/*jshint loopfunc: true*/ + +if (!!module.parent) { + module.exports = { + 'TypeAnnotations': [ + 'function foo(numVal: any){}', + 'function foo(numVal: number){}', + 'function foo(numVal: number, strVal: string){}', + 'function foo(numVal: number, untypedVal){}', + 'function foo(untypedVal, numVal: number){}', + 'function foo(nullableNum: ?number){}', + 'function foo(callback: () => void){}', + 'function foo(callback: () => number){}', + 'function foo(callback: (_:bool) => number){}', + 'function foo(callback: (_1:bool, _2:string) => number){}', + 'function foo(callback: (_1:bool, ...foo:Array) => number){}', + 'function foo():number{}', + 'function foo():() => void{}', + 'function foo():(_:bool) => number{}', + 'function foo():(_?:bool) => number{}', + 'function foo(): {} {}', + 'function foo() {}', + 'function foo() {}', + 'function foo() {}', + 'a=function() {}', + 'a={set fooProp(value:number){}}', + 'a={set fooProp(value:number): void{}}', + 'a={get fooProp(): number {}}', + 'class Foo {set fooProp(value:number){}}', + 'class Foo {set fooProp(value:number): void{}}', + 'class Foo {get fooProp(): number{}}', + 'var numVal:number;', + 'var numVal:number = otherNumVal;', + 'var a: {numVal: number};', + 'var a: {numVal: number;};', + 'var a: {numVal: number; [indexer: string]: number};', + 'var a: ?{numVal: number};', + 'var a: {numVal: number; strVal: string}', + 'var a: {subObj: {strVal: string}}', + 'var a: {subObj: ?{strVal: string}}', + 'var a: {param1: number; param2: string}', + 'var a: {param1: number; param2?: string}', + 'var a: {add(x:number, ...y:Array): void}', + 'var a: { id(x: T): T; }', + 'var a:Array = [1, 2, 3]', + 'a = class Foo { }', + 'a = class Foo extends Bar { }', + 'class Foo {}', + 'class Foo {}', + 'class Foo extends Bar { }', + 'class Foo extends mixin(Bar) { }', + 'class Foo { bar():number { return 42; }}', + 'class Foo { "bar"() { } }', + 'function foo(requiredParam, optParam?) {}', + 'class Foo { prop1:string; prop2:number; }', + 'var x : number | string = 4;', + 'class Array { concat(items:number | string) {}; }', + 'var x : () => number | () => string = fn;', + 'var x: typeof Y = Y;', + 'var x: typeof Y | number = Y;', + 'var {x}: {x: string; } = { x: "hello" };', + 'var {x}: {x: string } = { x: "hello" };', + 'var [x]: Array = [ "hello" ];', + 'function foo({x}: { x: string; }) {}', + 'function foo([x]: Array) {}', + 'function foo(...rest: Array) {}', + '(function (...rest: Array) {})', + '((...rest: Array) => rest)', + 'var a: Map >', + 'var a: Map>', + 'var a: number[]', + 'var a: ?string[]', + 'var a: Promise[]', + 'var a:(...rest:Array) => number' + ], + 'Type Alias': [ + 'type FBID = number;', + 'type Foo = Bar', + ], + 'Interfaces': [ + 'interface A {}', + 'interface A extends B {}', + 'interface A extends B, C {}', + 'interface A { foo: () => number; }', + 'interface Dictionary { [index: string]: string; length: number; }', + 'class Foo implements Bar {}', + 'class Foo extends Bar implements Bat, Man {}', + 'class Foo extends class Bar implements Bat {} {}', + 'class Foo extends class Bar implements Bat {} implements Man {}', + ], + 'Type Grouping': [ + 'var a: (number)', + 'var a: (() => number) | () => string', + 'var a: number & (string | bool)', + 'var a: (typeof A)', + ], + 'XJS': [ + '', + '', + ' {value} ', + '', + '', + '<日本語>', + '\nbar\nbaz\r\n', + ' : } />', + '{}', + '{/* this is a comment */}', + '
@test content
', + '

7x invalid-js-identifier
', + ' right=monkeys />', + '', + '', + '(
) < x;', + '
', + '
', + '
', + ' ', + ], + 'Call Properties': [ + 'var a : { (): number }', + 'var a : { (): number; }', + 'var a : { (): number; y: string; (x: string): string }', + 'var a : { (x: T): number; }', + 'interface A { (): number; }', + ], + 'String Literal Types': [ + 'function createElement(tagName: "div"): HTMLDivElement {}', + 'function createElement(tagName: \'div\'): HTMLDivElement {}', + ], + 'Qualified Generic Type': [ + 'var a : A.B', + 'var a : A.B.C', + 'var a : A.B', + 'var a : typeof A.B', + ], + 'Declare Statements': [ + 'declare var foo', + 'declare var foo;', + 'declare function foo(): void', + 'declare function foo(): void;', + 'declare function foo(): void;', + 'declare function foo(x: number, y: string): void;', + 'declare class A {}', + 'declare class A extends B { x: number }', + 'declare class A { static foo(): number; static x : string }', + 'declare class A { static [ indexer: number]: string }', + 'declare class A { static () : number }', + ], + 'Declare Module': [ + 'declare module A {}', + 'declare module "./a/b.js" {}', + 'declare module A { declare var x: number; }', + 'declare module A { declare function foo(): number; }', + 'declare module A { declare class B { foo(): number; } }', + ], + 'Typecasts': [ + '(xxx: number)', + '({xxx: 0, yyy: "hey"}: {xxx: number; yyy: string})', + // distinguish between function type params and typecasts + '((xxx) => xxx + 1: (xxx: number) => number)', + // parens disambiguate groups from casts + '((xxx: number), (yyy: string))', + '((xxx: any): number)', + ], + }; +} else { + require('mock-modules').autoMockOff(); + var tests = require("./gen/type-syntax-test.rec.js"); + var jstransform = require('../../src/jstransform'); + var visitors = require('../type-syntax').visitorList; + + describe('transforms match expectations', function () { + for (var section in tests) { + for (var test in tests[section]) { + it('transforms "'+test+'"', function (section, test) { return function () { + var transformed = jstransform.transform(visitors, test).code; + expect(transformed).toBe(tests[section][test].transformed); + }; } (section, test)); + it('evals "'+test+'"', function (section, test) { return function () { + var evalResult; + var transformed = jstransform.transform(visitors, test).code; + try { + eval(transformed); + evalResult = "No error"; + } catch (e) { + evalResult = e.message; + } + expect(evalResult).toBe(tests[section][test].eval); + }; } (section, test)); + } + } + }); +} diff --git a/react-app/node_modules/jstransform/visitors/__tests__/type-variable-declaration-syntax-test.js b/react-app/node_modules/jstransform/visitors/__tests__/type-variable-declaration-syntax-test.js new file mode 100644 index 0000000000..cd8b56499b --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/__tests__/type-variable-declaration-syntax-test.js @@ -0,0 +1,208 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jshint evil:true*/ +/*jshint -W117*/ + +require('mock-modules').autoMockOff(); + +describe('static type variable declaration syntax', function() { + var flowSyntaxVisitors; + var jstransform; + + beforeEach(function() { + require('mock-modules').dumpCache(); + + flowSyntaxVisitors = require('../type-syntax.js').visitorList; + jstransform = require('jstransform'); + }); + + function transform(code, visitors) { + code = code.join('\n'); + + // We run the flow transform first + code = jstransform.transform( + flowSyntaxVisitors, + code + ).code; + + if (visitors) { + code = jstransform.transform( + visitors, + code + ).code; + } + return code; + } + + describe('basic annotations', () => { + it('strips single annotated declarator without initializer', () => { + var code = transform([ + 'var myNum = 42;', + 'function foo() {', + ' var myNum:number;', + ' return myNum;', + '}' + ]); + eval(code); + expect(foo()).toBe(undefined); + }); + + it('strips single annotated declarator with initializer', () => { + var code = transform([ + 'var myNum:number = 42;', + ]); + eval(code); + expect(myNum).toBe(42); + }); + + it('strips single annotated nullable declarator with initializer', () => { + var code = transform([ + 'var myNum:?number = 42;', + ]); + eval(code); + expect(myNum).toBe(42); + }); + + it( + 'strips single annotated nullable declarator without initializer', + () => { + var code = transform([ + 'var myNum:?number;', + 'myNum = null;', + ]); + eval(code); + expect(myNum).toBe(null); + } + ); + + it('strips multiple annotation declarations without initializers', () => { + var code = transform([ + 'var num1 = 42;', + 'var num2 = 43;', + 'function foo() {', + ' var num1:number, num2:number;', + ' return [num1, num2];', + '}' + ]); + eval(code); + expect(foo()).toEqual([undefined, undefined]); + }); + + it('strips multiple annotation declarations without initializers', () => { + var code = transform([ + 'var num1:number = 42, num2:number = 43;' + ]); + eval(code); + expect(num1).toBe(42); + expect(num2).toBe(43); + }); + }); + + describe('function type annotations', () => { + it('strips function type annotations without initializer', () => { + var code = transform([ + 'var myFunc = function() { return "NOPE"; };', + 'function foo() {', + ' var myFunc:(_:bool) => number;', + ' return myFunc;', + '}' + ]); + eval(code); + expect(foo()).toBe(undefined); + }); + + it('strips function type annotations with initializer', () => { + var code = transform([ + 'var myFunc:(_:bool) => number = function(p1) {', + ' return 42;', + '};' + ]); + eval(code); + expect(myFunc()).toBe(42); + }); + }); + + describe('object type annotations', () => { + it('strips empty object type annotations without initializer', () => { + var code = transform([ + 'var myObj = "NOPE";', + 'function foo() {', + ' var myObj:{};', + ' return myObj;', + '}' + ]); + eval(code); + expect(foo()).toBe(undefined); + }); + + it('strips empty object type annotations with initializer', () => { + var code = transform([ + 'var myObj:{} = {YEP: true};' + ]); + eval(code); + expect(myObj.YEP).toBe(true); + }); + + it('strips empty nullable object type annotations with initializer', () => { + var code = transform([ + 'var myObj:?{} = {YEP: true};' + ]); + eval(code); + expect(myObj.YEP).toBe(true); + }); + + it('strips object type with basic property annotation', () => { + var code = transform([ + 'var myObj:{arrProp:Array} = {YEP: [true]};' + ]); + eval(code); + expect(myObj.YEP).toEqual([true]); + }); + + it('strips object type with multiple property annotations', () => { + var code = transform([ + 'var myObj:{numProp: number; strProp: string} = {', + ' numProp: 42,', + ' strProp: "YEP"', + '};' + ]); + eval(code); + expect(myObj.numProp).toBe(42); + expect(myObj.strProp).toBe("YEP"); + }); + + it('strips object type with parametric property annotation', () => { + var code = transform([ + 'var myObj:{arrProp:Array} = {YEP: [true]};' + ]); + eval(code); + expect(myObj.YEP).toEqual([true]); + }); + + it('strips object type with function property annotation', () => { + var code = transform([ + 'var myObj:{myMethod:() => void} = {', + ' myMethod: function() {', + ' return 42;', + ' }', + '};' + ]); + eval(code); + expect(myObj.myMethod()).toBe(42); + }); + }); +}); diff --git a/react-app/node_modules/jstransform/visitors/es6-arrow-function-visitors.js b/react-app/node_modules/jstransform/visitors/es6-arrow-function-visitors.js new file mode 100644 index 0000000000..e5a2fb43ab --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-arrow-function-visitors.js @@ -0,0 +1,158 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*global exports:true*/ + +/** + * Desugars ES6 Arrow functions to ES3 function expressions. + * If the function contains `this` expression -- automatically + * binds the function to current value of `this`. + * + * Single parameter, simple expression: + * + * [1, 2, 3].map(x => x * x); + * + * [1, 2, 3].map(function(x) { return x * x; }); + * + * Several parameters, complex block: + * + * this.users.forEach((user, idx) => { + * return this.isActive(idx) && this.send(user); + * }); + * + * this.users.forEach(function(user, idx) { + * return this.isActive(idx) && this.send(user); + * }.bind(this)); + * + */ +var restParamVisitors = require('./es6-rest-param-visitors'); +var destructuringVisitors = require('./es6-destructuring-visitors'); + +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); + +/** + * @public + */ +function visitArrowFunction(traverse, node, path, state) { + var notInExpression = (path[0].type === Syntax.ExpressionStatement); + + // Wrap a function into a grouping operator, if it's not + // in the expression position. + if (notInExpression) { + utils.append('(', state); + } + + utils.append('function', state); + renderParams(traverse, node, path, state); + + // Skip arrow. + utils.catchupWhiteSpace(node.body.range[0], state); + + var renderBody = node.body.type == Syntax.BlockStatement + ? renderStatementBody + : renderExpressionBody; + + path.unshift(node); + renderBody(traverse, node, path, state); + path.shift(); + + // Bind the function only if `this` value is used + // inside it or inside any sub-expression. + var containsBindingSyntax = + utils.containsChildMatching(node.body, function(node) { + return node.type === Syntax.ThisExpression + || (node.type === Syntax.Identifier + && node.name === "super"); + }); + + if (containsBindingSyntax) { + utils.append('.bind(this)', state); + } + + utils.catchupWhiteSpace(node.range[1], state); + + // Close wrapper if not in the expression. + if (notInExpression) { + utils.append(')', state); + } + + return false; +} + +function renderParams(traverse, node, path, state) { + // To preserve inline typechecking directives, we + // distinguish between parens-free and paranthesized single param. + if (isParensFreeSingleParam(node, state) || !node.params.length) { + utils.append('(', state); + } + if (node.params.length !== 0) { + path.unshift(node); + traverse(node.params, path, state); + path.unshift(); + } + utils.append(')', state); +} + +function isParensFreeSingleParam(node, state) { + return node.params.length === 1 && + state.g.source[state.g.position] !== '('; +} + +function renderExpressionBody(traverse, node, path, state) { + // Wrap simple expression bodies into a block + // with explicit return statement. + utils.append('{', state); + + // Special handling of rest param. + if (node.rest) { + utils.append( + restParamVisitors.renderRestParamSetup(node, state), + state + ); + } + + // Special handling of destructured params. + destructuringVisitors.renderDestructuredComponents( + node, + utils.updateState(state, { + localScope: { + parentNode: state.parentNode, + parentScope: state.parentScope, + identifiers: state.identifiers, + tempVarIndex: 0 + } + }) + ); + + utils.append('return ', state); + renderStatementBody(traverse, node, path, state); + utils.append(';}', state); +} + +function renderStatementBody(traverse, node, path, state) { + traverse(node.body, path, state); + utils.catchup(node.body.range[1], state); +} + +visitArrowFunction.test = function(node, path, state) { + return node.type === Syntax.ArrowFunctionExpression; +}; + +exports.visitorList = [ + visitArrowFunction +]; + diff --git a/react-app/node_modules/jstransform/visitors/es6-call-spread-visitors.js b/react-app/node_modules/jstransform/visitors/es6-call-spread-visitors.js new file mode 100644 index 0000000000..0acc4e3b5e --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-call-spread-visitors.js @@ -0,0 +1,107 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + */ +/*global exports:true*/ + +/** + * Implements ES6 call spread. + * + * instance.method(a, b, c, ...d) + * + * instance.method.apply(instance, [a, b, c].concat(d)) + * + */ + +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); + +function process(traverse, node, path, state) { + utils.move(node.range[0], state); + traverse(node, path, state); + utils.catchup(node.range[1], state); +} + +function visitCallSpread(traverse, node, path, state) { + utils.catchup(node.range[0], state); + + if (node.type === Syntax.NewExpression) { + // Input = new Set(1, 2, ...list) + // Output = new (Function.prototype.bind.apply(Set, [null, 1, 2].concat(list))) + utils.append('new (Function.prototype.bind.apply(', state); + process(traverse, node.callee, path, state); + } else if (node.callee.type === Syntax.MemberExpression) { + // Input = get().fn(1, 2, ...more) + // Output = (_ = get()).fn.apply(_, [1, 2].apply(more)) + var tempVar = utils.injectTempVar(state); + utils.append('(' + tempVar + ' = ', state); + process(traverse, node.callee.object, path, state); + utils.append(')', state); + if (node.callee.property.type === Syntax.Identifier) { + utils.append('.', state); + process(traverse, node.callee.property, path, state); + } else { + utils.append('[', state); + process(traverse, node.callee.property, path, state); + utils.append(']', state); + } + utils.append('.apply(' + tempVar, state); + } else { + // Input = max(1, 2, ...list) + // Output = max.apply(null, [1, 2].concat(list)) + var needsToBeWrappedInParenthesis = + node.callee.type === Syntax.FunctionDeclaration || + node.callee.type === Syntax.FunctionExpression; + if (needsToBeWrappedInParenthesis) { + utils.append('(', state); + } + process(traverse, node.callee, path, state); + if (needsToBeWrappedInParenthesis) { + utils.append(')', state); + } + utils.append('.apply(null', state); + } + utils.append(', ', state); + + var args = node.arguments.slice(); + var spread = args.pop(); + if (args.length || node.type === Syntax.NewExpression) { + utils.append('[', state); + if (node.type === Syntax.NewExpression) { + utils.append('null' + (args.length ? ', ' : ''), state); + } + while (args.length) { + var arg = args.shift(); + utils.move(arg.range[0], state); + traverse(arg, path, state); + if (args.length) { + utils.catchup(args[0].range[0], state); + } else { + utils.catchup(arg.range[1], state); + } + } + utils.append('].concat(', state); + process(traverse, spread.argument, path, state); + utils.append(')', state); + } else { + process(traverse, spread.argument, path, state); + } + utils.append(node.type === Syntax.NewExpression ? '))' : ')', state); + + utils.move(node.range[1], state); + return false; +} + +visitCallSpread.test = function(node, path, state) { + return ( + ( + node.type === Syntax.CallExpression || + node.type === Syntax.NewExpression + ) && + node.arguments.length > 0 && + node.arguments[node.arguments.length - 1].type === Syntax.SpreadElement + ); +}; + +exports.visitorList = [ + visitCallSpread, +]; diff --git a/react-app/node_modules/jstransform/visitors/es6-class-visitors.js b/react-app/node_modules/jstransform/visitors/es6-class-visitors.js new file mode 100644 index 0000000000..d9ac45f8b2 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-class-visitors.js @@ -0,0 +1,588 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jslint node:true*/ + +/** + * @typechecks + */ +'use strict'; + +var base62 = require('base62'); +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); +var reservedWordsHelper = require('./reserved-words-helper'); + +var declareIdentInLocalScope = utils.declareIdentInLocalScope; +var initScopeMetadata = utils.initScopeMetadata; + +var SUPER_PROTO_IDENT_PREFIX = '____SuperProtoOf'; + +var _anonClassUUIDCounter = 0; +var _mungedSymbolMaps = {}; + +function resetSymbols() { + _anonClassUUIDCounter = 0; + _mungedSymbolMaps = {}; +} + +/** + * Used to generate a unique class for use with code-gens for anonymous class + * expressions. + * + * @param {object} state + * @return {string} + */ +function _generateAnonymousClassName(state) { + var mungeNamespace = state.mungeNamespace || ''; + return '____Class' + mungeNamespace + base62.encode(_anonClassUUIDCounter++); +} + +/** + * Given an identifier name, munge it using the current state's mungeNamespace. + * + * @param {string} identName + * @param {object} state + * @return {string} + */ +function _getMungedName(identName, state) { + var mungeNamespace = state.mungeNamespace; + var shouldMinify = state.g.opts.minify; + + if (shouldMinify) { + if (!_mungedSymbolMaps[mungeNamespace]) { + _mungedSymbolMaps[mungeNamespace] = { + symbolMap: {}, + identUUIDCounter: 0 + }; + } + + var symbolMap = _mungedSymbolMaps[mungeNamespace].symbolMap; + if (!symbolMap[identName]) { + symbolMap[identName] = + base62.encode(_mungedSymbolMaps[mungeNamespace].identUUIDCounter++); + } + identName = symbolMap[identName]; + } + return '$' + mungeNamespace + identName; +} + +/** + * Extracts super class information from a class node. + * + * Information includes name of the super class and/or the expression string + * (if extending from an expression) + * + * @param {object} node + * @param {object} state + * @return {object} + */ +function _getSuperClassInfo(node, state) { + var ret = { + name: null, + expression: null + }; + if (node.superClass) { + if (node.superClass.type === Syntax.Identifier) { + ret.name = node.superClass.name; + } else { + // Extension from an expression + ret.name = _generateAnonymousClassName(state); + ret.expression = state.g.source.substring( + node.superClass.range[0], + node.superClass.range[1] + ); + } + } + return ret; +} + +/** + * Used with .filter() to find the constructor method in a list of + * MethodDefinition nodes. + * + * @param {object} classElement + * @return {boolean} + */ +function _isConstructorMethod(classElement) { + return classElement.type === Syntax.MethodDefinition && + classElement.key.type === Syntax.Identifier && + classElement.key.name === 'constructor'; +} + +/** + * @param {object} node + * @param {object} state + * @return {boolean} + */ +function _shouldMungeIdentifier(node, state) { + return ( + !!state.methodFuncNode && + !utils.getDocblock(state).hasOwnProperty('preventMunge') && + /^_(?!_)/.test(node.name) + ); +} + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function visitClassMethod(traverse, node, path, state) { + if (!state.g.opts.es5 && (node.kind === 'get' || node.kind === 'set')) { + throw new Error( + 'This transform does not support ' + node.kind + 'ter methods for ES6 ' + + 'classes. (line: ' + node.loc.start.line + ', col: ' + + node.loc.start.column + ')' + ); + } + state = utils.updateState(state, { + methodNode: node + }); + utils.catchup(node.range[0], state); + path.unshift(node); + traverse(node.value, path, state); + path.shift(); + return false; +} +visitClassMethod.test = function(node, path, state) { + return node.type === Syntax.MethodDefinition; +}; + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function visitClassFunctionExpression(traverse, node, path, state) { + var methodNode = path[0]; + var isGetter = methodNode.kind === 'get'; + var isSetter = methodNode.kind === 'set'; + + state = utils.updateState(state, { + methodFuncNode: node + }); + + if (methodNode.key.name === 'constructor') { + utils.append('function ' + state.className, state); + } else { + var methodAccessorComputed = false; + var methodAccessor; + var prototypeOrStatic = methodNode.static ? '' : '.prototype'; + var objectAccessor = state.className + prototypeOrStatic; + + if (methodNode.key.type === Syntax.Identifier) { + // foo() {} + methodAccessor = methodNode.key.name; + if (_shouldMungeIdentifier(methodNode.key, state)) { + methodAccessor = _getMungedName(methodAccessor, state); + } + if (isGetter || isSetter) { + methodAccessor = JSON.stringify(methodAccessor); + } else if (reservedWordsHelper.isReservedWord(methodAccessor)) { + methodAccessorComputed = true; + methodAccessor = JSON.stringify(methodAccessor); + } + } else if (methodNode.key.type === Syntax.Literal) { + // 'foo bar'() {} | get 'foo bar'() {} | set 'foo bar'() {} + methodAccessor = JSON.stringify(methodNode.key.value); + methodAccessorComputed = true; + } + + if (isSetter || isGetter) { + utils.append( + 'Object.defineProperty(' + + objectAccessor + ',' + + methodAccessor + ',' + + '{configurable:true,' + + methodNode.kind + ':function', + state + ); + } else { + if (state.g.opts.es3) { + if (methodAccessorComputed) { + methodAccessor = '[' + methodAccessor + ']'; + } else { + methodAccessor = '.' + methodAccessor; + } + utils.append( + objectAccessor + + methodAccessor + '=function' + (node.generator ? '*' : ''), + state + ); + } else { + if (!methodAccessorComputed) { + methodAccessor = JSON.stringify(methodAccessor); + } + utils.append( + 'Object.defineProperty(' + + objectAccessor + ',' + + methodAccessor + ',' + + '{writable:true,configurable:true,' + + 'value:function' + (node.generator ? '*' : ''), + state + ); + } + } + } + utils.move(methodNode.key.range[1], state); + utils.append('(', state); + + var params = node.params; + if (params.length > 0) { + utils.catchupNewlines(params[0].range[0], state); + for (var i = 0; i < params.length; i++) { + utils.catchup(node.params[i].range[0], state); + path.unshift(node); + traverse(params[i], path, state); + path.shift(); + } + } + + var closingParenPosition = utils.getNextSyntacticCharOffset(')', state); + utils.catchupWhiteSpace(closingParenPosition, state); + + var openingBracketPosition = utils.getNextSyntacticCharOffset('{', state); + utils.catchup(openingBracketPosition + 1, state); + + if (!state.scopeIsStrict) { + utils.append('"use strict";', state); + state = utils.updateState(state, { + scopeIsStrict: true + }); + } + utils.move(node.body.range[0] + '{'.length, state); + + path.unshift(node); + traverse(node.body, path, state); + path.shift(); + utils.catchup(node.body.range[1], state); + + if (methodNode.key.name !== 'constructor') { + if (isGetter || isSetter || !state.g.opts.es3) { + utils.append('})', state); + } + utils.append(';', state); + } + return false; +} +visitClassFunctionExpression.test = function(node, path, state) { + return node.type === Syntax.FunctionExpression + && path[0].type === Syntax.MethodDefinition; +}; + +function visitClassMethodParam(traverse, node, path, state) { + var paramName = node.name; + if (_shouldMungeIdentifier(node, state)) { + paramName = _getMungedName(node.name, state); + } + utils.append(paramName, state); + utils.move(node.range[1], state); +} +visitClassMethodParam.test = function(node, path, state) { + if (!path[0] || !path[1]) { + return; + } + + var parentFuncExpr = path[0]; + var parentClassMethod = path[1]; + + return parentFuncExpr.type === Syntax.FunctionExpression + && parentClassMethod.type === Syntax.MethodDefinition + && node.type === Syntax.Identifier; +}; + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function _renderClassBody(traverse, node, path, state) { + var className = state.className; + var superClass = state.superClass; + + // Set up prototype of constructor on same line as `extends` for line-number + // preservation. This relies on function-hoisting if a constructor function is + // defined in the class body. + if (superClass.name) { + // If the super class is an expression, we need to memoize the output of the + // expression into the generated class name variable and use that to refer + // to the super class going forward. Example: + // + // class Foo extends mixin(Bar, Baz) {} + // --transforms to-- + // function Foo() {} var ____Class0Blah = mixin(Bar, Baz); + if (superClass.expression !== null) { + utils.append( + 'var ' + superClass.name + '=' + superClass.expression + ';', + state + ); + } + + var keyName = superClass.name + '____Key'; + var keyNameDeclarator = ''; + if (!utils.identWithinLexicalScope(keyName, state)) { + keyNameDeclarator = 'var '; + declareIdentInLocalScope(keyName, initScopeMetadata(node), state); + } + utils.append( + 'for(' + keyNameDeclarator + keyName + ' in ' + superClass.name + '){' + + 'if(' + superClass.name + '.hasOwnProperty(' + keyName + ')){' + + className + '[' + keyName + ']=' + + superClass.name + '[' + keyName + '];' + + '}' + + '}', + state + ); + + var superProtoIdentStr = SUPER_PROTO_IDENT_PREFIX + superClass.name; + if (!utils.identWithinLexicalScope(superProtoIdentStr, state)) { + utils.append( + 'var ' + superProtoIdentStr + '=' + superClass.name + '===null?' + + 'null:' + superClass.name + '.prototype;', + state + ); + declareIdentInLocalScope(superProtoIdentStr, initScopeMetadata(node), state); + } + + utils.append( + className + '.prototype=Object.create(' + superProtoIdentStr + ');', + state + ); + utils.append( + className + '.prototype.constructor=' + className + ';', + state + ); + utils.append( + className + '.__superConstructor__=' + superClass.name + ';', + state + ); + } + + // If there's no constructor method specified in the class body, create an + // empty constructor function at the top (same line as the class keyword) + if (!node.body.body.filter(_isConstructorMethod).pop()) { + utils.append('function ' + className + '(){', state); + if (!state.scopeIsStrict) { + utils.append('"use strict";', state); + } + if (superClass.name) { + utils.append( + 'if(' + superClass.name + '!==null){' + + superClass.name + '.apply(this,arguments);}', + state + ); + } + utils.append('}', state); + } + + utils.move(node.body.range[0] + '{'.length, state); + traverse(node.body, path, state); + utils.catchupWhiteSpace(node.range[1], state); +} + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function visitClassDeclaration(traverse, node, path, state) { + var className = node.id.name; + var superClass = _getSuperClassInfo(node, state); + + state = utils.updateState(state, { + mungeNamespace: className, + className: className, + superClass: superClass + }); + + _renderClassBody(traverse, node, path, state); + + return false; +} +visitClassDeclaration.test = function(node, path, state) { + return node.type === Syntax.ClassDeclaration; +}; + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function visitClassExpression(traverse, node, path, state) { + var className = node.id && node.id.name || _generateAnonymousClassName(state); + var superClass = _getSuperClassInfo(node, state); + + utils.append('(function(){', state); + + state = utils.updateState(state, { + mungeNamespace: className, + className: className, + superClass: superClass + }); + + _renderClassBody(traverse, node, path, state); + + utils.append('return ' + className + ';})()', state); + return false; +} +visitClassExpression.test = function(node, path, state) { + return node.type === Syntax.ClassExpression; +}; + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function visitPrivateIdentifier(traverse, node, path, state) { + utils.append(_getMungedName(node.name, state), state); + utils.move(node.range[1], state); +} +visitPrivateIdentifier.test = function(node, path, state) { + if (node.type === Syntax.Identifier && _shouldMungeIdentifier(node, state)) { + // Always munge non-computed properties of MemberExpressions + // (a la preventing access of properties of unowned objects) + if (path[0].type === Syntax.MemberExpression && path[0].object !== node + && path[0].computed === false) { + return true; + } + + // Always munge identifiers that were declared within the method function + // scope + if (utils.identWithinLexicalScope(node.name, state, state.methodFuncNode)) { + return true; + } + + // Always munge private keys on object literals defined within a method's + // scope. + if (path[0].type === Syntax.Property + && path[1].type === Syntax.ObjectExpression) { + return true; + } + + // Always munge function parameters + if (path[0].type === Syntax.FunctionExpression + || path[0].type === Syntax.FunctionDeclaration + || path[0].type === Syntax.ArrowFunctionExpression) { + for (var i = 0; i < path[0].params.length; i++) { + if (path[0].params[i] === node) { + return true; + } + } + } + } + return false; +}; + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function visitSuperCallExpression(traverse, node, path, state) { + var superClassName = state.superClass.name; + + if (node.callee.type === Syntax.Identifier) { + if (_isConstructorMethod(state.methodNode)) { + utils.append(superClassName + '.call(', state); + } else { + var protoProp = SUPER_PROTO_IDENT_PREFIX + superClassName; + if (state.methodNode.key.type === Syntax.Identifier) { + protoProp += '.' + state.methodNode.key.name; + } else if (state.methodNode.key.type === Syntax.Literal) { + protoProp += '[' + JSON.stringify(state.methodNode.key.value) + ']'; + } + utils.append(protoProp + ".call(", state); + } + utils.move(node.callee.range[1], state); + } else if (node.callee.type === Syntax.MemberExpression) { + utils.append(SUPER_PROTO_IDENT_PREFIX + superClassName, state); + utils.move(node.callee.object.range[1], state); + + if (node.callee.computed) { + // ["a" + "b"] + utils.catchup(node.callee.property.range[1] + ']'.length, state); + } else { + // .ab + utils.append('.' + node.callee.property.name, state); + } + + utils.append('.call(', state); + utils.move(node.callee.range[1], state); + } + + utils.append('this', state); + if (node.arguments.length > 0) { + utils.append(',', state); + utils.catchupWhiteSpace(node.arguments[0].range[0], state); + traverse(node.arguments, path, state); + } + + utils.catchupWhiteSpace(node.range[1], state); + utils.append(')', state); + return false; +} +visitSuperCallExpression.test = function(node, path, state) { + if (state.superClass && node.type === Syntax.CallExpression) { + var callee = node.callee; + if (callee.type === Syntax.Identifier && callee.name === 'super' + || callee.type == Syntax.MemberExpression + && callee.object.name === 'super') { + return true; + } + } + return false; +}; + +/** + * @param {function} traverse + * @param {object} node + * @param {array} path + * @param {object} state + */ +function visitSuperMemberExpression(traverse, node, path, state) { + var superClassName = state.superClass.name; + + utils.append(SUPER_PROTO_IDENT_PREFIX + superClassName, state); + utils.move(node.object.range[1], state); +} +visitSuperMemberExpression.test = function(node, path, state) { + return state.superClass + && node.type === Syntax.MemberExpression + && node.object.type === Syntax.Identifier + && node.object.name === 'super'; +}; + +exports.resetSymbols = resetSymbols; + +exports.visitorList = [ + visitClassDeclaration, + visitClassExpression, + visitClassFunctionExpression, + visitClassMethod, + visitClassMethodParam, + visitPrivateIdentifier, + visitSuperCallExpression, + visitSuperMemberExpression +]; diff --git a/react-app/node_modules/jstransform/visitors/es6-destructuring-visitors.js b/react-app/node_modules/jstransform/visitors/es6-destructuring-visitors.js new file mode 100644 index 0000000000..b7e1dc3a1d --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-destructuring-visitors.js @@ -0,0 +1,280 @@ +/** + * Copyright 2014 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*global exports:true*/ + +/** + * Implements ES6 destructuring assignment and pattern matchng. + * + * function init({port, ip, coords: [x, y]}) { + * return (x && y) ? {id, port} : {ip}; + * }; + * + * function init($__0) { + * var + * port = $__0.port, + * ip = $__0.ip, + * $__1 = $__0.coords, + * x = $__1[0], + * y = $__1[1]; + * return (x && y) ? {id, port} : {ip}; + * } + * + * var x, {ip, port} = init({ip, port}); + * + * var x, $__0 = init({ip, port}), ip = $__0.ip, port = $__0.port; + * + */ +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); + +var reservedWordsHelper = require('./reserved-words-helper'); +var restParamVisitors = require('./es6-rest-param-visitors'); +var restPropertyHelpers = require('./es7-rest-property-helpers'); + +// ------------------------------------------------------- +// 1. Structured variable declarations. +// +// var [a, b] = [b, a]; +// var {x, y} = {y, x}; +// ------------------------------------------------------- + +function visitStructuredVariable(traverse, node, path, state) { + // Allocate new temp for the pattern. + utils.append(utils.getTempVar(state.localScope.tempVarIndex) + '=', state); + // Skip the pattern and assign the init to the temp. + utils.catchupWhiteSpace(node.init.range[0], state); + traverse(node.init, path, state); + utils.catchup(node.init.range[1], state); + // Render the destructured data. + utils.append(',' + getDestructuredComponents(node.id, state), state); + state.localScope.tempVarIndex++; + return false; +} + +visitStructuredVariable.test = function(node, path, state) { + return node.type === Syntax.VariableDeclarator && + isStructuredPattern(node.id); +}; + +function isStructuredPattern(node) { + return node.type === Syntax.ObjectPattern || + node.type === Syntax.ArrayPattern; +} + +// Main function which does actual recursive destructuring +// of nested complex structures. +function getDestructuredComponents(node, state) { + var tmpIndex = state.localScope.tempVarIndex; + var components = []; + var patternItems = getPatternItems(node); + + for (var idx = 0; idx < patternItems.length; idx++) { + var item = patternItems[idx]; + if (!item) { + continue; + } + + if (item.type === Syntax.SpreadElement) { + // Spread/rest of an array. + // TODO(dmitrys): support spread in the middle of a pattern + // and also for function param patterns: [x, ...xs, y] + components.push(item.argument.name + + '=Array.prototype.slice.call(' + + utils.getTempVar(tmpIndex) + ',' + idx + ')' + ); + continue; + } + + if (item.type === Syntax.SpreadProperty) { + var restExpression = restPropertyHelpers.renderRestExpression( + utils.getTempVar(tmpIndex), + patternItems + ); + components.push(item.argument.name + '=' + restExpression); + continue; + } + + // Depending on pattern type (Array or Object), we get + // corresponding pattern item parts. + var accessor = getPatternItemAccessor(node, item, tmpIndex, idx); + var value = getPatternItemValue(node, item); + + // TODO(dmitrys): implement default values: {x, y=5} + if (value.type === Syntax.Identifier) { + // Simple pattern item. + components.push(value.name + '=' + accessor); + } else { + // Complex sub-structure. + components.push( + utils.getTempVar(++state.localScope.tempVarIndex) + '=' + accessor + + ',' + getDestructuredComponents(value, state) + ); + } + } + + return components.join(','); +} + +function getPatternItems(node) { + return node.properties || node.elements; +} + +function getPatternItemAccessor(node, patternItem, tmpIndex, idx) { + var tmpName = utils.getTempVar(tmpIndex); + if (node.type === Syntax.ObjectPattern) { + if (reservedWordsHelper.isReservedWord(patternItem.key.name)) { + return tmpName + '["' + patternItem.key.name + '"]'; + } else if (patternItem.key.type === Syntax.Literal) { + return tmpName + '[' + JSON.stringify(patternItem.key.value) + ']'; + } else if (patternItem.key.type === Syntax.Identifier) { + return tmpName + '.' + patternItem.key.name; + } + } else if (node.type === Syntax.ArrayPattern) { + return tmpName + '[' + idx + ']'; + } +} + +function getPatternItemValue(node, patternItem) { + return node.type === Syntax.ObjectPattern + ? patternItem.value + : patternItem; +} + +// ------------------------------------------------------- +// 2. Assignment expression. +// +// [a, b] = [b, a]; +// ({x, y} = {y, x}); +// ------------------------------------------------------- + +function visitStructuredAssignment(traverse, node, path, state) { + var exprNode = node.expression; + utils.append('var ' + utils.getTempVar(state.localScope.tempVarIndex) + '=', state); + + utils.catchupWhiteSpace(exprNode.right.range[0], state); + traverse(exprNode.right, path, state); + utils.catchup(exprNode.right.range[1], state); + + utils.append( + ';' + getDestructuredComponents(exprNode.left, state) + ';', + state + ); + + utils.catchupWhiteSpace(node.range[1], state); + state.localScope.tempVarIndex++; + return false; +} + +visitStructuredAssignment.test = function(node, path, state) { + // We consider the expression statement rather than just assignment + // expression to cover case with object patters which should be + // wrapped in grouping operator: ({x, y} = {y, x}); + return node.type === Syntax.ExpressionStatement && + node.expression.type === Syntax.AssignmentExpression && + isStructuredPattern(node.expression.left); +}; + +// ------------------------------------------------------- +// 3. Structured parameter. +// +// function foo({x, y}) { ... } +// ------------------------------------------------------- + +function visitStructuredParameter(traverse, node, path, state) { + utils.append(utils.getTempVar(getParamIndex(node, path)), state); + utils.catchupWhiteSpace(node.range[1], state); + return true; +} + +function getParamIndex(paramNode, path) { + var funcNode = path[0]; + var tmpIndex = 0; + for (var k = 0; k < funcNode.params.length; k++) { + var param = funcNode.params[k]; + if (param === paramNode) { + break; + } + if (isStructuredPattern(param)) { + tmpIndex++; + } + } + return tmpIndex; +} + +visitStructuredParameter.test = function(node, path, state) { + return isStructuredPattern(node) && isFunctionNode(path[0]); +}; + +function isFunctionNode(node) { + return (node.type == Syntax.FunctionDeclaration || + node.type == Syntax.FunctionExpression || + node.type == Syntax.MethodDefinition || + node.type == Syntax.ArrowFunctionExpression); +} + +// ------------------------------------------------------- +// 4. Function body for structured parameters. +// +// function foo({x, y}) { x; y; } +// ------------------------------------------------------- + +function visitFunctionBodyForStructuredParameter(traverse, node, path, state) { + var funcNode = path[0]; + + utils.catchup(funcNode.body.range[0] + 1, state); + renderDestructuredComponents(funcNode, state); + + if (funcNode.rest) { + utils.append( + restParamVisitors.renderRestParamSetup(funcNode, state), + state + ); + } + + return true; +} + +function renderDestructuredComponents(funcNode, state) { + var destructuredComponents = []; + + for (var k = 0; k < funcNode.params.length; k++) { + var param = funcNode.params[k]; + if (isStructuredPattern(param)) { + destructuredComponents.push( + getDestructuredComponents(param, state) + ); + state.localScope.tempVarIndex++; + } + } + + if (destructuredComponents.length) { + utils.append('var ' + destructuredComponents.join(',') + ';', state); + } +} + +visitFunctionBodyForStructuredParameter.test = function(node, path, state) { + return node.type === Syntax.BlockStatement && isFunctionNode(path[0]); +}; + +exports.visitorList = [ + visitStructuredVariable, + visitStructuredAssignment, + visitStructuredParameter, + visitFunctionBodyForStructuredParameter +]; + +exports.renderDestructuredComponents = renderDestructuredComponents; + diff --git a/react-app/node_modules/jstransform/visitors/es6-object-concise-method-visitors.js b/react-app/node_modules/jstransform/visitors/es6-object-concise-method-visitors.js new file mode 100644 index 0000000000..a5412a9e5e --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-object-concise-method-visitors.js @@ -0,0 +1,69 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jslint node:true*/ + +/** + * Desugars concise methods of objects to function expressions. + * + * var foo = { + * method(x, y) { ... } + * }; + * + * var foo = { + * method: function(x, y) { ... } + * }; + * + */ + +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); +var reservedWordsHelper = require('./reserved-words-helper'); + +function visitObjectConciseMethod(traverse, node, path, state) { + var isGenerator = node.value.generator; + if (isGenerator) { + utils.catchupWhiteSpace(node.range[0] + 1, state); + } + if (node.computed) { // []() { ...} + utils.catchup(node.key.range[1] + 1, state); + } else if (reservedWordsHelper.isReservedWord(node.key.name)) { + utils.catchup(node.key.range[0], state); + utils.append('"', state); + utils.catchup(node.key.range[1], state); + utils.append('"', state); + } + + utils.catchup(node.key.range[1], state); + utils.append( + ':function' + (isGenerator ? '*' : ''), + state + ); + path.unshift(node); + traverse(node.value, path, state); + path.shift(); + return false; +} + +visitObjectConciseMethod.test = function(node, path, state) { + return node.type === Syntax.Property && + node.value.type === Syntax.FunctionExpression && + node.method === true; +}; + +exports.visitorList = [ + visitObjectConciseMethod +]; diff --git a/react-app/node_modules/jstransform/visitors/es6-object-short-notation-visitors.js b/react-app/node_modules/jstransform/visitors/es6-object-short-notation-visitors.js new file mode 100644 index 0000000000..b5bd7d7836 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-object-short-notation-visitors.js @@ -0,0 +1,53 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jslint node: true*/ + +/** + * Desugars ES6 Object Literal short notations into ES3 full notation. + * + * // Easier return values. + * function foo(x, y) { + * return {x, y}; // {x: x, y: y} + * }; + * + * // Destructuring. + * function init({port, ip, coords: {x, y}}) { ... } + * + */ +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); + +/** + * @public + */ +function visitObjectLiteralShortNotation(traverse, node, path, state) { + utils.catchup(node.key.range[1], state); + utils.append(':' + node.key.name, state); + return false; +} + +visitObjectLiteralShortNotation.test = function(node, path, state) { + return node.type === Syntax.Property && + node.kind === 'init' && + node.shorthand === true && + path[0].type !== Syntax.ObjectPattern; +}; + +exports.visitorList = [ + visitObjectLiteralShortNotation +]; + diff --git a/react-app/node_modules/jstransform/visitors/es6-rest-param-visitors.js b/react-app/node_modules/jstransform/visitors/es6-rest-param-visitors.js new file mode 100644 index 0000000000..aa36db8c31 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-rest-param-visitors.js @@ -0,0 +1,106 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jslint node:true*/ + +/** + * Desugars ES6 rest parameters into an ES3 arguments array. + * + * function printf(template, ...args) { + * args.forEach(...); + * } + * + * We could use `Array.prototype.slice.call`, but that usage of arguments causes + * functions to be deoptimized in V8, so instead we use a for-loop. + * + * function printf(template) { + * for (var args = [], $__0 = 1, $__1 = arguments.length; $__0 < $__1; $__0++) + * args.push(arguments[$__0]); + * args.forEach(...); + * } + * + */ +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); + + + +function _nodeIsFunctionWithRestParam(node) { + return (node.type === Syntax.FunctionDeclaration + || node.type === Syntax.FunctionExpression + || node.type === Syntax.ArrowFunctionExpression) + && node.rest; +} + +function visitFunctionParamsWithRestParam(traverse, node, path, state) { + if (node.parametricType) { + utils.catchup(node.parametricType.range[0], state); + path.unshift(node); + traverse(node.parametricType, path, state); + path.shift(); + } + + // Render params. + if (node.params.length) { + path.unshift(node); + traverse(node.params, path, state); + path.shift(); + } else { + // -3 is for ... of the rest. + utils.catchup(node.rest.range[0] - 3, state); + } + utils.catchupWhiteSpace(node.rest.range[1], state); + + path.unshift(node); + traverse(node.body, path, state); + path.shift(); + + return false; +} + +visitFunctionParamsWithRestParam.test = function(node, path, state) { + return _nodeIsFunctionWithRestParam(node); +}; + +function renderRestParamSetup(functionNode, state) { + var idx = state.localScope.tempVarIndex++; + var len = state.localScope.tempVarIndex++; + + return 'for (var ' + functionNode.rest.name + '=[],' + + utils.getTempVar(idx) + '=' + functionNode.params.length + ',' + + utils.getTempVar(len) + '=arguments.length;' + + utils.getTempVar(idx) + '<' + utils.getTempVar(len) + ';' + + utils.getTempVar(idx) + '++) ' + + functionNode.rest.name + '.push(arguments[' + utils.getTempVar(idx) + ']);'; +} + +function visitFunctionBodyWithRestParam(traverse, node, path, state) { + utils.catchup(node.range[0] + 1, state); + var parentNode = path[0]; + utils.append(renderRestParamSetup(parentNode, state), state); + return true; +} + +visitFunctionBodyWithRestParam.test = function(node, path, state) { + return node.type === Syntax.BlockStatement + && _nodeIsFunctionWithRestParam(path[0]); +}; + +exports.renderRestParamSetup = renderRestParamSetup; +exports.visitorList = [ + visitFunctionParamsWithRestParam, + visitFunctionBodyWithRestParam +]; diff --git a/react-app/node_modules/jstransform/visitors/es6-template-visitors.js b/react-app/node_modules/jstransform/visitors/es6-template-visitors.js new file mode 100644 index 0000000000..4b56951bb9 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es6-template-visitors.js @@ -0,0 +1,156 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jslint node:true*/ + +/** + * @typechecks + */ +'use strict'; + +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); + +/** + * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-12.1.9 + */ +function visitTemplateLiteral(traverse, node, path, state) { + var templateElements = node.quasis; + + utils.append('(', state); + for (var ii = 0; ii < templateElements.length; ii++) { + var templateElement = templateElements[ii]; + if (templateElement.value.raw !== '') { + utils.append(getCookedValue(templateElement), state); + if (!templateElement.tail) { + // + between element and substitution + utils.append(' + ', state); + } + // maintain line numbers + utils.move(templateElement.range[0], state); + utils.catchupNewlines(templateElement.range[1], state); + } else { // templateElement.value.raw === '' + // Concatenat adjacent substitutions, e.g. `${x}${y}`. Empty templates + // appear before the first and after the last element - nothing to add in + // those cases. + if (ii > 0 && !templateElement.tail) { + // + between substitution and substitution + utils.append(' + ', state); + } + } + + utils.move(templateElement.range[1], state); + if (!templateElement.tail) { + var substitution = node.expressions[ii]; + if (substitution.type === Syntax.Identifier || + substitution.type === Syntax.MemberExpression || + substitution.type === Syntax.CallExpression) { + utils.catchup(substitution.range[1], state); + } else { + utils.append('(', state); + traverse(substitution, path, state); + utils.catchup(substitution.range[1], state); + utils.append(')', state); + } + // if next templateElement isn't empty... + if (templateElements[ii + 1].value.cooked !== '') { + utils.append(' + ', state); + } + } + } + utils.move(node.range[1], state); + utils.append(')', state); + return false; +} + +visitTemplateLiteral.test = function(node, path, state) { + return node.type === Syntax.TemplateLiteral; +}; + +/** + * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-12.2.6 + */ +function visitTaggedTemplateExpression(traverse, node, path, state) { + var template = node.quasi; + var numQuasis = template.quasis.length; + + // print the tag + utils.move(node.tag.range[0], state); + traverse(node.tag, path, state); + utils.catchup(node.tag.range[1], state); + + // print array of template elements + utils.append('(function() { var siteObj = [', state); + for (var ii = 0; ii < numQuasis; ii++) { + utils.append(getCookedValue(template.quasis[ii]), state); + if (ii !== numQuasis - 1) { + utils.append(', ', state); + } + } + utils.append(']; siteObj.raw = [', state); + for (ii = 0; ii < numQuasis; ii++) { + utils.append(getRawValue(template.quasis[ii]), state); + if (ii !== numQuasis - 1) { + utils.append(', ', state); + } + } + utils.append( + ']; Object.freeze(siteObj.raw); Object.freeze(siteObj); return siteObj; }()', + state + ); + + // print substitutions + if (numQuasis > 1) { + for (ii = 0; ii < template.expressions.length; ii++) { + var expression = template.expressions[ii]; + utils.append(', ', state); + + // maintain line numbers by calling catchupWhiteSpace over the whole + // previous TemplateElement + utils.move(template.quasis[ii].range[0], state); + utils.catchupNewlines(template.quasis[ii].range[1], state); + + utils.move(expression.range[0], state); + traverse(expression, path, state); + utils.catchup(expression.range[1], state); + } + } + + // print blank lines to push the closing ) down to account for the final + // TemplateElement. + utils.catchupNewlines(node.range[1], state); + + utils.append(')', state); + + return false; +} + +visitTaggedTemplateExpression.test = function(node, path, state) { + return node.type === Syntax.TaggedTemplateExpression; +}; + +function getCookedValue(templateElement) { + return JSON.stringify(templateElement.value.cooked); +} + +function getRawValue(templateElement) { + return JSON.stringify(templateElement.value.raw); +} + +exports.visitorList = [ + visitTemplateLiteral, + visitTaggedTemplateExpression +]; diff --git a/react-app/node_modules/jstransform/visitors/es7-rest-property-helpers.js b/react-app/node_modules/jstransform/visitors/es7-rest-property-helpers.js new file mode 100644 index 0000000000..8560568660 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es7-rest-property-helpers.js @@ -0,0 +1,80 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jslint node:true*/ + +/** + * Desugars ES7 rest properties into ES5 object iteration. + */ + +var Syntax = require('esprima-fb').Syntax; + +// TODO: This is a pretty massive helper, it should only be defined once, in the +// transform's runtime environment. We don't currently have a runtime though. +var restFunction = + '(function(source, exclusion) {' + + 'var rest = {};' + + 'var hasOwn = Object.prototype.hasOwnProperty;' + + 'if (source == null) {' + + 'throw new TypeError();' + + '}' + + 'for (var key in source) {' + + 'if (hasOwn.call(source, key) && !hasOwn.call(exclusion, key)) {' + + 'rest[key] = source[key];' + + '}' + + '}' + + 'return rest;' + + '})'; + +function getPropertyNames(properties) { + var names = []; + for (var i = 0; i < properties.length; i++) { + var property = properties[i]; + if (property.type === Syntax.SpreadProperty) { + continue; + } + if (property.type === Syntax.Identifier) { + names.push(property.name); + } else { + names.push(property.key.name); + } + } + return names; +} + +function getRestFunctionCall(source, exclusion) { + return restFunction + '(' + source + ',' + exclusion + ')'; +} + +function getSimpleShallowCopy(accessorExpression) { + // This could be faster with 'Object.assign({}, ' + accessorExpression + ')' + // but to unify code paths and avoid a ES6 dependency we use the same + // helper as for the exclusion case. + return getRestFunctionCall(accessorExpression, '{}'); +} + +function renderRestExpression(accessorExpression, excludedProperties) { + var excludedNames = getPropertyNames(excludedProperties); + if (!excludedNames.length) { + return getSimpleShallowCopy(accessorExpression); + } + return getRestFunctionCall( + accessorExpression, + '{' + excludedNames.join(':1,') + ':1}' + ); +} + +exports.renderRestExpression = renderRestExpression; diff --git a/react-app/node_modules/jstransform/visitors/es7-spread-property-visitors.js b/react-app/node_modules/jstransform/visitors/es7-spread-property-visitors.js new file mode 100644 index 0000000000..14490d71ba --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/es7-spread-property-visitors.js @@ -0,0 +1,108 @@ +/** + * Copyright 2004-present Facebook. All Rights Reserved. + */ +/*global exports:true*/ + +/** + * Implements ES7 object spread property. + * https://gist.github.com/sebmarkbage/aa849c7973cb4452c547 + * + * { ...a, x: 1 } + * + * Object.assign({}, a, {x: 1 }) + * + */ + +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); + +function visitObjectLiteralSpread(traverse, node, path, state) { + utils.catchup(node.range[0], state); + + utils.append('Object.assign({', state); + + // Skip the original { + utils.move(node.range[0] + 1, state); + + var previousWasSpread = false; + + for (var i = 0; i < node.properties.length; i++) { + var property = node.properties[i]; + if (property.type === Syntax.SpreadProperty) { + + // Close the previous object or initial object + if (!previousWasSpread) { + utils.append('}', state); + } + + if (i === 0) { + // Normally there will be a comma when we catch up, but not before + // the first property. + utils.append(',', state); + } + + utils.catchup(property.range[0], state); + + // skip ... + utils.move(property.range[0] + 3, state); + + traverse(property.argument, path, state); + + utils.catchup(property.range[1], state); + + previousWasSpread = true; + + } else { + + utils.catchup(property.range[0], state); + + if (previousWasSpread) { + utils.append('{', state); + } + + traverse(property, path, state); + + utils.catchup(property.range[1], state); + + previousWasSpread = false; + + } + } + + // Strip any non-whitespace between the last item and the end. + // We only catch up on whitespace so that we ignore any trailing commas which + // are stripped out for IE8 support. Unfortunately, this also strips out any + // trailing comments. + utils.catchupWhiteSpace(node.range[1] - 1, state); + + // Skip the trailing } + utils.move(node.range[1], state); + + if (!previousWasSpread) { + utils.append('}', state); + } + + utils.append(')', state); + return false; +} + +visitObjectLiteralSpread.test = function(node, path, state) { + if (node.type !== Syntax.ObjectExpression) { + return false; + } + // Tight loop optimization + var hasAtLeastOneSpreadProperty = false; + for (var i = 0; i < node.properties.length; i++) { + var property = node.properties[i]; + if (property.type === Syntax.SpreadProperty) { + hasAtLeastOneSpreadProperty = true; + } else if (property.kind !== 'init') { + return false; + } + } + return hasAtLeastOneSpreadProperty; +}; + +exports.visitorList = [ + visitObjectLiteralSpread +]; diff --git a/react-app/node_modules/jstransform/visitors/reserved-words-helper.js b/react-app/node_modules/jstransform/visitors/reserved-words-helper.js new file mode 100644 index 0000000000..07eaf13bfd --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/reserved-words-helper.js @@ -0,0 +1,74 @@ +/** + * Copyright 2014 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var KEYWORDS = [ + 'break', 'do', 'in', 'typeof', 'case', 'else', 'instanceof', 'var', 'catch', + 'export', 'new', 'void', 'class', 'extends', 'return', 'while', 'const', + 'finally', 'super', 'with', 'continue', 'for', 'switch', 'yield', 'debugger', + 'function', 'this', 'default', 'if', 'throw', 'delete', 'import', 'try' +]; + +var FUTURE_RESERVED_WORDS = [ + 'enum', 'await', 'implements', 'package', 'protected', 'static', 'interface', + 'private', 'public' +]; + +var LITERALS = [ + 'null', + 'true', + 'false' +]; + +// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-reserved-words +var RESERVED_WORDS = [].concat( + KEYWORDS, + FUTURE_RESERVED_WORDS, + LITERALS +); + +var reservedWordsMap = Object.create(null); +RESERVED_WORDS.forEach(function(k) { + reservedWordsMap[k] = true; +}); + +/** + * This list should not grow as new reserved words are introdued. This list is + * of words that need to be quoted because ES3-ish browsers do not allow their + * use as identifier names. + */ +var ES3_FUTURE_RESERVED_WORDS = [ + 'enum', 'implements', 'package', 'protected', 'static', 'interface', + 'private', 'public' +]; + +var ES3_RESERVED_WORDS = [].concat( + KEYWORDS, + ES3_FUTURE_RESERVED_WORDS, + LITERALS +); + +var es3ReservedWordsMap = Object.create(null); +ES3_RESERVED_WORDS.forEach(function(k) { + es3ReservedWordsMap[k] = true; +}); + +exports.isReservedWord = function(word) { + return !!reservedWordsMap[word]; +}; + +exports.isES3ReservedWord = function(word) { + return !!es3ReservedWordsMap[word]; +}; diff --git a/react-app/node_modules/jstransform/visitors/reserved-words-visitors.js b/react-app/node_modules/jstransform/visitors/reserved-words-visitors.js new file mode 100644 index 0000000000..d0ae50cbe0 --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/reserved-words-visitors.js @@ -0,0 +1,68 @@ +/** + * Copyright 2014 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +/*global exports:true*/ + +var Syntax = require('esprima-fb').Syntax; +var utils = require('../src/utils'); +var reserverdWordsHelper = require('./reserved-words-helper'); + +/** + * Code adapted from https://github.com/spicyj/es3ify + * The MIT License (MIT) + * Copyright (c) 2014 Ben Alpert + */ + +function visitProperty(traverse, node, path, state) { + utils.catchup(node.key.range[0], state); + utils.append('"', state); + utils.catchup(node.key.range[1], state); + utils.append('"', state); + utils.catchup(node.value.range[0], state); + traverse(node.value, path, state); + return false; +} + +visitProperty.test = function(node) { + return node.type === Syntax.Property && + node.key.type === Syntax.Identifier && + !node.method && + !node.shorthand && + !node.computed && + reserverdWordsHelper.isES3ReservedWord(node.key.name); +}; + +function visitMemberExpression(traverse, node, path, state) { + traverse(node.object, path, state); + utils.catchup(node.property.range[0] - 1, state); + utils.append('[', state); + utils.catchupWhiteSpace(node.property.range[0], state); + utils.append('"', state); + utils.catchup(node.property.range[1], state); + utils.append('"]', state); + return false; +} + +visitMemberExpression.test = function(node) { + return node.type === Syntax.MemberExpression && + node.property.type === Syntax.Identifier && + reserverdWordsHelper.isES3ReservedWord(node.property.name); +}; + +exports.visitorList = [ + visitProperty, + visitMemberExpression +]; diff --git a/react-app/node_modules/jstransform/visitors/type-syntax.js b/react-app/node_modules/jstransform/visitors/type-syntax.js new file mode 100644 index 0000000000..25209bc09c --- /dev/null +++ b/react-app/node_modules/jstransform/visitors/type-syntax.js @@ -0,0 +1,172 @@ +var esprima = require('esprima-fb'); +var utils = require('../src/utils'); + +var Syntax = esprima.Syntax; + +function _isFunctionNode(node) { + return node.type === Syntax.FunctionDeclaration + || node.type === Syntax.FunctionExpression + || node.type === Syntax.ArrowFunctionExpression; +} + +function visitClassProperty(traverse, node, path, state) { + utils.catchup(node.range[0], state); + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitClassProperty.test = function(node, path, state) { + return node.type === Syntax.ClassProperty; +}; + +function visitTypeAlias(traverse, node, path, state) { + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitTypeAlias.test = function(node, path, state) { + return node.type === Syntax.TypeAlias; +}; + +function visitTypeCast(traverse, node, path, state) { + path.unshift(node); + traverse(node.expression, path, state); + path.shift(); + + utils.catchup(node.typeAnnotation.range[0], state); + utils.catchupWhiteOut(node.typeAnnotation.range[1], state); + return false; +} +visitTypeCast.test = function(node, path, state) { + return node.type === Syntax.TypeCastExpression; +}; + +function visitInterfaceDeclaration(traverse, node, path, state) { + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitInterfaceDeclaration.test = function(node, path, state) { + return node.type === Syntax.InterfaceDeclaration; +}; + +function visitDeclare(traverse, node, path, state) { + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitDeclare.test = function(node, path, state) { + switch (node.type) { + case Syntax.DeclareVariable: + case Syntax.DeclareFunction: + case Syntax.DeclareClass: + case Syntax.DeclareModule: + return true; + } + return false; +}; + +function visitFunctionParametricAnnotation(traverse, node, path, state) { + utils.catchup(node.range[0], state); + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitFunctionParametricAnnotation.test = function(node, path, state) { + return node.type === Syntax.TypeParameterDeclaration + && path[0] + && _isFunctionNode(path[0]) + && node === path[0].typeParameters; +}; + +function visitFunctionReturnAnnotation(traverse, node, path, state) { + utils.catchup(node.range[0], state); + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitFunctionReturnAnnotation.test = function(node, path, state) { + return path[0] && _isFunctionNode(path[0]) && node === path[0].returnType; +}; + +function visitOptionalFunctionParameterAnnotation(traverse, node, path, state) { + utils.catchup(node.range[0] + node.name.length, state); + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitOptionalFunctionParameterAnnotation.test = function(node, path, state) { + return node.type === Syntax.Identifier + && node.optional + && path[0] + && _isFunctionNode(path[0]); +}; + +function visitTypeAnnotatedIdentifier(traverse, node, path, state) { + utils.catchup(node.typeAnnotation.range[0], state); + utils.catchupWhiteOut(node.typeAnnotation.range[1], state); + return false; +} +visitTypeAnnotatedIdentifier.test = function(node, path, state) { + return node.type === Syntax.Identifier && node.typeAnnotation; +}; + +function visitTypeAnnotatedObjectOrArrayPattern(traverse, node, path, state) { + utils.catchup(node.typeAnnotation.range[0], state); + utils.catchupWhiteOut(node.typeAnnotation.range[1], state); + return false; +} +visitTypeAnnotatedObjectOrArrayPattern.test = function(node, path, state) { + var rightType = node.type === Syntax.ObjectPattern + || node.type === Syntax.ArrayPattern; + return rightType && node.typeAnnotation; +}; + +/** + * Methods cause trouble, since esprima parses them as a key/value pair, where + * the location of the value starts at the method body. For example + * { bar(x:number,...y:Array):number {} } + * is parsed as + * { bar: function(x: number, ...y:Array): number {} } + * except that the location of the FunctionExpression value is 40-something, + * which is the location of the function body. This means that by the time we + * visit the params, rest param, and return type organically, we've already + * catchup()'d passed them. + */ +function visitMethod(traverse, node, path, state) { + path.unshift(node); + traverse(node.key, path, state); + + path.unshift(node.value); + traverse(node.value.params, path, state); + node.value.rest && traverse(node.value.rest, path, state); + node.value.returnType && traverse(node.value.returnType, path, state); + traverse(node.value.body, path, state); + + path.shift(); + + path.shift(); + return false; +} + +visitMethod.test = function(node, path, state) { + return (node.type === "Property" && (node.method || node.kind === "set" || node.kind === "get")) + || (node.type === "MethodDefinition"); +}; + +function visitImportType(traverse, node, path, state) { + utils.catchupWhiteOut(node.range[1], state); + return false; +} +visitImportType.test = function(node, path, state) { + return node.type === 'ImportDeclaration' + && node.isType; +}; + +exports.visitorList = [ + visitClassProperty, + visitDeclare, + visitImportType, + visitInterfaceDeclaration, + visitFunctionParametricAnnotation, + visitFunctionReturnAnnotation, + visitMethod, + visitOptionalFunctionParameterAnnotation, + visitTypeAlias, + visitTypeCast, + visitTypeAnnotatedIdentifier, + visitTypeAnnotatedObjectOrArrayPattern +]; diff --git a/react-app/node_modules/lodash/LICENSE b/react-app/node_modules/lodash/LICENSE new file mode 100644 index 0000000000..9cd87e5dce --- /dev/null +++ b/react-app/node_modules/lodash/LICENSE @@ -0,0 +1,22 @@ +Copyright 2012-2015 The Dojo Foundation +Based on Underscore.js, copyright 2009-2015 Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +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. diff --git a/react-app/node_modules/lodash/README.md b/react-app/node_modules/lodash/README.md new file mode 100644 index 0000000000..fd98e5c989 --- /dev/null +++ b/react-app/node_modules/lodash/README.md @@ -0,0 +1,121 @@ +# lodash v3.10.1 + +The [modern build](https://github.com/lodash/lodash/wiki/Build-Differences) of [lodash](https://lodash.com/) exported as [Node.js](http://nodejs.org/)/[io.js](https://iojs.org/) modules. + +Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli): +```bash +$ lodash modularize modern exports=node -o ./ +$ lodash modern -d -o ./index.js +``` + +## Installation + +Using npm: + +```bash +$ {sudo -H} npm i -g npm +$ npm i --save lodash +``` + +In Node.js/io.js: + +```js +// load the modern build +var _ = require('lodash'); +// or a method category +var array = require('lodash/array'); +// or a method (great for smaller builds with browserify/webpack) +var chunk = require('lodash/array/chunk'); +``` + +See the [package source](https://github.com/lodash/lodash/tree/3.10.1-npm) for more details. + +**Note:**
+Don’t assign values to the [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` when in the REPL.
+Install [n_](https://www.npmjs.com/package/n_) for a REPL that includes lodash by default. + +## Module formats + +lodash is also available in a variety of other builds & module formats. + + * npm packages for [modern](https://www.npmjs.com/package/lodash), [compatibility](https://www.npmjs.com/package/lodash-compat), & [per method](https://www.npmjs.com/browse/keyword/lodash-modularized) builds + * AMD modules for [modern](https://github.com/lodash/lodash/tree/3.10.1-amd) & [compatibility](https://github.com/lodash/lodash-compat/tree/3.10.1-amd) builds + * ES modules for the [modern](https://github.com/lodash/lodash/tree/3.10.1-es) build + +## Further Reading + + * [API Documentation](https://lodash.com/docs) + * [Build Differences](https://github.com/lodash/lodash/wiki/Build-Differences) + * [Changelog](https://github.com/lodash/lodash/wiki/Changelog) + * [Roadmap](https://github.com/lodash/lodash/wiki/Roadmap) + * [More Resources](https://github.com/lodash/lodash/wiki/Resources) + +## Features + + * ~100% [code coverage](https://coveralls.io/r/lodash) + * Follows [semantic versioning](http://semver.org/) for releases + * [Lazily evaluated](http://filimanjaro.com/blog/2014/introducing-lazy-evaluation/) chaining + * [_(…)](https://lodash.com/docs#_) supports implicit chaining + * [_.ary](https://lodash.com/docs#ary) & [_.rearg](https://lodash.com/docs#rearg) to change function argument limits & order + * [_.at](https://lodash.com/docs#at) for cherry-picking collection values + * [_.attempt](https://lodash.com/docs#attempt) to execute functions which may error without a try-catch + * [_.before](https://lodash.com/docs#before) to complement [_.after](https://lodash.com/docs#after) + * [_.bindKey](https://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods + * [_.chunk](https://lodash.com/docs#chunk) for splitting an array into chunks of a given size + * [_.clone](https://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects + * [_.cloneDeep](https://lodash.com/docs#cloneDeep) for deep cloning arrays & objects + * [_.curry](https://lodash.com/docs#curry) & [_.curryRight](https://lodash.com/docs#curryRight) for creating [curried](http://hughfdjackson.com/javascript/why-curry-helps/) functions + * [_.debounce](https://lodash.com/docs#debounce) & [_.throttle](https://lodash.com/docs#throttle) are cancelable & accept options for more control + * [_.defaultsDeep](https://lodash.com/docs#defaultsDeep) for recursively assigning default properties + * [_.fill](https://lodash.com/docs#fill) to fill arrays with values + * [_.findKey](https://lodash.com/docs#findKey) for finding keys + * [_.flow](https://lodash.com/docs#flow) to complement [_.flowRight](https://lodash.com/docs#flowRight) (a.k.a `_.compose`) + * [_.forEach](https://lodash.com/docs#forEach) supports exiting early + * [_.forIn](https://lodash.com/docs#forIn) for iterating all enumerable properties + * [_.forOwn](https://lodash.com/docs#forOwn) for iterating own properties + * [_.get](https://lodash.com/docs#get) & [_.set](https://lodash.com/docs#set) for deep property getting & setting + * [_.gt](https://lodash.com/docs#gt), [_.gte](https://lodash.com/docs#gte), [_.lt](https://lodash.com/docs#lt), & [_.lte](https://lodash.com/docs#lte) relational methods + * [_.inRange](https://lodash.com/docs#inRange) for checking whether a number is within a given range + * [_.isNative](https://lodash.com/docs#isNative) to check for native functions + * [_.isPlainObject](https://lodash.com/docs#isPlainObject) & [_.toPlainObject](https://lodash.com/docs#toPlainObject) to check for & convert to `Object` objects + * [_.isTypedArray](https://lodash.com/docs#isTypedArray) to check for typed arrays + * [_.mapKeys](https://lodash.com/docs#mapKeys) for mapping keys to an object + * [_.matches](https://lodash.com/docs#matches) supports deep object comparisons + * [_.matchesProperty](https://lodash.com/docs#matchesProperty) to complement [_.matches](https://lodash.com/docs#matches) & [_.property](https://lodash.com/docs#property) + * [_.merge](https://lodash.com/docs#merge) for a deep [_.extend](https://lodash.com/docs#extend) + * [_.method](https://lodash.com/docs#method) & [_.methodOf](https://lodash.com/docs#methodOf) to create functions that invoke methods + * [_.modArgs](https://lodash.com/docs#modArgs) for more advanced functional composition + * [_.parseInt](https://lodash.com/docs#parseInt) for consistent cross-environment behavior + * [_.pull](https://lodash.com/docs#pull), [_.pullAt](https://lodash.com/docs#pullAt), & [_.remove](https://lodash.com/docs#remove) for mutating arrays + * [_.random](https://lodash.com/docs#random) supports returning floating-point numbers + * [_.restParam](https://lodash.com/docs#restParam) & [_.spread](https://lodash.com/docs#spread) for applying rest parameters & spreading arguments to functions + * [_.runInContext](https://lodash.com/docs#runInContext) for collisionless mixins & easier mocking + * [_.slice](https://lodash.com/docs#slice) for creating subsets of array-like values + * [_.sortByAll](https://lodash.com/docs#sortByAll) & [_.sortByOrder](https://lodash.com/docs#sortByOrder) for sorting by multiple properties & orders + * [_.support](https://lodash.com/docs#support) for flagging environment features + * [_.template](https://lodash.com/docs#template) supports [*“imports”*](https://lodash.com/docs#templateSettings-imports) options & [ES template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components) + * [_.transform](https://lodash.com/docs#transform) as a powerful alternative to [_.reduce](https://lodash.com/docs#reduce) for transforming objects + * [_.unzipWith](https://lodash.com/docs#unzipWith) & [_.zipWith](https://lodash.com/docs#zipWith) to specify how grouped values should be combined + * [_.valuesIn](https://lodash.com/docs#valuesIn) for getting values of all enumerable properties + * [_.xor](https://lodash.com/docs#xor) to complement [_.difference](https://lodash.com/docs#difference), [_.intersection](https://lodash.com/docs#intersection), & [_.union](https://lodash.com/docs#union) + * [_.add](https://lodash.com/docs#add), [_.round](https://lodash.com/docs#round), [_.sum](https://lodash.com/docs#sum), & + [more](https://lodash.com/docs "_.ceil & _.floor") math methods + * [_.bind](https://lodash.com/docs#bind), [_.curry](https://lodash.com/docs#curry), [_.partial](https://lodash.com/docs#partial), & + [more](https://lodash.com/docs "_.bindKey, _.curryRight, _.partialRight") support customizable argument placeholders + * [_.capitalize](https://lodash.com/docs#capitalize), [_.trim](https://lodash.com/docs#trim), & + [more](https://lodash.com/docs "_.camelCase, _.deburr, _.endsWith, _.escapeRegExp, _.kebabCase, _.pad, _.padLeft, _.padRight, _.repeat, _.snakeCase, _.startCase, _.startsWith, _.trimLeft, _.trimRight, _.trunc, _.words") string methods + * [_.clone](https://lodash.com/docs#clone), [_.isEqual](https://lodash.com/docs#isEqual), & + [more](https://lodash.com/docs "_.assign, _.cloneDeep, _.merge") accept customizer callbacks + * [_.dropWhile](https://lodash.com/docs#dropWhile), [_.takeWhile](https://lodash.com/docs#takeWhile), & + [more](https://lodash.com/docs "_.drop, _.dropRight, _.dropRightWhile, _.take, _.takeRight, _.takeRightWhile") to complement [_.first](https://lodash.com/docs#first), [_.initial](https://lodash.com/docs#initial), [_.last](https://lodash.com/docs#last), & [_.rest](https://lodash.com/docs#rest) + * [_.findLast](https://lodash.com/docs#findLast), [_.findLastKey](https://lodash.com/docs#findLastKey), & + [more](https://lodash.com/docs "_.curryRight, _.dropRight, _.dropRightWhile, _.flowRight, _.forEachRight, _.forInRight, _.forOwnRight, _.padRight, partialRight, _.takeRight, _.trimRight, _.takeRightWhile") right-associative methods + * [_.includes](https://lodash.com/docs#includes), [_.toArray](https://lodash.com/docs#toArray), & + [more](https://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.findLast, _.findWhere, _.forEach, _.forEachRight, _.groupBy, _.indexBy, _.invoke, _.map, _.max, _.min, _.partition, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.sortByAll, _.sortByOrder, _.sum, _.where") accept strings + * [_#commit](https://lodash.com/docs#prototype-commit) & [_#plant](https://lodash.com/docs#prototype-plant) for working with chain sequences + * [_#thru](https://lodash.com/docs#thru) to pass values thru a chain sequence + +## Support + +Tested in Chrome 43-44, Firefox 38-39, IE 6-11, MS Edge, Safari 5-8, ChakraNode 0.12.2, io.js 2.5.0, Node.js 0.8.28, 0.10.40, & 0.12.7, PhantomJS 1.9.8, RingoJS 0.11, & Rhino 1.7.6. +Automated [browser](https://saucelabs.com/u/lodash) & [CI](https://travis-ci.org/lodash/lodash/) test runs are available. Special thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing. diff --git a/react-app/node_modules/lodash/array.js b/react-app/node_modules/lodash/array.js new file mode 100644 index 0000000000..e5121fa52e --- /dev/null +++ b/react-app/node_modules/lodash/array.js @@ -0,0 +1,44 @@ +module.exports = { + 'chunk': require('./array/chunk'), + 'compact': require('./array/compact'), + 'difference': require('./array/difference'), + 'drop': require('./array/drop'), + 'dropRight': require('./array/dropRight'), + 'dropRightWhile': require('./array/dropRightWhile'), + 'dropWhile': require('./array/dropWhile'), + 'fill': require('./array/fill'), + 'findIndex': require('./array/findIndex'), + 'findLastIndex': require('./array/findLastIndex'), + 'first': require('./array/first'), + 'flatten': require('./array/flatten'), + 'flattenDeep': require('./array/flattenDeep'), + 'head': require('./array/head'), + 'indexOf': require('./array/indexOf'), + 'initial': require('./array/initial'), + 'intersection': require('./array/intersection'), + 'last': require('./array/last'), + 'lastIndexOf': require('./array/lastIndexOf'), + 'object': require('./array/object'), + 'pull': require('./array/pull'), + 'pullAt': require('./array/pullAt'), + 'remove': require('./array/remove'), + 'rest': require('./array/rest'), + 'slice': require('./array/slice'), + 'sortedIndex': require('./array/sortedIndex'), + 'sortedLastIndex': require('./array/sortedLastIndex'), + 'tail': require('./array/tail'), + 'take': require('./array/take'), + 'takeRight': require('./array/takeRight'), + 'takeRightWhile': require('./array/takeRightWhile'), + 'takeWhile': require('./array/takeWhile'), + 'union': require('./array/union'), + 'uniq': require('./array/uniq'), + 'unique': require('./array/unique'), + 'unzip': require('./array/unzip'), + 'unzipWith': require('./array/unzipWith'), + 'without': require('./array/without'), + 'xor': require('./array/xor'), + 'zip': require('./array/zip'), + 'zipObject': require('./array/zipObject'), + 'zipWith': require('./array/zipWith') +}; diff --git a/react-app/node_modules/lodash/array/chunk.js b/react-app/node_modules/lodash/array/chunk.js new file mode 100644 index 0000000000..c8be1fb02d --- /dev/null +++ b/react-app/node_modules/lodash/array/chunk.js @@ -0,0 +1,46 @@ +var baseSlice = require('../internal/baseSlice'), + isIterateeCall = require('../internal/isIterateeCall'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeMax = Math.max; + +/** + * Creates an array of elements split into groups the length of `size`. + * If `collection` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the new array containing chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ +function chunk(array, size, guard) { + if (guard ? isIterateeCall(array, size, guard) : size == null) { + size = 1; + } else { + size = nativeMax(nativeFloor(size) || 1, 1); + } + var index = 0, + length = array ? array.length : 0, + resIndex = -1, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[++resIndex] = baseSlice(array, index, (index += size)); + } + return result; +} + +module.exports = chunk; diff --git a/react-app/node_modules/lodash/array/compact.js b/react-app/node_modules/lodash/array/compact.js new file mode 100644 index 0000000000..1dc1c55e8f --- /dev/null +++ b/react-app/node_modules/lodash/array/compact.js @@ -0,0 +1,30 @@ +/** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ +function compact(array) { + var index = -1, + length = array ? array.length : 0, + resIndex = -1, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[++resIndex] = value; + } + } + return result; +} + +module.exports = compact; diff --git a/react-app/node_modules/lodash/array/difference.js b/react-app/node_modules/lodash/array/difference.js new file mode 100644 index 0000000000..128932a146 --- /dev/null +++ b/react-app/node_modules/lodash/array/difference.js @@ -0,0 +1,29 @@ +var baseDifference = require('../internal/baseDifference'), + baseFlatten = require('../internal/baseFlatten'), + isArrayLike = require('../internal/isArrayLike'), + isObjectLike = require('../internal/isObjectLike'), + restParam = require('../function/restParam'); + +/** + * Creates an array of unique `array` values not included in the other + * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The arrays of values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.difference([1, 2, 3], [4, 2]); + * // => [1, 3] + */ +var difference = restParam(function(array, values) { + return (isObjectLike(array) && isArrayLike(array)) + ? baseDifference(array, baseFlatten(values, false, true)) + : []; +}); + +module.exports = difference; diff --git a/react-app/node_modules/lodash/array/drop.js b/react-app/node_modules/lodash/array/drop.js new file mode 100644 index 0000000000..039a0b5fdc --- /dev/null +++ b/react-app/node_modules/lodash/array/drop.js @@ -0,0 +1,39 @@ +var baseSlice = require('../internal/baseSlice'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ +function drop(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + return baseSlice(array, n < 0 ? 0 : n); +} + +module.exports = drop; diff --git a/react-app/node_modules/lodash/array/dropRight.js b/react-app/node_modules/lodash/array/dropRight.js new file mode 100644 index 0000000000..14b5eb6f0a --- /dev/null +++ b/react-app/node_modules/lodash/array/dropRight.js @@ -0,0 +1,40 @@ +var baseSlice = require('../internal/baseSlice'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ +function dropRight(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + n = length - (+n || 0); + return baseSlice(array, 0, n < 0 ? 0 : n); +} + +module.exports = dropRight; diff --git a/react-app/node_modules/lodash/array/dropRightWhile.js b/react-app/node_modules/lodash/array/dropRightWhile.js new file mode 100644 index 0000000000..be158bd5fa --- /dev/null +++ b/react-app/node_modules/lodash/array/dropRightWhile.js @@ -0,0 +1,59 @@ +var baseCallback = require('../internal/baseCallback'), + baseWhile = require('../internal/baseWhile'); + +/** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * bound to `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that match the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRightWhile([1, 2, 3], function(n) { + * return n > 1; + * }); + * // => [1] + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); + * // => ['barney', 'fred'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.dropRightWhile(users, 'active', false), 'user'); + * // => ['barney'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.dropRightWhile(users, 'active'), 'user'); + * // => ['barney', 'fred', 'pebbles'] + */ +function dropRightWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, baseCallback(predicate, thisArg, 3), true, true) + : []; +} + +module.exports = dropRightWhile; diff --git a/react-app/node_modules/lodash/array/dropWhile.js b/react-app/node_modules/lodash/array/dropWhile.js new file mode 100644 index 0000000000..d9eabae9fa --- /dev/null +++ b/react-app/node_modules/lodash/array/dropWhile.js @@ -0,0 +1,59 @@ +var baseCallback = require('../internal/baseCallback'), + baseWhile = require('../internal/baseWhile'); + +/** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * bound to `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropWhile([1, 2, 3], function(n) { + * return n < 3; + * }); + * // => [3] + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user'); + * // => ['fred', 'pebbles'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.dropWhile(users, 'active', false), 'user'); + * // => ['pebbles'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.dropWhile(users, 'active'), 'user'); + * // => ['barney', 'fred', 'pebbles'] + */ +function dropWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, baseCallback(predicate, thisArg, 3), true) + : []; +} + +module.exports = dropWhile; diff --git a/react-app/node_modules/lodash/array/fill.js b/react-app/node_modules/lodash/array/fill.js new file mode 100644 index 0000000000..2c8f6da71d --- /dev/null +++ b/react-app/node_modules/lodash/array/fill.js @@ -0,0 +1,44 @@ +var baseFill = require('../internal/baseFill'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8], '*', 1, 2); + * // => [4, '*', 8] + */ +function fill(array, value, start, end) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); +} + +module.exports = fill; diff --git a/react-app/node_modules/lodash/array/findIndex.js b/react-app/node_modules/lodash/array/findIndex.js new file mode 100644 index 0000000000..2a6b8e14ba --- /dev/null +++ b/react-app/node_modules/lodash/array/findIndex.js @@ -0,0 +1,53 @@ +var createFindIndex = require('../internal/createFindIndex'); + +/** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(chr) { + * return chr.user == 'barney'; + * }); + * // => 0 + * + * // using the `_.matches` callback shorthand + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // using the `_.matchesProperty` callback shorthand + * _.findIndex(users, 'active', false); + * // => 0 + * + * // using the `_.property` callback shorthand + * _.findIndex(users, 'active'); + * // => 2 + */ +var findIndex = createFindIndex(); + +module.exports = findIndex; diff --git a/react-app/node_modules/lodash/array/findLastIndex.js b/react-app/node_modules/lodash/array/findLastIndex.js new file mode 100644 index 0000000000..d6d8eca6df --- /dev/null +++ b/react-app/node_modules/lodash/array/findLastIndex.js @@ -0,0 +1,53 @@ +var createFindIndex = require('../internal/createFindIndex'); + +/** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(chr) { + * return chr.user == 'pebbles'; + * }); + * // => 2 + * + * // using the `_.matches` callback shorthand + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // using the `_.matchesProperty` callback shorthand + * _.findLastIndex(users, 'active', false); + * // => 2 + * + * // using the `_.property` callback shorthand + * _.findLastIndex(users, 'active'); + * // => 0 + */ +var findLastIndex = createFindIndex(true); + +module.exports = findLastIndex; diff --git a/react-app/node_modules/lodash/array/first.js b/react-app/node_modules/lodash/array/first.js new file mode 100644 index 0000000000..b3b9c79c7b --- /dev/null +++ b/react-app/node_modules/lodash/array/first.js @@ -0,0 +1,22 @@ +/** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @alias head + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.first([1, 2, 3]); + * // => 1 + * + * _.first([]); + * // => undefined + */ +function first(array) { + return array ? array[0] : undefined; +} + +module.exports = first; diff --git a/react-app/node_modules/lodash/array/flatten.js b/react-app/node_modules/lodash/array/flatten.js new file mode 100644 index 0000000000..dc2eff8686 --- /dev/null +++ b/react-app/node_modules/lodash/array/flatten.js @@ -0,0 +1,32 @@ +var baseFlatten = require('../internal/baseFlatten'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Flattens a nested array. If `isDeep` is `true` the array is recursively + * flattened, otherwise it's only flattened a single level. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to flatten. + * @param {boolean} [isDeep] Specify a deep flatten. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, 3, [4]]]); + * // => [1, 2, 3, [4]] + * + * // using `isDeep` + * _.flatten([1, [2, 3, [4]]], true); + * // => [1, 2, 3, 4] + */ +function flatten(array, isDeep, guard) { + var length = array ? array.length : 0; + if (guard && isIterateeCall(array, isDeep, guard)) { + isDeep = false; + } + return length ? baseFlatten(array, isDeep) : []; +} + +module.exports = flatten; diff --git a/react-app/node_modules/lodash/array/flattenDeep.js b/react-app/node_modules/lodash/array/flattenDeep.js new file mode 100644 index 0000000000..9f775febe2 --- /dev/null +++ b/react-app/node_modules/lodash/array/flattenDeep.js @@ -0,0 +1,21 @@ +var baseFlatten = require('../internal/baseFlatten'); + +/** + * Recursively flattens a nested array. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to recursively flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, 3, [4]]]); + * // => [1, 2, 3, 4] + */ +function flattenDeep(array) { + var length = array ? array.length : 0; + return length ? baseFlatten(array, true) : []; +} + +module.exports = flattenDeep; diff --git a/react-app/node_modules/lodash/array/head.js b/react-app/node_modules/lodash/array/head.js new file mode 100644 index 0000000000..1961b08c7e --- /dev/null +++ b/react-app/node_modules/lodash/array/head.js @@ -0,0 +1 @@ +module.exports = require('./first'); diff --git a/react-app/node_modules/lodash/array/indexOf.js b/react-app/node_modules/lodash/array/indexOf.js new file mode 100644 index 0000000000..4cfc682319 --- /dev/null +++ b/react-app/node_modules/lodash/array/indexOf.js @@ -0,0 +1,53 @@ +var baseIndexOf = require('../internal/baseIndexOf'), + binaryIndex = require('../internal/binaryIndex'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the offset + * from the end of `array`. If `array` is sorted providing `true` for `fromIndex` + * performs a faster binary search. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {*} value The value to search for. + * @param {boolean|number} [fromIndex=0] The index to search from or `true` + * to perform a binary search on a sorted array. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // using `fromIndex` + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + * + * // performing a binary search + * _.indexOf([1, 1, 2, 2], 2, true); + * // => 2 + */ +function indexOf(array, value, fromIndex) { + var length = array ? array.length : 0; + if (!length) { + return -1; + } + if (typeof fromIndex == 'number') { + fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; + } else if (fromIndex) { + var index = binaryIndex(array, value); + if (index < length && + (value === value ? (value === array[index]) : (array[index] !== array[index]))) { + return index; + } + return -1; + } + return baseIndexOf(array, value, fromIndex || 0); +} + +module.exports = indexOf; diff --git a/react-app/node_modules/lodash/array/initial.js b/react-app/node_modules/lodash/array/initial.js new file mode 100644 index 0000000000..59b7a7d96d --- /dev/null +++ b/react-app/node_modules/lodash/array/initial.js @@ -0,0 +1,20 @@ +var dropRight = require('./dropRight'); + +/** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ +function initial(array) { + return dropRight(array, 1); +} + +module.exports = initial; diff --git a/react-app/node_modules/lodash/array/intersection.js b/react-app/node_modules/lodash/array/intersection.js new file mode 100644 index 0000000000..f218432cfb --- /dev/null +++ b/react-app/node_modules/lodash/array/intersection.js @@ -0,0 +1,58 @@ +var baseIndexOf = require('../internal/baseIndexOf'), + cacheIndexOf = require('../internal/cacheIndexOf'), + createCache = require('../internal/createCache'), + isArrayLike = require('../internal/isArrayLike'), + restParam = require('../function/restParam'); + +/** + * Creates an array of unique values that are included in all of the provided + * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of shared values. + * @example + * _.intersection([1, 2], [4, 2], [2, 1]); + * // => [2] + */ +var intersection = restParam(function(arrays) { + var othLength = arrays.length, + othIndex = othLength, + caches = Array(length), + indexOf = baseIndexOf, + isCommon = true, + result = []; + + while (othIndex--) { + var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : []; + caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null; + } + var array = arrays[0], + index = -1, + length = array ? array.length : 0, + seen = caches[0]; + + outer: + while (++index < length) { + value = array[index]; + if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) { + var othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) { + continue outer; + } + } + if (seen) { + seen.push(value); + } + result.push(value); + } + } + return result; +}); + +module.exports = intersection; diff --git a/react-app/node_modules/lodash/array/last.js b/react-app/node_modules/lodash/array/last.js new file mode 100644 index 0000000000..299af3146c --- /dev/null +++ b/react-app/node_modules/lodash/array/last.js @@ -0,0 +1,19 @@ +/** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ +function last(array) { + var length = array ? array.length : 0; + return length ? array[length - 1] : undefined; +} + +module.exports = last; diff --git a/react-app/node_modules/lodash/array/lastIndexOf.js b/react-app/node_modules/lodash/array/lastIndexOf.js new file mode 100644 index 0000000000..02b806269b --- /dev/null +++ b/react-app/node_modules/lodash/array/lastIndexOf.js @@ -0,0 +1,60 @@ +var binaryIndex = require('../internal/binaryIndex'), + indexOfNaN = require('../internal/indexOfNaN'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {*} value The value to search for. + * @param {boolean|number} [fromIndex=array.length-1] The index to search from + * or `true` to perform a binary search on a sorted array. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // using `fromIndex` + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + * + * // performing a binary search + * _.lastIndexOf([1, 1, 2, 2], 2, true); + * // => 3 + */ +function lastIndexOf(array, value, fromIndex) { + var length = array ? array.length : 0; + if (!length) { + return -1; + } + var index = length; + if (typeof fromIndex == 'number') { + index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1; + } else if (fromIndex) { + index = binaryIndex(array, value, true) - 1; + var other = array[index]; + if (value === value ? (value === other) : (other !== other)) { + return index; + } + return -1; + } + if (value !== value) { + return indexOfNaN(array, index, true); + } + while (index--) { + if (array[index] === value) { + return index; + } + } + return -1; +} + +module.exports = lastIndexOf; diff --git a/react-app/node_modules/lodash/array/object.js b/react-app/node_modules/lodash/array/object.js new file mode 100644 index 0000000000..f4a34531b1 --- /dev/null +++ b/react-app/node_modules/lodash/array/object.js @@ -0,0 +1 @@ +module.exports = require('./zipObject'); diff --git a/react-app/node_modules/lodash/array/pull.js b/react-app/node_modules/lodash/array/pull.js new file mode 100644 index 0000000000..7bcbb4a63c --- /dev/null +++ b/react-app/node_modules/lodash/array/pull.js @@ -0,0 +1,52 @@ +var baseIndexOf = require('../internal/baseIndexOf'); + +/** Used for native method references. */ +var arrayProto = Array.prototype; + +/** Native method references. */ +var splice = arrayProto.splice; + +/** + * Removes all provided values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3, 1, 2, 3]; + * + * _.pull(array, 2, 3); + * console.log(array); + * // => [1, 1] + */ +function pull() { + var args = arguments, + array = args[0]; + + if (!(array && array.length)) { + return array; + } + var index = 0, + indexOf = baseIndexOf, + length = args.length; + + while (++index < length) { + var fromIndex = 0, + value = args[index]; + + while ((fromIndex = indexOf(array, value, fromIndex)) > -1) { + splice.call(array, fromIndex, 1); + } + } + return array; +} + +module.exports = pull; diff --git a/react-app/node_modules/lodash/array/pullAt.js b/react-app/node_modules/lodash/array/pullAt.js new file mode 100644 index 0000000000..4ca2476f0e --- /dev/null +++ b/react-app/node_modules/lodash/array/pullAt.js @@ -0,0 +1,40 @@ +var baseAt = require('../internal/baseAt'), + baseCompareAscending = require('../internal/baseCompareAscending'), + baseFlatten = require('../internal/baseFlatten'), + basePullAt = require('../internal/basePullAt'), + restParam = require('../function/restParam'); + +/** + * Removes elements from `array` corresponding to the given indexes and returns + * an array of the removed elements. Indexes may be specified as an array of + * indexes or as individual arguments. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove, + * specified as individual indexes or arrays of indexes. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [5, 10, 15, 20]; + * var evens = _.pullAt(array, 1, 3); + * + * console.log(array); + * // => [5, 15] + * + * console.log(evens); + * // => [10, 20] + */ +var pullAt = restParam(function(array, indexes) { + indexes = baseFlatten(indexes); + + var result = baseAt(array, indexes); + basePullAt(array, indexes.sort(baseCompareAscending)); + return result; +}); + +module.exports = pullAt; diff --git a/react-app/node_modules/lodash/array/remove.js b/react-app/node_modules/lodash/array/remove.js new file mode 100644 index 0000000000..0cf979bda0 --- /dev/null +++ b/react-app/node_modules/lodash/array/remove.js @@ -0,0 +1,64 @@ +var baseCallback = require('../internal/baseCallback'), + basePullAt = require('../internal/basePullAt'); + +/** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is bound to + * `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * **Note:** Unlike `_.filter`, this method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to modify. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ +function remove(array, predicate, thisArg) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = baseCallback(predicate, thisArg, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; +} + +module.exports = remove; diff --git a/react-app/node_modules/lodash/array/rest.js b/react-app/node_modules/lodash/array/rest.js new file mode 100644 index 0000000000..9bfb734f1f --- /dev/null +++ b/react-app/node_modules/lodash/array/rest.js @@ -0,0 +1,21 @@ +var drop = require('./drop'); + +/** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @alias tail + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.rest([1, 2, 3]); + * // => [2, 3] + */ +function rest(array) { + return drop(array, 1); +} + +module.exports = rest; diff --git a/react-app/node_modules/lodash/array/slice.js b/react-app/node_modules/lodash/array/slice.js new file mode 100644 index 0000000000..48ef1a1a28 --- /dev/null +++ b/react-app/node_modules/lodash/array/slice.js @@ -0,0 +1,30 @@ +var baseSlice = require('../internal/baseSlice'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of `Array#slice` to support node + * lists in IE < 9 and to ensure dense arrays are returned. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ +function slice(array, start, end) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + return baseSlice(array, start, end); +} + +module.exports = slice; diff --git a/react-app/node_modules/lodash/array/sortedIndex.js b/react-app/node_modules/lodash/array/sortedIndex.js new file mode 100644 index 0000000000..6903bca437 --- /dev/null +++ b/react-app/node_modules/lodash/array/sortedIndex.js @@ -0,0 +1,53 @@ +var createSortedIndex = require('../internal/createSortedIndex'); + +/** + * Uses a binary search to determine the lowest index at which `value` should + * be inserted into `array` in order to maintain its sort order. If an iteratee + * function is provided it's invoked for `value` and each element of `array` + * to compute their sort ranking. The iteratee is bound to `thisArg` and + * invoked with one argument; (value). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + * + * _.sortedIndex([4, 4, 5, 5], 5); + * // => 2 + * + * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } }; + * + * // using an iteratee function + * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) { + * return this.data[word]; + * }, dict); + * // => 1 + * + * // using the `_.property` callback shorthand + * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x'); + * // => 1 + */ +var sortedIndex = createSortedIndex(); + +module.exports = sortedIndex; diff --git a/react-app/node_modules/lodash/array/sortedLastIndex.js b/react-app/node_modules/lodash/array/sortedLastIndex.js new file mode 100644 index 0000000000..81a4a8689e --- /dev/null +++ b/react-app/node_modules/lodash/array/sortedLastIndex.js @@ -0,0 +1,25 @@ +var createSortedIndex = require('../internal/createSortedIndex'); + +/** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 4, 5, 5], 5); + * // => 4 + */ +var sortedLastIndex = createSortedIndex(true); + +module.exports = sortedLastIndex; diff --git a/react-app/node_modules/lodash/array/tail.js b/react-app/node_modules/lodash/array/tail.js new file mode 100644 index 0000000000..c5dfe779d6 --- /dev/null +++ b/react-app/node_modules/lodash/array/tail.js @@ -0,0 +1 @@ +module.exports = require('./rest'); diff --git a/react-app/node_modules/lodash/array/take.js b/react-app/node_modules/lodash/array/take.js new file mode 100644 index 0000000000..875917a746 --- /dev/null +++ b/react-app/node_modules/lodash/array/take.js @@ -0,0 +1,39 @@ +var baseSlice = require('../internal/baseSlice'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ +function take(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + return baseSlice(array, 0, n < 0 ? 0 : n); +} + +module.exports = take; diff --git a/react-app/node_modules/lodash/array/takeRight.js b/react-app/node_modules/lodash/array/takeRight.js new file mode 100644 index 0000000000..6e89c87480 --- /dev/null +++ b/react-app/node_modules/lodash/array/takeRight.js @@ -0,0 +1,40 @@ +var baseSlice = require('../internal/baseSlice'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ +function takeRight(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + n = length - (+n || 0); + return baseSlice(array, n < 0 ? 0 : n); +} + +module.exports = takeRight; diff --git a/react-app/node_modules/lodash/array/takeRightWhile.js b/react-app/node_modules/lodash/array/takeRightWhile.js new file mode 100644 index 0000000000..5464d13b7f --- /dev/null +++ b/react-app/node_modules/lodash/array/takeRightWhile.js @@ -0,0 +1,59 @@ +var baseCallback = require('../internal/baseCallback'), + baseWhile = require('../internal/baseWhile'); + +/** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is bound to `thisArg` + * and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRightWhile([1, 2, 3], function(n) { + * return n > 1; + * }); + * // => [2, 3] + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); + * // => ['pebbles'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.takeRightWhile(users, 'active', false), 'user'); + * // => ['fred', 'pebbles'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.takeRightWhile(users, 'active'), 'user'); + * // => [] + */ +function takeRightWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, baseCallback(predicate, thisArg, 3), false, true) + : []; +} + +module.exports = takeRightWhile; diff --git a/react-app/node_modules/lodash/array/takeWhile.js b/react-app/node_modules/lodash/array/takeWhile.js new file mode 100644 index 0000000000..f7e28a1d42 --- /dev/null +++ b/react-app/node_modules/lodash/array/takeWhile.js @@ -0,0 +1,59 @@ +var baseCallback = require('../internal/baseCallback'), + baseWhile = require('../internal/baseWhile'); + +/** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is bound to + * `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeWhile([1, 2, 3], function(n) { + * return n < 3; + * }); + * // => [1, 2] + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false}, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user'); + * // => ['barney'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.takeWhile(users, 'active', false), 'user'); + * // => ['barney', 'fred'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.takeWhile(users, 'active'), 'user'); + * // => [] + */ +function takeWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, baseCallback(predicate, thisArg, 3)) + : []; +} + +module.exports = takeWhile; diff --git a/react-app/node_modules/lodash/array/union.js b/react-app/node_modules/lodash/array/union.js new file mode 100644 index 0000000000..53cefe432d --- /dev/null +++ b/react-app/node_modules/lodash/array/union.js @@ -0,0 +1,24 @@ +var baseFlatten = require('../internal/baseFlatten'), + baseUniq = require('../internal/baseUniq'), + restParam = require('../function/restParam'); + +/** + * Creates an array of unique values, in order, from all of the provided arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([1, 2], [4, 2], [2, 1]); + * // => [1, 2, 4] + */ +var union = restParam(function(arrays) { + return baseUniq(baseFlatten(arrays, false, true)); +}); + +module.exports = union; diff --git a/react-app/node_modules/lodash/array/uniq.js b/react-app/node_modules/lodash/array/uniq.js new file mode 100644 index 0000000000..ae937efdf5 --- /dev/null +++ b/react-app/node_modules/lodash/array/uniq.js @@ -0,0 +1,71 @@ +var baseCallback = require('../internal/baseCallback'), + baseUniq = require('../internal/baseUniq'), + isIterateeCall = require('../internal/isIterateeCall'), + sortedUniq = require('../internal/sortedUniq'); + +/** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurence of each element + * is kept. Providing `true` for `isSorted` performs a faster search algorithm + * for sorted arrays. If an iteratee function is provided it's invoked for + * each element in the array to generate the criterion by which uniqueness + * is computed. The `iteratee` is bound to `thisArg` and invoked with three + * arguments: (value, index, array). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias unique + * @category Array + * @param {Array} array The array to inspect. + * @param {boolean} [isSorted] Specify the array is sorted. + * @param {Function|Object|string} [iteratee] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new duplicate-value-free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + * + * // using `isSorted` + * _.uniq([1, 1, 2], true); + * // => [1, 2] + * + * // using an iteratee function + * _.uniq([1, 2.5, 1.5, 2], function(n) { + * return this.floor(n); + * }, Math); + * // => [1, 2.5] + * + * // using the `_.property` callback shorthand + * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ +function uniq(array, isSorted, iteratee, thisArg) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (isSorted != null && typeof isSorted != 'boolean') { + thisArg = iteratee; + iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted; + isSorted = false; + } + iteratee = iteratee == null ? iteratee : baseCallback(iteratee, thisArg, 3); + return (isSorted) + ? sortedUniq(array, iteratee) + : baseUniq(array, iteratee); +} + +module.exports = uniq; diff --git a/react-app/node_modules/lodash/array/unique.js b/react-app/node_modules/lodash/array/unique.js new file mode 100644 index 0000000000..396de1b804 --- /dev/null +++ b/react-app/node_modules/lodash/array/unique.js @@ -0,0 +1 @@ +module.exports = require('./uniq'); diff --git a/react-app/node_modules/lodash/array/unzip.js b/react-app/node_modules/lodash/array/unzip.js new file mode 100644 index 0000000000..0a539fa631 --- /dev/null +++ b/react-app/node_modules/lodash/array/unzip.js @@ -0,0 +1,47 @@ +var arrayFilter = require('../internal/arrayFilter'), + arrayMap = require('../internal/arrayMap'), + baseProperty = require('../internal/baseProperty'), + isArrayLike = require('../internal/isArrayLike'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]); + * // => [['fred', 30, true], ['barney', 40, false]] + * + * _.unzip(zipped); + * // => [['fred', 'barney'], [30, 40], [true, false]] + */ +function unzip(array) { + if (!(array && array.length)) { + return []; + } + var index = -1, + length = 0; + + array = arrayFilter(array, function(group) { + if (isArrayLike(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + var result = Array(length); + while (++index < length) { + result[index] = arrayMap(array, baseProperty(index)); + } + return result; +} + +module.exports = unzip; diff --git a/react-app/node_modules/lodash/array/unzipWith.js b/react-app/node_modules/lodash/array/unzipWith.js new file mode 100644 index 0000000000..324a2b1db2 --- /dev/null +++ b/react-app/node_modules/lodash/array/unzipWith.js @@ -0,0 +1,41 @@ +var arrayMap = require('../internal/arrayMap'), + arrayReduce = require('../internal/arrayReduce'), + bindCallback = require('../internal/bindCallback'), + unzip = require('./unzip'); + +/** + * This method is like `_.unzip` except that it accepts an iteratee to specify + * how regrouped values should be combined. The `iteratee` is bound to `thisArg` + * and invoked with four arguments: (accumulator, value, index, group). + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee] The function to combine regrouped values. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ +function unzipWith(array, iteratee, thisArg) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + iteratee = bindCallback(iteratee, thisArg, 4); + return arrayMap(result, function(group) { + return arrayReduce(group, iteratee, undefined, true); + }); +} + +module.exports = unzipWith; diff --git a/react-app/node_modules/lodash/array/without.js b/react-app/node_modules/lodash/array/without.js new file mode 100644 index 0000000000..2ac3d1176e --- /dev/null +++ b/react-app/node_modules/lodash/array/without.js @@ -0,0 +1,27 @@ +var baseDifference = require('../internal/baseDifference'), + isArrayLike = require('../internal/isArrayLike'), + restParam = require('../function/restParam'); + +/** + * Creates an array excluding all provided values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to filter. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.without([1, 2, 1, 3], 1, 2); + * // => [3] + */ +var without = restParam(function(array, values) { + return isArrayLike(array) + ? baseDifference(array, values) + : []; +}); + +module.exports = without; diff --git a/react-app/node_modules/lodash/array/xor.js b/react-app/node_modules/lodash/array/xor.js new file mode 100644 index 0000000000..04ef32aefd --- /dev/null +++ b/react-app/node_modules/lodash/array/xor.js @@ -0,0 +1,35 @@ +var arrayPush = require('../internal/arrayPush'), + baseDifference = require('../internal/baseDifference'), + baseUniq = require('../internal/baseUniq'), + isArrayLike = require('../internal/isArrayLike'); + +/** + * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the provided arrays. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of values. + * @example + * + * _.xor([1, 2], [4, 2]); + * // => [1, 4] + */ +function xor() { + var index = -1, + length = arguments.length; + + while (++index < length) { + var array = arguments[index]; + if (isArrayLike(array)) { + var result = result + ? arrayPush(baseDifference(result, array), baseDifference(array, result)) + : array; + } + } + return result ? baseUniq(result) : []; +} + +module.exports = xor; diff --git a/react-app/node_modules/lodash/array/zip.js b/react-app/node_modules/lodash/array/zip.js new file mode 100644 index 0000000000..53a6f69912 --- /dev/null +++ b/react-app/node_modules/lodash/array/zip.js @@ -0,0 +1,21 @@ +var restParam = require('../function/restParam'), + unzip = require('./unzip'); + +/** + * Creates an array of grouped elements, the first of which contains the first + * elements of the given arrays, the second of which contains the second elements + * of the given arrays, and so on. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['fred', 'barney'], [30, 40], [true, false]); + * // => [['fred', 30, true], ['barney', 40, false]] + */ +var zip = restParam(unzip); + +module.exports = zip; diff --git a/react-app/node_modules/lodash/array/zipObject.js b/react-app/node_modules/lodash/array/zipObject.js new file mode 100644 index 0000000000..dec7a211b7 --- /dev/null +++ b/react-app/node_modules/lodash/array/zipObject.js @@ -0,0 +1,43 @@ +var isArray = require('../lang/isArray'); + +/** + * The inverse of `_.pairs`; this method returns an object composed from arrays + * of property names and values. Provide either a single two dimensional array, + * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names + * and one of corresponding values. + * + * @static + * @memberOf _ + * @alias object + * @category Array + * @param {Array} props The property names. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject([['fred', 30], ['barney', 40]]); + * // => { 'fred': 30, 'barney': 40 } + * + * _.zipObject(['fred', 'barney'], [30, 40]); + * // => { 'fred': 30, 'barney': 40 } + */ +function zipObject(props, values) { + var index = -1, + length = props ? props.length : 0, + result = {}; + + if (length && !values && !isArray(props[0])) { + values = []; + } + while (++index < length) { + var key = props[index]; + if (values) { + result[key] = values[index]; + } else if (key) { + result[key[0]] = key[1]; + } + } + return result; +} + +module.exports = zipObject; diff --git a/react-app/node_modules/lodash/array/zipWith.js b/react-app/node_modules/lodash/array/zipWith.js new file mode 100644 index 0000000000..ad103742cd --- /dev/null +++ b/react-app/node_modules/lodash/array/zipWith.js @@ -0,0 +1,36 @@ +var restParam = require('../function/restParam'), + unzipWith = require('./unzipWith'); + +/** + * This method is like `_.zip` except that it accepts an iteratee to specify + * how grouped values should be combined. The `iteratee` is bound to `thisArg` + * and invoked with four arguments: (accumulator, value, index, group). + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee] The function to combine grouped values. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], _.add); + * // => [111, 222] + */ +var zipWith = restParam(function(arrays) { + var length = arrays.length, + iteratee = length > 2 ? arrays[length - 2] : undefined, + thisArg = length > 1 ? arrays[length - 1] : undefined; + + if (length > 2 && typeof iteratee == 'function') { + length -= 2; + } else { + iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined; + thisArg = undefined; + } + arrays.length = length; + return unzipWith(arrays, iteratee, thisArg); +}); + +module.exports = zipWith; diff --git a/react-app/node_modules/lodash/chain.js b/react-app/node_modules/lodash/chain.js new file mode 100644 index 0000000000..6439627f3d --- /dev/null +++ b/react-app/node_modules/lodash/chain.js @@ -0,0 +1,16 @@ +module.exports = { + 'chain': require('./chain/chain'), + 'commit': require('./chain/commit'), + 'concat': require('./chain/concat'), + 'lodash': require('./chain/lodash'), + 'plant': require('./chain/plant'), + 'reverse': require('./chain/reverse'), + 'run': require('./chain/run'), + 'tap': require('./chain/tap'), + 'thru': require('./chain/thru'), + 'toJSON': require('./chain/toJSON'), + 'toString': require('./chain/toString'), + 'value': require('./chain/value'), + 'valueOf': require('./chain/valueOf'), + 'wrapperChain': require('./chain/wrapperChain') +}; diff --git a/react-app/node_modules/lodash/chain/chain.js b/react-app/node_modules/lodash/chain/chain.js new file mode 100644 index 0000000000..453ba1eb5e --- /dev/null +++ b/react-app/node_modules/lodash/chain/chain.js @@ -0,0 +1,35 @@ +var lodash = require('./lodash'); + +/** + * Creates a `lodash` object that wraps `value` with explicit method + * chaining enabled. + * + * @static + * @memberOf _ + * @category Chain + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _.chain(users) + * .sortBy('age') + * .map(function(chr) { + * return chr.user + ' is ' + chr.age; + * }) + * .first() + * .value(); + * // => 'pebbles is 1' + */ +function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; +} + +module.exports = chain; diff --git a/react-app/node_modules/lodash/chain/commit.js b/react-app/node_modules/lodash/chain/commit.js new file mode 100644 index 0000000000..c732d1bf91 --- /dev/null +++ b/react-app/node_modules/lodash/chain/commit.js @@ -0,0 +1 @@ +module.exports = require('./wrapperCommit'); diff --git a/react-app/node_modules/lodash/chain/concat.js b/react-app/node_modules/lodash/chain/concat.js new file mode 100644 index 0000000000..90607d1ee1 --- /dev/null +++ b/react-app/node_modules/lodash/chain/concat.js @@ -0,0 +1 @@ +module.exports = require('./wrapperConcat'); diff --git a/react-app/node_modules/lodash/chain/lodash.js b/react-app/node_modules/lodash/chain/lodash.js new file mode 100644 index 0000000000..1c3467efee --- /dev/null +++ b/react-app/node_modules/lodash/chain/lodash.js @@ -0,0 +1,125 @@ +var LazyWrapper = require('../internal/LazyWrapper'), + LodashWrapper = require('../internal/LodashWrapper'), + baseLodash = require('../internal/baseLodash'), + isArray = require('../lang/isArray'), + isObjectLike = require('../internal/isObjectLike'), + wrapperClone = require('../internal/wrapperClone'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates a `lodash` object which wraps `value` to enable implicit chaining. + * Methods that operate on and return arrays, collections, and functions can + * be chained together. Methods that retrieve a single value or may return a + * primitive value will automatically end the chain returning the unwrapped + * value. Explicit chaining may be enabled using `_.chain`. The execution of + * chained methods is lazy, that is, execution is deferred until `_#value` + * is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. Shortcut + * fusion is an optimization strategy which merge iteratee calls; this can help + * to avoid the creation of intermediate data structures and greatly reduce the + * number of iteratee executions. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, + * `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`, + * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`, + * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`, + * and `where` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`, + * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`, + * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`, + * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`, + * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, + * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, + * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, + * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, + * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`, + * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`, + * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`, + * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`, + * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, + * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`, + * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, + * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`, + * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`, + * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, + * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, + * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`, + * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`, + * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`, + * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`, + * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`, + * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`, + * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`, + * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, + * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, + * `unescape`, `uniqueId`, `value`, and `words` + * + * The wrapper method `sample` will return a wrapped value when `n` is provided, + * otherwise an unwrapped value is returned. + * + * @name _ + * @constructor + * @category Chain + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var wrapped = _([1, 2, 3]); + * + * // returns an unwrapped value + * wrapped.reduce(function(total, n) { + * return total + n; + * }); + * // => 6 + * + * // returns a wrapped value + * var squares = wrapped.map(function(n) { + * return n * n; + * }); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ +function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); +} + +// Ensure wrappers are instances of `baseLodash`. +lodash.prototype = baseLodash.prototype; + +module.exports = lodash; diff --git a/react-app/node_modules/lodash/chain/plant.js b/react-app/node_modules/lodash/chain/plant.js new file mode 100644 index 0000000000..04099f2386 --- /dev/null +++ b/react-app/node_modules/lodash/chain/plant.js @@ -0,0 +1 @@ +module.exports = require('./wrapperPlant'); diff --git a/react-app/node_modules/lodash/chain/reverse.js b/react-app/node_modules/lodash/chain/reverse.js new file mode 100644 index 0000000000..f72a64a19b --- /dev/null +++ b/react-app/node_modules/lodash/chain/reverse.js @@ -0,0 +1 @@ +module.exports = require('./wrapperReverse'); diff --git a/react-app/node_modules/lodash/chain/run.js b/react-app/node_modules/lodash/chain/run.js new file mode 100644 index 0000000000..5e751a2c32 --- /dev/null +++ b/react-app/node_modules/lodash/chain/run.js @@ -0,0 +1 @@ +module.exports = require('./wrapperValue'); diff --git a/react-app/node_modules/lodash/chain/tap.js b/react-app/node_modules/lodash/chain/tap.js new file mode 100644 index 0000000000..3d0257ecfd --- /dev/null +++ b/react-app/node_modules/lodash/chain/tap.js @@ -0,0 +1,29 @@ +/** + * This method invokes `interceptor` and returns `value`. The interceptor is + * bound to `thisArg` and invoked with one argument; (value). The purpose of + * this method is to "tap into" a method chain in order to perform operations + * on intermediate results within the chain. + * + * @static + * @memberOf _ + * @category Chain + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @param {*} [thisArg] The `this` binding of `interceptor`. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ +function tap(value, interceptor, thisArg) { + interceptor.call(thisArg, value); + return value; +} + +module.exports = tap; diff --git a/react-app/node_modules/lodash/chain/thru.js b/react-app/node_modules/lodash/chain/thru.js new file mode 100644 index 0000000000..a715780376 --- /dev/null +++ b/react-app/node_modules/lodash/chain/thru.js @@ -0,0 +1,26 @@ +/** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * + * @static + * @memberOf _ + * @category Chain + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @param {*} [thisArg] The `this` binding of `interceptor`. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ +function thru(value, interceptor, thisArg) { + return interceptor.call(thisArg, value); +} + +module.exports = thru; diff --git a/react-app/node_modules/lodash/chain/toJSON.js b/react-app/node_modules/lodash/chain/toJSON.js new file mode 100644 index 0000000000..5e751a2c32 --- /dev/null +++ b/react-app/node_modules/lodash/chain/toJSON.js @@ -0,0 +1 @@ +module.exports = require('./wrapperValue'); diff --git a/react-app/node_modules/lodash/chain/toString.js b/react-app/node_modules/lodash/chain/toString.js new file mode 100644 index 0000000000..c7bcbf9a54 --- /dev/null +++ b/react-app/node_modules/lodash/chain/toString.js @@ -0,0 +1 @@ +module.exports = require('./wrapperToString'); diff --git a/react-app/node_modules/lodash/chain/value.js b/react-app/node_modules/lodash/chain/value.js new file mode 100644 index 0000000000..5e751a2c32 --- /dev/null +++ b/react-app/node_modules/lodash/chain/value.js @@ -0,0 +1 @@ +module.exports = require('./wrapperValue'); diff --git a/react-app/node_modules/lodash/chain/valueOf.js b/react-app/node_modules/lodash/chain/valueOf.js new file mode 100644 index 0000000000..5e751a2c32 --- /dev/null +++ b/react-app/node_modules/lodash/chain/valueOf.js @@ -0,0 +1 @@ +module.exports = require('./wrapperValue'); diff --git a/react-app/node_modules/lodash/chain/wrapperChain.js b/react-app/node_modules/lodash/chain/wrapperChain.js new file mode 100644 index 0000000000..38234819ba --- /dev/null +++ b/react-app/node_modules/lodash/chain/wrapperChain.js @@ -0,0 +1,32 @@ +var chain = require('./chain'); + +/** + * Enables explicit method chaining on the wrapper object. + * + * @name chain + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // without explicit chaining + * _(users).first(); + * // => { 'user': 'barney', 'age': 36 } + * + * // with explicit chaining + * _(users).chain() + * .first() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ +function wrapperChain() { + return chain(this); +} + +module.exports = wrapperChain; diff --git a/react-app/node_modules/lodash/chain/wrapperCommit.js b/react-app/node_modules/lodash/chain/wrapperCommit.js new file mode 100644 index 0000000000..c3d289804b --- /dev/null +++ b/react-app/node_modules/lodash/chain/wrapperCommit.js @@ -0,0 +1,32 @@ +var LodashWrapper = require('../internal/LodashWrapper'); + +/** + * Executes the chained sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ +function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); +} + +module.exports = wrapperCommit; diff --git a/react-app/node_modules/lodash/chain/wrapperConcat.js b/react-app/node_modules/lodash/chain/wrapperConcat.js new file mode 100644 index 0000000000..799156cd83 --- /dev/null +++ b/react-app/node_modules/lodash/chain/wrapperConcat.js @@ -0,0 +1,34 @@ +var arrayConcat = require('../internal/arrayConcat'), + baseFlatten = require('../internal/baseFlatten'), + isArray = require('../lang/isArray'), + restParam = require('../function/restParam'), + toObject = require('../internal/toObject'); + +/** + * Creates a new array joining a wrapped array with any additional arrays + * and/or values. + * + * @name concat + * @memberOf _ + * @category Chain + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var wrapped = _(array).concat(2, [3], [[4]]); + * + * console.log(wrapped.value()); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ +var wrapperConcat = restParam(function(values) { + values = baseFlatten(values); + return this.thru(function(array) { + return arrayConcat(isArray(array) ? array : [toObject(array)], values); + }); +}); + +module.exports = wrapperConcat; diff --git a/react-app/node_modules/lodash/chain/wrapperPlant.js b/react-app/node_modules/lodash/chain/wrapperPlant.js new file mode 100644 index 0000000000..234fe41fec --- /dev/null +++ b/react-app/node_modules/lodash/chain/wrapperPlant.js @@ -0,0 +1,45 @@ +var baseLodash = require('../internal/baseLodash'), + wrapperClone = require('../internal/wrapperClone'); + +/** + * Creates a clone of the chained sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).map(function(value) { + * return Math.pow(value, 2); + * }); + * + * var other = [3, 4]; + * var otherWrapped = wrapped.plant(other); + * + * otherWrapped.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ +function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; +} + +module.exports = wrapperPlant; diff --git a/react-app/node_modules/lodash/chain/wrapperReverse.js b/react-app/node_modules/lodash/chain/wrapperReverse.js new file mode 100644 index 0000000000..6ba546de4e --- /dev/null +++ b/react-app/node_modules/lodash/chain/wrapperReverse.js @@ -0,0 +1,43 @@ +var LazyWrapper = require('../internal/LazyWrapper'), + LodashWrapper = require('../internal/LodashWrapper'), + thru = require('./thru'); + +/** + * Reverses the wrapped array so the first element becomes the last, the + * second element becomes the second to last, and so on. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new reversed `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ +function wrapperReverse() { + var value = this.__wrapped__; + + var interceptor = function(value) { + return value.reverse(); + }; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(interceptor); +} + +module.exports = wrapperReverse; diff --git a/react-app/node_modules/lodash/chain/wrapperToString.js b/react-app/node_modules/lodash/chain/wrapperToString.js new file mode 100644 index 0000000000..db975a5a35 --- /dev/null +++ b/react-app/node_modules/lodash/chain/wrapperToString.js @@ -0,0 +1,17 @@ +/** + * Produces the result of coercing the unwrapped value to a string. + * + * @name toString + * @memberOf _ + * @category Chain + * @returns {string} Returns the coerced string value. + * @example + * + * _([1, 2, 3]).toString(); + * // => '1,2,3' + */ +function wrapperToString() { + return (this.value() + ''); +} + +module.exports = wrapperToString; diff --git a/react-app/node_modules/lodash/chain/wrapperValue.js b/react-app/node_modules/lodash/chain/wrapperValue.js new file mode 100644 index 0000000000..2734e41c4a --- /dev/null +++ b/react-app/node_modules/lodash/chain/wrapperValue.js @@ -0,0 +1,20 @@ +var baseWrapperValue = require('../internal/baseWrapperValue'); + +/** + * Executes the chained sequence to extract the unwrapped value. + * + * @name value + * @memberOf _ + * @alias run, toJSON, valueOf + * @category Chain + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ +function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); +} + +module.exports = wrapperValue; diff --git a/react-app/node_modules/lodash/collection.js b/react-app/node_modules/lodash/collection.js new file mode 100644 index 0000000000..03388571c3 --- /dev/null +++ b/react-app/node_modules/lodash/collection.js @@ -0,0 +1,44 @@ +module.exports = { + 'all': require('./collection/all'), + 'any': require('./collection/any'), + 'at': require('./collection/at'), + 'collect': require('./collection/collect'), + 'contains': require('./collection/contains'), + 'countBy': require('./collection/countBy'), + 'detect': require('./collection/detect'), + 'each': require('./collection/each'), + 'eachRight': require('./collection/eachRight'), + 'every': require('./collection/every'), + 'filter': require('./collection/filter'), + 'find': require('./collection/find'), + 'findLast': require('./collection/findLast'), + 'findWhere': require('./collection/findWhere'), + 'foldl': require('./collection/foldl'), + 'foldr': require('./collection/foldr'), + 'forEach': require('./collection/forEach'), + 'forEachRight': require('./collection/forEachRight'), + 'groupBy': require('./collection/groupBy'), + 'include': require('./collection/include'), + 'includes': require('./collection/includes'), + 'indexBy': require('./collection/indexBy'), + 'inject': require('./collection/inject'), + 'invoke': require('./collection/invoke'), + 'map': require('./collection/map'), + 'max': require('./math/max'), + 'min': require('./math/min'), + 'partition': require('./collection/partition'), + 'pluck': require('./collection/pluck'), + 'reduce': require('./collection/reduce'), + 'reduceRight': require('./collection/reduceRight'), + 'reject': require('./collection/reject'), + 'sample': require('./collection/sample'), + 'select': require('./collection/select'), + 'shuffle': require('./collection/shuffle'), + 'size': require('./collection/size'), + 'some': require('./collection/some'), + 'sortBy': require('./collection/sortBy'), + 'sortByAll': require('./collection/sortByAll'), + 'sortByOrder': require('./collection/sortByOrder'), + 'sum': require('./math/sum'), + 'where': require('./collection/where') +}; diff --git a/react-app/node_modules/lodash/collection/all.js b/react-app/node_modules/lodash/collection/all.js new file mode 100644 index 0000000000..d0839f77ed --- /dev/null +++ b/react-app/node_modules/lodash/collection/all.js @@ -0,0 +1 @@ +module.exports = require('./every'); diff --git a/react-app/node_modules/lodash/collection/any.js b/react-app/node_modules/lodash/collection/any.js new file mode 100644 index 0000000000..900ac25e83 --- /dev/null +++ b/react-app/node_modules/lodash/collection/any.js @@ -0,0 +1 @@ +module.exports = require('./some'); diff --git a/react-app/node_modules/lodash/collection/at.js b/react-app/node_modules/lodash/collection/at.js new file mode 100644 index 0000000000..29236e577d --- /dev/null +++ b/react-app/node_modules/lodash/collection/at.js @@ -0,0 +1,29 @@ +var baseAt = require('../internal/baseAt'), + baseFlatten = require('../internal/baseFlatten'), + restParam = require('../function/restParam'); + +/** + * Creates an array of elements corresponding to the given keys, or indexes, + * of `collection`. Keys may be specified as individual arguments or as arrays + * of keys. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {...(number|number[]|string|string[])} [props] The property names + * or indexes of elements to pick, specified individually or in arrays. + * @returns {Array} Returns the new array of picked elements. + * @example + * + * _.at(['a', 'b', 'c'], [0, 2]); + * // => ['a', 'c'] + * + * _.at(['barney', 'fred', 'pebbles'], 0, 2); + * // => ['barney', 'pebbles'] + */ +var at = restParam(function(collection, props) { + return baseAt(collection, baseFlatten(props)); +}); + +module.exports = at; diff --git a/react-app/node_modules/lodash/collection/collect.js b/react-app/node_modules/lodash/collection/collect.js new file mode 100644 index 0000000000..0d1e1abfaf --- /dev/null +++ b/react-app/node_modules/lodash/collection/collect.js @@ -0,0 +1 @@ +module.exports = require('./map'); diff --git a/react-app/node_modules/lodash/collection/contains.js b/react-app/node_modules/lodash/collection/contains.js new file mode 100644 index 0000000000..594722af59 --- /dev/null +++ b/react-app/node_modules/lodash/collection/contains.js @@ -0,0 +1 @@ +module.exports = require('./includes'); diff --git a/react-app/node_modules/lodash/collection/countBy.js b/react-app/node_modules/lodash/collection/countBy.js new file mode 100644 index 0000000000..e97dbb749d --- /dev/null +++ b/react-app/node_modules/lodash/collection/countBy.js @@ -0,0 +1,54 @@ +var createAggregator = require('../internal/createAggregator'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an object composed of keys generated from the results of running + * each element of `collection` through `iteratee`. The corresponding value + * of each key is the number of times the key was returned by `iteratee`. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([4.3, 6.1, 6.4], function(n) { + * return Math.floor(n); + * }); + * // => { '4': 1, '6': 2 } + * + * _.countBy([4.3, 6.1, 6.4], function(n) { + * return this.floor(n); + * }, Math); + * // => { '4': 1, '6': 2 } + * + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ +var countBy = createAggregator(function(result, value, key) { + hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1); +}); + +module.exports = countBy; diff --git a/react-app/node_modules/lodash/collection/detect.js b/react-app/node_modules/lodash/collection/detect.js new file mode 100644 index 0000000000..2fb6303efb --- /dev/null +++ b/react-app/node_modules/lodash/collection/detect.js @@ -0,0 +1 @@ +module.exports = require('./find'); diff --git a/react-app/node_modules/lodash/collection/each.js b/react-app/node_modules/lodash/collection/each.js new file mode 100644 index 0000000000..8800f42046 --- /dev/null +++ b/react-app/node_modules/lodash/collection/each.js @@ -0,0 +1 @@ +module.exports = require('./forEach'); diff --git a/react-app/node_modules/lodash/collection/eachRight.js b/react-app/node_modules/lodash/collection/eachRight.js new file mode 100644 index 0000000000..3252b2aba3 --- /dev/null +++ b/react-app/node_modules/lodash/collection/eachRight.js @@ -0,0 +1 @@ +module.exports = require('./forEachRight'); diff --git a/react-app/node_modules/lodash/collection/every.js b/react-app/node_modules/lodash/collection/every.js new file mode 100644 index 0000000000..5a2d0f5dd4 --- /dev/null +++ b/react-app/node_modules/lodash/collection/every.js @@ -0,0 +1,66 @@ +var arrayEvery = require('../internal/arrayEvery'), + baseCallback = require('../internal/baseCallback'), + baseEvery = require('../internal/baseEvery'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * The predicate is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias all + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.every(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.every(users, 'active'); + * // => false + */ +function every(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = baseCallback(predicate, thisArg, 3); + } + return func(collection, predicate); +} + +module.exports = every; diff --git a/react-app/node_modules/lodash/collection/filter.js b/react-app/node_modules/lodash/collection/filter.js new file mode 100644 index 0000000000..7620aa7619 --- /dev/null +++ b/react-app/node_modules/lodash/collection/filter.js @@ -0,0 +1,61 @@ +var arrayFilter = require('../internal/arrayFilter'), + baseCallback = require('../internal/baseCallback'), + baseFilter = require('../internal/baseFilter'), + isArray = require('../lang/isArray'); + +/** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is bound to `thisArg` and + * invoked with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias select + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the new filtered array. + * @example + * + * _.filter([4, 5, 6], function(n) { + * return n % 2 == 0; + * }); + * // => [4, 6] + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user'); + * // => ['barney'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.filter(users, 'active', false), 'user'); + * // => ['fred'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.filter(users, 'active'), 'user'); + * // => ['barney'] + */ +function filter(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayFilter : baseFilter; + predicate = baseCallback(predicate, thisArg, 3); + return func(collection, predicate); +} + +module.exports = filter; diff --git a/react-app/node_modules/lodash/collection/find.js b/react-app/node_modules/lodash/collection/find.js new file mode 100644 index 0000000000..7358cfe86c --- /dev/null +++ b/react-app/node_modules/lodash/collection/find.js @@ -0,0 +1,56 @@ +var baseEach = require('../internal/baseEach'), + createFind = require('../internal/createFind'); + +/** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is bound to `thisArg` and + * invoked with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias detect + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.result(_.find(users, function(chr) { + * return chr.age < 40; + * }), 'user'); + * // => 'barney' + * + * // using the `_.matches` callback shorthand + * _.result(_.find(users, { 'age': 1, 'active': true }), 'user'); + * // => 'pebbles' + * + * // using the `_.matchesProperty` callback shorthand + * _.result(_.find(users, 'active', false), 'user'); + * // => 'fred' + * + * // using the `_.property` callback shorthand + * _.result(_.find(users, 'active'), 'user'); + * // => 'barney' + */ +var find = createFind(baseEach); + +module.exports = find; diff --git a/react-app/node_modules/lodash/collection/findLast.js b/react-app/node_modules/lodash/collection/findLast.js new file mode 100644 index 0000000000..75dbadca24 --- /dev/null +++ b/react-app/node_modules/lodash/collection/findLast.js @@ -0,0 +1,25 @@ +var baseEachRight = require('../internal/baseEachRight'), + createFind = require('../internal/createFind'); + +/** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ +var findLast = createFind(baseEachRight, true); + +module.exports = findLast; diff --git a/react-app/node_modules/lodash/collection/findWhere.js b/react-app/node_modules/lodash/collection/findWhere.js new file mode 100644 index 0000000000..2d620655ed --- /dev/null +++ b/react-app/node_modules/lodash/collection/findWhere.js @@ -0,0 +1,37 @@ +var baseMatches = require('../internal/baseMatches'), + find = require('./find'); + +/** + * Performs a deep comparison between each element in `collection` and the + * source object, returning the first element that has equivalent property + * values. + * + * **Note:** This method supports comparing arrays, booleans, `Date` objects, + * numbers, `Object` objects, regexes, and strings. Objects are compared by + * their own, not inherited, enumerable properties. For comparing a single + * own or inherited property value see `_.matchesProperty`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Object} source The object of property values to match. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user'); + * // => 'barney' + * + * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user'); + * // => 'fred' + */ +function findWhere(collection, source) { + return find(collection, baseMatches(source)); +} + +module.exports = findWhere; diff --git a/react-app/node_modules/lodash/collection/foldl.js b/react-app/node_modules/lodash/collection/foldl.js new file mode 100644 index 0000000000..26f53cf7b2 --- /dev/null +++ b/react-app/node_modules/lodash/collection/foldl.js @@ -0,0 +1 @@ +module.exports = require('./reduce'); diff --git a/react-app/node_modules/lodash/collection/foldr.js b/react-app/node_modules/lodash/collection/foldr.js new file mode 100644 index 0000000000..8fb199eda6 --- /dev/null +++ b/react-app/node_modules/lodash/collection/foldr.js @@ -0,0 +1 @@ +module.exports = require('./reduceRight'); diff --git a/react-app/node_modules/lodash/collection/forEach.js b/react-app/node_modules/lodash/collection/forEach.js new file mode 100644 index 0000000000..05a8e2140e --- /dev/null +++ b/react-app/node_modules/lodash/collection/forEach.js @@ -0,0 +1,37 @@ +var arrayEach = require('../internal/arrayEach'), + baseEach = require('../internal/baseEach'), + createForEach = require('../internal/createForEach'); + +/** + * Iterates over elements of `collection` invoking `iteratee` for each element. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). Iteratee functions may exit iteration early + * by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" property + * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn` + * may be used for object iteration. + * + * @static + * @memberOf _ + * @alias each + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array|Object|string} Returns `collection`. + * @example + * + * _([1, 2]).forEach(function(n) { + * console.log(n); + * }).value(); + * // => logs each value from left to right and returns the array + * + * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) { + * console.log(n, key); + * }); + * // => logs each value-key pair and returns the object (iteration order is not guaranteed) + */ +var forEach = createForEach(arrayEach, baseEach); + +module.exports = forEach; diff --git a/react-app/node_modules/lodash/collection/forEachRight.js b/react-app/node_modules/lodash/collection/forEachRight.js new file mode 100644 index 0000000000..3499711002 --- /dev/null +++ b/react-app/node_modules/lodash/collection/forEachRight.js @@ -0,0 +1,26 @@ +var arrayEachRight = require('../internal/arrayEachRight'), + baseEachRight = require('../internal/baseEachRight'), + createForEach = require('../internal/createForEach'); + +/** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @alias eachRight + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array|Object|string} Returns `collection`. + * @example + * + * _([1, 2]).forEachRight(function(n) { + * console.log(n); + * }).value(); + * // => logs each value from right to left and returns the array + */ +var forEachRight = createForEach(arrayEachRight, baseEachRight); + +module.exports = forEachRight; diff --git a/react-app/node_modules/lodash/collection/groupBy.js b/react-app/node_modules/lodash/collection/groupBy.js new file mode 100644 index 0000000000..a925c894a0 --- /dev/null +++ b/react-app/node_modules/lodash/collection/groupBy.js @@ -0,0 +1,59 @@ +var createAggregator = require('../internal/createAggregator'); + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an object composed of keys generated from the results of running + * each element of `collection` through `iteratee`. The corresponding value + * of each key is an array of the elements responsible for generating the key. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([4.2, 6.1, 6.4], function(n) { + * return Math.floor(n); + * }); + * // => { '4': [4.2], '6': [6.1, 6.4] } + * + * _.groupBy([4.2, 6.1, 6.4], function(n) { + * return this.floor(n); + * }, Math); + * // => { '4': [4.2], '6': [6.1, 6.4] } + * + * // using the `_.property` callback shorthand + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ +var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + result[key] = [value]; + } +}); + +module.exports = groupBy; diff --git a/react-app/node_modules/lodash/collection/include.js b/react-app/node_modules/lodash/collection/include.js new file mode 100644 index 0000000000..594722af59 --- /dev/null +++ b/react-app/node_modules/lodash/collection/include.js @@ -0,0 +1 @@ +module.exports = require('./includes'); diff --git a/react-app/node_modules/lodash/collection/includes.js b/react-app/node_modules/lodash/collection/includes.js new file mode 100644 index 0000000000..329486a530 --- /dev/null +++ b/react-app/node_modules/lodash/collection/includes.js @@ -0,0 +1,57 @@ +var baseIndexOf = require('../internal/baseIndexOf'), + getLength = require('../internal/getLength'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'), + isLength = require('../internal/isLength'), + isString = require('../lang/isString'), + values = require('../object/values'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Checks if `target` is in `collection` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the offset + * from the end of `collection`. + * + * @static + * @memberOf _ + * @alias contains, include + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {*} target The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. + * @returns {boolean} Returns `true` if a matching element is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'user': 'fred', 'age': 40 }, 'fred'); + * // => true + * + * _.includes('pebbles', 'eb'); + * // => true + */ +function includes(collection, target, fromIndex, guard) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + collection = values(collection); + length = collection.length; + } + if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) { + fromIndex = 0; + } else { + fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); + } + return (typeof collection == 'string' || !isArray(collection) && isString(collection)) + ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1) + : (!!length && baseIndexOf(collection, target, fromIndex) > -1); +} + +module.exports = includes; diff --git a/react-app/node_modules/lodash/collection/indexBy.js b/react-app/node_modules/lodash/collection/indexBy.js new file mode 100644 index 0000000000..34a941e729 --- /dev/null +++ b/react-app/node_modules/lodash/collection/indexBy.js @@ -0,0 +1,53 @@ +var createAggregator = require('../internal/createAggregator'); + +/** + * Creates an object composed of keys generated from the results of running + * each element of `collection` through `iteratee`. The corresponding value + * of each key is the last element responsible for generating the key. The + * iteratee function is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var keyData = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.indexBy(keyData, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + * + * _.indexBy(keyData, function(object) { + * return String.fromCharCode(object.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.indexBy(keyData, function(object) { + * return this.fromCharCode(object.code); + * }, String); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + */ +var indexBy = createAggregator(function(result, value, key) { + result[key] = value; +}); + +module.exports = indexBy; diff --git a/react-app/node_modules/lodash/collection/inject.js b/react-app/node_modules/lodash/collection/inject.js new file mode 100644 index 0000000000..26f53cf7b2 --- /dev/null +++ b/react-app/node_modules/lodash/collection/inject.js @@ -0,0 +1 @@ +module.exports = require('./reduce'); diff --git a/react-app/node_modules/lodash/collection/invoke.js b/react-app/node_modules/lodash/collection/invoke.js new file mode 100644 index 0000000000..6e71721957 --- /dev/null +++ b/react-app/node_modules/lodash/collection/invoke.js @@ -0,0 +1,42 @@ +var baseEach = require('../internal/baseEach'), + invokePath = require('../internal/invokePath'), + isArrayLike = require('../internal/isArrayLike'), + isKey = require('../internal/isKey'), + restParam = require('../function/restParam'); + +/** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `methodName` is a function it's + * invoked for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invoke([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ +var invoke = restParam(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + isProp = isKey(path), + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined); + result[++index] = func ? func.apply(value, args) : invokePath(value, path, args); + }); + return result; +}); + +module.exports = invoke; diff --git a/react-app/node_modules/lodash/collection/map.js b/react-app/node_modules/lodash/collection/map.js new file mode 100644 index 0000000000..5381110df1 --- /dev/null +++ b/react-app/node_modules/lodash/collection/map.js @@ -0,0 +1,68 @@ +var arrayMap = require('../internal/arrayMap'), + baseCallback = require('../internal/baseCallback'), + baseMap = require('../internal/baseMap'), + isArray = require('../lang/isArray'); + +/** + * Creates an array of values by running each element in `collection` through + * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three + * arguments: (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, + * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, + * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, + * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, + * `sum`, `uniq`, and `words` + * + * @static + * @memberOf _ + * @alias collect + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new mapped array. + * @example + * + * function timesThree(n) { + * return n * 3; + * } + * + * _.map([1, 2], timesThree); + * // => [3, 6] + * + * _.map({ 'a': 1, 'b': 2 }, timesThree); + * // => [3, 6] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // using the `_.property` callback shorthand + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ +function map(collection, iteratee, thisArg) { + var func = isArray(collection) ? arrayMap : baseMap; + iteratee = baseCallback(iteratee, thisArg, 3); + return func(collection, iteratee); +} + +module.exports = map; diff --git a/react-app/node_modules/lodash/collection/max.js b/react-app/node_modules/lodash/collection/max.js new file mode 100644 index 0000000000..bb1d213c33 --- /dev/null +++ b/react-app/node_modules/lodash/collection/max.js @@ -0,0 +1 @@ +module.exports = require('../math/max'); diff --git a/react-app/node_modules/lodash/collection/min.js b/react-app/node_modules/lodash/collection/min.js new file mode 100644 index 0000000000..eef13d02b8 --- /dev/null +++ b/react-app/node_modules/lodash/collection/min.js @@ -0,0 +1 @@ +module.exports = require('../math/min'); diff --git a/react-app/node_modules/lodash/collection/partition.js b/react-app/node_modules/lodash/collection/partition.js new file mode 100644 index 0000000000..ee35f27d93 --- /dev/null +++ b/react-app/node_modules/lodash/collection/partition.js @@ -0,0 +1,66 @@ +var createAggregator = require('../internal/createAggregator'); + +/** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, while the second of which + * contains elements `predicate` returns falsey for. The predicate is bound + * to `thisArg` and invoked with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * _.partition([1, 2, 3], function(n) { + * return n % 2; + * }); + * // => [[1, 3], [2]] + * + * _.partition([1.2, 2.3, 3.4], function(n) { + * return this.floor(n) % 2; + * }, Math); + * // => [[1.2, 3.4], [2.3]] + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * var mapper = function(array) { + * return _.pluck(array, 'user'); + * }; + * + * // using the `_.matches` callback shorthand + * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper); + * // => [['pebbles'], ['barney', 'fred']] + * + * // using the `_.matchesProperty` callback shorthand + * _.map(_.partition(users, 'active', false), mapper); + * // => [['barney', 'pebbles'], ['fred']] + * + * // using the `_.property` callback shorthand + * _.map(_.partition(users, 'active'), mapper); + * // => [['fred'], ['barney', 'pebbles']] + */ +var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); +}, function() { return [[], []]; }); + +module.exports = partition; diff --git a/react-app/node_modules/lodash/collection/pluck.js b/react-app/node_modules/lodash/collection/pluck.js new file mode 100644 index 0000000000..5ee1ec84ee --- /dev/null +++ b/react-app/node_modules/lodash/collection/pluck.js @@ -0,0 +1,31 @@ +var map = require('./map'), + property = require('../utility/property'); + +/** + * Gets the property value of `path` from all elements in `collection`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Array|string} path The path of the property to pluck. + * @returns {Array} Returns the property values. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * _.pluck(users, 'user'); + * // => ['barney', 'fred'] + * + * var userIndex = _.indexBy(users, 'user'); + * _.pluck(userIndex, 'age'); + * // => [36, 40] (iteration order is not guaranteed) + */ +function pluck(collection, path) { + return map(collection, property(path)); +} + +module.exports = pluck; diff --git a/react-app/node_modules/lodash/collection/reduce.js b/react-app/node_modules/lodash/collection/reduce.js new file mode 100644 index 0000000000..5d5e8c9169 --- /dev/null +++ b/react-app/node_modules/lodash/collection/reduce.js @@ -0,0 +1,44 @@ +var arrayReduce = require('../internal/arrayReduce'), + baseEach = require('../internal/baseEach'), + createReduce = require('../internal/createReduce'); + +/** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` through `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not provided the first element of `collection` is used as the initial + * value. The `iteratee` is bound to `thisArg` and invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`, + * and `sortByOrder` + * + * @static + * @memberOf _ + * @alias foldl, inject + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {*} Returns the accumulated value. + * @example + * + * _.reduce([1, 2], function(total, n) { + * return total + n; + * }); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) { + * result[key] = n * 3; + * return result; + * }, {}); + * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed) + */ +var reduce = createReduce(arrayReduce, baseEach); + +module.exports = reduce; diff --git a/react-app/node_modules/lodash/collection/reduceRight.js b/react-app/node_modules/lodash/collection/reduceRight.js new file mode 100644 index 0000000000..5a5753b9c2 --- /dev/null +++ b/react-app/node_modules/lodash/collection/reduceRight.js @@ -0,0 +1,29 @@ +var arrayReduceRight = require('../internal/arrayReduceRight'), + baseEachRight = require('../internal/baseEachRight'), + createReduce = require('../internal/createReduce'); + +/** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @alias foldr + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {*} Returns the accumulated value. + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ +var reduceRight = createReduce(arrayReduceRight, baseEachRight); + +module.exports = reduceRight; diff --git a/react-app/node_modules/lodash/collection/reject.js b/react-app/node_modules/lodash/collection/reject.js new file mode 100644 index 0000000000..55924539b5 --- /dev/null +++ b/react-app/node_modules/lodash/collection/reject.js @@ -0,0 +1,50 @@ +var arrayFilter = require('../internal/arrayFilter'), + baseCallback = require('../internal/baseCallback'), + baseFilter = require('../internal/baseFilter'), + isArray = require('../lang/isArray'); + +/** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the new filtered array. + * @example + * + * _.reject([1, 2, 3, 4], function(n) { + * return n % 2 == 0; + * }); + * // => [1, 3] + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user'); + * // => ['barney'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.reject(users, 'active', false), 'user'); + * // => ['fred'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.reject(users, 'active'), 'user'); + * // => ['barney'] + */ +function reject(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayFilter : baseFilter; + predicate = baseCallback(predicate, thisArg, 3); + return func(collection, function(value, index, collection) { + return !predicate(value, index, collection); + }); +} + +module.exports = reject; diff --git a/react-app/node_modules/lodash/collection/sample.js b/react-app/node_modules/lodash/collection/sample.js new file mode 100644 index 0000000000..8e01533016 --- /dev/null +++ b/react-app/node_modules/lodash/collection/sample.js @@ -0,0 +1,50 @@ +var baseRandom = require('../internal/baseRandom'), + isIterateeCall = require('../internal/isIterateeCall'), + toArray = require('../lang/toArray'), + toIterable = require('../internal/toIterable'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Gets a random element or `n` random elements from a collection. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to sample. + * @param {number} [n] The number of elements to sample. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {*} Returns the random sample(s). + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + * + * _.sample([1, 2, 3, 4], 2); + * // => [3, 1] + */ +function sample(collection, n, guard) { + if (guard ? isIterateeCall(collection, n, guard) : n == null) { + collection = toIterable(collection); + var length = collection.length; + return length > 0 ? collection[baseRandom(0, length - 1)] : undefined; + } + var index = -1, + result = toArray(collection), + length = result.length, + lastIndex = length - 1; + + n = nativeMin(n < 0 ? 0 : (+n || 0), length); + while (++index < n) { + var rand = baseRandom(index, lastIndex), + value = result[rand]; + + result[rand] = result[index]; + result[index] = value; + } + result.length = n; + return result; +} + +module.exports = sample; diff --git a/react-app/node_modules/lodash/collection/select.js b/react-app/node_modules/lodash/collection/select.js new file mode 100644 index 0000000000..ade80f6fba --- /dev/null +++ b/react-app/node_modules/lodash/collection/select.js @@ -0,0 +1 @@ +module.exports = require('./filter'); diff --git a/react-app/node_modules/lodash/collection/shuffle.js b/react-app/node_modules/lodash/collection/shuffle.js new file mode 100644 index 0000000000..949689c5fc --- /dev/null +++ b/react-app/node_modules/lodash/collection/shuffle.js @@ -0,0 +1,24 @@ +var sample = require('./sample'); + +/** Used as references for `-Infinity` and `Infinity`. */ +var POSITIVE_INFINITY = Number.POSITIVE_INFINITY; + +/** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ +function shuffle(collection) { + return sample(collection, POSITIVE_INFINITY); +} + +module.exports = shuffle; diff --git a/react-app/node_modules/lodash/collection/size.js b/react-app/node_modules/lodash/collection/size.js new file mode 100644 index 0000000000..78dcf4ce9b --- /dev/null +++ b/react-app/node_modules/lodash/collection/size.js @@ -0,0 +1,30 @@ +var getLength = require('../internal/getLength'), + isLength = require('../internal/isLength'), + keys = require('../object/keys'); + +/** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable properties for objects. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the size of `collection`. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ +function size(collection) { + var length = collection ? getLength(collection) : 0; + return isLength(length) ? length : keys(collection).length; +} + +module.exports = size; diff --git a/react-app/node_modules/lodash/collection/some.js b/react-app/node_modules/lodash/collection/some.js new file mode 100644 index 0000000000..d0b09a4746 --- /dev/null +++ b/react-app/node_modules/lodash/collection/some.js @@ -0,0 +1,67 @@ +var arraySome = require('../internal/arraySome'), + baseCallback = require('../internal/baseCallback'), + baseSome = require('../internal/baseSome'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * The function returns as soon as it finds a passing value and does not iterate + * over the entire collection. The predicate is bound to `thisArg` and invoked + * with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias any + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.some(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.some(users, 'active'); + * // => true + */ +function some(collection, predicate, thisArg) { + var func = isArray(collection) ? arraySome : baseSome; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = baseCallback(predicate, thisArg, 3); + } + return func(collection, predicate); +} + +module.exports = some; diff --git a/react-app/node_modules/lodash/collection/sortBy.js b/react-app/node_modules/lodash/collection/sortBy.js new file mode 100644 index 0000000000..4401c777f4 --- /dev/null +++ b/react-app/node_modules/lodash/collection/sortBy.js @@ -0,0 +1,71 @@ +var baseCallback = require('../internal/baseCallback'), + baseMap = require('../internal/baseMap'), + baseSortBy = require('../internal/baseSortBy'), + compareAscending = require('../internal/compareAscending'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection through `iteratee`. This method performs + * a stable sort, that is, it preserves the original sort order of equal elements. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new sorted array. + * @example + * + * _.sortBy([1, 2, 3], function(n) { + * return Math.sin(n); + * }); + * // => [3, 1, 2] + * + * _.sortBy([1, 2, 3], function(n) { + * return this.sin(n); + * }, Math); + * // => [3, 1, 2] + * + * var users = [ + * { 'user': 'fred' }, + * { 'user': 'pebbles' }, + * { 'user': 'barney' } + * ]; + * + * // using the `_.property` callback shorthand + * _.pluck(_.sortBy(users, 'user'), 'user'); + * // => ['barney', 'fred', 'pebbles'] + */ +function sortBy(collection, iteratee, thisArg) { + if (collection == null) { + return []; + } + if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { + iteratee = undefined; + } + var index = -1; + iteratee = baseCallback(iteratee, thisArg, 3); + + var result = baseMap(collection, function(value, key, collection) { + return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value }; + }); + return baseSortBy(result, compareAscending); +} + +module.exports = sortBy; diff --git a/react-app/node_modules/lodash/collection/sortByAll.js b/react-app/node_modules/lodash/collection/sortByAll.js new file mode 100644 index 0000000000..4766c20985 --- /dev/null +++ b/react-app/node_modules/lodash/collection/sortByAll.js @@ -0,0 +1,52 @@ +var baseFlatten = require('../internal/baseFlatten'), + baseSortByOrder = require('../internal/baseSortByOrder'), + isIterateeCall = require('../internal/isIterateeCall'), + restParam = require('../function/restParam'); + +/** + * This method is like `_.sortBy` except that it can sort by multiple iteratees + * or property names. + * + * If a property name is provided for an iteratee the created `_.property` + * style callback returns the property value of the given element. + * + * If an object is provided for an iteratee the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees + * The iteratees to sort by, specified as individual values or arrays of values. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 42 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.map(_.sortByAll(users, ['user', 'age']), _.values); + * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]] + * + * _.map(_.sortByAll(users, 'user', function(chr) { + * return Math.floor(chr.age / 10); + * }), _.values); + * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] + */ +var sortByAll = restParam(function(collection, iteratees) { + if (collection == null) { + return []; + } + var guard = iteratees[2]; + if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) { + iteratees.length = 1; + } + return baseSortByOrder(collection, baseFlatten(iteratees), []); +}); + +module.exports = sortByAll; diff --git a/react-app/node_modules/lodash/collection/sortByOrder.js b/react-app/node_modules/lodash/collection/sortByOrder.js new file mode 100644 index 0000000000..8b4fc19687 --- /dev/null +++ b/react-app/node_modules/lodash/collection/sortByOrder.js @@ -0,0 +1,55 @@ +var baseSortByOrder = require('../internal/baseSortByOrder'), + isArray = require('../lang/isArray'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** + * This method is like `_.sortByAll` except that it allows specifying the + * sort orders of the iteratees to sort by. If `orders` is unspecified, all + * values are sorted in ascending order. Otherwise, a value is sorted in + * ascending order if its corresponding order is "asc", and descending if "desc". + * + * If a property name is provided for an iteratee the created `_.property` + * style callback returns the property value of the given element. + * + * If an object is provided for an iteratee the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {boolean[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 42 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // sort by `user` in ascending order and by `age` in descending order + * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values); + * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] + */ +function sortByOrder(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (guard && isIterateeCall(iteratees, orders, guard)) { + orders = undefined; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseSortByOrder(collection, iteratees, orders); +} + +module.exports = sortByOrder; diff --git a/react-app/node_modules/lodash/collection/sum.js b/react-app/node_modules/lodash/collection/sum.js new file mode 100644 index 0000000000..a2e93808ae --- /dev/null +++ b/react-app/node_modules/lodash/collection/sum.js @@ -0,0 +1 @@ +module.exports = require('../math/sum'); diff --git a/react-app/node_modules/lodash/collection/where.js b/react-app/node_modules/lodash/collection/where.js new file mode 100644 index 0000000000..f603bf8ce4 --- /dev/null +++ b/react-app/node_modules/lodash/collection/where.js @@ -0,0 +1,37 @@ +var baseMatches = require('../internal/baseMatches'), + filter = require('./filter'); + +/** + * Performs a deep comparison between each element in `collection` and the + * source object, returning an array of all elements that have equivalent + * property values. + * + * **Note:** This method supports comparing arrays, booleans, `Date` objects, + * numbers, `Object` objects, regexes, and strings. Objects are compared by + * their own, not inherited, enumerable properties. For comparing a single + * own or inherited property value see `_.matchesProperty`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Object} source The object of property values to match. + * @returns {Array} Returns the new filtered array. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] }, + * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] } + * ]; + * + * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user'); + * // => ['barney'] + * + * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user'); + * // => ['fred'] + */ +function where(collection, source) { + return filter(collection, baseMatches(source)); +} + +module.exports = where; diff --git a/react-app/node_modules/lodash/date.js b/react-app/node_modules/lodash/date.js new file mode 100644 index 0000000000..195366e777 --- /dev/null +++ b/react-app/node_modules/lodash/date.js @@ -0,0 +1,3 @@ +module.exports = { + 'now': require('./date/now') +}; diff --git a/react-app/node_modules/lodash/date/now.js b/react-app/node_modules/lodash/date/now.js new file mode 100644 index 0000000000..ffe3060e5b --- /dev/null +++ b/react-app/node_modules/lodash/date/now.js @@ -0,0 +1,24 @@ +var getNative = require('../internal/getNative'); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeNow = getNative(Date, 'now'); + +/** + * Gets the number of milliseconds that have elapsed since the Unix epoch + * (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @category Date + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => logs the number of milliseconds it took for the deferred function to be invoked + */ +var now = nativeNow || function() { + return new Date().getTime(); +}; + +module.exports = now; diff --git a/react-app/node_modules/lodash/function.js b/react-app/node_modules/lodash/function.js new file mode 100644 index 0000000000..71f8ebeb27 --- /dev/null +++ b/react-app/node_modules/lodash/function.js @@ -0,0 +1,28 @@ +module.exports = { + 'after': require('./function/after'), + 'ary': require('./function/ary'), + 'backflow': require('./function/backflow'), + 'before': require('./function/before'), + 'bind': require('./function/bind'), + 'bindAll': require('./function/bindAll'), + 'bindKey': require('./function/bindKey'), + 'compose': require('./function/compose'), + 'curry': require('./function/curry'), + 'curryRight': require('./function/curryRight'), + 'debounce': require('./function/debounce'), + 'defer': require('./function/defer'), + 'delay': require('./function/delay'), + 'flow': require('./function/flow'), + 'flowRight': require('./function/flowRight'), + 'memoize': require('./function/memoize'), + 'modArgs': require('./function/modArgs'), + 'negate': require('./function/negate'), + 'once': require('./function/once'), + 'partial': require('./function/partial'), + 'partialRight': require('./function/partialRight'), + 'rearg': require('./function/rearg'), + 'restParam': require('./function/restParam'), + 'spread': require('./function/spread'), + 'throttle': require('./function/throttle'), + 'wrap': require('./function/wrap') +}; diff --git a/react-app/node_modules/lodash/function/after.js b/react-app/node_modules/lodash/function/after.js new file mode 100644 index 0000000000..96a51fdbcf --- /dev/null +++ b/react-app/node_modules/lodash/function/after.js @@ -0,0 +1,48 @@ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsFinite = global.isFinite; + +/** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => logs 'done saving!' after the two async saves have completed + */ +function after(n, func) { + if (typeof func != 'function') { + if (typeof n == 'function') { + var temp = n; + n = func; + func = temp; + } else { + throw new TypeError(FUNC_ERROR_TEXT); + } + } + n = nativeIsFinite(n = +n) ? n : 0; + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; +} + +module.exports = after; diff --git a/react-app/node_modules/lodash/function/ary.js b/react-app/node_modules/lodash/function/ary.js new file mode 100644 index 0000000000..53a6913e3f --- /dev/null +++ b/react-app/node_modules/lodash/function/ary.js @@ -0,0 +1,34 @@ +var createWrapper = require('../internal/createWrapper'), + isIterateeCall = require('../internal/isIterateeCall'); + +/** Used to compose bitmasks for wrapper metadata. */ +var ARY_FLAG = 128; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that accepts up to `n` arguments ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Function} Returns the new function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ +function ary(func, n, guard) { + if (guard && isIterateeCall(func, n, guard)) { + n = undefined; + } + n = (func && n == null) ? func.length : nativeMax(+n || 0, 0); + return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n); +} + +module.exports = ary; diff --git a/react-app/node_modules/lodash/function/backflow.js b/react-app/node_modules/lodash/function/backflow.js new file mode 100644 index 0000000000..1954e94239 --- /dev/null +++ b/react-app/node_modules/lodash/function/backflow.js @@ -0,0 +1 @@ +module.exports = require('./flowRight'); diff --git a/react-app/node_modules/lodash/function/before.js b/react-app/node_modules/lodash/function/before.js new file mode 100644 index 0000000000..3d94216825 --- /dev/null +++ b/react-app/node_modules/lodash/function/before.js @@ -0,0 +1,42 @@ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery('#add').on('click', _.before(5, addContactToList)); + * // => allows adding up to 4 contacts to the list + */ +function before(n, func) { + var result; + if (typeof func != 'function') { + if (typeof n == 'function') { + var temp = n; + n = func; + func = temp; + } else { + throw new TypeError(FUNC_ERROR_TEXT); + } + } + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; +} + +module.exports = before; diff --git a/react-app/node_modules/lodash/function/bind.js b/react-app/node_modules/lodash/function/bind.js new file mode 100644 index 0000000000..0de126ae35 --- /dev/null +++ b/react-app/node_modules/lodash/function/bind.js @@ -0,0 +1,56 @@ +var createWrapper = require('../internal/createWrapper'), + replaceHolders = require('../internal/replaceHolders'), + restParam = require('./restParam'); + +/** Used to compose bitmasks for wrapper metadata. */ +var BIND_FLAG = 1, + PARTIAL_FLAG = 32; + +/** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and prepends any additional `_.bind` arguments to those provided to the + * bound function. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind` this method does not set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var greet = function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * }; + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // using placeholders + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ +var bind = restParam(function(func, thisArg, partials) { + var bitmask = BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, bind.placeholder); + bitmask |= PARTIAL_FLAG; + } + return createWrapper(func, bitmask, thisArg, partials, holders); +}); + +// Assign default placeholders. +bind.placeholder = {}; + +module.exports = bind; diff --git a/react-app/node_modules/lodash/function/bindAll.js b/react-app/node_modules/lodash/function/bindAll.js new file mode 100644 index 0000000000..a09e948524 --- /dev/null +++ b/react-app/node_modules/lodash/function/bindAll.js @@ -0,0 +1,50 @@ +var baseFlatten = require('../internal/baseFlatten'), + createWrapper = require('../internal/createWrapper'), + functions = require('../object/functions'), + restParam = require('./restParam'); + +/** Used to compose bitmasks for wrapper metadata. */ +var BIND_FLAG = 1; + +/** + * Binds methods of an object to the object itself, overwriting the existing + * method. Method names may be specified as individual arguments or as arrays + * of method names. If no method names are provided all enumerable function + * properties, own and inherited, of `object` are bound. + * + * **Note:** This method does not set the "length" property of bound functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Object} object The object to bind and assign the bound methods to. + * @param {...(string|string[])} [methodNames] The object method names to bind, + * specified as individual method names or arrays of method names. + * @returns {Object} Returns `object`. + * @example + * + * var view = { + * 'label': 'docs', + * 'onClick': function() { + * console.log('clicked ' + this.label); + * } + * }; + * + * _.bindAll(view); + * jQuery('#docs').on('click', view.onClick); + * // => logs 'clicked docs' when the element is clicked + */ +var bindAll = restParam(function(object, methodNames) { + methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object); + + var index = -1, + length = methodNames.length; + + while (++index < length) { + var key = methodNames[index]; + object[key] = createWrapper(object[key], BIND_FLAG, object); + } + return object; +}); + +module.exports = bindAll; diff --git a/react-app/node_modules/lodash/function/bindKey.js b/react-app/node_modules/lodash/function/bindKey.js new file mode 100644 index 0000000000..b787fe7022 --- /dev/null +++ b/react-app/node_modules/lodash/function/bindKey.js @@ -0,0 +1,66 @@ +var createWrapper = require('../internal/createWrapper'), + replaceHolders = require('../internal/replaceHolders'), + restParam = require('./restParam'); + +/** Used to compose bitmasks for wrapper metadata. */ +var BIND_FLAG = 1, + BIND_KEY_FLAG = 2, + PARTIAL_FLAG = 32; + +/** + * Creates a function that invokes the method at `object[key]` and prepends + * any additional `_.bindKey` arguments to those provided to the bound function. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. + * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @category Function + * @param {Object} object The object the method belongs to. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // using placeholders + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ +var bindKey = restParam(function(object, key, partials) { + var bitmask = BIND_FLAG | BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, bindKey.placeholder); + bitmask |= PARTIAL_FLAG; + } + return createWrapper(key, bitmask, object, partials, holders); +}); + +// Assign default placeholders. +bindKey.placeholder = {}; + +module.exports = bindKey; diff --git a/react-app/node_modules/lodash/function/compose.js b/react-app/node_modules/lodash/function/compose.js new file mode 100644 index 0000000000..1954e94239 --- /dev/null +++ b/react-app/node_modules/lodash/function/compose.js @@ -0,0 +1 @@ +module.exports = require('./flowRight'); diff --git a/react-app/node_modules/lodash/function/curry.js b/react-app/node_modules/lodash/function/curry.js new file mode 100644 index 0000000000..b7db3fdad8 --- /dev/null +++ b/react-app/node_modules/lodash/function/curry.js @@ -0,0 +1,51 @@ +var createCurry = require('../internal/createCurry'); + +/** Used to compose bitmasks for wrapper metadata. */ +var CURRY_FLAG = 8; + +/** + * Creates a function that accepts one or more arguments of `func` that when + * called either invokes `func` returning its result, if all `func` arguments + * have been provided, or returns a function that accepts one or more of the + * remaining `func` arguments, and so on. The arity of `func` may be specified + * if `func.length` is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method does not set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // using placeholders + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ +var curry = createCurry(CURRY_FLAG); + +// Assign default placeholders. +curry.placeholder = {}; + +module.exports = curry; diff --git a/react-app/node_modules/lodash/function/curryRight.js b/react-app/node_modules/lodash/function/curryRight.js new file mode 100644 index 0000000000..11c540393b --- /dev/null +++ b/react-app/node_modules/lodash/function/curryRight.js @@ -0,0 +1,48 @@ +var createCurry = require('../internal/createCurry'); + +/** Used to compose bitmasks for wrapper metadata. */ +var CURRY_RIGHT_FLAG = 16; + +/** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method does not set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // using placeholders + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ +var curryRight = createCurry(CURRY_RIGHT_FLAG); + +// Assign default placeholders. +curryRight.placeholder = {}; + +module.exports = curryRight; diff --git a/react-app/node_modules/lodash/function/debounce.js b/react-app/node_modules/lodash/function/debounce.js new file mode 100644 index 0000000000..163af90f38 --- /dev/null +++ b/react-app/node_modules/lodash/function/debounce.js @@ -0,0 +1,181 @@ +var isObject = require('../lang/isObject'), + now = require('../date/now'); + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed invocations. Provide an options object to indicate that `func` + * should be invoked on the leading and/or trailing edge of the `wait` timeout. + * Subsequent calls to the debounced function return the result of the last + * `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked + * on the trailing edge of the timeout only if the the debounced function is + * invoked more than once during the `wait` timeout. + * + * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options] The options object. + * @param {boolean} [options.leading=false] Specify invoking on the leading + * edge of the timeout. + * @param {number} [options.maxWait] The maximum time `func` is allowed to be + * delayed before it's invoked. + * @param {boolean} [options.trailing=true] Specify invoking on the trailing + * edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // avoid costly calculations while the window size is in flux + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // invoke `sendMail` when the click event is fired, debouncing subsequent calls + * jQuery('#postbox').on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // ensure `batchLog` is invoked once after 1 second of debounced calls + * var source = new EventSource('/stream'); + * jQuery(source).on('message', _.debounce(batchLog, 250, { + * 'maxWait': 1000 + * })); + * + * // cancel a debounced call + * var todoChanges = _.debounce(batchLog, 1000); + * Object.observe(models.todo, todoChanges); + * + * Object.observe(models, function(changes) { + * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) { + * todoChanges.cancel(); + * } + * }, ['delete']); + * + * // ...at some point `models.todo` is changed + * models.todo.completed = true; + * + * // ...before 1 second has passed `models.todo` is deleted + * // which cancels the debounced `todoChanges` call + * delete models.todo; + */ +function debounce(func, wait, options) { + var args, + maxTimeoutId, + result, + stamp, + thisArg, + timeoutId, + trailingCall, + lastCalled = 0, + maxWait = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = wait < 0 ? 0 : (+wait || 0); + if (options === true) { + var leading = true; + trailing = false; + } else if (isObject(options)) { + leading = !!options.leading; + maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait); + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function cancel() { + if (timeoutId) { + clearTimeout(timeoutId); + } + if (maxTimeoutId) { + clearTimeout(maxTimeoutId); + } + lastCalled = 0; + maxTimeoutId = timeoutId = trailingCall = undefined; + } + + function complete(isCalled, id) { + if (id) { + clearTimeout(id); + } + maxTimeoutId = timeoutId = trailingCall = undefined; + if (isCalled) { + lastCalled = now(); + result = func.apply(thisArg, args); + if (!timeoutId && !maxTimeoutId) { + args = thisArg = undefined; + } + } + } + + function delayed() { + var remaining = wait - (now() - stamp); + if (remaining <= 0 || remaining > wait) { + complete(trailingCall, maxTimeoutId); + } else { + timeoutId = setTimeout(delayed, remaining); + } + } + + function maxDelayed() { + complete(trailing, timeoutId); + } + + function debounced() { + args = arguments; + stamp = now(); + thisArg = this; + trailingCall = trailing && (timeoutId || !leading); + + if (maxWait === false) { + var leadingCall = leading && !timeoutId; + } else { + if (!maxTimeoutId && !leading) { + lastCalled = stamp; + } + var remaining = maxWait - (stamp - lastCalled), + isCalled = remaining <= 0 || remaining > maxWait; + + if (isCalled) { + if (maxTimeoutId) { + maxTimeoutId = clearTimeout(maxTimeoutId); + } + lastCalled = stamp; + result = func.apply(thisArg, args); + } + else if (!maxTimeoutId) { + maxTimeoutId = setTimeout(maxDelayed, remaining); + } + } + if (isCalled && timeoutId) { + timeoutId = clearTimeout(timeoutId); + } + else if (!timeoutId && wait !== maxWait) { + timeoutId = setTimeout(delayed, wait); + } + if (leadingCall) { + isCalled = true; + result = func.apply(thisArg, args); + } + if (isCalled && !timeoutId && !maxTimeoutId) { + args = thisArg = undefined; + } + return result; + } + debounced.cancel = cancel; + return debounced; +} + +module.exports = debounce; diff --git a/react-app/node_modules/lodash/function/defer.js b/react-app/node_modules/lodash/function/defer.js new file mode 100644 index 0000000000..3accbf9b10 --- /dev/null +++ b/react-app/node_modules/lodash/function/defer.js @@ -0,0 +1,25 @@ +var baseDelay = require('../internal/baseDelay'), + restParam = require('./restParam'); + +/** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke the function with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // logs 'deferred' after one or more milliseconds + */ +var defer = restParam(function(func, args) { + return baseDelay(func, 1, args); +}); + +module.exports = defer; diff --git a/react-app/node_modules/lodash/function/delay.js b/react-app/node_modules/lodash/function/delay.js new file mode 100644 index 0000000000..d5eef27a9f --- /dev/null +++ b/react-app/node_modules/lodash/function/delay.js @@ -0,0 +1,26 @@ +var baseDelay = require('../internal/baseDelay'), + restParam = require('./restParam'); + +/** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke the function with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => logs 'later' after one second + */ +var delay = restParam(function(func, wait, args) { + return baseDelay(func, wait, args); +}); + +module.exports = delay; diff --git a/react-app/node_modules/lodash/function/flow.js b/react-app/node_modules/lodash/function/flow.js new file mode 100644 index 0000000000..a435a3d878 --- /dev/null +++ b/react-app/node_modules/lodash/function/flow.js @@ -0,0 +1,25 @@ +var createFlow = require('../internal/createFlow'); + +/** + * Creates a function that returns the result of invoking the provided + * functions with the `this` binding of the created function, where each + * successive invocation is supplied the return value of the previous. + * + * @static + * @memberOf _ + * @category Function + * @param {...Function} [funcs] Functions to invoke. + * @returns {Function} Returns the new function. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var addSquare = _.flow(_.add, square); + * addSquare(1, 2); + * // => 9 + */ +var flow = createFlow(); + +module.exports = flow; diff --git a/react-app/node_modules/lodash/function/flowRight.js b/react-app/node_modules/lodash/function/flowRight.js new file mode 100644 index 0000000000..23b9d76b58 --- /dev/null +++ b/react-app/node_modules/lodash/function/flowRight.js @@ -0,0 +1,25 @@ +var createFlow = require('../internal/createFlow'); + +/** + * This method is like `_.flow` except that it creates a function that + * invokes the provided functions from right to left. + * + * @static + * @memberOf _ + * @alias backflow, compose + * @category Function + * @param {...Function} [funcs] Functions to invoke. + * @returns {Function} Returns the new function. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var addSquare = _.flowRight(square, _.add); + * addSquare(1, 2); + * // => 9 + */ +var flowRight = createFlow(true); + +module.exports = flowRight; diff --git a/react-app/node_modules/lodash/function/memoize.js b/react-app/node_modules/lodash/function/memoize.js new file mode 100644 index 0000000000..f3b8d69920 --- /dev/null +++ b/react-app/node_modules/lodash/function/memoize.js @@ -0,0 +1,80 @@ +var MapCache = require('../internal/MapCache'); + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is coerced to a string and used as the + * cache key. The `func` is invoked with the `this` binding of the memoized + * function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object) + * method interface of `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoizing function. + * @example + * + * var upperCase = _.memoize(function(string) { + * return string.toUpperCase(); + * }); + * + * upperCase('fred'); + * // => 'FRED' + * + * // modifying the result cache + * upperCase.cache.set('fred', 'BARNEY'); + * upperCase('fred'); + * // => 'BARNEY' + * + * // replacing `_.memoize.Cache` + * var object = { 'user': 'fred' }; + * var other = { 'user': 'barney' }; + * var identity = _.memoize(_.identity); + * + * identity(object); + * // => { 'user': 'fred' } + * identity(other); + * // => { 'user': 'fred' } + * + * _.memoize.Cache = WeakMap; + * var identity = _.memoize(_.identity); + * + * identity(object); + * // => { 'user': 'fred' } + * identity(other); + * // => { 'user': 'barney' } + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new memoize.Cache; + return memoized; +} + +// Assign cache to `_.memoize`. +memoize.Cache = MapCache; + +module.exports = memoize; diff --git a/react-app/node_modules/lodash/function/modArgs.js b/react-app/node_modules/lodash/function/modArgs.js new file mode 100644 index 0000000000..49b9b5e682 --- /dev/null +++ b/react-app/node_modules/lodash/function/modArgs.js @@ -0,0 +1,58 @@ +var arrayEvery = require('../internal/arrayEvery'), + baseFlatten = require('../internal/baseFlatten'), + baseIsFunction = require('../internal/baseIsFunction'), + restParam = require('./restParam'); + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Creates a function that runs each argument through a corresponding + * transform function. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms] The functions to transform + * arguments, specified as individual functions or arrays of functions. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var modded = _.modArgs(function(x, y) { + * return [x, y]; + * }, square, doubled); + * + * modded(1, 2); + * // => [1, 4] + * + * modded(5, 10); + * // => [25, 20] + */ +var modArgs = restParam(function(func, transforms) { + transforms = baseFlatten(transforms); + if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = transforms.length; + return restParam(function(args) { + var index = nativeMin(args.length, length); + while (index--) { + args[index] = transforms[index](args[index]); + } + return func.apply(this, args); + }); +}); + +module.exports = modArgs; diff --git a/react-app/node_modules/lodash/function/negate.js b/react-app/node_modules/lodash/function/negate.js new file mode 100644 index 0000000000..82479390ad --- /dev/null +++ b/react-app/node_modules/lodash/function/negate.js @@ -0,0 +1,32 @@ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ +function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + return !predicate.apply(this, arguments); + }; +} + +module.exports = negate; diff --git a/react-app/node_modules/lodash/function/once.js b/react-app/node_modules/lodash/function/once.js new file mode 100644 index 0000000000..0b5bd853cb --- /dev/null +++ b/react-app/node_modules/lodash/function/once.js @@ -0,0 +1,24 @@ +var before = require('./before'); + +/** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first call. The `func` is invoked + * with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // `initialize` invokes `createApplication` once + */ +function once(func) { + return before(2, func); +} + +module.exports = once; diff --git a/react-app/node_modules/lodash/function/partial.js b/react-app/node_modules/lodash/function/partial.js new file mode 100644 index 0000000000..fb1d04fb6c --- /dev/null +++ b/react-app/node_modules/lodash/function/partial.js @@ -0,0 +1,43 @@ +var createPartial = require('../internal/createPartial'); + +/** Used to compose bitmasks for wrapper metadata. */ +var PARTIAL_FLAG = 32; + +/** + * Creates a function that invokes `func` with `partial` arguments prepended + * to those provided to the new function. This method is like `_.bind` except + * it does **not** alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method does not set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * var greet = function(greeting, name) { + * return greeting + ' ' + name; + * }; + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // using placeholders + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ +var partial = createPartial(PARTIAL_FLAG); + +// Assign default placeholders. +partial.placeholder = {}; + +module.exports = partial; diff --git a/react-app/node_modules/lodash/function/partialRight.js b/react-app/node_modules/lodash/function/partialRight.js new file mode 100644 index 0000000000..634e6a4c40 --- /dev/null +++ b/react-app/node_modules/lodash/function/partialRight.js @@ -0,0 +1,42 @@ +var createPartial = require('../internal/createPartial'); + +/** Used to compose bitmasks for wrapper metadata. */ +var PARTIAL_RIGHT_FLAG = 64; + +/** + * This method is like `_.partial` except that partially applied arguments + * are appended to those provided to the new function. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method does not set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * var greet = function(greeting, name) { + * return greeting + ' ' + name; + * }; + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // using placeholders + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ +var partialRight = createPartial(PARTIAL_RIGHT_FLAG); + +// Assign default placeholders. +partialRight.placeholder = {}; + +module.exports = partialRight; diff --git a/react-app/node_modules/lodash/function/rearg.js b/react-app/node_modules/lodash/function/rearg.js new file mode 100644 index 0000000000..f2bd9c41ec --- /dev/null +++ b/react-app/node_modules/lodash/function/rearg.js @@ -0,0 +1,40 @@ +var baseFlatten = require('../internal/baseFlatten'), + createWrapper = require('../internal/createWrapper'), + restParam = require('./restParam'); + +/** Used to compose bitmasks for wrapper metadata. */ +var REARG_FLAG = 256; + +/** + * Creates a function that invokes `func` with arguments arranged according + * to the specified indexes where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes, + * specified as individual indexes or arrays of indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, 2, 0, 1); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + * + * var map = _.rearg(_.map, [1, 0]); + * map(function(n) { + * return n * 3; + * }, [1, 2, 3]); + * // => [3, 6, 9] + */ +var rearg = restParam(function(func, indexes) { + return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes)); +}); + +module.exports = rearg; diff --git a/react-app/node_modules/lodash/function/restParam.js b/react-app/node_modules/lodash/function/restParam.js new file mode 100644 index 0000000000..8852286dd5 --- /dev/null +++ b/react-app/node_modules/lodash/function/restParam.js @@ -0,0 +1,58 @@ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as an array. + * + * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.restParam(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ +function restParam(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + rest = Array(length); + + while (++index < length) { + rest[index] = args[start + index]; + } + switch (start) { + case 0: return func.call(this, rest); + case 1: return func.call(this, args[0], rest); + case 2: return func.call(this, args[0], args[1], rest); + } + var otherArgs = Array(start + 1); + index = -1; + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = rest; + return func.apply(this, otherArgs); + }; +} + +module.exports = restParam; diff --git a/react-app/node_modules/lodash/function/spread.js b/react-app/node_modules/lodash/function/spread.js new file mode 100644 index 0000000000..780f5042ad --- /dev/null +++ b/react-app/node_modules/lodash/function/spread.js @@ -0,0 +1,44 @@ +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that invokes `func` with the `this` binding of the created + * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3). + * + * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/Web/JavaScript/Reference/Operators/Spread_operator). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to spread arguments over. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * // with a Promise + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ +function spread(func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function(array) { + return func.apply(this, array); + }; +} + +module.exports = spread; diff --git a/react-app/node_modules/lodash/function/throttle.js b/react-app/node_modules/lodash/function/throttle.js new file mode 100644 index 0000000000..1dd00eab75 --- /dev/null +++ b/react-app/node_modules/lodash/function/throttle.js @@ -0,0 +1,62 @@ +var debounce = require('./debounce'), + isObject = require('../lang/isObject'); + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed invocations. Provide an options object to indicate + * that `func` should be invoked on the leading and/or trailing edge of the + * `wait` timeout. Subsequent calls to the throttled function return the + * result of the last `func` call. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked + * on the trailing edge of the timeout only if the the throttled function is + * invoked more than once during the `wait` timeout. + * + * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options] The options object. + * @param {boolean} [options.leading=true] Specify invoking on the leading + * edge of the timeout. + * @param {boolean} [options.trailing=true] Specify invoking on the trailing + * edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // avoid excessively updating the position while scrolling + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes + * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, { + * 'trailing': false + * })); + * + * // cancel a trailing throttled call + * jQuery(window).on('popstate', throttled.cancel); + */ +function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (options === false) { + leading = false; + } else if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing }); +} + +module.exports = throttle; diff --git a/react-app/node_modules/lodash/function/wrap.js b/react-app/node_modules/lodash/function/wrap.js new file mode 100644 index 0000000000..6a33c5ec6f --- /dev/null +++ b/react-app/node_modules/lodash/function/wrap.js @@ -0,0 +1,33 @@ +var createWrapper = require('../internal/createWrapper'), + identity = require('../utility/identity'); + +/** Used to compose bitmasks for wrapper metadata. */ +var PARTIAL_FLAG = 32; + +/** + * Creates a function that provides `value` to the wrapper function as its + * first argument. Any additional arguments provided to the function are + * appended to those provided to the wrapper function. The wrapper is invoked + * with the `this` binding of the created function. + * + * @static + * @memberOf _ + * @category Function + * @param {*} value The value to wrap. + * @param {Function} wrapper The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ +function wrap(value, wrapper) { + wrapper = wrapper == null ? identity : wrapper; + return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []); +} + +module.exports = wrap; diff --git a/react-app/node_modules/lodash/index.js b/react-app/node_modules/lodash/index.js new file mode 100644 index 0000000000..5f17319b9b --- /dev/null +++ b/react-app/node_modules/lodash/index.js @@ -0,0 +1,12351 @@ +/** + * @license + * lodash 3.10.1 (Custom Build) + * Build: `lodash modern -d -o ./index.js` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '3.10.1'; + + /** Used to compose bitmasks for wrapper metadata. */ + var BIND_FLAG = 1, + BIND_KEY_FLAG = 2, + CURRY_BOUND_FLAG = 4, + CURRY_FLAG = 8, + CURRY_RIGHT_FLAG = 16, + PARTIAL_FLAG = 32, + PARTIAL_RIGHT_FLAG = 64, + ARY_FLAG = 128, + REARG_FLAG = 256; + + /** Used as default options for `_.trunc`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect when a function becomes hot. */ + var HOT_COUNT = 150, + HOT_SPAN = 16; + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2; + + /** Used as the `TypeError` message for "Functions" methods. */ + var FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + + var arrayBufferTag = '[object ArrayBuffer]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g, + reUnescapedHtml = /[&<>"'`]/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; + + /** + * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns) + * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern). + */ + var reRegExpChars = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g, + reHasRegExpChars = RegExp(reRegExpChars.source); + + /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */ + var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** Used to detect hexadecimal string values. */ + var reHasHexPrefix = /^0[xX]/; + + /** Used to detect host constructors (Safari > 5). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^\d+$/; + + /** Used to match latin-1 supplementary letters (excluding mathematical operators). */ + var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to match words to create compound words. */ + var reWords = (function() { + var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]', + lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+'; + + return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g'); + }()); + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number', + 'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'isFinite', + 'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap' + ]; + + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dateTag] = typedArrayTags[errorTag] = + typedArrayTags[funcTag] = typedArrayTags[mapTag] = + typedArrayTags[numberTag] = typedArrayTags[objectTag] = + typedArrayTags[regexpTag] = typedArrayTags[setTag] = + typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = + cloneableTags[dateTag] = cloneableTags[float32Tag] = + cloneableTags[float64Tag] = cloneableTags[int8Tag] = + cloneableTags[int16Tag] = cloneableTags[int32Tag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[stringTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[mapTag] = cloneableTags[setTag] = + cloneableTags[weakMapTag] = false; + + /** Used to map latin-1 supplementary letters to basic latin letters. */ + var deburredLetters = { + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcC': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xeC': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss' + }; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '`': '`' + }; + + /** Used to determine if values are of the language type `Object`. */ + var objectTypes = { + 'function': true, + 'object': true + }; + + /** Used to escape characters for inclusion in compiled regexes. */ + var regexpEscapes = { + '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34', + '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39', + 'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46', + 'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66', + 'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78' + }; + + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /** Detect free variable `exports`. */ + var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global; + + /** Detect free variable `self`. */ + var freeSelf = objectTypes[typeof self] && self && self.Object && self; + + /** Detect free variable `window`. */ + var freeWindow = objectTypes[typeof window] && window && window.Object && window; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports && freeExports; + + /** + * Used as a reference to the global object. + * + * The `this` value is used if it's the global object to avoid Greasemonkey's + * restricted `window` object, otherwise the `window` object is used. + */ + var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this; + + /*--------------------------------------------------------------------------*/ + + /** + * The base implementation of `compareAscending` which compares values and + * sorts them in ascending order without guaranteeing a stable sort. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function baseCompareAscending(value, other) { + if (value !== other) { + var valIsNull = value === null, + valIsUndef = value === undefined, + valIsReflexive = value === value; + + var othIsNull = other === null, + othIsUndef = other === undefined, + othIsReflexive = other === other; + + if ((value > other && !othIsNull) || !valIsReflexive || + (valIsNull && !othIsUndef && othIsReflexive) || + (valIsUndef && othIsReflexive)) { + return 1; + } + if ((value < other && !valIsNull) || !othIsReflexive || + (othIsNull && !valIsUndef && valIsReflexive) || + (othIsUndef && valIsReflexive)) { + return -1; + } + } + return 0; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for callback shorthands and `this` binding. + * + * @private + * @param {Array} array The array to search. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.indexOf` without support for binary searches. + * + * @private + * @param {Array} array The array to search. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + if (value !== value) { + return indexOfNaN(array, fromIndex); + } + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.isFunction` without support for environments + * with incorrect `typeof` results. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + */ + function baseIsFunction(value) { + // Avoid a Chakra JIT bug in compatibility modes of IE 11. + // See https://github.com/jashkenas/underscore/issues/1621 for more details. + return typeof value == 'function' || false; + } + + /** + * Converts `value` to a string if it's not one. An empty string is returned + * for `null` or `undefined` values. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + return value == null ? '' : (value + ''); + } + + /** + * Used by `_.trim` and `_.trimLeft` to get the index of the first character + * of `string` that is not found in `chars`. + * + * @private + * @param {string} string The string to inspect. + * @param {string} chars The characters to find. + * @returns {number} Returns the index of the first character not found in `chars`. + */ + function charsLeftIndex(string, chars) { + var index = -1, + length = string.length; + + while (++index < length && chars.indexOf(string.charAt(index)) > -1) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimRight` to get the index of the last character + * of `string` that is not found in `chars`. + * + * @private + * @param {string} string The string to inspect. + * @param {string} chars The characters to find. + * @returns {number} Returns the index of the last character not found in `chars`. + */ + function charsRightIndex(string, chars) { + var index = string.length; + + while (index-- && chars.indexOf(string.charAt(index)) > -1) {} + return index; + } + + /** + * Used by `_.sortBy` to compare transformed elements of a collection and stable + * sort them in ascending order. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareAscending(object, other) { + return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index); + } + + /** + * Used by `_.sortByOrder` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise, + * a value is sorted in ascending order if its corresponding order is "asc", and + * descending if "desc". + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = baseCompareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * ((order === 'asc' || order === true) ? 1 : -1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://code.google.com/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; + } + + /** + * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + function deburrLetter(letter) { + return deburredLetters[letter]; + } + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeHtmlChar(chr) { + return htmlEscapes[chr]; + } + + /** + * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes. + * + * @private + * @param {string} chr The matched character to escape. + * @param {string} leadingChar The capture group for a leading character. + * @param {string} whitespaceChar The capture group for a whitespace character. + * @returns {string} Returns the escaped character. + */ + function escapeRegExpChar(chr, leadingChar, whitespaceChar) { + if (leadingChar) { + chr = regexpEscapes[chr]; + } else if (whitespaceChar) { + chr = stringEscapes[chr]; + } + return '\\' + chr; + } + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + + /** + * Gets the index at which the first occurrence of `NaN` is found in `array`. + * + * @private + * @param {Array} array The array to search. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched `NaN`, else `-1`. + */ + function indexOfNaN(array, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 0 : -1); + + while ((fromRight ? index-- : ++index < length)) { + var other = array[index]; + if (other !== other) { + return index; + } + } + return -1; + } + + /** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ + function isObjectLike(value) { + return !!value && typeof value == 'object'; + } + + /** + * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a + * character code is whitespace. + * + * @private + * @param {number} charCode The character code to inspect. + * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`. + */ + function isSpace(charCode) { + return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 || + (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279))); + } + + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = -1, + result = []; + + while (++index < length) { + if (array[index] === placeholder) { + array[index] = PLACEHOLDER; + result[++resIndex] = index; + } + } + return result; + } + + /** + * An implementation of `_.uniq` optimized for sorted arrays without support + * for callback shorthands and `this` binding. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The function invoked per iteration. + * @returns {Array} Returns the new duplicate-value-free array. + */ + function sortedUniq(array, iteratee) { + var seen, + index = -1, + length = array.length, + resIndex = -1, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value, index, array) : value; + + if (!index || seen !== computed) { + seen = computed; + result[++resIndex] = value; + } + } + return result; + } + + /** + * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the first non-whitespace character. + */ + function trimmedLeftIndex(string) { + var index = -1, + length = string.length; + + while (++index < length && isSpace(string.charCodeAt(index))) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ + function trimmedRightIndex(string) { + var index = string.length; + + while (index-- && isSpace(string.charCodeAt(index))) {} + return index; + } + + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + function unescapeHtmlChar(chr) { + return htmlUnescapes[chr]; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Create a new pristine `lodash` function using the given `context` object. + * + * @static + * @memberOf _ + * @category Utility + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // using `context` to mock `Date#getTime` use in `_.now` + * var mock = _.runInContext({ + * 'Date': function() { + * return { 'getTime': getTimeMock }; + * } + * }); + * + * // or creating a suped-up `defer` in Node.js + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + function runInContext(context) { + // Avoid issues with some ES3 environments that attempt to use values, named + // after built-in constructors like `Object`, for the creation of literals. + // ES5 clears this up by stating that literals must use built-in constructors. + // See https://es5.github.io/#x11.1.5 for more details. + context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root; + + /** Native constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Number = context.Number, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for native method references. */ + var arrayProto = Array.prototype, + objectProto = Object.prototype, + stringProto = String.prototype; + + /** Used to resolve the decompiled source of functions. */ + var fnToString = Function.prototype.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ + var objToString = objectProto.toString; + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Native method references. */ + var ArrayBuffer = context.ArrayBuffer, + clearTimeout = context.clearTimeout, + parseFloat = context.parseFloat, + pow = Math.pow, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + Set = getNative(context, 'Set'), + setTimeout = context.setTimeout, + splice = arrayProto.splice, + Uint8Array = context.Uint8Array, + WeakMap = getNative(context, 'WeakMap'); + + /* Native method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeCreate = getNative(Object, 'create'), + nativeFloor = Math.floor, + nativeIsArray = getNative(Array, 'isArray'), + nativeIsFinite = context.isFinite, + nativeKeys = getNative(Object, 'keys'), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = getNative(Date, 'now'), + nativeParseInt = context.parseInt, + nativeRandom = Math.random; + + /** Used as references for `-Infinity` and `Infinity`. */ + var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY, + POSITIVE_INFINITY = Number.POSITIVE_INFINITY; + + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + /** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ + var MAX_SAFE_INTEGER = 9007199254740991; + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit chaining. + * Methods that operate on and return arrays, collections, and functions can + * be chained together. Methods that retrieve a single value or may return a + * primitive value will automatically end the chain returning the unwrapped + * value. Explicit chaining may be enabled using `_.chain`. The execution of + * chained methods is lazy, that is, execution is deferred until `_#value` + * is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. Shortcut + * fusion is an optimization strategy which merge iteratee calls; this can help + * to avoid the creation of intermediate data structures and greatly reduce the + * number of iteratee executions. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, + * `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`, + * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`, + * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`, + * and `where` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`, + * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`, + * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`, + * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`, + * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, + * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, + * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, + * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, + * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`, + * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`, + * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`, + * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`, + * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, + * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`, + * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, + * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`, + * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`, + * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, + * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, + * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`, + * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`, + * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`, + * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`, + * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`, + * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`, + * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`, + * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, + * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, + * `unescape`, `uniqueId`, `value`, and `words` + * + * The wrapper method `sample` will return a wrapped value when `n` is provided, + * otherwise an unwrapped value is returned. + * + * @name _ + * @constructor + * @category Chain + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var wrapped = _([1, 2, 3]); + * + * // returns an unwrapped value + * wrapped.reduce(function(total, n) { + * return total + n; + * }); + * // => 6 + * + * // returns a wrapped value + * var squares = wrapped.map(function(n) { + * return n * n; + * }); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + + /** + * The function whose prototype all chaining wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable chaining for all wrapper methods. + * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value. + */ + function LodashWrapper(value, chainAll, actions) { + this.__wrapped__ = value; + this.__actions__ = actions || []; + this.__chain__ = !!chainAll; + } + + /** + * An object environment feature flags. + * + * @static + * @memberOf _ + * @type Object + */ + var support = lodash.support = {}; + + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB). Change the following template settings to use + * alternative delimiters. + * + * @static + * @memberOf _ + * @type Object + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type RegExp + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type RegExp + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type RegExp + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type string + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type Object + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type Function + */ + '_': lodash + } + }; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = POSITIVE_INFINITY; + this.__views__ = []; + } + + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = arrayCopy(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = arrayCopy(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = arrayCopy(this.__views__); + return result; + } + + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } + + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) { + return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a cache object to store key/value pairs. + * + * @private + * @static + * @name Cache + * @memberOf _.memoize + */ + function MapCache() { + this.__data__ = {}; + } + + /** + * Removes `key` and its value from the cache. + * + * @private + * @name delete + * @memberOf _.memoize.Cache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`. + */ + function mapDelete(key) { + return this.has(key) && delete this.__data__[key]; + } + + /** + * Gets the cached value for `key`. + * + * @private + * @name get + * @memberOf _.memoize.Cache + * @param {string} key The key of the value to get. + * @returns {*} Returns the cached value. + */ + function mapGet(key) { + return key == '__proto__' ? undefined : this.__data__[key]; + } + + /** + * Checks if a cached value for `key` exists. + * + * @private + * @name has + * @memberOf _.memoize.Cache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapHas(key) { + return key != '__proto__' && hasOwnProperty.call(this.__data__, key); + } + + /** + * Sets `value` to `key` of the cache. + * + * @private + * @name set + * @memberOf _.memoize.Cache + * @param {string} key The key of the value to cache. + * @param {*} value The value to cache. + * @returns {Object} Returns the cache object. + */ + function mapSet(key, value) { + if (key != '__proto__') { + this.__data__[key] = value; + } + return this; + } + + /*------------------------------------------------------------------------*/ + + /** + * + * Creates a cache object to store unique values. + * + * @private + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var length = values ? values.length : 0; + + this.data = { 'hash': nativeCreate(null), 'set': new Set }; + while (length--) { + this.push(values[length]); + } + } + + /** + * Checks if `value` is in `cache` mimicking the return signature of + * `_.indexOf` by returning `0` if the value is found, else `-1`. + * + * @private + * @param {Object} cache The cache to search. + * @param {*} value The value to search for. + * @returns {number} Returns `0` if `value` is found, else `-1`. + */ + function cacheIndexOf(cache, value) { + var data = cache.data, + result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value]; + + return result ? 0 : -1; + } + + /** + * Adds `value` to the cache. + * + * @private + * @name push + * @memberOf SetCache + * @param {*} value The value to cache. + */ + function cachePush(value) { + var data = this.data; + if (typeof value == 'string' || isObject(value)) { + data.set.add(value); + } else { + data.hash[value] = true; + } + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a new array joining `array` with `other`. + * + * @private + * @param {Array} array The array to join. + * @param {Array} other The other array to join. + * @returns {Array} Returns the new concatenated array. + */ + function arrayConcat(array, other) { + var index = -1, + length = array.length, + othIndex = -1, + othLength = other.length, + result = Array(length + othLength); + + while (++index < length) { + result[index] = array[index]; + } + while (++othIndex < othLength) { + result[index++] = other[othIndex]; + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function arrayCopy(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + /** + * A specialized version of `_.forEach` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.forEachRight` for arrays without support for + * callback shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.every` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + + /** + * A specialized version of `baseExtremum` for arrays which invokes `iteratee` + * with one argument: (value). + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} comparator The function used to compare values. + * @param {*} exValue The initial extremum value. + * @returns {*} Returns the extremum value. + */ + function arrayExtremum(array, iteratee, comparator, exValue) { + var index = -1, + length = array.length, + computed = exValue, + result = computed; + + while (++index < length) { + var value = array[index], + current = +iteratee(value); + + if (comparator(current, computed)) { + computed = current; + result = value; + } + } + return result; + } + + /** + * A specialized version of `_.filter` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array.length, + resIndex = -1, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[++resIndex] = value; + } + } + return result; + } + + /** + * A specialized version of `_.map` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + /** + * A specialized version of `_.reduce` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initFromArray] Specify using the first element of `array` + * as the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initFromArray) { + var index = -1, + length = array.length; + + if (initFromArray && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + /** + * A specialized version of `_.reduceRight` for arrays without support for + * callback shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initFromArray] Specify using the last element of `array` + * as the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initFromArray) { + var length = array.length; + if (initFromArray && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + + /** + * A specialized version of `_.some` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + /** + * A specialized version of `_.sum` for arrays without support for callback + * shorthands and `this` binding.. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function arraySum(array, iteratee) { + var length = array.length, + result = 0; + + while (length--) { + result += +iteratee(array[length]) || 0; + } + return result; + } + + /** + * Used by `_.defaults` to customize its `_.assign` use. + * + * @private + * @param {*} objectValue The destination object property value. + * @param {*} sourceValue The source object property value. + * @returns {*} Returns the value to assign to the destination object. + */ + function assignDefaults(objectValue, sourceValue) { + return objectValue === undefined ? sourceValue : objectValue; + } + + /** + * Used by `_.template` to customize its `_.assign` use. + * + * **Note:** This function is like `assignDefaults` except that it ignores + * inherited property values when checking if a property is `undefined`. + * + * @private + * @param {*} objectValue The destination object property value. + * @param {*} sourceValue The source object property value. + * @param {string} key The key associated with the object and source values. + * @param {Object} object The destination object. + * @returns {*} Returns the value to assign to the destination object. + */ + function assignOwnDefaults(objectValue, sourceValue, key, object) { + return (objectValue === undefined || !hasOwnProperty.call(object, key)) + ? sourceValue + : objectValue; + } + + /** + * A specialized version of `_.assign` for customizing assigned values without + * support for argument juggling, multiple sources, and `this` binding `customizer` + * functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + */ + function assignWith(object, source, customizer) { + var index = -1, + props = keys(source), + length = props.length; + + while (++index < length) { + var key = props[index], + value = object[key], + result = customizer(value, source[key], key, object, source); + + if ((result === result ? (result !== value) : (value === value)) || + (value === undefined && !(key in object))) { + object[key] = result; + } + } + return object; + } + + /** + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); + } + + /** + * The base implementation of `_.at` without support for string collections + * and individual key arguments. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {number[]|string[]} props The property names or indexes of elements to pick. + * @returns {Array} Returns the new array of picked elements. + */ + function baseAt(collection, props) { + var index = -1, + isNil = collection == null, + isArr = !isNil && isArrayLike(collection), + length = isArr ? collection.length : 0, + propsLength = props.length, + result = Array(propsLength); + + while(++index < propsLength) { + var key = props[index]; + if (isArr) { + result[index] = isIndex(key, length) ? collection[key] : undefined; + } else { + result[index] = isNil ? undefined : collection[key]; + } + } + return result; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. + * @returns {Object} Returns `object`. + */ + function baseCopy(source, props, object) { + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; + } + return object; + } + + /** + * The base implementation of `_.callback` which supports specifying the + * number of arguments to provide to `func`. + * + * @private + * @param {*} [func=_.identity] The value to convert to a callback. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ + function baseCallback(func, thisArg, argCount) { + var type = typeof func; + if (type == 'function') { + return thisArg === undefined + ? func + : bindCallback(func, thisArg, argCount); + } + if (func == null) { + return identity; + } + if (type == 'object') { + return baseMatches(func); + } + return thisArg === undefined + ? property(func) + : baseMatchesProperty(func, thisArg); + } + + /** + * The base implementation of `_.clone` without support for argument juggling + * and `this` binding `customizer` functions. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @param {Function} [customizer] The function to customize cloning values. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The object `value` belongs to. + * @param {Array} [stackA=[]] Tracks traversed source objects. + * @param {Array} [stackB=[]] Associates clones with source counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, isDeep, customizer, key, object, stackA, stackB) { + var result; + if (customizer) { + result = object ? customizer(value, key, object) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return arrayCopy(value, result); + } + } else { + var tag = objToString.call(value), + isFunc = tag == funcTag; + + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = initCloneObject(isFunc ? {} : value); + if (!isDeep) { + return baseAssign(result, value); + } + } else { + return cloneableTags[tag] + ? initCloneByTag(value, tag, isDeep) + : (object ? value : {}); + } + } + // Check for circular references and return its corresponding clone. + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == value) { + return stackB[length]; + } + } + // Add the source value to the stack of traversed objects and associate it with its clone. + stackA.push(value); + stackB.push(result); + + // Recursively populate clone (susceptible to call stack limits). + (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) { + result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB); + }); + return result; + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} prototype The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(prototype) { + if (isObject(prototype)) { + object.prototype = prototype; + var result = new object; + object.prototype = undefined; + } + return result || {}; + }; + }()); + + /** + * The base implementation of `_.delay` and `_.defer` which accepts an index + * of where to slice the arguments to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Object} args The arguments provide to `func`. + * @returns {number} Returns the timer id. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of `_.difference` which accepts a single array + * of values to exclude. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values) { + var length = array ? array.length : 0, + result = []; + + if (!length) { + return result; + } + var index = -1, + indexOf = getIndexOf(), + isCommon = indexOf == baseIndexOf, + cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null, + valuesLength = values.length; + + if (cache) { + indexOf = cacheIndexOf; + isCommon = false; + values = cache; + } + outer: + while (++index < length) { + var value = array[index]; + + if (isCommon && value === value) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === value) { + continue outer; + } + } + result.push(value); + } + else if (indexOf(values, value, 0) < 0) { + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.forEach` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object|string} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.forEachRight` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object|string} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); + + /** + * The base implementation of `_.every` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * Gets the extremum value of `collection` invoking `iteratee` for each value + * in `collection` to generate the criterion by which the value is ranked. + * The `iteratee` is invoked with three arguments: (value, index|key, collection). + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} comparator The function used to compare values. + * @param {*} exValue The initial extremum value. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(collection, iteratee, comparator, exValue) { + var computed = exValue, + result = computed; + + baseEach(collection, function(value, index, collection) { + var current = +iteratee(value, index, collection); + if (comparator(current, computed) || (current === exValue && current === result)) { + computed = current; + result = value; + } + }); + return result; + } + + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; + + start = start == null ? 0 : (+start || 0); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : (+end || 0); + if (end < 0) { + end += length; + } + length = start > end ? 0 : (end >>> 0); + start >>>= 0; + + while (start < length) { + array[start++] = value; + } + return array; + } + + /** + * The base implementation of `_.filter` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`, + * without support for callback shorthands and `this` binding, which iterates + * over `collection` using the provided `eachFunc`. + * + * @private + * @param {Array|Object|string} collection The collection to search. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @param {boolean} [retKey] Specify returning the key of the found element + * instead of the element itself. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFind(collection, predicate, eachFunc, retKey) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = retKey ? key : value; + return false; + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with added support for restricting + * flattening and specifying the start index. + * + * @private + * @param {Array} array The array to flatten. + * @param {boolean} [isDeep] Specify a deep flatten. + * @param {boolean} [isStrict] Restrict flattening to arrays-like objects. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, isDeep, isStrict, result) { + result || (result = []); + + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index]; + if (isObjectLike(value) && isArrayLike(value) && + (isStrict || isArray(value) || isArguments(value))) { + if (isDeep) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, isDeep, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForIn` and `baseForOwn` which iterates + * over `object` properties returned by `keysFunc` invoking `iteratee` for + * each property. Iteratee functions may exit iteration early by explicitly + * returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); + + /** + * The base implementation of `_.forIn` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForIn(object, iteratee) { + return baseFor(object, iteratee, keysIn); + } + + /** + * The base implementation of `_.forOwn` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.forOwnRight` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return baseForRight(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from those provided. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the new array of filtered property names. + */ + function baseFunctions(object, props) { + var index = -1, + length = props.length, + resIndex = -1, + result = []; + + while (++index < length) { + var key = props[index]; + if (isFunction(object[key])) { + result[++resIndex] = key; + } + } + return result; + } + + /** + * The base implementation of `get` without support for string paths + * and default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path of the property to get. + * @param {string} [pathKey] The key representation of path. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path, pathKey) { + if (object == null) { + return; + } + if (pathKey !== undefined && pathKey in toObject(object)) { + path = [pathKey]; + } + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[path[index++]]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `_.isEqual` without support for `this` binding + * `customizer` functions. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing objects. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA=[]] Tracks traversed `value` objects. + * @param {Array} [stackB=[]] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = objToString.call(object); + if (objTag == argsTag) { + objTag = objectTag; + } else if (objTag != objectTag) { + objIsArr = isTypedArray(object); + } + } + if (!othIsArr) { + othTag = objToString.call(other); + if (othTag == argsTag) { + othTag = objectTag; + } else if (othTag != objectTag) { + othIsArr = isTypedArray(other); + } + } + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && !(objIsArr || objIsObj)) { + return equalByTag(object, other, objTag); + } + if (!isLoose) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); + } + } + if (!isSameTag) { + return false; + } + // Assume cyclic values are equal. + // For more information on detecting circular references see https://es5.github.io/#JO. + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == object) { + return stackB[length] == other; + } + } + // Add `object` and `other` to the stack of traversed objects. + stackA.push(object); + stackB.push(other); + + var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); + + stackA.pop(); + stackB.pop(); + + return result; + } + + /** + * The base implementation of `_.isMatch` without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} matchData The propery names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparing objects. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = toObject(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var result = customizer ? customizer(objValue, srcValue, key) : undefined; + if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) { + return false; + } + } + } + return true; + } + + /** + * The base implementation of `_.map` without support for callback shorthands + * and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which does not clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + var key = matchData[0][0], + value = matchData[0][1]; + + return function(object) { + if (object == null) { + return false; + } + return object[key] === value && (value !== undefined || (key in toObject(object))); + }; + } + return function(object) { + return baseIsMatch(object, matchData); + }; + } + + /** + * The base implementation of `_.matchesProperty` which does not clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to compare. + * @returns {Function} Returns the new function. + */ + function baseMatchesProperty(path, srcValue) { + var isArr = isArray(path), + isCommon = isKey(path) && isStrictComparable(srcValue), + pathKey = (path + ''); + + path = toPath(path); + return function(object) { + if (object == null) { + return false; + } + var key = pathKey; + object = toObject(object); + if ((isArr || !isCommon) && !(key in object)) { + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + key = last(path); + object = toObject(object); + } + return object[key] === srcValue + ? (srcValue !== undefined || (key in object)) + : baseIsEqual(srcValue, object[key], undefined, true); + }; + } + + /** + * The base implementation of `_.merge` without support for argument juggling, + * multiple sources, and `this` binding `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {Function} [customizer] The function to customize merged values. + * @param {Array} [stackA=[]] Tracks traversed source objects. + * @param {Array} [stackB=[]] Associates values with source counterparts. + * @returns {Object} Returns `object`. + */ + function baseMerge(object, source, customizer, stackA, stackB) { + if (!isObject(object)) { + return object; + } + var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)), + props = isSrcArr ? undefined : keys(source); + + arrayEach(props || source, function(srcValue, key) { + if (props) { + key = srcValue; + srcValue = source[key]; + } + if (isObjectLike(srcValue)) { + stackA || (stackA = []); + stackB || (stackB = []); + baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); + } + else { + var value = object[key], + result = customizer ? customizer(value, srcValue, key, object, source) : undefined, + isCommon = result === undefined; + + if (isCommon) { + result = srcValue; + } + if ((result !== undefined || (isSrcArr && !(key in object))) && + (isCommon || (result === result ? (result !== value) : (value === value)))) { + object[key] = result; + } + } + }); + return object; + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize merged values. + * @param {Array} [stackA=[]] Tracks traversed source objects. + * @param {Array} [stackB=[]] Associates values with source counterparts. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) { + var length = stackA.length, + srcValue = source[key]; + + while (length--) { + if (stackA[length] == srcValue) { + object[key] = stackB[length]; + return; + } + } + var value = object[key], + result = customizer ? customizer(value, srcValue, key, object, source) : undefined, + isCommon = result === undefined; + + if (isCommon) { + result = srcValue; + if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) { + result = isArray(value) + ? value + : (isArrayLike(value) ? arrayCopy(value) : []); + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + result = isArguments(value) + ? toPlainObject(value) + : (isPlainObject(value) ? value : {}); + } + else { + isCommon = false; + } + } + // Add the source value to the stack of traversed objects and associate + // it with its merged value. + stackA.push(srcValue); + stackB.push(result); + + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB); + } else if (result === result ? (result !== value) : (value === value)) { + object[key] = result; + } + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + */ + function basePropertyDeep(path) { + var pathKey = (path + ''); + path = toPath(path); + return function(object) { + return baseGet(object, path, pathKey); + }; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * index arguments and capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0; + while (length--) { + var index = indexes[length]; + if (index != previous && isIndex(index)) { + var previous = index; + splice.call(array, index, 1); + } + } + return array; + } + + /** + * The base implementation of `_.random` without support for argument juggling + * and returning floating-point numbers. + * + * @private + * @param {number} min The minimum possible value. + * @param {number} max The maximum possible value. + * @returns {number} Returns the random number. + */ + function baseRandom(min, max) { + return min + nativeFloor(nativeRandom() * (max - min + 1)); + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight` without support + * for callback shorthands and `this` binding, which iterates over `collection` + * using the provided `eachFunc`. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initFromCollection Specify using the first or last element + * of `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initFromCollection + ? (initFromCollection = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `setData` without support for hot loop detection. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + start = start == null ? 0 : (+start || 0); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : (+end || 0); + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.some` without support for callback shorthands + * and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `_.sortBy` which uses `comparer` to define + * the sort order of `array` and replaces criteria objects with their + * corresponding values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + + /** + * The base implementation of `_.sortByOrder` without param guards. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {boolean[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseSortByOrder(collection, iteratees, orders) { + var callback = getCallback(), + index = -1; + + iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); }); + + var result = baseMap(collection, function(value) { + var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + + /** + * The base implementation of `_.sum` without support for callback shorthands + * and `this` binding. + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(collection, iteratee) { + var result = 0; + baseEach(collection, function(value, index, collection) { + result += +iteratee(value, index, collection) || 0; + }); + return result; + } + + /** + * The base implementation of `_.uniq` without support for callback shorthands + * and `this` binding. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The function invoked per iteration. + * @returns {Array} Returns the new duplicate-value-free array. + */ + function baseUniq(array, iteratee) { + var index = -1, + indexOf = getIndexOf(), + length = array.length, + isCommon = indexOf == baseIndexOf, + isLarge = isCommon && length >= LARGE_ARRAY_SIZE, + seen = isLarge ? createCache() : null, + result = []; + + if (seen) { + indexOf = cacheIndexOf; + isCommon = false; + } else { + isLarge = false; + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value, index, array) : value; + + if (isCommon && value === value) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (indexOf(seen, computed, 0) < 0) { + if (iteratee || isLarge) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + var index = -1, + length = props.length, + result = Array(length); + + while (++index < length) { + result[index] = object[props[index]]; + } + return result; + } + + /** + * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`, + * and `_.takeWhile` without support for callback shorthands and `this` binding. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {} + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to peform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + var index = -1, + length = actions.length; + + while (++index < length) { + var action = actions[index]; + result = action.func.apply(action.thisArg, arrayPush([result], action.args)); + } + return result; + } + + /** + * Performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function binaryIndex(array, value, retHighest) { + var low = 0, + high = array ? array.length : low; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return binaryIndexBy(array, value, identity, retHighest); + } + + /** + * This function is like `binaryIndex` except that it invokes `iteratee` for + * `value` and each element of `array` to compute their sort ranking. The + * iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The function invoked per iteration. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function binaryIndexBy(array, value, iteratee, retHighest) { + value = iteratee(value); + + var low = 0, + high = array ? array.length : 0, + valIsNaN = value !== value, + valIsNull = value === null, + valIsUndef = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + isDef = computed !== undefined, + isReflexive = computed === computed; + + if (valIsNaN) { + var setLow = isReflexive || retHighest; + } else if (valIsNull) { + setLow = isReflexive && isDef && (retHighest || computed != null); + } else if (valIsUndef) { + setLow = isReflexive && (retHighest || isDef); + } else if (computed == null) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + /** + * A specialized version of `baseCallback` which only supports `this` binding + * and specifying the number of arguments to provide to `func`. + * + * @private + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ + function bindCallback(func, thisArg, argCount) { + if (typeof func != 'function') { + return identity; + } + if (thisArg === undefined) { + return func; + } + switch (argCount) { + case 1: return function(value) { + return func.call(thisArg, value); + }; + case 3: return function(value, index, collection) { + return func.call(thisArg, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(thisArg, accumulator, value, index, collection); + }; + case 5: return function(value, other, key, object, source) { + return func.call(thisArg, value, other, key, object, source); + }; + } + return function() { + return func.apply(thisArg, arguments); + }; + } + + /** + * Creates a clone of the given array buffer. + * + * @private + * @param {ArrayBuffer} buffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function bufferClone(buffer) { + var result = new ArrayBuffer(buffer.byteLength), + view = new Uint8Array(result); + + view.set(new Uint8Array(buffer)); + return result; + } + + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array|Object} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders) { + var holdersLength = holders.length, + argsIndex = -1, + argsLength = nativeMax(args.length - holdersLength, 0), + leftIndex = -1, + leftLength = partials.length, + result = Array(leftLength + argsLength); + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + while (argsLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } + + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array|Object} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders) { + var holdersIndex = -1, + holdersLength = holders.length, + argsIndex = -1, + argsLength = nativeMax(args.length - holdersLength, 0), + rightIndex = -1, + rightLength = partials.length, + result = Array(argsLength + rightLength); + + while (++argsIndex < argsLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + return result; + } + + /** + * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function. + * + * @private + * @param {Function} setter The function to set keys and values of the accumulator object. + * @param {Function} [initializer] The function to initialize the accumulator object. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee, thisArg) { + var result = initializer ? initializer() : {}; + iteratee = getCallback(iteratee, thisArg, 3); + + if (isArray(collection)) { + var index = -1, + length = collection.length; + + while (++index < length) { + var value = collection[index]; + setter(result, value, iteratee(value, index, collection), collection); + } + } else { + baseEach(collection, function(value, key, collection) { + setter(result, value, iteratee(value, key, collection), collection); + }); + } + return result; + }; + } + + /** + * Creates a `_.assign`, `_.defaults`, or `_.merge` function. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return restParam(function(object, sources) { + var index = -1, + length = object == null ? 0 : sources.length, + customizer = length > 2 ? sources[length - 2] : undefined, + guard = length > 2 ? sources[2] : undefined, + thisArg = length > 1 ? sources[length - 1] : undefined; + + if (typeof customizer == 'function') { + customizer = bindCallback(customizer, thisArg, 5); + length -= 2; + } else { + customizer = typeof thisArg == 'function' ? thisArg : undefined; + length -= (customizer ? 1 : 0); + } + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + return eachFunc(collection, iteratee); + } + var index = fromRight ? length : -1, + iterable = toObject(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for `_.forIn` or `_.forInRight`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var iterable = toObject(object), + props = keysFunc(object), + length = props.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + var key = props[index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that wraps `func` and invokes it with the `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to bind. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new bound function. + */ + function createBindWrapper(func, thisArg) { + var Ctor = createCtorWrapper(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(thisArg, arguments); + } + return wrapper; + } + + /** + * Creates a `Set` cache object to optimize linear searches of large arrays. + * + * @private + * @param {Array} [values] The values to cache. + * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`. + */ + function createCache(values) { + return (nativeCreate && Set) ? new SetCache(values) : null; + } + + /** + * Creates a function that produces compound words out of the words in a + * given string. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + var index = -1, + array = words(deburr(string)), + length = array.length, + result = ''; + + while (++index < length) { + result = callback(result, array[index], index); + } + return result; + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtorWrapper(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. + // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a `_.curry` or `_.curryRight` function. + * + * @private + * @param {boolean} flag The curry bit flag. + * @returns {Function} Returns the new curry function. + */ + function createCurry(flag) { + function curryFunc(func, arity, guard) { + if (guard && isIterateeCall(func, arity, guard)) { + arity = undefined; + } + var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryFunc.placeholder; + return result; + } + return curryFunc; + } + + /** + * Creates a `_.defaults` or `_.defaultsDeep` function. + * + * @private + * @param {Function} assigner The function to assign values. + * @param {Function} customizer The function to customize assigned values. + * @returns {Function} Returns the new defaults function. + */ + function createDefaults(assigner, customizer) { + return restParam(function(args) { + var object = args[0]; + if (object == null) { + return object; + } + args.push(customizer); + return assigner.apply(undefined, args); + }); + } + + /** + * Creates a `_.max` or `_.min` function. + * + * @private + * @param {Function} comparator The function used to compare values. + * @param {*} exValue The initial extremum value. + * @returns {Function} Returns the new extremum function. + */ + function createExtremum(comparator, exValue) { + return function(collection, iteratee, thisArg) { + if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { + iteratee = undefined; + } + iteratee = getCallback(iteratee, thisArg, 3); + if (iteratee.length == 1) { + collection = isArray(collection) ? collection : toIterable(collection); + var result = arrayExtremum(collection, iteratee, comparator, exValue); + if (!(collection.length && result === exValue)) { + return result; + } + } + return baseExtremum(collection, iteratee, comparator, exValue); + }; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new find function. + */ + function createFind(eachFunc, fromRight) { + return function(collection, predicate, thisArg) { + predicate = getCallback(predicate, thisArg, 3); + if (isArray(collection)) { + var index = baseFindIndex(collection, predicate, fromRight); + return index > -1 ? collection[index] : undefined; + } + return baseFind(collection, predicate, eachFunc); + }; + } + + /** + * Creates a `_.findIndex` or `_.findLastIndex` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new find function. + */ + function createFindIndex(fromRight) { + return function(array, predicate, thisArg) { + if (!(array && array.length)) { + return -1; + } + predicate = getCallback(predicate, thisArg, 3); + return baseFindIndex(array, predicate, fromRight); + }; + } + + /** + * Creates a `_.findKey` or `_.findLastKey` function. + * + * @private + * @param {Function} objectFunc The function to iterate over an object. + * @returns {Function} Returns the new find function. + */ + function createFindKey(objectFunc) { + return function(object, predicate, thisArg) { + predicate = getCallback(predicate, thisArg, 3); + return baseFind(object, predicate, objectFunc, true); + }; + } + + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return function() { + var wrapper, + length = arguments.length, + index = fromRight ? length : -1, + leftIndex = 0, + funcs = Array(length); + + while ((fromRight ? index-- : ++index < length)) { + var func = funcs[leftIndex++] = arguments[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') { + wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? -1 : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }; + } + + /** + * Creates a function for `_.forEach` or `_.forEachRight`. + * + * @private + * @param {Function} arrayFunc The function to iterate over an array. + * @param {Function} eachFunc The function to iterate over a collection. + * @returns {Function} Returns the new each function. + */ + function createForEach(arrayFunc, eachFunc) { + return function(collection, iteratee, thisArg) { + return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) + ? arrayFunc(collection, iteratee) + : eachFunc(collection, bindCallback(iteratee, thisArg, 3)); + }; + } + + /** + * Creates a function for `_.forIn` or `_.forInRight`. + * + * @private + * @param {Function} objectFunc The function to iterate over an object. + * @returns {Function} Returns the new each function. + */ + function createForIn(objectFunc) { + return function(object, iteratee, thisArg) { + if (typeof iteratee != 'function' || thisArg !== undefined) { + iteratee = bindCallback(iteratee, thisArg, 3); + } + return objectFunc(object, iteratee, keysIn); + }; + } + + /** + * Creates a function for `_.forOwn` or `_.forOwnRight`. + * + * @private + * @param {Function} objectFunc The function to iterate over an object. + * @returns {Function} Returns the new each function. + */ + function createForOwn(objectFunc) { + return function(object, iteratee, thisArg) { + if (typeof iteratee != 'function' || thisArg !== undefined) { + iteratee = bindCallback(iteratee, thisArg, 3); + } + return objectFunc(object, iteratee); + }; + } + + /** + * Creates a function for `_.mapKeys` or `_.mapValues`. + * + * @private + * @param {boolean} [isMapKeys] Specify mapping keys instead of values. + * @returns {Function} Returns the new map function. + */ + function createObjectMapper(isMapKeys) { + return function(object, iteratee, thisArg) { + var result = {}; + iteratee = getCallback(iteratee, thisArg, 3); + + baseForOwn(object, function(value, key, object) { + var mapped = iteratee(value, key, object); + key = isMapKeys ? mapped : key; + value = isMapKeys ? value : mapped; + result[key] = value; + }); + return result; + }; + } + + /** + * Creates a function for `_.padLeft` or `_.padRight`. + * + * @private + * @param {boolean} [fromRight] Specify padding from the right. + * @returns {Function} Returns the new pad function. + */ + function createPadDir(fromRight) { + return function(string, length, chars) { + string = baseToString(string); + return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string); + }; + } + + /** + * Creates a `_.partial` or `_.partialRight` function. + * + * @private + * @param {boolean} flag The partial bit flag. + * @returns {Function} Returns the new partial function. + */ + function createPartial(flag) { + var partialFunc = restParam(function(func, partials) { + var holders = replaceHolders(partials, partialFunc.placeholder); + return createWrapper(func, flag, undefined, partials, holders); + }); + return partialFunc; + } + + /** + * Creates a function for `_.reduce` or `_.reduceRight`. + * + * @private + * @param {Function} arrayFunc The function to iterate over an array. + * @param {Function} eachFunc The function to iterate over a collection. + * @returns {Function} Returns the new each function. + */ + function createReduce(arrayFunc, eachFunc) { + return function(collection, iteratee, accumulator, thisArg) { + var initFromArray = arguments.length < 3; + return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) + ? arrayFunc(collection, iteratee, accumulator, initFromArray) + : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc); + }; + } + + /** + * Creates a function that wraps `func` and invokes it with optional `this` + * binding of, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to reference. + * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & ARY_FLAG, + isBind = bitmask & BIND_FLAG, + isBindKey = bitmask & BIND_KEY_FLAG, + isCurry = bitmask & CURRY_FLAG, + isCurryBound = bitmask & CURRY_BOUND_FLAG, + isCurryRight = bitmask & CURRY_RIGHT_FLAG, + Ctor = isBindKey ? undefined : createCtorWrapper(func); + + function wrapper() { + // Avoid `arguments` object use disqualifying optimizations by + // converting it to an array before providing it to other functions. + var length = arguments.length, + index = length, + args = Array(length); + + while (index--) { + args[index] = arguments[index]; + } + if (partials) { + args = composeArgs(args, partials, holders); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight); + } + if (isCurry || isCurryRight) { + var placeholder = wrapper.placeholder, + argsHolders = replaceHolders(args, placeholder); + + length -= argsHolders.length; + if (length < arity) { + var newArgPos = argPos ? arrayCopy(argPos) : undefined, + newArity = nativeMax(arity - length, 0), + newsHolders = isCurry ? argsHolders : undefined, + newHoldersRight = isCurry ? undefined : argsHolders, + newPartials = isCurry ? args : undefined, + newPartialsRight = isCurry ? undefined : args; + + bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); + + if (!isCurryBound) { + bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); + } + var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity], + result = createHybridWrapper.apply(undefined, newData); + + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return result; + } + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + if (argPos) { + args = reorder(args, argPos); + } + if (isAry && ary < args.length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtorWrapper(func); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + + /** + * Creates the padding required for `string` based on the given `length`. + * The `chars` string is truncated if the number of characters exceeds `length`. + * + * @private + * @param {string} string The string to create padding for. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the pad for `string`. + */ + function createPadding(string, length, chars) { + var strLength = string.length; + length = +length; + + if (strLength >= length || !nativeIsFinite(length)) { + return ''; + } + var padLength = length - strLength; + chars = chars == null ? ' ' : (chars + ''); + return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength); + } + + /** + * Creates a function that wraps `func` and invokes it with the optional `this` + * binding of `thisArg` and the `partials` prepended to those provided to + * the wrapper. + * + * @private + * @param {Function} func The function to partially apply arguments to. + * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to the new function. + * @returns {Function} Returns the new bound function. + */ + function createPartialWrapper(func, bitmask, thisArg, partials) { + var isBind = bitmask & BIND_FLAG, + Ctor = createCtorWrapper(func); + + function wrapper() { + // Avoid `arguments` object use disqualifying optimizations by + // converting it to an array before providing it `func`. + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength); + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * Creates a `_.ceil`, `_.floor`, or `_.round` function. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + precision = precision === undefined ? 0 : (+precision || 0); + if (precision) { + precision = pow(10, precision); + return func(number * precision) / precision; + } + return func(number); + }; + } + + /** + * Creates a `_.sortedIndex` or `_.sortedLastIndex` function. + * + * @private + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {Function} Returns the new index function. + */ + function createSortedIndex(retHighest) { + return function(array, value, iteratee, thisArg) { + var callback = getCallback(iteratee); + return (iteratee == null && callback === baseCallback) + ? binaryIndex(array, value, retHighest) + : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest); + }; + } + + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to reference. + * @param {number} bitmask The bitmask of flags. + * The bitmask may be composed of the following flags: + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + length -= (holders ? holders.length : 0); + if (bitmask & PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func), + newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity]; + + if (data) { + mergeData(newData, data); + bitmask = newData[1]; + arity = newData[9]; + } + newData[9] = arity == null + ? (isBindKey ? 0 : func.length) + : (nativeMax(arity - length, 0) || 0); + + if (bitmask == BIND_FLAG) { + var result = createBindWrapper(newData[0], newData[2]); + } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) { + result = createPartialWrapper.apply(undefined, newData); + } else { + result = createHybridWrapper.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setter(result, newData); + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing arrays. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { + var index = -1, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isLoose && othLength > arrLength)) { + return false; + } + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index], + result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; + + if (result !== undefined) { + if (result) { + continue; + } + return false; + } + // Recursively compare arrays (susceptible to call stack limits). + if (isLoose) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + })) { + return false; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { + return false; + } + } + return true; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag) { + switch (tag) { + case boolTag: + case dateTag: + // Coerce dates and booleans to numbers, dates to milliseconds and booleans + // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. + return +object == +other; + + case errorTag: + return object.name == other.name && object.message == other.message; + + case numberTag: + // Treat `NaN` vs. `NaN` as equal. + return (object != +object) + ? other != +other + : object == +other; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings primitives and string + // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. + return object == (other + ''); + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isLoose) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var skipCtor = isLoose; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key], + result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; + + // Recursively compare objects (susceptible to call stack limits). + if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { + return false; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (!skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + return false; + } + } + return true; + } + + /** + * Gets the appropriate "callback" function. If the `_.callback` method is + * customized this function returns the custom method, otherwise it returns + * the `baseCallback` function. If arguments are provided the chosen function + * is invoked with them and its result is returned. + * + * @private + * @returns {Function} Returns the chosen function or its result. + */ + function getCallback(func, thisArg, argCount) { + var result = lodash.callback || callback; + result = result === callback ? baseCallback : result; + return argCount ? result(func, thisArg, argCount) : result; + } + + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = func.name, + array = realNames[result], + length = array ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } + + /** + * Gets the appropriate "indexOf" function. If the `_.indexOf` method is + * customized this function returns the custom method, otherwise it returns + * the `baseIndexOf` function. If arguments are provided the chosen function + * is invoked with them and its result is returned. + * + * @private + * @returns {Function|number} Returns the chosen function or its result. + */ + function getIndexOf(collection, target, fromIndex) { + var result = lodash.indexOf || indexOf; + result = result === indexOf ? baseIndexOf : result; + return collection ? result(collection, target, fromIndex) : result; + } + + /** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ + var getLength = baseProperty('length'); + + /** + * Gets the propery names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = pairs(object), + length = result.length; + + while (length--) { + result[length][2] = isStrictComparable(result[length][1]); + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; + } + + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add array properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + var Ctor = object.constructor; + if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) { + Ctor = Object; + } + return new Ctor; + } + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return bufferClone(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + var buffer = object.buffer; + return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length); + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + var result = new Ctor(object.source, reFlags.exec(object)); + result.lastIndex = object.lastIndex; + } + return result; + } + + /** + * Invokes the method at `path` on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function invokePath(object, path, args) { + if (object != null && !isKey(path, object)) { + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + path = last(path); + } + var func = object == null ? object : object[path]; + return func == null ? undefined : func.apply(object, args); + } + + /** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ + function isArrayLike(value) { + return value != null && isLength(getLength(value)); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; + } + + /** + * Checks if the provided arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + var type = typeof value; + if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { + return true; + } + if (isArray(value)) { + return false; + } + var result = !reIsDeepProp.test(value); + return result || (object != null && value in toObject(object)); + } + + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func); + if (!(funcName in LazyWrapper.prototype)) { + return false; + } + var other = lodash[funcName]; + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ + function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); + } + + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers required to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg` + * augment function arguments, making the order in which they are executed important, + * preventing the merging of metadata. However, we make an exception for a safe + * common case where curried functions have `_.ary` and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < ARY_FLAG; + + var isCombo = + (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) || + (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) || + (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value); + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]); + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value); + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]); + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = arrayCopy(value); + } + // Use source `ary` if it's smaller. + if (srcBitmask & ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; + } + + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use. + * + * @private + * @param {*} objectValue The destination object property value. + * @param {*} sourceValue The source object property value. + * @returns {*} Returns the value to assign to the destination object. + */ + function mergeDefaults(objectValue, sourceValue) { + return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults); + } + + /** + * A specialized version of `_.pick` which picks `object` properties specified + * by `props`. + * + * @private + * @param {Object} object The source object. + * @param {string[]} props The property names to pick. + * @returns {Object} Returns the new object. + */ + function pickByArray(object, props) { + object = toObject(object); + + var index = -1, + length = props.length, + result = {}; + + while (++index < length) { + var key = props[index]; + if (key in object) { + result[key] = object[key]; + } + } + return result; + } + + /** + * A specialized version of `_.pick` which picks `object` properties `predicate` + * returns truthy for. + * + * @private + * @param {Object} object The source object. + * @param {Function} predicate The function invoked per iteration. + * @returns {Object} Returns the new object. + */ + function pickByCallback(object, predicate) { + var result = {}; + baseForIn(object, function(value, key, object) { + if (predicate(value, key, object)) { + result[key] = value; + } + }); + return result; + } + + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = arrayCopy(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; + } + + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity function + * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = (function() { + var count = 0, + lastCalled = 0; + + return function(key, value) { + var stamp = now(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return key; + } + } else { + count = 0; + } + return baseSetData(key, value); + }; + }()); + + /** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; + + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to an array-like object if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Array|Object} Returns the array-like object. + */ + function toIterable(value) { + if (value == null) { + return []; + } + if (!isArrayLike(value)) { + return values(value); + } + return isObject(value) ? value : Object(value); + } + + /** + * Converts `value` to an object if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Object} Returns the object. + */ + function toObject(value) { + return isObject(value) ? value : Object(value); + } + + /** + * Converts `value` to property path array if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Array} Returns the property path array. + */ + function toPath(value) { + if (isArray(value)) { + return value; + } + var result = []; + baseToString(value).replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + } + + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + return wrapper instanceof LazyWrapper + ? wrapper.clone() + : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `collection` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the new array containing chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if (guard ? isIterateeCall(array, size, guard) : size == null) { + size = 1; + } else { + size = nativeMax(nativeFloor(size) || 1, 1); + } + var index = 0, + length = array ? array.length : 0, + resIndex = -1, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[++resIndex] = baseSlice(array, index, (index += size)); + } + return result; + } + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array ? array.length : 0, + resIndex = -1, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[++resIndex] = value; + } + } + return result; + } + + /** + * Creates an array of unique `array` values not included in the other + * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The arrays of values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.difference([1, 2, 3], [4, 2]); + * // => [1, 3] + */ + var difference = restParam(function(array, values) { + return (isObjectLike(array) && isArrayLike(array)) + ? baseDifference(array, baseFlatten(values, false, true)) + : []; + }); + + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + return baseSlice(array, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + n = length - (+n || 0); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * bound to `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that match the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRightWhile([1, 2, 3], function(n) { + * return n > 1; + * }); + * // => [1] + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); + * // => ['barney', 'fred'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.dropRightWhile(users, 'active', false), 'user'); + * // => ['barney'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.dropRightWhile(users, 'active'), 'user'); + * // => ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true) + : []; + } + + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * bound to `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropWhile([1, 2, 3], function(n) { + * return n < 3; + * }); + * // => [3] + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user'); + * // => ['fred', 'pebbles'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.dropWhile(users, 'active', false), 'user'); + * // => ['pebbles'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.dropWhile(users, 'active'), 'user'); + * // => ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, getCallback(predicate, thisArg, 3), true) + : []; + } + + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8], '*', 1, 2); + * // => [4, '*', 8] + */ + function fill(array, value, start, end) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(chr) { + * return chr.user == 'barney'; + * }); + * // => 0 + * + * // using the `_.matches` callback shorthand + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // using the `_.matchesProperty` callback shorthand + * _.findIndex(users, 'active', false); + * // => 0 + * + * // using the `_.property` callback shorthand + * _.findIndex(users, 'active'); + * // => 2 + */ + var findIndex = createFindIndex(); + + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(chr) { + * return chr.user == 'pebbles'; + * }); + * // => 2 + * + * // using the `_.matches` callback shorthand + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // using the `_.matchesProperty` callback shorthand + * _.findLastIndex(users, 'active', false); + * // => 2 + * + * // using the `_.property` callback shorthand + * _.findLastIndex(users, 'active'); + * // => 0 + */ + var findLastIndex = createFindIndex(true); + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @alias head + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.first([1, 2, 3]); + * // => 1 + * + * _.first([]); + * // => undefined + */ + function first(array) { + return array ? array[0] : undefined; + } + + /** + * Flattens a nested array. If `isDeep` is `true` the array is recursively + * flattened, otherwise it is only flattened a single level. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to flatten. + * @param {boolean} [isDeep] Specify a deep flatten. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, 3, [4]]]); + * // => [1, 2, 3, [4]] + * + * // using `isDeep` + * _.flatten([1, [2, 3, [4]]], true); + * // => [1, 2, 3, 4] + */ + function flatten(array, isDeep, guard) { + var length = array ? array.length : 0; + if (guard && isIterateeCall(array, isDeep, guard)) { + isDeep = false; + } + return length ? baseFlatten(array, isDeep) : []; + } + + /** + * Recursively flattens a nested array. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to recursively flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, 3, [4]]]); + * // => [1, 2, 3, 4] + */ + function flattenDeep(array) { + var length = array ? array.length : 0; + return length ? baseFlatten(array, true) : []; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it is used as the offset + * from the end of `array`. If `array` is sorted providing `true` for `fromIndex` + * performs a faster binary search. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {*} value The value to search for. + * @param {boolean|number} [fromIndex=0] The index to search from or `true` + * to perform a binary search on a sorted array. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // using `fromIndex` + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + * + * // performing a binary search + * _.indexOf([1, 1, 2, 2], 2, true); + * // => 2 + */ + function indexOf(array, value, fromIndex) { + var length = array ? array.length : 0; + if (!length) { + return -1; + } + if (typeof fromIndex == 'number') { + fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; + } else if (fromIndex) { + var index = binaryIndex(array, value); + if (index < length && + (value === value ? (value === array[index]) : (array[index] !== array[index]))) { + return index; + } + return -1; + } + return baseIndexOf(array, value, fromIndex || 0); + } + + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + return dropRight(array, 1); + } + + /** + * Creates an array of unique values that are included in all of the provided + * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of shared values. + * @example + * _.intersection([1, 2], [4, 2], [2, 1]); + * // => [2] + */ + var intersection = restParam(function(arrays) { + var othLength = arrays.length, + othIndex = othLength, + caches = Array(length), + indexOf = getIndexOf(), + isCommon = indexOf == baseIndexOf, + result = []; + + while (othIndex--) { + var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : []; + caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null; + } + var array = arrays[0], + index = -1, + length = array ? array.length : 0, + seen = caches[0]; + + outer: + while (++index < length) { + value = array[index]; + if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) { + var othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) { + continue outer; + } + } + if (seen) { + seen.push(value); + } + result.push(value); + } + } + return result; + }); + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array ? array.length : 0; + return length ? array[length - 1] : undefined; + } + + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to search. + * @param {*} value The value to search for. + * @param {boolean|number} [fromIndex=array.length-1] The index to search from + * or `true` to perform a binary search on a sorted array. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // using `fromIndex` + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + * + * // performing a binary search + * _.lastIndexOf([1, 1, 2, 2], 2, true); + * // => 3 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array ? array.length : 0; + if (!length) { + return -1; + } + var index = length; + if (typeof fromIndex == 'number') { + index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1; + } else if (fromIndex) { + index = binaryIndex(array, value, true) - 1; + var other = array[index]; + if (value === value ? (value === other) : (other !== other)) { + return index; + } + return -1; + } + if (value !== value) { + return indexOfNaN(array, index, true); + } + while (index--) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * Removes all provided values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3, 1, 2, 3]; + * + * _.pull(array, 2, 3); + * console.log(array); + * // => [1, 1] + */ + function pull() { + var args = arguments, + array = args[0]; + + if (!(array && array.length)) { + return array; + } + var index = 0, + indexOf = getIndexOf(), + length = args.length; + + while (++index < length) { + var fromIndex = 0, + value = args[index]; + + while ((fromIndex = indexOf(array, value, fromIndex)) > -1) { + splice.call(array, fromIndex, 1); + } + } + return array; + } + + /** + * Removes elements from `array` corresponding to the given indexes and returns + * an array of the removed elements. Indexes may be specified as an array of + * indexes or as individual arguments. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove, + * specified as individual indexes or arrays of indexes. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [5, 10, 15, 20]; + * var evens = _.pullAt(array, 1, 3); + * + * console.log(array); + * // => [5, 15] + * + * console.log(evens); + * // => [10, 20] + */ + var pullAt = restParam(function(array, indexes) { + indexes = baseFlatten(indexes); + + var result = baseAt(array, indexes); + basePullAt(array, indexes.sort(baseCompareAscending)); + return result; + }); + + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is bound to + * `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * **Note:** Unlike `_.filter`, this method mutates `array`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to modify. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate, thisArg) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = getCallback(predicate, thisArg, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } + + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @alias tail + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.rest([1, 2, 3]); + * // => [2, 3] + */ + function rest(array) { + return drop(array, 1); + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of `Array#slice` to support node + * lists in IE < 9 and to ensure dense arrays are returned. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + return baseSlice(array, start, end); + } + + /** + * Uses a binary search to determine the lowest index at which `value` should + * be inserted into `array` in order to maintain its sort order. If an iteratee + * function is provided it is invoked for `value` and each element of `array` + * to compute their sort ranking. The iteratee is bound to `thisArg` and + * invoked with one argument; (value). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + * + * _.sortedIndex([4, 4, 5, 5], 5); + * // => 2 + * + * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } }; + * + * // using an iteratee function + * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) { + * return this.data[word]; + * }, dict); + * // => 1 + * + * // using the `_.property` callback shorthand + * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x'); + * // => 1 + */ + var sortedIndex = createSortedIndex(); + + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 4, 5, 5], 5); + * // => 4 + */ + var sortedLastIndex = createSortedIndex(true); + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (guard ? isIterateeCall(array, n, guard) : n == null) { + n = 1; + } + n = length - (+n || 0); + return baseSlice(array, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is bound to `thisArg` + * and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRightWhile([1, 2, 3], function(n) { + * return n > 1; + * }); + * // => [2, 3] + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); + * // => ['pebbles'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.takeRightWhile(users, 'active', false), 'user'); + * // => ['fred', 'pebbles'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.takeRightWhile(users, 'active'), 'user'); + * // => [] + */ + function takeRightWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true) + : []; + } + + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is bound to + * `thisArg` and invoked with three arguments: (value, index, array). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to query. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeWhile([1, 2, 3], function(n) { + * return n < 3; + * }); + * // => [1, 2] + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false}, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user'); + * // => ['barney'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.takeWhile(users, 'active', false), 'user'); + * // => ['barney', 'fred'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.takeWhile(users, 'active'), 'user'); + * // => [] + */ + function takeWhile(array, predicate, thisArg) { + return (array && array.length) + ? baseWhile(array, getCallback(predicate, thisArg, 3)) + : []; + } + + /** + * Creates an array of unique values, in order, from all of the provided arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([1, 2], [4, 2], [2, 1]); + * // => [1, 2, 4] + */ + var union = restParam(function(arrays) { + return baseUniq(baseFlatten(arrays, false, true)); + }); + + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurence of each element + * is kept. Providing `true` for `isSorted` performs a faster search algorithm + * for sorted arrays. If an iteratee function is provided it is invoked for + * each element in the array to generate the criterion by which uniqueness + * is computed. The `iteratee` is bound to `thisArg` and invoked with three + * arguments: (value, index, array). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias unique + * @category Array + * @param {Array} array The array to inspect. + * @param {boolean} [isSorted] Specify the array is sorted. + * @param {Function|Object|string} [iteratee] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new duplicate-value-free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + * + * // using `isSorted` + * _.uniq([1, 1, 2], true); + * // => [1, 2] + * + * // using an iteratee function + * _.uniq([1, 2.5, 1.5, 2], function(n) { + * return this.floor(n); + * }, Math); + * // => [1, 2.5] + * + * // using the `_.property` callback shorthand + * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniq(array, isSorted, iteratee, thisArg) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (isSorted != null && typeof isSorted != 'boolean') { + thisArg = iteratee; + iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted; + isSorted = false; + } + var callback = getCallback(); + if (!(iteratee == null && callback === baseCallback)) { + iteratee = callback(iteratee, thisArg, 3); + } + return (isSorted && getIndexOf() == baseIndexOf) + ? sortedUniq(array, iteratee) + : baseUniq(array, iteratee); + } + + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]); + * // => [['fred', 30, true], ['barney', 40, false]] + * + * _.unzip(zipped); + * // => [['fred', 'barney'], [30, 40], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var index = -1, + length = 0; + + array = arrayFilter(array, function(group) { + if (isArrayLike(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + var result = Array(length); + while (++index < length) { + result[index] = arrayMap(array, baseProperty(index)); + } + return result; + } + + /** + * This method is like `_.unzip` except that it accepts an iteratee to specify + * how regrouped values should be combined. The `iteratee` is bound to `thisArg` + * and invoked with four arguments: (accumulator, value, index, group). + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee] The function to combine regrouped values. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee, thisArg) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + iteratee = bindCallback(iteratee, thisArg, 4); + return arrayMap(result, function(group) { + return arrayReduce(group, iteratee, undefined, true); + }); + } + + /** + * Creates an array excluding all provided values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array to filter. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.without([1, 2, 1, 3], 1, 2); + * // => [3] + */ + var without = restParam(function(array, values) { + return isArrayLike(array) + ? baseDifference(array, values) + : []; + }); + + /** + * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the provided arrays. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of values. + * @example + * + * _.xor([1, 2], [4, 2]); + * // => [1, 4] + */ + function xor() { + var index = -1, + length = arguments.length; + + while (++index < length) { + var array = arguments[index]; + if (isArrayLike(array)) { + var result = result + ? arrayPush(baseDifference(result, array), baseDifference(array, result)) + : array; + } + } + return result ? baseUniq(result) : []; + } + + /** + * Creates an array of grouped elements, the first of which contains the first + * elements of the given arrays, the second of which contains the second elements + * of the given arrays, and so on. + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['fred', 'barney'], [30, 40], [true, false]); + * // => [['fred', 30, true], ['barney', 40, false]] + */ + var zip = restParam(unzip); + + /** + * The inverse of `_.pairs`; this method returns an object composed from arrays + * of property names and values. Provide either a single two dimensional array, + * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names + * and one of corresponding values. + * + * @static + * @memberOf _ + * @alias object + * @category Array + * @param {Array} props The property names. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject([['fred', 30], ['barney', 40]]); + * // => { 'fred': 30, 'barney': 40 } + * + * _.zipObject(['fred', 'barney'], [30, 40]); + * // => { 'fred': 30, 'barney': 40 } + */ + function zipObject(props, values) { + var index = -1, + length = props ? props.length : 0, + result = {}; + + if (length && !values && !isArray(props[0])) { + values = []; + } + while (++index < length) { + var key = props[index]; + if (values) { + result[key] = values[index]; + } else if (key) { + result[key[0]] = key[1]; + } + } + return result; + } + + /** + * This method is like `_.zip` except that it accepts an iteratee to specify + * how grouped values should be combined. The `iteratee` is bound to `thisArg` + * and invoked with four arguments: (accumulator, value, index, group). + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee] The function to combine grouped values. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], _.add); + * // => [111, 222] + */ + var zipWith = restParam(function(arrays) { + var length = arrays.length, + iteratee = length > 2 ? arrays[length - 2] : undefined, + thisArg = length > 1 ? arrays[length - 1] : undefined; + + if (length > 2 && typeof iteratee == 'function') { + length -= 2; + } else { + iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined; + thisArg = undefined; + } + arrays.length = length; + return unzipWith(arrays, iteratee, thisArg); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object that wraps `value` with explicit method + * chaining enabled. + * + * @static + * @memberOf _ + * @category Chain + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _.chain(users) + * .sortBy('age') + * .map(function(chr) { + * return chr.user + ' is ' + chr.age; + * }) + * .first() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor is + * bound to `thisArg` and invoked with one argument; (value). The purpose of + * this method is to "tap into" a method chain in order to perform operations + * on intermediate results within the chain. + * + * @static + * @memberOf _ + * @category Chain + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @param {*} [thisArg] The `this` binding of `interceptor`. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor, thisArg) { + interceptor.call(thisArg, value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * + * @static + * @memberOf _ + * @category Chain + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @param {*} [thisArg] The `this` binding of `interceptor`. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor, thisArg) { + return interceptor.call(thisArg, value); + } + + /** + * Enables explicit method chaining on the wrapper object. + * + * @name chain + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // without explicit chaining + * _(users).first(); + * // => { 'user': 'barney', 'age': 36 } + * + * // with explicit chaining + * _(users).chain() + * .first() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chained sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + + /** + * Creates a new array joining a wrapped array with any additional arrays + * and/or values. + * + * @name concat + * @memberOf _ + * @category Chain + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var wrapped = _(array).concat(2, [3], [[4]]); + * + * console.log(wrapped.value()); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + var wrapperConcat = restParam(function(values) { + values = baseFlatten(values); + return this.thru(function(array) { + return arrayConcat(isArray(array) ? array : [toObject(array)], values); + }); + }); + + /** + * Creates a clone of the chained sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).map(function(value) { + * return Math.pow(value, 2); + * }); + * + * var other = [3, 4]; + * var otherWrapped = wrapped.plant(other); + * + * otherWrapped.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } + + /** + * Reverses the wrapped array so the first element becomes the last, the + * second element becomes the second to last, and so on. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @category Chain + * @returns {Object} Returns the new reversed `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + + var interceptor = function(value) { + return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse(); + }; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(interceptor); + } + + /** + * Produces the result of coercing the unwrapped value to a string. + * + * @name toString + * @memberOf _ + * @category Chain + * @returns {string} Returns the coerced string value. + * @example + * + * _([1, 2, 3]).toString(); + * // => '1,2,3' + */ + function wrapperToString() { + return (this.value() + ''); + } + + /** + * Executes the chained sequence to extract the unwrapped value. + * + * @name value + * @memberOf _ + * @alias run, toJSON, valueOf + * @category Chain + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements corresponding to the given keys, or indexes, + * of `collection`. Keys may be specified as individual arguments or as arrays + * of keys. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {...(number|number[]|string|string[])} [props] The property names + * or indexes of elements to pick, specified individually or in arrays. + * @returns {Array} Returns the new array of picked elements. + * @example + * + * _.at(['a', 'b', 'c'], [0, 2]); + * // => ['a', 'c'] + * + * _.at(['barney', 'fred', 'pebbles'], 0, 2); + * // => ['barney', 'pebbles'] + */ + var at = restParam(function(collection, props) { + return baseAt(collection, baseFlatten(props)); + }); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` through `iteratee`. The corresponding value + * of each key is the number of times the key was returned by `iteratee`. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([4.3, 6.1, 6.4], function(n) { + * return Math.floor(n); + * }); + * // => { '4': 1, '6': 2 } + * + * _.countBy([4.3, 6.1, 6.4], function(n) { + * return this.floor(n); + * }, Math); + * // => { '4': 1, '6': 2 } + * + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1); + }); + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * The predicate is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias all + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.every(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = getCallback(predicate, thisArg, 3); + } + return func(collection, predicate); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is bound to `thisArg` and + * invoked with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias select + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the new filtered array. + * @example + * + * _.filter([4, 5, 6], function(n) { + * return n % 2 == 0; + * }); + * // => [4, 6] + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user'); + * // => ['barney'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.filter(users, 'active', false), 'user'); + * // => ['fred'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.filter(users, 'active'), 'user'); + * // => ['barney'] + */ + function filter(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayFilter : baseFilter; + predicate = getCallback(predicate, thisArg, 3); + return func(collection, predicate); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is bound to `thisArg` and + * invoked with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias detect + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.result(_.find(users, function(chr) { + * return chr.age < 40; + * }), 'user'); + * // => 'barney' + * + * // using the `_.matches` callback shorthand + * _.result(_.find(users, { 'age': 1, 'active': true }), 'user'); + * // => 'pebbles' + * + * // using the `_.matchesProperty` callback shorthand + * _.result(_.find(users, 'active', false), 'user'); + * // => 'fred' + * + * // using the `_.property` callback shorthand + * _.result(_.find(users, 'active'), 'user'); + * // => 'barney' + */ + var find = createFind(baseEach); + + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(baseEachRight, true); + + /** + * Performs a deep comparison between each element in `collection` and the + * source object, returning the first element that has equivalent property + * values. + * + * **Note:** This method supports comparing arrays, booleans, `Date` objects, + * numbers, `Object` objects, regexes, and strings. Objects are compared by + * their own, not inherited, enumerable properties. For comparing a single + * own or inherited property value see `_.matchesProperty`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Object} source The object of property values to match. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user'); + * // => 'barney' + * + * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user'); + * // => 'fred' + */ + function findWhere(collection, source) { + return find(collection, baseMatches(source)); + } + + /** + * Iterates over elements of `collection` invoking `iteratee` for each element. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). Iteratee functions may exit iteration early + * by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" property + * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn` + * may be used for object iteration. + * + * @static + * @memberOf _ + * @alias each + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array|Object|string} Returns `collection`. + * @example + * + * _([1, 2]).forEach(function(n) { + * console.log(n); + * }).value(); + * // => logs each value from left to right and returns the array + * + * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) { + * console.log(n, key); + * }); + * // => logs each value-key pair and returns the object (iteration order is not guaranteed) + */ + var forEach = createForEach(arrayEach, baseEach); + + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @alias eachRight + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array|Object|string} Returns `collection`. + * @example + * + * _([1, 2]).forEachRight(function(n) { + * console.log(n); + * }).value(); + * // => logs each value from right to left and returns the array + */ + var forEachRight = createForEach(arrayEachRight, baseEachRight); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` through `iteratee`. The corresponding value + * of each key is an array of the elements responsible for generating the key. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([4.2, 6.1, 6.4], function(n) { + * return Math.floor(n); + * }); + * // => { '4': [4.2], '6': [6.1, 6.4] } + * + * _.groupBy([4.2, 6.1, 6.4], function(n) { + * return this.floor(n); + * }, Math); + * // => { '4': [4.2], '6': [6.1, 6.4] } + * + * // using the `_.property` callback shorthand + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + result[key] = [value]; + } + }); + + /** + * Checks if `value` is in `collection` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it is used as the offset + * from the end of `collection`. + * + * @static + * @memberOf _ + * @alias contains, include + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {*} target The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. + * @returns {boolean} Returns `true` if a matching element is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'user': 'fred', 'age': 40 }, 'fred'); + * // => true + * + * _.includes('pebbles', 'eb'); + * // => true + */ + function includes(collection, target, fromIndex, guard) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + collection = values(collection); + length = collection.length; + } + if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) { + fromIndex = 0; + } else { + fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); + } + return (typeof collection == 'string' || !isArray(collection) && isString(collection)) + ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1) + : (!!length && getIndexOf(collection, target, fromIndex) > -1); + } + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` through `iteratee`. The corresponding value + * of each key is the last element responsible for generating the key. The + * iteratee function is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var keyData = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.indexBy(keyData, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + * + * _.indexBy(keyData, function(object) { + * return String.fromCharCode(object.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.indexBy(keyData, function(object) { + * return this.fromCharCode(object.code); + * }, String); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + */ + var indexBy = createAggregator(function(result, value, key) { + result[key] = value; + }); + + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `methodName` is a function it is + * invoked for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invoke([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invoke = restParam(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + isProp = isKey(path), + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined); + result[++index] = func ? func.apply(value, args) : invokePath(value, path, args); + }); + return result; + }); + + /** + * Creates an array of values by running each element in `collection` through + * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three + * arguments: (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, + * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, + * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, + * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, + * `sum`, `uniq`, and `words` + * + * @static + * @memberOf _ + * @alias collect + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new mapped array. + * @example + * + * function timesThree(n) { + * return n * 3; + * } + * + * _.map([1, 2], timesThree); + * // => [3, 6] + * + * _.map({ 'a': 1, 'b': 2 }, timesThree); + * // => [3, 6] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // using the `_.property` callback shorthand + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee, thisArg) { + var func = isArray(collection) ? arrayMap : baseMap; + iteratee = getCallback(iteratee, thisArg, 3); + return func(collection, iteratee); + } + + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, while the second of which + * contains elements `predicate` returns falsey for. The predicate is bound + * to `thisArg` and invoked with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * _.partition([1, 2, 3], function(n) { + * return n % 2; + * }); + * // => [[1, 3], [2]] + * + * _.partition([1.2, 2.3, 3.4], function(n) { + * return this.floor(n) % 2; + * }, Math); + * // => [[1.2, 3.4], [2.3]] + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * var mapper = function(array) { + * return _.pluck(array, 'user'); + * }; + * + * // using the `_.matches` callback shorthand + * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper); + * // => [['pebbles'], ['barney', 'fred']] + * + * // using the `_.matchesProperty` callback shorthand + * _.map(_.partition(users, 'active', false), mapper); + * // => [['barney', 'pebbles'], ['fred']] + * + * // using the `_.property` callback shorthand + * _.map(_.partition(users, 'active'), mapper); + * // => [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); + + /** + * Gets the property value of `path` from all elements in `collection`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Array|string} path The path of the property to pluck. + * @returns {Array} Returns the property values. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * _.pluck(users, 'user'); + * // => ['barney', 'fred'] + * + * var userIndex = _.indexBy(users, 'user'); + * _.pluck(userIndex, 'age'); + * // => [36, 40] (iteration order is not guaranteed) + */ + function pluck(collection, path) { + return map(collection, property(path)); + } + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` through `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not provided the first element of `collection` is used as the initial + * value. The `iteratee` is bound to `thisArg` and invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`, + * and `sortByOrder` + * + * @static + * @memberOf _ + * @alias foldl, inject + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {*} Returns the accumulated value. + * @example + * + * _.reduce([1, 2], function(total, n) { + * return total + n; + * }); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) { + * result[key] = n * 3; + * return result; + * }, {}); + * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed) + */ + var reduce = createReduce(arrayReduce, baseEach); + + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @alias foldr + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {*} Returns the accumulated value. + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + var reduceRight = createReduce(arrayReduceRight, baseEachRight); + + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Array} Returns the new filtered array. + * @example + * + * _.reject([1, 2, 3, 4], function(n) { + * return n % 2 == 0; + * }); + * // => [1, 3] + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * // using the `_.matches` callback shorthand + * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user'); + * // => ['barney'] + * + * // using the `_.matchesProperty` callback shorthand + * _.pluck(_.reject(users, 'active', false), 'user'); + * // => ['fred'] + * + * // using the `_.property` callback shorthand + * _.pluck(_.reject(users, 'active'), 'user'); + * // => ['barney'] + */ + function reject(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayFilter : baseFilter; + predicate = getCallback(predicate, thisArg, 3); + return func(collection, function(value, index, collection) { + return !predicate(value, index, collection); + }); + } + + /** + * Gets a random element or `n` random elements from a collection. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to sample. + * @param {number} [n] The number of elements to sample. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {*} Returns the random sample(s). + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + * + * _.sample([1, 2, 3, 4], 2); + * // => [3, 1] + */ + function sample(collection, n, guard) { + if (guard ? isIterateeCall(collection, n, guard) : n == null) { + collection = toIterable(collection); + var length = collection.length; + return length > 0 ? collection[baseRandom(0, length - 1)] : undefined; + } + var index = -1, + result = toArray(collection), + length = result.length, + lastIndex = length - 1; + + n = nativeMin(n < 0 ? 0 : (+n || 0), length); + while (++index < n) { + var rand = baseRandom(index, lastIndex), + value = result[rand]; + + result[rand] = result[index]; + result[index] = value; + } + result.length = n; + return result; + } + + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + return sample(collection, POSITIVE_INFINITY); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable properties for objects. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the size of `collection`. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + var length = collection ? getLength(collection) : 0; + return isLength(length) ? length : keys(collection).length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * The function returns as soon as it finds a passing value and does not iterate + * over the entire collection. The predicate is bound to `thisArg` and invoked + * with three arguments: (value, index|key, collection). + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @alias any + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // using the `_.matches` callback shorthand + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // using the `_.matchesProperty` callback shorthand + * _.some(users, 'active', false); + * // => true + * + * // using the `_.property` callback shorthand + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, thisArg) { + var func = isArray(collection) ? arraySome : baseSome; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = undefined; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = getCallback(predicate, thisArg, 3); + } + return func(collection, predicate); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection through `iteratee`. This method performs + * a stable sort, that is, it preserves the original sort order of equal elements. + * The `iteratee` is bound to `thisArg` and invoked with three arguments: + * (value, index|key, collection). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new sorted array. + * @example + * + * _.sortBy([1, 2, 3], function(n) { + * return Math.sin(n); + * }); + * // => [3, 1, 2] + * + * _.sortBy([1, 2, 3], function(n) { + * return this.sin(n); + * }, Math); + * // => [3, 1, 2] + * + * var users = [ + * { 'user': 'fred' }, + * { 'user': 'pebbles' }, + * { 'user': 'barney' } + * ]; + * + * // using the `_.property` callback shorthand + * _.pluck(_.sortBy(users, 'user'), 'user'); + * // => ['barney', 'fred', 'pebbles'] + */ + function sortBy(collection, iteratee, thisArg) { + if (collection == null) { + return []; + } + if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { + iteratee = undefined; + } + var index = -1; + iteratee = getCallback(iteratee, thisArg, 3); + + var result = baseMap(collection, function(value, key, collection) { + return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value }; + }); + return baseSortBy(result, compareAscending); + } + + /** + * This method is like `_.sortBy` except that it can sort by multiple iteratees + * or property names. + * + * If a property name is provided for an iteratee the created `_.property` + * style callback returns the property value of the given element. + * + * If an object is provided for an iteratee the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees + * The iteratees to sort by, specified as individual values or arrays of values. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 42 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.map(_.sortByAll(users, ['user', 'age']), _.values); + * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]] + * + * _.map(_.sortByAll(users, 'user', function(chr) { + * return Math.floor(chr.age / 10); + * }), _.values); + * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] + */ + var sortByAll = restParam(function(collection, iteratees) { + if (collection == null) { + return []; + } + var guard = iteratees[2]; + if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) { + iteratees.length = 1; + } + return baseSortByOrder(collection, baseFlatten(iteratees), []); + }); + + /** + * This method is like `_.sortByAll` except that it allows specifying the + * sort orders of the iteratees to sort by. If `orders` is unspecified, all + * values are sorted in ascending order. Otherwise, a value is sorted in + * ascending order if its corresponding order is "asc", and descending if "desc". + * + * If a property name is provided for an iteratee the created `_.property` + * style callback returns the property value of the given element. + * + * If an object is provided for an iteratee the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {boolean[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 42 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // sort by `user` in ascending order and by `age` in descending order + * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values); + * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] + */ + function sortByOrder(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (guard && isIterateeCall(iteratees, orders, guard)) { + orders = undefined; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseSortByOrder(collection, iteratees, orders); + } + + /** + * Performs a deep comparison between each element in `collection` and the + * source object, returning an array of all elements that have equivalent + * property values. + * + * **Note:** This method supports comparing arrays, booleans, `Date` objects, + * numbers, `Object` objects, regexes, and strings. Objects are compared by + * their own, not inherited, enumerable properties. For comparing a single + * own or inherited property value see `_.matchesProperty`. + * + * @static + * @memberOf _ + * @category Collection + * @param {Array|Object|string} collection The collection to search. + * @param {Object} source The object of property values to match. + * @returns {Array} Returns the new filtered array. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] }, + * { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] } + * ]; + * + * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user'); + * // => ['barney'] + * + * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user'); + * // => ['fred'] + */ + function where(collection, source) { + return filter(collection, baseMatches(source)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Gets the number of milliseconds that have elapsed since the Unix epoch + * (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @category Date + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => logs the number of milliseconds it took for the deferred function to be invoked + */ + var now = nativeNow || function() { + return new Date().getTime(); + }; + + /*------------------------------------------------------------------------*/ + + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it is called `n` or more times. + * + * @static + * @memberOf _ + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => logs 'done saving!' after the two async saves have completed + */ + function after(n, func) { + if (typeof func != 'function') { + if (typeof n == 'function') { + var temp = n; + n = func; + func = temp; + } else { + throw new TypeError(FUNC_ERROR_TEXT); + } + } + n = nativeIsFinite(n = +n) ? n : 0; + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that accepts up to `n` arguments ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Function} Returns the new function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + if (guard && isIterateeCall(func, n, guard)) { + n = undefined; + } + n = (func && n == null) ? func.length : nativeMax(+n || 0, 0); + return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n); + } + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it is called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery('#add').on('click', _.before(5, addContactToList)); + * // => allows adding up to 4 contacts to the list + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + if (typeof n == 'function') { + var temp = n; + n = func; + func = temp; + } else { + throw new TypeError(FUNC_ERROR_TEXT); + } + } + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and prepends any additional `_.bind` arguments to those provided to the + * bound function. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind` this method does not set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var greet = function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * }; + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // using placeholders + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = restParam(function(func, thisArg, partials) { + var bitmask = BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, bind.placeholder); + bitmask |= PARTIAL_FLAG; + } + return createWrapper(func, bitmask, thisArg, partials, holders); + }); + + /** + * Binds methods of an object to the object itself, overwriting the existing + * method. Method names may be specified as individual arguments or as arrays + * of method names. If no method names are provided all enumerable function + * properties, own and inherited, of `object` are bound. + * + * **Note:** This method does not set the "length" property of bound functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Object} object The object to bind and assign the bound methods to. + * @param {...(string|string[])} [methodNames] The object method names to bind, + * specified as individual method names or arrays of method names. + * @returns {Object} Returns `object`. + * @example + * + * var view = { + * 'label': 'docs', + * 'onClick': function() { + * console.log('clicked ' + this.label); + * } + * }; + * + * _.bindAll(view); + * jQuery('#docs').on('click', view.onClick); + * // => logs 'clicked docs' when the element is clicked + */ + var bindAll = restParam(function(object, methodNames) { + methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object); + + var index = -1, + length = methodNames.length; + + while (++index < length) { + var key = methodNames[index]; + object[key] = createWrapper(object[key], BIND_FLAG, object); + } + return object; + }); + + /** + * Creates a function that invokes the method at `object[key]` and prepends + * any additional `_.bindKey` arguments to those provided to the bound function. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. + * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @category Function + * @param {Object} object The object the method belongs to. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // using placeholders + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = restParam(function(object, key, partials) { + var bitmask = BIND_FLAG | BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, bindKey.placeholder); + bitmask |= PARTIAL_FLAG; + } + return createWrapper(key, bitmask, object, partials, holders); + }); + + /** + * Creates a function that accepts one or more arguments of `func` that when + * called either invokes `func` returning its result, if all `func` arguments + * have been provided, or returns a function that accepts one or more of the + * remaining `func` arguments, and so on. The arity of `func` may be specified + * if `func.length` is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method does not set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // using placeholders + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + var curry = createCurry(CURRY_FLAG); + + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method does not set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // using placeholders + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + var curryRight = createCurry(CURRY_RIGHT_FLAG); + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed invocations. Provide an options object to indicate that `func` + * should be invoked on the leading and/or trailing edge of the `wait` timeout. + * Subsequent calls to the debounced function return the result of the last + * `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked + * on the trailing edge of the timeout only if the the debounced function is + * invoked more than once during the `wait` timeout. + * + * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options] The options object. + * @param {boolean} [options.leading=false] Specify invoking on the leading + * edge of the timeout. + * @param {number} [options.maxWait] The maximum time `func` is allowed to be + * delayed before it is invoked. + * @param {boolean} [options.trailing=true] Specify invoking on the trailing + * edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // avoid costly calculations while the window size is in flux + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // invoke `sendMail` when the click event is fired, debouncing subsequent calls + * jQuery('#postbox').on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // ensure `batchLog` is invoked once after 1 second of debounced calls + * var source = new EventSource('/stream'); + * jQuery(source).on('message', _.debounce(batchLog, 250, { + * 'maxWait': 1000 + * })); + * + * // cancel a debounced call + * var todoChanges = _.debounce(batchLog, 1000); + * Object.observe(models.todo, todoChanges); + * + * Object.observe(models, function(changes) { + * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) { + * todoChanges.cancel(); + * } + * }, ['delete']); + * + * // ...at some point `models.todo` is changed + * models.todo.completed = true; + * + * // ...before 1 second has passed `models.todo` is deleted + * // which cancels the debounced `todoChanges` call + * delete models.todo; + */ + function debounce(func, wait, options) { + var args, + maxTimeoutId, + result, + stamp, + thisArg, + timeoutId, + trailingCall, + lastCalled = 0, + maxWait = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = wait < 0 ? 0 : (+wait || 0); + if (options === true) { + var leading = true; + trailing = false; + } else if (isObject(options)) { + leading = !!options.leading; + maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait); + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function cancel() { + if (timeoutId) { + clearTimeout(timeoutId); + } + if (maxTimeoutId) { + clearTimeout(maxTimeoutId); + } + lastCalled = 0; + maxTimeoutId = timeoutId = trailingCall = undefined; + } + + function complete(isCalled, id) { + if (id) { + clearTimeout(id); + } + maxTimeoutId = timeoutId = trailingCall = undefined; + if (isCalled) { + lastCalled = now(); + result = func.apply(thisArg, args); + if (!timeoutId && !maxTimeoutId) { + args = thisArg = undefined; + } + } + } + + function delayed() { + var remaining = wait - (now() - stamp); + if (remaining <= 0 || remaining > wait) { + complete(trailingCall, maxTimeoutId); + } else { + timeoutId = setTimeout(delayed, remaining); + } + } + + function maxDelayed() { + complete(trailing, timeoutId); + } + + function debounced() { + args = arguments; + stamp = now(); + thisArg = this; + trailingCall = trailing && (timeoutId || !leading); + + if (maxWait === false) { + var leadingCall = leading && !timeoutId; + } else { + if (!maxTimeoutId && !leading) { + lastCalled = stamp; + } + var remaining = maxWait - (stamp - lastCalled), + isCalled = remaining <= 0 || remaining > maxWait; + + if (isCalled) { + if (maxTimeoutId) { + maxTimeoutId = clearTimeout(maxTimeoutId); + } + lastCalled = stamp; + result = func.apply(thisArg, args); + } + else if (!maxTimeoutId) { + maxTimeoutId = setTimeout(maxDelayed, remaining); + } + } + if (isCalled && timeoutId) { + timeoutId = clearTimeout(timeoutId); + } + else if (!timeoutId && wait !== maxWait) { + timeoutId = setTimeout(delayed, wait); + } + if (leadingCall) { + isCalled = true; + result = func.apply(thisArg, args); + } + if (isCalled && !timeoutId && !maxTimeoutId) { + args = thisArg = undefined; + } + return result; + } + debounced.cancel = cancel; + return debounced; + } + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it is invoked. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke the function with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // logs 'deferred' after one or more milliseconds + */ + var defer = restParam(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it is invoked. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke the function with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => logs 'later' after one second + */ + var delay = restParam(function(func, wait, args) { + return baseDelay(func, wait, args); + }); + + /** + * Creates a function that returns the result of invoking the provided + * functions with the `this` binding of the created function, where each + * successive invocation is supplied the return value of the previous. + * + * @static + * @memberOf _ + * @category Function + * @param {...Function} [funcs] Functions to invoke. + * @returns {Function} Returns the new function. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var addSquare = _.flow(_.add, square); + * addSquare(1, 2); + * // => 9 + */ + var flow = createFlow(); + + /** + * This method is like `_.flow` except that it creates a function that + * invokes the provided functions from right to left. + * + * @static + * @memberOf _ + * @alias backflow, compose + * @category Function + * @param {...Function} [funcs] Functions to invoke. + * @returns {Function} Returns the new function. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var addSquare = _.flowRight(square, _.add); + * addSquare(1, 2); + * // => 9 + */ + var flowRight = createFlow(true); + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is coerced to a string and used as the + * cache key. The `func` is invoked with the `this` binding of the memoized + * function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object) + * method interface of `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoizing function. + * @example + * + * var upperCase = _.memoize(function(string) { + * return string.toUpperCase(); + * }); + * + * upperCase('fred'); + * // => 'FRED' + * + * // modifying the result cache + * upperCase.cache.set('fred', 'BARNEY'); + * upperCase('fred'); + * // => 'BARNEY' + * + * // replacing `_.memoize.Cache` + * var object = { 'user': 'fred' }; + * var other = { 'user': 'barney' }; + * var identity = _.memoize(_.identity); + * + * identity(object); + * // => { 'user': 'fred' } + * identity(other); + * // => { 'user': 'fred' } + * + * _.memoize.Cache = WeakMap; + * var identity = _.memoize(_.identity); + * + * identity(object); + * // => { 'user': 'fred' } + * identity(other); + * // => { 'user': 'barney' } + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new memoize.Cache; + return memoized; + } + + /** + * Creates a function that runs each argument through a corresponding + * transform function. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms] The functions to transform + * arguments, specified as individual functions or arrays of functions. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var modded = _.modArgs(function(x, y) { + * return [x, y]; + * }, square, doubled); + * + * modded(1, 2); + * // => [1, 4] + * + * modded(5, 10); + * // => [25, 20] + */ + var modArgs = restParam(function(func, transforms) { + transforms = baseFlatten(transforms); + if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = transforms.length; + return restParam(function(args) { + var index = nativeMin(args.length, length); + while (index--) { + args[index] = transforms[index](args[index]); + } + return func.apply(this, args); + }); + }); + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + return !predicate.apply(this, arguments); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first call. The `func` is invoked + * with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // `initialize` invokes `createApplication` once + */ + function once(func) { + return before(2, func); + } + + /** + * Creates a function that invokes `func` with `partial` arguments prepended + * to those provided to the new function. This method is like `_.bind` except + * it does **not** alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method does not set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * var greet = function(greeting, name) { + * return greeting + ' ' + name; + * }; + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // using placeholders + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = createPartial(PARTIAL_FLAG); + + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to those provided to the new function. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method does not set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * var greet = function(greeting, name) { + * return greeting + ' ' + name; + * }; + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // using placeholders + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = createPartial(PARTIAL_RIGHT_FLAG); + + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified indexes where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes, + * specified as individual indexes or arrays of indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, 2, 0, 1); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + * + * var map = _.rearg(_.map, [1, 0]); + * map(function(n) { + * return n * 3; + * }, [1, 2, 3]); + * // => [3, 6, 9] + */ + var rearg = restParam(function(func, indexes) { + return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes)); + }); + + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as an array. + * + * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.restParam(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function restParam(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + rest = Array(length); + + while (++index < length) { + rest[index] = args[start + index]; + } + switch (start) { + case 0: return func.call(this, rest); + case 1: return func.call(this, args[0], rest); + case 2: return func.call(this, args[0], args[1], rest); + } + var otherArgs = Array(start + 1); + index = -1; + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = rest; + return func.apply(this, otherArgs); + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of the created + * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3). + * + * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator). + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to spread arguments over. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * // with a Promise + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function(array) { + return func.apply(this, array); + }; + } + + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed invocations. Provide an options object to indicate + * that `func` should be invoked on the leading and/or trailing edge of the + * `wait` timeout. Subsequent calls to the throttled function return the + * result of the last `func` call. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked + * on the trailing edge of the timeout only if the the throttled function is + * invoked more than once during the `wait` timeout. + * + * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options] The options object. + * @param {boolean} [options.leading=true] Specify invoking on the leading + * edge of the timeout. + * @param {boolean} [options.trailing=true] Specify invoking on the trailing + * edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // avoid excessively updating the position while scrolling + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes + * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, { + * 'trailing': false + * })); + * + * // cancel a trailing throttled call + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (options === false) { + leading = false; + } else if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing }); + } + + /** + * Creates a function that provides `value` to the wrapper function as its + * first argument. Any additional arguments provided to the function are + * appended to those provided to the wrapper function. The wrapper is invoked + * with the `this` binding of the created function. + * + * @static + * @memberOf _ + * @category Function + * @param {*} value The value to wrap. + * @param {Function} wrapper The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ + function wrap(value, wrapper) { + wrapper = wrapper == null ? identity : wrapper; + return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned, + * otherwise they are assigned by reference. If `customizer` is provided it is + * invoked to produce the cloned values. If `customizer` returns `undefined` + * cloning is handled by the method instead. The `customizer` is bound to + * `thisArg` and invoked with two argument; (value [, index|key, object]). + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). + * The enumerable properties of `arguments` objects and objects created by + * constructors other than `Object` are cloned to plain `Object` objects. An + * empty object is returned for uncloneable values such as functions, DOM nodes, + * Maps, Sets, and WeakMaps. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @param {Function} [customizer] The function to customize cloning values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {*} Returns the cloned value. + * @example + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * var shallow = _.clone(users); + * shallow[0] === users[0]; + * // => true + * + * var deep = _.clone(users, true); + * deep[0] === users[0]; + * // => false + * + * // using a customizer callback + * var el = _.clone(document.body, function(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * }); + * + * el === document.body + * // => false + * el.nodeName + * // => BODY + * el.childNodes.length; + * // => 0 + */ + function clone(value, isDeep, customizer, thisArg) { + if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) { + isDeep = false; + } + else if (typeof isDeep == 'function') { + thisArg = customizer; + customizer = isDeep; + isDeep = false; + } + return typeof customizer == 'function' + ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1)) + : baseClone(value, isDeep); + } + + /** + * Creates a deep clone of `value`. If `customizer` is provided it is invoked + * to produce the cloned values. If `customizer` returns `undefined` cloning + * is handled by the method instead. The `customizer` is bound to `thisArg` + * and invoked with two argument; (value [, index|key, object]). + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm). + * The enumerable properties of `arguments` objects and objects created by + * constructors other than `Object` are cloned to plain `Object` objects. An + * empty object is returned for uncloneable values such as functions, DOM nodes, + * Maps, Sets, and WeakMaps. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to deep clone. + * @param {Function} [customizer] The function to customize cloning values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {*} Returns the deep cloned value. + * @example + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * var deep = _.cloneDeep(users); + * deep[0] === users[0]; + * // => false + * + * // using a customizer callback + * var el = _.cloneDeep(document.body, function(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * }); + * + * el === document.body + * // => false + * el.nodeName + * // => BODY + * el.childNodes.length; + * // => 20 + */ + function cloneDeep(value, customizer, thisArg) { + return typeof customizer == 'function' + ? baseClone(value, true, bindCallback(customizer, thisArg, 1)) + : baseClone(value, true); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`. + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + function gt(value, other) { + return value > other; + } + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`. + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + function gte(value, other) { + return value >= other; + } + + /** + * Checks if `value` is classified as an `arguments` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + function isArguments(value) { + return isObjectLike(value) && isArrayLike(value) && + hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); + } + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ + var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; + }; + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag); + } + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + function isDate(value) { + return isObjectLike(value) && objToString.call(value) == dateTag; + } + + /** + * Checks if `value` is a DOM element. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value); + } + + /** + * Checks if `value` is empty. A value is considered empty unless it is an + * `arguments` object, array, string, or jQuery-like collection with a length + * greater than `0` or an object with own enumerable properties. + * + * @static + * @memberOf _ + * @category Lang + * @param {Array|Object|string} value The value to inspect. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) || + (isObjectLike(value) && isFunction(value.splice)))) { + return !value.length; + } + return !keys(value).length; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. If `customizer` is provided it is invoked to compare values. + * If `customizer` returns `undefined` comparisons are handled by the method + * instead. The `customizer` is bound to `thisArg` and invoked with three + * arguments: (value, other [, index|key]). + * + * **Note:** This method supports comparing arrays, booleans, `Date` objects, + * numbers, `Object` objects, regexes, and strings. Objects are compared by + * their own, not inherited, enumerable properties. Functions and DOM nodes + * are **not** supported. Provide a customizer function to extend support + * for comparing other values. + * + * @static + * @memberOf _ + * @alias eq + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize value comparisons. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'user': 'fred' }; + * var other = { 'user': 'fred' }; + * + * object == other; + * // => false + * + * _.isEqual(object, other); + * // => true + * + * // using a customizer callback + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqual(array, other, function(value, other) { + * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) { + * return true; + * } + * }); + * // => true + */ + function isEqual(value, other, customizer, thisArg) { + customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, customizer) : !!result; + } + + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag; + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite). + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(10); + * // => true + * + * _.isFinite('10'); + * // => false + * + * _.isFinite(true); + * // => false + * + * _.isFinite(Object(10)); + * // => false + * + * _.isFinite(Infinity); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; + } + + /** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ + function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); + } + + /** + * Performs a deep comparison between `object` and `source` to determine if + * `object` contains equivalent property values. If `customizer` is provided + * it is invoked to compare values. If `customizer` returns `undefined` + * comparisons are handled by the method instead. The `customizer` is bound + * to `thisArg` and invoked with three arguments: (value, other, index|key). + * + * **Note:** This method supports comparing properties of arrays, booleans, + * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions + * and DOM nodes are **not** supported. Provide a customizer function to extend + * support for comparing other values. + * + * @static + * @memberOf _ + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize value comparisons. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'user': 'fred', 'age': 40 }; + * + * _.isMatch(object, { 'age': 40 }); + * // => true + * + * _.isMatch(object, { 'age': 36 }); + * // => false + * + * // using a customizer callback + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatch(object, source, function(value, other) { + * return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined; + * }); + * // => true + */ + function isMatch(object, source, customizer, thisArg) { + customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined; + return baseIsMatch(object, getMatchData(source), customizer); + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4) + * which returns `true` for `undefined` and other non-numeric values. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some host objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified + * as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isNumber(8.4); + * // => true + * + * _.isNumber(NaN); + * // => true + * + * _.isNumber('8.4'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag); + } + + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * **Note:** This method assumes objects created by the `Object` constructor + * have no inherited enumerable properties. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + var Ctor; + + // Exit early for non `Object` objects. + if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) || + (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) { + return false; + } + // IE < 9 iterates inherited properties before own properties. If the first + // iterated property is an object's own property then there are no inherited + // enumerable properties. + var result; + // In most environments an object's own properties are iterated before + // its inherited properties. If the last iterated property is an object's + // own property then there are no inherited enumerable properties. + baseForIn(value, function(subValue, key) { + result = key; + }); + return result === undefined || hasOwnProperty.call(value, result); + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + function isRegExp(value) { + return isObject(value) && objToString.call(value) == regexpTag; + } + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); + } + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + function isTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; + } + + /** + * Checks if `value` is `undefined`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`. + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + function lt(value, other) { + return value < other; + } + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`. + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + function lte(value, other) { + return value <= other; + } + + /** + * Converts `value` to an array. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * (function() { + * return _.toArray(arguments).slice(1); + * }(1, 2, 3)); + * // => [2, 3] + */ + function toArray(value) { + var length = value ? getLength(value) : 0; + if (!isLength(length)) { + return values(value); + } + if (!length) { + return []; + } + return arrayCopy(value); + } + + /** + * Converts `value` to a plain object flattening inherited enumerable + * properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return baseCopy(value, keysIn(value)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Recursively merges own enumerable properties of the source object(s), that + * don't resolve to `undefined` into the destination object. Subsequent sources + * overwrite property assignments of previous sources. If `customizer` is + * provided it is invoked to produce the merged values of the destination and + * source properties. If `customizer` returns `undefined` merging is handled + * by the method instead. The `customizer` is bound to `thisArg` and invoked + * with five arguments: (objectValue, sourceValue, key, object, source). + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {Object} Returns `object`. + * @example + * + * var users = { + * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }] + * }; + * + * var ages = { + * 'data': [{ 'age': 36 }, { 'age': 40 }] + * }; + * + * _.merge(users, ages); + * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] } + * + * // using a customizer callback + * var object = { + * 'fruits': ['apple'], + * 'vegetables': ['beet'] + * }; + * + * var other = { + * 'fruits': ['banana'], + * 'vegetables': ['carrot'] + * }; + * + * _.merge(object, other, function(a, b) { + * if (_.isArray(a)) { + * return a.concat(b); + * } + * }); + * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] } + */ + var merge = createAssigner(baseMerge); + + /** + * Assigns own enumerable properties of source object(s) to the destination + * object. Subsequent sources overwrite property assignments of previous sources. + * If `customizer` is provided it is invoked to produce the assigned values. + * The `customizer` is bound to `thisArg` and invoked with five arguments: + * (objectValue, sourceValue, key, object, source). + * + * **Note:** This method mutates `object` and is based on + * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign). + * + * @static + * @memberOf _ + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {Object} Returns `object`. + * @example + * + * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); + * // => { 'user': 'fred', 'age': 40 } + * + * // using a customizer callback + * var defaults = _.partialRight(_.assign, function(value, other) { + * return _.isUndefined(value) ? other : value; + * }); + * + * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); + * // => { 'user': 'barney', 'age': 36 } + */ + var assign = createAssigner(function(object, source, customizer) { + return customizer + ? assignWith(object, source, customizer) + : baseAssign(object, source); + }); + + /** + * Creates an object that inherits from the given `prototype` object. If a + * `properties` object is provided its own enumerable properties are assigned + * to the created object. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties, guard) { + var result = baseCreate(prototype); + if (guard && isIterateeCall(prototype, properties, guard)) { + properties = undefined; + } + return properties ? baseAssign(result, properties) : result; + } + + /** + * Assigns own enumerable properties of source object(s) to the destination + * object for all destination properties that resolve to `undefined`. Once a + * property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); + * // => { 'user': 'barney', 'age': 36 } + */ + var defaults = createDefaults(assign, assignDefaults); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } }); + * // => { 'user': { 'name': 'barney', 'age': 36 } } + * + */ + var defaultsDeep = createDefaults(merge, mergeDefaults); + + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {string|undefined} Returns the key of the matched element, else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(chr) { + * return chr.age < 40; + * }); + * // => 'barney' (iteration order is not guaranteed) + * + * // using the `_.matches` callback shorthand + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // using the `_.matchesProperty` callback shorthand + * _.findKey(users, 'active', false); + * // => 'fred' + * + * // using the `_.property` callback shorthand + * _.findKey(users, 'active'); + * // => 'barney' + */ + var findKey = createFindKey(baseForOwn); + + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * If a property name is provided for `predicate` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `predicate` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to search. + * @param {Function|Object|string} [predicate=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {string|undefined} Returns the key of the matched element, else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(chr) { + * return chr.age < 40; + * }); + * // => returns `pebbles` assuming `_.findKey` returns `barney` + * + * // using the `_.matches` callback shorthand + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // using the `_.matchesProperty` callback shorthand + * _.findLastKey(users, 'active', false); + * // => 'fred' + * + * // using the `_.property` callback shorthand + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + var findLastKey = createFindKey(baseForOwnRight); + + /** + * Iterates over own and inherited enumerable properties of an object invoking + * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns `object`. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed) + */ + var forIn = createForIn(baseFor); + + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns `object`. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c' + */ + var forInRight = createForIn(baseForRight); + + /** + * Iterates over own enumerable properties of an object invoking `iteratee` + * for each property. The `iteratee` is bound to `thisArg` and invoked with + * three arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns `object`. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => logs 'a' and 'b' (iteration order is not guaranteed) + */ + var forOwn = createForOwn(baseForOwn); + + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns `object`. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b' + */ + var forOwnRight = createForOwn(baseForOwnRight); + + /** + * Creates an array of function property names from all enumerable properties, + * own and inherited, of `object`. + * + * @static + * @memberOf _ + * @alias methods + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the new array of property names. + * @example + * + * _.functions(_); + * // => ['after', 'ary', 'assign', ...] + */ + function functions(object) { + return baseFunctions(object, keysIn(object)); + } + + /** + * Gets the property value at `path` of `object`. If the resolved value is + * `undefined` the `defaultValue` is used in its place. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned if the resolved value is `undefined`. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, toPath(path), path + ''); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` is a direct property, else `false`. + * @example + * + * var object = { 'a': { 'b': { 'c': 3 } } }; + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b.c'); + * // => true + * + * _.has(object, ['a', 'b', 'c']); + * // => true + */ + function has(object, path) { + if (object == null) { + return false; + } + var result = hasOwnProperty.call(object, path); + if (!result && !isKey(path)) { + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + path = last(path); + result = hasOwnProperty.call(object, path); + } + return result || (isLength(object.length) && isIndex(path, object.length) && + (isArray(object) || isArguments(object))); + } + + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite property + * assignments of previous values unless `multiValue` is `true`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to invert. + * @param {boolean} [multiValue] Allow multiple values per key. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + * + * // with `multiValue` + * _.invert(object, true); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function invert(object, multiValue, guard) { + if (guard && isIterateeCall(object, multiValue, guard)) { + multiValue = undefined; + } + var index = -1, + props = keys(object), + length = props.length, + result = {}; + + while (++index < length) { + var key = props[index], + value = object[key]; + + if (multiValue) { + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + } + else { + result[value] = key; + } + } + return result; + } + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; + }; + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * property of `object` through `iteratee`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the new mapped object. + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + var mapKeys = createObjectMapper(true); + + /** + * Creates an object with the same keys as `object` and values generated by + * running each own enumerable property of `object` through `iteratee`. The + * iteratee function is bound to `thisArg` and invoked with three arguments: + * (value, key, object). + * + * If a property name is provided for `iteratee` the created `_.property` + * style callback returns the property value of the given element. + * + * If a value is also provided for `thisArg` the created `_.matchesProperty` + * style callback returns `true` for elements that have a matching property + * value, else `false`. + * + * If an object is provided for `iteratee` the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the new mapped object. + * @example + * + * _.mapValues({ 'a': 1, 'b': 2 }, function(n) { + * return n * 3; + * }); + * // => { 'a': 3, 'b': 6 } + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * // using the `_.property` callback shorthand + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + var mapValues = createObjectMapper(); + + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable properties of `object` that are not omitted. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {Function|...(string|string[])} [predicate] The function invoked per + * iteration or property names to omit, specified as individual property + * names or arrays of property names. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'user': 'fred', 'age': 40 }; + * + * _.omit(object, 'age'); + * // => { 'user': 'fred' } + * + * _.omit(object, _.isNumber); + * // => { 'user': 'fred' } + */ + var omit = restParam(function(object, props) { + if (object == null) { + return {}; + } + if (typeof props[0] != 'function') { + var props = arrayMap(baseFlatten(props), String); + return pickByArray(object, baseDifference(keysIn(object), props)); + } + var predicate = bindCallback(props[0], props[1], 3); + return pickByCallback(object, function(value, key, object) { + return !predicate(value, key, object); + }); + }); + + /** + * Creates a two dimensional array of the key-value pairs for `object`, + * e.g. `[[key1, value1], [key2, value2]]`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the new array of key-value pairs. + * @example + * + * _.pairs({ 'barney': 36, 'fred': 40 }); + * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) + */ + function pairs(object) { + object = toObject(object); + + var index = -1, + props = keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + var key = props[index]; + result[index] = [key, object[key]]; + } + return result; + } + + /** + * Creates an object composed of the picked `object` properties. Property + * names may be specified as individual arguments or as arrays of property + * names. If `predicate` is provided it is invoked for each property of `object` + * picking the properties `predicate` returns truthy for. The predicate is + * bound to `thisArg` and invoked with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {Function|...(string|string[])} [predicate] The function invoked per + * iteration or property names to pick, specified as individual property + * names or arrays of property names. + * @param {*} [thisArg] The `this` binding of `predicate`. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'user': 'fred', 'age': 40 }; + * + * _.pick(object, 'user'); + * // => { 'user': 'fred' } + * + * _.pick(object, _.isString); + * // => { 'user': 'fred' } + */ + var pick = restParam(function(object, props) { + if (object == null) { + return {}; + } + return typeof props[0] == 'function' + ? pickByCallback(object, bindCallback(props[0], props[1], 3)) + : pickByArray(object, baseFlatten(props)); + }); + + /** + * This method is like `_.get` except that if the resolved value is a function + * it is invoked with the `this` binding of its parent object and its result + * is returned. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned if the resolved value is `undefined`. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a.b.c', 'default'); + * // => 'default' + * + * _.result(object, 'a.b.c', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + var result = object == null ? undefined : object[path]; + if (result === undefined) { + if (object != null && !isKey(path, object)) { + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + result = object == null ? undefined : object[last(path)]; + } + result = result === undefined ? defaultValue : result; + } + return isFunction(result) ? result.call(object) : result; + } + + /** + * Sets the property value of `path` on `object`. If a portion of `path` + * does not exist it is created. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to augment. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, 'x[0].y.z', 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + if (object == null) { + return object; + } + var pathKey = (path + ''); + path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = path[index]; + if (isObject(nested)) { + if (index == lastIndex) { + nested[key] = value; + } else if (nested[key] == null) { + nested[key] = isIndex(path[index + 1]) ? [] : {}; + } + } + nested = nested[key]; + } + return object; + } + + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own enumerable + * properties through `iteratee`, with each invocation potentially mutating + * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked + * with four arguments: (accumulator, value, key, object). Iteratee functions + * may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @category Object + * @param {Array|Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) { + * result[key] = n * 3; + * }); + * // => { 'a': 3, 'b': 6 } + */ + function transform(object, iteratee, accumulator, thisArg) { + var isArr = isArray(object) || isTypedArray(object); + iteratee = getCallback(iteratee, thisArg, 4); + + if (accumulator == null) { + if (isArr || isObject(object)) { + var Ctor = object.constructor; + if (isArr) { + accumulator = isArray(object) ? new Ctor : []; + } else { + accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined); + } + } else { + accumulator = {}; + } + } + (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + + /** + * Creates an array of the own enumerable property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return baseValues(object, keys(object)); + } + + /** + * Creates an array of the own and inherited enumerable property values + * of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return baseValues(object, keysIn(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Checks if `n` is between `start` and up to but not including, `end`. If + * `end` is not specified it is set to `start` with `start` then set to `0`. + * + * @static + * @memberOf _ + * @category Number + * @param {number} n The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `n` is in the range, else `false`. + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + */ + function inRange(value, start, end) { + start = +start || 0; + if (end === undefined) { + end = start; + start = 0; + } else { + end = +end || 0; + } + return value >= nativeMin(start, end) && value < nativeMax(start, end); + } + + /** + * Produces a random number between `min` and `max` (inclusive). If only one + * argument is provided a number between `0` and the given number is returned. + * If `floating` is `true`, or either `min` or `max` are floats, a floating-point + * number is returned instead of an integer. + * + * @static + * @memberOf _ + * @category Number + * @param {number} [min=0] The minimum possible value. + * @param {number} [max=1] The maximum possible value. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(min, max, floating) { + if (floating && isIterateeCall(min, max, floating)) { + max = floating = undefined; + } + var noMin = min == null, + noMax = max == null; + + if (floating == null) { + if (noMax && typeof min == 'boolean') { + floating = min; + min = 1; + } + else if (typeof max == 'boolean') { + floating = max; + noMax = true; + } + } + if (noMin && noMax) { + max = 1; + noMax = false; + } + min = +min || 0; + if (noMax) { + max = min; + min = 0; + } else { + max = +max || 0; + } + if (floating || min % 1 || max % 1) { + var rand = nativeRandom(); + return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max); + } + return baseRandom(min, max); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar'); + * // => 'fooBar' + * + * _.camelCase('__foo_bar__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word); + }); + + /** + * Capitalizes the first character of `string`. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('fred'); + * // => 'Fred' + */ + function capitalize(string) { + string = baseToString(string); + return string && (string.charAt(0).toUpperCase() + string.slice(1)); + } + + /** + * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = baseToString(string); + return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, ''); + } + + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to search. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search from. + * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = baseToString(string); + target = (target + ''); + + var length = string.length; + position = position === undefined + ? length + : nativeMin(position < 0 ? 0 : (+position || 0), length); + + position -= target.length; + return position >= 0 && string.indexOf(target, position) == position; + } + + /** + * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to + * their corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional characters + * use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. + * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * Backticks are escaped because in Internet Explorer < 9, they can break out + * of attribute values or HTML comments. See [#59](https://html5sec.org/#59), + * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and + * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/) + * for more details. + * + * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping) + * to reduce XSS vectors. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + // Reset `lastIndex` because in IE < 9 `String#replace` does not. + string = baseToString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /** + * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?", + * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https:\/\/lodash\.com\/\)' + */ + function escapeRegExp(string) { + string = baseToString(string); + return (string && reHasRegExpChars.test(string)) + ? string.replace(reRegExpChars, escapeRegExpChar) + : (string || '(?:)'); + } + + /** + * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__foo_bar__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = baseToString(string); + length = +length; + + var strLength = string.length; + if (strLength >= length || !nativeIsFinite(length)) { + return string; + } + var mid = (length - strLength) / 2, + leftLength = nativeFloor(mid), + rightLength = nativeCeil(mid); + + chars = createPadding('', rightLength, chars); + return chars.slice(0, leftLength) + string + chars; + } + + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padLeft('abc', 6); + * // => ' abc' + * + * _.padLeft('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padLeft('abc', 3); + * // => 'abc' + */ + var padLeft = createPadDir(); + + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padRight('abc', 6); + * // => 'abc ' + * + * _.padRight('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padRight('abc', 3); + * // => 'abc' + */ + var padRight = createPadDir(true); + + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal, + * in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E) + * of `parseInt`. + * + * @static + * @memberOf _ + * @category String + * @param {string} string The string to convert. + * @param {number} [radix] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`. + // Chrome fails to trim leading whitespace characters. + // See https://code.google.com/p/v8/issues/detail?id=3109 for more details. + if (guard ? isIterateeCall(string, radix, guard) : radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + string = trim(string); + return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10)); + } + + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=0] The number of times to repeat the string. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n) { + var result = ''; + string = baseToString(string); + n = +n; + if (n < 1 || !string || !nativeIsFinite(n)) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + string += string; + } while (n); + + return result; + } + + /** + * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--foo-bar'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + + /** + * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__foo_bar__'); + * // => 'Foo Bar' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1)); + }); + + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The string to search. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = baseToString(string); + position = position == null + ? 0 + : nativeMin(position < 0 ? 0 : (+position || 0), string.length); + + return string.lastIndexOf(target, position) == position; + } + + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is provided it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options] The options object. + * @param {RegExp} [options.escape] The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate] The "evaluate" delimiter. + * @param {Object} [options.imports] An object to import into the template as free variables. + * @param {RegExp} [options.interpolate] The "interpolate" delimiter. + * @param {string} [options.sourceURL] The sourceURL of the template's compiled source. + * @param {string} [options.variable] The data object variable name. + * @param- {Object} [otherOptions] Enables the legacy `options` param signature. + * @returns {Function} Returns the compiled template function. + * @example + * + * // using the "interpolate" delimiter to create a compiled template + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // using the HTML "escape" delimiter to escape data property values + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': ' + + +This library also works if you use AMD (Asynchronous Module Definition), which is used in tools like [RequireJS](http://requirejs.org/). Just list `browser-source-map-support` as a dependency: + + + +## Options + +This module installs two things: a change to the `stack` property on `Error` objects and a handler for uncaught exceptions that mimics node's default exception handler (the handler can be seen in the demos below). You may want to disable the handler if you have your own uncaught exception handler. This can be done by passing an argument to the installer: + + require('source-map-support').install({ + handleUncaughtExceptions: false + }); + +This module loads source maps from the filesystem by default. You can provide alternate loading behavior through a callback as shown below. For example, [Meteor](https://github.com/meteor) keeps all source maps cached in memory to avoid disk access. + + require('source-map-support').install({ + retrieveSourceMap: function(source) { + if (source === 'compiled.js') { + return { + url: 'original.js', + map: fs.readFileSync('compiled.js.map', 'utf8') + }; + } + return null; + } + }); + +## Demos + +#### Basic Demo + +original.js: + + throw new Error('test'); // This is the original code + +compiled.js: + + //# sourceMappingURL=compiled.js.map + require('source-map-support').install(); + + throw new Error('test'); // This is the compiled code + +compiled.js.map: + + { + "version": 3, + "file": "compiled.js", + "sources": ["original.js"], + "names": [], + "mappings": ";;;AAAA,MAAM,IAAI" + } + +Run compiled.js using node (notice how the stack trace uses original.js instead of compiled.js): + + $ node compiled.js + + original.js:1 + throw new Error('test'); // This is the original code + ^ + Error: test + at Object. (original.js:1:7) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:901:3 + +#### TypeScript Demo + +demo.ts: + + declare function require(name: string); + require('source-map-support').install(); + class Foo { + constructor() { this.bar(); } + bar() { throw new Error('this is a demo'); } + } + new Foo(); + +Compile and run the file using the TypeScript compiler from the terminal: + + $ npm install source-map-support typescript + $ node_modules/typescript/bin/tsc -sourcemap demo.ts + $ node demo.js + + demo.ts:5 + bar() { throw new Error('this is a demo'); } + ^ + Error: this is a demo + at Foo.bar (demo.ts:5:17) + at new Foo (demo.ts:4:24) + at Object. (demo.ts:7:1) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:901:3 + +#### CoffeeScript Demo + +demo.coffee: + + require('source-map-support').install() + foo = -> + bar = -> throw new Error 'this is a demo' + bar() + foo() + +Compile and run the file using the CoffeeScript compiler from the terminal: + + $ npm install source-map-support coffee-script + $ node_modules/coffee-script/bin/coffee --map --compile demo.coffee + $ node demo.js + + demo.coffee:3 + bar = -> throw new Error 'this is a demo' + ^ + Error: this is a demo + at bar (demo.coffee:3:22) + at foo (demo.coffee:4:3) + at Object. (demo.coffee:5:1) + at Object. (demo.coffee:1:1) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + +## License + +This code is available under the [MIT license](http://opensource.org/licenses/MIT). diff --git a/react-app/node_modules/source-map-support/amd-test/browser-source-map-support.js b/react-app/node_modules/source-map-support/amd-test/browser-source-map-support.js new file mode 100644 index 0000000000..af2d91b9c7 --- /dev/null +++ b/react-app/node_modules/source-map-support/amd-test/browser-source-map-support.js @@ -0,0 +1,89 @@ +/* + * Support for source maps in V8 stack traces + * https://github.com/evanw/node-source-map-support + */ +(this.define||function(K,O){this.sourceMapSupport=O()})("browser-source-map-support",function(K){(function h(r,m,e){function p(g,d){if(!m[g]){if(!r[g]){var k="function"==typeof require&&require;if(!d&&k)return k(g,!0);if(v)return v(g,!0);throw Error("Cannot find module '"+g+"'");}k=m[g]={exports:{}};r[g][0].call(k.exports,function(d){var c=r[g][1][d];return p(c?c:d)},k,k.exports,h,r,m,e)}return m[g].exports}for(var v="function"==typeof require&&require,A=0;A=a))return x?(x=f[n],n+1=c)){var b;a?(n+2>>0)): +(n+1>>0);return b}}function g(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+1=f.length))return f=v(f,n,a,!0),f&32768?-1*(65535-f+1):f}function d(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+3= +f.length))return f=A(f,n,a,!0),f&2147483648?-1*(4294967295-f+1):f}function k(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(n+3=d))for(c=0,d=Math.min(d-a,2);c>>8*(b?c:1-c)}function a(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3=d))for(c=0,d=Math.min(d-a,4);c>> +8*(b?c:3-c)&255}function b(f,n,a,b,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+1=f.length||(0<=n?c(f,n,a,b,d):c(f,65535+n+1,a,b,d))}function z(f,n,b,c,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof c,"missing or invalid endian"),q(void 0!==b&&null!==b,"missing offset"),q(b+3=f.length||(0<=n?a(f,n,b,c,d):a(f,4294967295+n+1,b,c,d))}function D(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3=f.length||I.write(f,n,a,b,23,4)}function B(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"), +q(void 0!==a&&null!==a,"missing offset"),q(a+7=f.length||I.write(f,n,a,b,52,8)}function E(f,a,b){if("number"!==typeof f)return b;f=~~f;if(f>=a)return a;if(0<=f)return f;f+=a;return 0<=f?f:0}function w(f){f=~~Math.ceil(+f);return 0>f?0:f}function y(f){return(Array.isArray||function(f){return"[object Array]"===Object.prototype.toString.call(f)})(f)}function H(f){return 16>f?"0"+f.toString(16):f.toString(16)} +function t(f){for(var a=[],b=0;b=c)a.push(f.charCodeAt(b));else{var d=b;55296<=c&&57343>=c&&b++;c=encodeURIComponent(f.slice(d,b+1)).substr(1).split("%");for(d=0;d=a.length||d>=f.length);d++)a[d+b]=f[d];return d}function G(f){try{return decodeURIComponent(f)}catch(a){return String.fromCharCode(65533)}} +function L(f,a){q("number"===typeof f,"cannot write a non-number as a number");q(0<=f,"specified a negative value for writing an unsigned value");q(f<=a,"value is larger than maximum value for type");q(Math.floor(f)===f,"value has a fractional component")}function M(f,a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value");q(Math.floor(f)===f,"value has a fractional component")}function N(f, +a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value")}function q(f,a){if(!f)throw Error(a||"Failed assertion");}var J=h("base64-js"),I=h("ieee754");m.Buffer=e;m.SlowBuffer=e;m.INSPECT_MAX_BYTES=50;e.poolSize=8192;e._useTypedArrays=function(){try{var f=new ArrayBuffer(0),a=new Uint8Array(f);a.foo=function(){return 42};return 42===a.foo()&&"function"===typeof a.subarray}catch(b){return!1}}(); +e.isEncoding=function(f){switch(String(f).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0;default:return!1}};e.isBuffer=function(f){return!(null===f||void 0===f||!f._isBuffer)};e.byteLength=function(f,a){var b;f+="";switch(a||"utf8"){case "hex":b=f.length/2;break;case "utf8":case "utf-8":b=t(f).length;break;case "ascii":case "binary":case "raw":b=f.length;break;case "base64":b=J.toByteArray(f).length; +break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=2*f.length;break;default:throw Error("Unknown encoding");}return b};e.concat=function(f,a){q(y(f),"Usage: Buffer.concat(list, [totalLength])\nlist should be an Array.");if(0===f.length)return new e(0);if(1===f.length)return f[0];var b;if("number"!==typeof a)for(b=a=0;bd&&(b=d)):b=d;c=String(c||"utf8").toLowerCase();switch(c){case "hex":a=Number(a)||0;c=this.length-a;b?(b=Number(b),b>c&&(b=c)):b=c;c=f.length;q(0===c%2,"Invalid hex string");b>c/2&&(b=c/2);for(c=0;c>8,k%=256,d.push(k),d.push(c);f=e._charsWritten=C(d,this,a,b);break;default:throw Error("Unknown encoding");}return f};e.prototype.toString=function(f,a,b){f=String(f||"utf8").toLowerCase();a=Number(a)||0;b=void 0!==b?Number(b):b=this.length;if(b===a)return""; +switch(f){case "hex":f=a;a=this.length;if(!f||0>f)f=0;if(!b||0>b||b>a)b=a;for(a="";f=this[c]?(f+=G(a)+String.fromCharCode(this[c]),a=""):a+="%"+this[c].toString(16);b=f+G(a);break;case "ascii":b=p(this,a,b);break;case "binary":b=p(this,a,b);break;case "base64":f=a;b=0===f&&b===this.length?J.fromByteArray(this):J.fromByteArray(this.slice(f,b));break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b= +this.slice(a,b);f="";for(a=0;a=c,"sourceEnd < sourceStart"),q(0<=b&&bthis.length&&(d=this.length),a.length-bd||!e._useTypedArrays)for(var k=0;k=this.length))return this[a]};e.prototype.readUInt16LE=function(a,b){return v(this,a,!0,b)};e.prototype.readUInt16BE=function(a,b){return v(this,a,!1,b)};e.prototype.readUInt32LE=function(a,b){return A(this, +a,!0,b)};e.prototype.readUInt32BE=function(a,b){return A(this,a,!1,b)};e.prototype.readInt8=function(a,b){b||(q(void 0!==a&&null!==a,"missing offset"),q(a=this.length))return this[a]&128?-1*(255-this[a]+1):this[a]};e.prototype.readInt16LE=function(a,b){return g(this,a,!0,b)};e.prototype.readInt16BE=function(a,b){return g(this,a,!1,b)};e.prototype.readInt32LE=function(a,b){return d(this,a,!0,b)};e.prototype.readInt32BE=function(a,b){return d(this, +a,!1,b)};e.prototype.readFloatLE=function(a,b){return k(this,a,!0,b)};e.prototype.readFloatBE=function(a,b){return k(this,a,!1,b)};e.prototype.readDoubleLE=function(a,b){return l(this,a,!0,b)};e.prototype.readDoubleBE=function(a,b){return l(this,a,!1,b)};e.prototype.writeUInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b=this.length||(this[b]=a)};e.prototype.writeUInt16LE=function(a, +b,d){c(this,a,b,!0,d)};e.prototype.writeUInt16BE=function(a,b,d){c(this,a,b,!1,d)};e.prototype.writeUInt32LE=function(b,c,d){a(this,b,c,!0,d)};e.prototype.writeUInt32BE=function(b,c,d){a(this,b,c,!1,d)};e.prototype.writeInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b=this.length||(0<=a?this.writeUInt8(a,b,c):this.writeUInt8(255+a+1,b,c))};e.prototype.writeInt16LE=function(a, +c,d){b(this,a,c,!0,d)};e.prototype.writeInt16BE=function(a,c,d){b(this,a,c,!1,d)};e.prototype.writeInt32LE=function(a,b,c){z(this,a,b,!0,c)};e.prototype.writeInt32BE=function(a,b,c){z(this,a,b,!1,c)};e.prototype.writeFloatLE=function(a,b,c){D(this,a,b,!0,c)};e.prototype.writeFloatBE=function(a,b,c){D(this,a,b,!1,c)};e.prototype.writeDoubleLE=function(a,b,c){B(this,a,b,!0,c)};e.prototype.writeDoubleBE=function(a,b,c){B(this,a,b,!1,c)};e.prototype.fill=function(a,b,c){a||(a=0);b||(b=0);c||(c=this.length); +"string"===typeof a&&(a=a.charCodeAt(0));q("number"===typeof a&&!isNaN(a),"value is not a number");q(c>=b,"end < start");if(c!==b&&0!==this.length)for(q(0<=b&&b"};e.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(e._useTypedArrays)return(new e(this)).buffer; +for(var a=new Uint8Array(this.length),b=0,c=a.length;be)return-1;if(58>e)return e-48+52;if(91>e)return e-65;if(123>e)return e-97+26}var v="undefined"!==typeof Uint8Array? +Uint8Array:Array;e.toByteArray=function(e){function g(c){a[b++]=c}var d,k,l,c,a;if(0>16),g((l&65280)>>8),g(l&255);2===c?(l=p(e.charAt(d))<<2|p(e.charAt(d+1))>>4,g(l&255)):1===c&&(l=p(e.charAt(d))<<10| +p(e.charAt(d+1))<<4|p(e.charAt(d+2))>>2,g(l>>8&255),g(l&255));return a};e.fromByteArray=function(e){var g,d=e.length%3,k="",l,c;g=0;for(c=e.length-d;g>18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l& +63),k+=l;switch(d){case 1:l=e[e.length-1];k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>2);k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<<4&63);k+="==";break;case 2:l=(e[e.length-2]<<8)+e[e.length-1],k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>10),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>4&63),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<< +2&63),k+="="}return k}})("undefined"===typeof m?this.base64js={}:m)},{}],5:[function(h,r,m){m.read=function(e,p,v,h,g){var d;d=8*g-h-1;var k=(1<>1,c=-7;g=v?g-1:0;var a=v?-1:1,b=e[p+g];g+=a;v=b&(1<<-c)-1;b>>=-c;for(c+=d;0>=-c;for(c+=h;0>1,b= +23===g?Math.pow(2,-24)-Math.pow(2,-77):0;d=h?0:d-1;var z=h?1:-1,D=0>p||0===p&&0>1/p?1:0;p=Math.abs(p);isNaN(p)||Infinity===p?(p=isNaN(p)?1:0,h=c):(h=Math.floor(Math.log(p)/Math.LN2),1>p*(k=Math.pow(2,-h))&&(h--,k*=2),p=1<=h+a?p+b/k:p+b*Math.pow(2,1-a),2<=p*k&&(h++,k/=2),h+a>=c?(p=0,h=c):1<=h+a?(p=(p*k-1)*Math.pow(2,g),h+=a):(p=p*Math.pow(2,a-1)*Math.pow(2,g),h=0));for(;8<=g;e[v+d]=p&255,d+=z,p/=256,g-=8);h=h<c?[]:a.slice(b, +c-b+1)}d=m.resolve(d).substr(1);e=m.resolve(e).substr(1);for(var c=l(d.split("/")),a=l(e.split("/")),b=Math.min(c.length,a.length),g=b,h=0;he&&(e=d.length+e);return d.substr(e,l)}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"))},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6}],8:[function(h,r,m){m.SourceMapGenerator=h("./source-map/source-map-generator").SourceMapGenerator; +m.SourceMapConsumer=h("./source-map/source-map-consumer").SourceMapConsumer;m.SourceNode=h("./source-map/source-node").SourceNode},{"./source-map/source-map-consumer":13,"./source-map/source-map-generator":14,"./source-map/source-node":15}],9:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(){this._array=[];this._set={}}var d=e("./util");g.fromArray=function(d,e){for(var c=new g,a=0,b=d.length;ad?(-d<<1)+1:(d<<1)+0;do d=l&31,l>>>=5,0=l)throw Error("Expected more digits in base 64 VLQ value.");h=g.decode(d.charAt(e++));b=!!(h&32);h&=31;c+=h<>1;return{value:1===(c&1)?-l:l,rest:d.slice(e)}}})}, +{"./base64":11,amdefine:17}],11:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){var g={},d={};"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").forEach(function(e,l){g[e]=l;d[l]=e});h.encode=function(e){if(e in d)return d[e];throw new TypeError("Must be between 0 and 63: "+e);};h.decode=function(d){if(d in g)return g[d];throw new TypeError("Not a valid base 64 digit: "+d);}})},{amdefine:17}],12:[function(h,r,m){if("function"!==typeof e)var e= +h("amdefine")(r,h);e(function(e,h,m){function g(d,e,l,c,a){var b=Math.floor((e-d)/2)+d,h=a(l,c[b],!0);return 0===h?c[b]:0d?null:c[d]}h.search=function(d,e,l){return 0=a[c])throw new TypeError("Line must be greater than or equal to 1, got "+a[c]);if(0>a[d])throw new TypeError("Column must be greater than or equal to 0, got "+a[d]);return k.search(a,b,e)};g.prototype.originalPositionFor=function(a){a={generatedLine:d.getArg(a,"line"),generatedColumn:d.getArg(a,"column")};if(a=this._findMapping(a,this._generatedMappings,"generatedLine","generatedColumn", +d.compareByGeneratedPositions)){var b=d.getArg(a,"source",null);b&&this.sourceRoot&&(b=d.join(this.sourceRoot,b));return{source:b,line:d.getArg(a,"originalLine",null),column:d.getArg(a,"originalColumn",null),name:d.getArg(a,"name",null)}}return{source:null,line:null,column:null,name:null}};g.prototype.sourceContentFor=function(a){if(!this.sourcesContent)return null;this.sourceRoot&&(a=d.relative(this.sourceRoot,a));if(this._sources.has(a))return this.sourcesContent[this._sources.indexOf(a)];var b; +if(this.sourceRoot&&(b=d.urlParse(this.sourceRoot))){var c=a.replace(/^file:\/\//,"");if("file"==b.scheme&&this._sources.has(c))return this.sourcesContent[this._sources.indexOf(c)];if((!b.path||"/"==b.path)&&this._sources.has("/"+a))return this.sourcesContent[this._sources.indexOf("/"+a)]}throw Error('"'+a+'" is not in the SourceMap.');};g.prototype.generatedPositionFor=function(a){a={source:d.getArg(a,"source"),originalLine:d.getArg(a,"line"),originalColumn:d.getArg(a,"column")};this.sourceRoot&& +(a.source=d.relative(this.sourceRoot,a.source));return(a=this._findMapping(a,this._originalMappings,"originalLine","originalColumn",d.compareByOriginalPositions))?{line:d.getArg(a,"generatedLine",null),column:d.getArg(a,"generatedColumn",null)}:{line:null,column:null}};g.GENERATED_ORDER=1;g.ORIGINAL_ORDER=2;g.prototype.eachMapping=function(a,b,c){b=b||null;switch(c||g.GENERATED_ORDER){case g.GENERATED_ORDER:c=this._generatedMappings;break;case g.ORIGINAL_ORDER:c=this._originalMappings;break;default:throw Error("Unknown order of iteration."); +}var e=this.sourceRoot;c.map(function(a){var b=a.source;b&&e&&(b=d.join(e,b));return{source:b,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,originalLine:a.originalLine,originalColumn:a.originalColumn,name:a.name}}).forEach(a,b)};h.SourceMapConsumer=g})},{"./array-set":9,"./base64-vlq":10,"./binary-search":12,"./util":16,amdefine:17}],14:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(c){this._file=k.getArg(c,"file");this._sourceRoot= +k.getArg(c,"sourceRoot",null);this._sources=new l;this._names=new l;this._mappings=[];this._sourcesContents=null}var d=e("./base64-vlq"),k=e("./util"),l=e("./array-set").ArraySet;g.prototype._version=3;g.fromSourceMap=function(c){var a=c.sourceRoot,b=new g({file:c.file,sourceRoot:a});c.eachMapping(function(c){var d={generated:{line:c.generatedLine,column:c.generatedColumn}};c.source&&(d.source=c.source,a&&(d.source=k.relative(a,d.source)),d.original={line:c.originalLine,column:c.originalColumn},c.name&& +(d.name=c.name));b.addMapping(d)});c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&b.setSourceContent(a,d)});return b};g.prototype.addMapping=function(c){var a=k.getArg(c,"generated"),b=k.getArg(c,"original",null),d=k.getArg(c,"source",null);c=k.getArg(c,"name",null);this._validateMapping(a,b,d,c);d&&!this._sources.has(d)&&this._sources.add(d);c&&!this._names.has(c)&&this._names.add(c);this._mappings.push({generatedLine:a.line,generatedColumn:a.column,originalLine:null!=b&&b.line,originalColumn:null!= +b&&b.column,source:d,name:c})};g.prototype.setSourceContent=function(c,a){var b=c;this._sourceRoot&&(b=k.relative(this._sourceRoot,b));null!==a?(this._sourcesContents||(this._sourcesContents={}),this._sourcesContents[k.toSetString(b)]=a):(delete this._sourcesContents[k.toSetString(b)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};g.prototype.applySourceMap=function(c,a){a||(a=c.file);var b=this._sourceRoot;b&&(a=k.relative(b,a));var d=new l,e=new l;this._mappings.forEach(function(g){if(g.source=== +a&&g.originalLine){var l=c.originalPositionFor({line:g.originalLine,column:g.originalColumn});null!==l.source&&(g.source=b?k.relative(b,l.source):l.source,g.originalLine=l.line,g.originalColumn=l.column,null!==l.name&&null!==g.name&&(g.name=l.name))}(l=g.source)&&!d.has(l)&&d.add(l);(g=g.name)&&!e.has(g)&&e.add(g)},this);this._sources=d;this._names=e;c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&(b&&(a=k.relative(b,a)),this.setSourceContent(a,d))},this)};g.prototype._validateMapping= +function(c,a,b,d){if(!(c&&"line"in c&&"column"in c&&0d)-(c",a=this.getLineNumber(),null!=a&&(b+=":"+a,(a=this.getColumnNumber())&&(b+=":"+a)));a="";var c=this.getFunctionName(), +d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?a+="new "+(c||""):c?a+=c:(a+=b,d=!1);else{var e=this.getTypeName(),g=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(a+=e+"."),a+=c,g&&c.indexOf("."+g)!=c.length-g.length-1&&(a+=" [as "+g+"]")):a+=e+"."+(g||"")}d&&(a+=" ("+b+")");return a}function a(a){var b={};Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(function(c){b[c]=/^(?:is|get)/.test(c)?function(){return a[c].call(a)}:a[c]});b.toString=c;return b}function b(b){var c= +b.getFileName()||b.getScriptNameOrSourceURL();if(c){var d=k({source:c,line:b.getLineNumber(),column:b.getColumnNumber()-1});b=a(b);b.getFileName=function(){return d.source};b.getLineNumber=function(){return d.line};b.getColumnNumber=function(){return d.column+1};b.getScriptNameOrSourceURL=function(){return d.source};return b}var e=b.isEval()&&b.getEvalOrigin();e&&(e=l(e),b=a(b),b.getEvalOrigin=function(){return e});return b}function z(a,c){t&&(F={},C={});return a+c.map(function(a){return"\n at "+ +b(a)}).join("")}function D(a){var b=/\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2],b=+b[3],d=F[a];!d&&y.existsSync(a)&&(d=y.readFileSync(a,"utf8"));if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return"\n"+a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function B(a){if(a&&a.stack){var b=D(a);null!==b&&console.log(b);console.log(a.stack)}else console.log("Uncaught exception:",a);e.exit(1)}var E=h("source-map").SourceMapConsumer,w=h("path"),y=h("fs"),H=!1,t=!1,F={},C= +{};m.wrapCallSite=b;m.getErrorSource=D;m.mapSourcePosition=k;m.retrieveSourceMap=d;m.install=function(a){if(!H){H=!0;Error.prepareStackTrace=z;a=a||{};var b="handleUncaughtExceptions"in a?a.handleUncaughtExceptions:!0;t="emptyCacheBetweenOperations"in a?a.emptyCacheBetweenOperations:!1;a.retrieveFile&&(A=a.retrieveFile);a.retrieveSourceMap&&(d=a.retrieveSourceMap);if(b&&!r())e.on("uncaughtException",B)}}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"), +h("buffer").Buffer)},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6,buffer:3,fs:2,path:7,"source-map":8}]},{},[1]);return K}); diff --git a/react-app/node_modules/source-map-support/amd-test/index.html b/react-app/node_modules/source-map-support/amd-test/index.html new file mode 100644 index 0000000000..7fd64a1ba1 --- /dev/null +++ b/react-app/node_modules/source-map-support/amd-test/index.html @@ -0,0 +1,6 @@ +

+Make sure to run build.js. +This test should say either "Test failed" or "Test passed": +

+ + diff --git a/react-app/node_modules/source-map-support/amd-test/require.js b/react-app/node_modules/source-map-support/amd-test/require.js new file mode 100644 index 0000000000..ee9999f622 --- /dev/null +++ b/react-app/node_modules/source-map-support/amd-test/require.js @@ -0,0 +1,36 @@ +/* + RequireJS 2.1.9 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. + Available via the MIT or new BSD license. + see: http://github.com/jrburke/requirejs for details +*/ +var requirejs,require,define; +(function(Z){function H(b){return"[object Function]"===L.call(b)}function I(b){return"[object Array]"===L.call(b)}function y(b,c){if(b){var e;for(e=0;ethis.depCount&&!this.defined){if(H(m)){if(this.events.error&&this.map.isDefine||j.onError!==aa)try{d=i.execCb(c,m,b,d)}catch(e){a=e}else d=i.execCb(c,m,b,d);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!== +this.exports?d=b.exports:void 0===d&&this.usingExports&&(d=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",v(this.error=a)}else d=m;this.exports=d;if(this.map.isDefine&&!this.ignore&&(r[c]=d,j.onResourceLoad))j.onResourceLoad(i,this.map,this.depMaps);x(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete= +!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,e=n(a.prefix);this.depMaps.push(e);s(e,"defined",u(this,function(d){var m,e;e=this.map.name;var g=this.map.parentMap?this.map.parentMap.name:null,h=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(d.normalize&&(e=d.normalize(e,function(a){return c(a,g,!0)})||""),d=n(a.prefix+"!"+e,this.map.parentMap),s(d,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})), +e=l(p,d.id)){this.depMaps.push(d);if(this.events.error)e.on("error",u(this,function(a){this.emit("error",a)}));e.enable()}}else m=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),m.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];F(p,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&x(a.map.id)});v(a)}),m.fromText=u(this,function(d,c){var e=a.name,g=n(e),B=O;c&&(d=c);B&&(O=!1);q(g);t(k.config,b)&&(k.config[e]=k.config[b]);try{j.exec(d)}catch(ca){return v(A("fromtexteval", +"fromText eval for "+b+" failed: "+ca,ca,[b]))}B&&(O=!0);this.depMaps.push(g);i.completeLoad(e);h([e],m)}),d.load(a.name,h,m,k)}));i.enable(e,this);this.pluginMaps[e.id]=e},enable:function(){T[this.map.id]=this;this.enabling=this.enabled=!0;y(this.depMaps,u(this,function(a,b){var c,d;if("string"===typeof a){a=n(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=l(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,"defined",u(this,function(a){this.defineDep(b, +a);this.check()}));this.errback&&s(a,"error",u(this,this.errback))}c=a.id;d=p[c];!t(N,c)&&(d&&!d.enabled)&&i.enable(a,this)}));F(this.pluginMaps,u(this,function(a){var b=l(p,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:k,contextName:b,registry:p,defined:r,urlFetched:S,defQueue:G,Module:X,makeModuleMap:n, +nextTick:j.nextTick,onError:v,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=k.pkgs,c=k.shim,d={paths:!0,config:!0,map:!0};F(a,function(a,b){d[b]?"map"===b?(k.map||(k.map={}),Q(k[b],a,!0,!0)):Q(k[b],a,!0):k[b]=a});a.shim&&(F(a.shim,function(a,b){I(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);c[b]=a}),k.shim=c);a.packages&&(y(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name, +location:a.location||a.name,main:(a.main||"main").replace(ja,"").replace(ea,"")}}),k.pkgs=b);F(p,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=n(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(Z,arguments));return b||a.exports&&ba(a.exports)}},makeRequire:function(a,f){function h(d,c,e){var g,k;f.enableBuildCallback&&(c&&H(c))&&(c.__requireJsBuild=!0);if("string"===typeof d){if(H(c))return v(A("requireargs", +"Invalid require call"),e);if(a&&t(N,d))return N[d](p[a.id]);if(j.get)return j.get(i,d,a,h);g=n(d,a,!1,!0);g=g.id;return!t(r,g)?v(A("notloaded",'Module name "'+g+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[g]}K();i.nextTick(function(){K();k=q(n(null,a));k.skipMap=f.skipMap;k.init(d,c,e,{enabled:!0});C()});return h}f=f||{};Q(h,{isBrowser:z,toUrl:function(b){var f,e=b.lastIndexOf("."),g=b.split("/")[0];if(-1!==e&&(!("."===g||".."===g)||1h.attachEvent.toString().indexOf("[native code"))&&!W?(O=!0,h.attachEvent("onreadystatechange",b.onScriptLoad)):(h.addEventListener("load",b.onScriptLoad,!1),h.addEventListener("error", +b.onScriptError,!1)),h.src=e,K=h,C?x.insertBefore(h,C):x.appendChild(h),K=null,h;if(da)try{importScripts(e),b.completeLoad(c)}catch(l){b.onError(A("importscripts","importScripts failed for "+c+" at "+e,l,[c]))}};z&&!s.skipDataMain&&M(document.getElementsByTagName("script"),function(b){x||(x=b.parentNode);if(J=b.getAttribute("data-main"))return q=J,s.baseUrl||(D=q.split("/"),q=D.pop(),fa=D.length?D.join("/")+"/":"./",s.baseUrl=fa),q=q.replace(ea,""),j.jsExtRegExp.test(q)&&(q=J),s.deps=s.deps?s.deps.concat(q): +[q],!0});define=function(b,c,e){var h,j;"string"!==typeof b&&(e=c,c=b,b=null);I(c)||(e=c,c=null);!c&&H(e)&&(c=[],e.length&&(e.toString().replace(la,"").replace(ma,function(b,e){c.push(e)}),c=(1===e.length?["require"]:["require","exports","module"]).concat(c)));if(O){if(!(h=K))P&&"interactive"===P.readyState||M(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),h=P;h&&(b||(b=h.getAttribute("data-requiremodule")),j=E[h.getAttribute("data-requirecontext")])}(j? +j.defQueue:R).push([b,c,e])};define.amd={jQuery:!0};j.exec=function(b){return eval(b)};j(s)}})(this); diff --git a/react-app/node_modules/source-map-support/amd-test/script.coffee b/react-app/node_modules/source-map-support/amd-test/script.coffee new file mode 100644 index 0000000000..fe28f653eb --- /dev/null +++ b/react-app/node_modules/source-map-support/amd-test/script.coffee @@ -0,0 +1,13 @@ +define ['browser-source-map-support'], (sourceMapSupport) -> + sourceMapSupport.install() + + foo = -> throw new Error 'foo' + + try + foo() + catch e + if /\bscript\.coffee\b/.test e.stack + document.body.appendChild document.createTextNode 'Test passed' + else + document.body.appendChild document.createTextNode 'Test failed' + console.log e.stack diff --git a/react-app/node_modules/source-map-support/amd-test/script.js b/react-app/node_modules/source-map-support/amd-test/script.js new file mode 100644 index 0000000000..7cfd359eb2 --- /dev/null +++ b/react-app/node_modules/source-map-support/amd-test/script.js @@ -0,0 +1,24 @@ +// Generated by CoffeeScript 1.7.1 +(function() { + define(['browser-source-map-support'], function(sourceMapSupport) { + var e, foo; + sourceMapSupport.install(); + foo = function() { + throw new Error('foo'); + }; + try { + return foo(); + } catch (_error) { + e = _error; + if (/\bscript\.coffee\b/.test(e.stack)) { + return document.body.appendChild(document.createTextNode('Test passed')); + } else { + document.body.appendChild(document.createTextNode('Test failed')); + return console.log(e.stack); + } + } + }); + +}).call(this); + +//# sourceMappingURL=script.map diff --git a/react-app/node_modules/source-map-support/amd-test/script.map b/react-app/node_modules/source-map-support/amd-test/script.map new file mode 100644 index 0000000000..27b42570cc --- /dev/null +++ b/react-app/node_modules/source-map-support/amd-test/script.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "file": "script.js", + "sourceRoot": "..", + "sources": [ + "amd-test/script.coffee" + ], + "names": [], + "mappings": ";AAAA;AAAA,EAAA,MAAA,CAAO,CAAC,4BAAD,CAAP,EAAuC,SAAC,gBAAD,GAAA;AACrC,QAAA,MAAA;AAAA,IAAA,gBAAgB,CAAC,OAAjB,CAAA,CAAA,CAAA;AAAA,IAEA,GAAA,GAAM,SAAA,GAAA;AAAG,YAAU,IAAA,KAAA,CAAM,KAAN,CAAV,CAAH;IAAA,CAFN,CAAA;AAIA;aACE,GAAA,CAAA,EADF;KAAA,cAAA;AAGE,MADI,UACJ,CAAA;AAAA,MAAA,IAAG,oBAAoB,CAAC,IAArB,CAA0B,CAAC,CAAC,KAA5B,CAAH;eACE,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,EADF;OAAA,MAAA;AAGE,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CAAA;eACA,OAAO,CAAC,GAAR,CAAY,CAAC,CAAC,KAAd,EAJF;OAHF;KALqC;EAAA,CAAvC,CAAA,CAAA;AAAA" +} \ No newline at end of file diff --git a/react-app/node_modules/source-map-support/browser-source-map-support.js b/react-app/node_modules/source-map-support/browser-source-map-support.js new file mode 100644 index 0000000000..af2d91b9c7 --- /dev/null +++ b/react-app/node_modules/source-map-support/browser-source-map-support.js @@ -0,0 +1,89 @@ +/* + * Support for source maps in V8 stack traces + * https://github.com/evanw/node-source-map-support + */ +(this.define||function(K,O){this.sourceMapSupport=O()})("browser-source-map-support",function(K){(function h(r,m,e){function p(g,d){if(!m[g]){if(!r[g]){var k="function"==typeof require&&require;if(!d&&k)return k(g,!0);if(v)return v(g,!0);throw Error("Cannot find module '"+g+"'");}k=m[g]={exports:{}};r[g][0].call(k.exports,function(d){var c=r[g][1][d];return p(c?c:d)},k,k.exports,h,r,m,e)}return m[g].exports}for(var v="function"==typeof require&&require,A=0;A=a))return x?(x=f[n],n+1=c)){var b;a?(n+2>>0)): +(n+1>>0);return b}}function g(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+1=f.length))return f=v(f,n,a,!0),f&32768?-1*(65535-f+1):f}function d(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+3= +f.length))return f=A(f,n,a,!0),f&2147483648?-1*(4294967295-f+1):f}function k(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(n+3=d))for(c=0,d=Math.min(d-a,2);c>>8*(b?c:1-c)}function a(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3=d))for(c=0,d=Math.min(d-a,4);c>> +8*(b?c:3-c)&255}function b(f,n,a,b,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+1=f.length||(0<=n?c(f,n,a,b,d):c(f,65535+n+1,a,b,d))}function z(f,n,b,c,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof c,"missing or invalid endian"),q(void 0!==b&&null!==b,"missing offset"),q(b+3=f.length||(0<=n?a(f,n,b,c,d):a(f,4294967295+n+1,b,c,d))}function D(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3=f.length||I.write(f,n,a,b,23,4)}function B(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"), +q(void 0!==a&&null!==a,"missing offset"),q(a+7=f.length||I.write(f,n,a,b,52,8)}function E(f,a,b){if("number"!==typeof f)return b;f=~~f;if(f>=a)return a;if(0<=f)return f;f+=a;return 0<=f?f:0}function w(f){f=~~Math.ceil(+f);return 0>f?0:f}function y(f){return(Array.isArray||function(f){return"[object Array]"===Object.prototype.toString.call(f)})(f)}function H(f){return 16>f?"0"+f.toString(16):f.toString(16)} +function t(f){for(var a=[],b=0;b=c)a.push(f.charCodeAt(b));else{var d=b;55296<=c&&57343>=c&&b++;c=encodeURIComponent(f.slice(d,b+1)).substr(1).split("%");for(d=0;d=a.length||d>=f.length);d++)a[d+b]=f[d];return d}function G(f){try{return decodeURIComponent(f)}catch(a){return String.fromCharCode(65533)}} +function L(f,a){q("number"===typeof f,"cannot write a non-number as a number");q(0<=f,"specified a negative value for writing an unsigned value");q(f<=a,"value is larger than maximum value for type");q(Math.floor(f)===f,"value has a fractional component")}function M(f,a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value");q(Math.floor(f)===f,"value has a fractional component")}function N(f, +a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value")}function q(f,a){if(!f)throw Error(a||"Failed assertion");}var J=h("base64-js"),I=h("ieee754");m.Buffer=e;m.SlowBuffer=e;m.INSPECT_MAX_BYTES=50;e.poolSize=8192;e._useTypedArrays=function(){try{var f=new ArrayBuffer(0),a=new Uint8Array(f);a.foo=function(){return 42};return 42===a.foo()&&"function"===typeof a.subarray}catch(b){return!1}}(); +e.isEncoding=function(f){switch(String(f).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0;default:return!1}};e.isBuffer=function(f){return!(null===f||void 0===f||!f._isBuffer)};e.byteLength=function(f,a){var b;f+="";switch(a||"utf8"){case "hex":b=f.length/2;break;case "utf8":case "utf-8":b=t(f).length;break;case "ascii":case "binary":case "raw":b=f.length;break;case "base64":b=J.toByteArray(f).length; +break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=2*f.length;break;default:throw Error("Unknown encoding");}return b};e.concat=function(f,a){q(y(f),"Usage: Buffer.concat(list, [totalLength])\nlist should be an Array.");if(0===f.length)return new e(0);if(1===f.length)return f[0];var b;if("number"!==typeof a)for(b=a=0;bd&&(b=d)):b=d;c=String(c||"utf8").toLowerCase();switch(c){case "hex":a=Number(a)||0;c=this.length-a;b?(b=Number(b),b>c&&(b=c)):b=c;c=f.length;q(0===c%2,"Invalid hex string");b>c/2&&(b=c/2);for(c=0;c>8,k%=256,d.push(k),d.push(c);f=e._charsWritten=C(d,this,a,b);break;default:throw Error("Unknown encoding");}return f};e.prototype.toString=function(f,a,b){f=String(f||"utf8").toLowerCase();a=Number(a)||0;b=void 0!==b?Number(b):b=this.length;if(b===a)return""; +switch(f){case "hex":f=a;a=this.length;if(!f||0>f)f=0;if(!b||0>b||b>a)b=a;for(a="";f=this[c]?(f+=G(a)+String.fromCharCode(this[c]),a=""):a+="%"+this[c].toString(16);b=f+G(a);break;case "ascii":b=p(this,a,b);break;case "binary":b=p(this,a,b);break;case "base64":f=a;b=0===f&&b===this.length?J.fromByteArray(this):J.fromByteArray(this.slice(f,b));break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b= +this.slice(a,b);f="";for(a=0;a=c,"sourceEnd < sourceStart"),q(0<=b&&bthis.length&&(d=this.length),a.length-bd||!e._useTypedArrays)for(var k=0;k=this.length))return this[a]};e.prototype.readUInt16LE=function(a,b){return v(this,a,!0,b)};e.prototype.readUInt16BE=function(a,b){return v(this,a,!1,b)};e.prototype.readUInt32LE=function(a,b){return A(this, +a,!0,b)};e.prototype.readUInt32BE=function(a,b){return A(this,a,!1,b)};e.prototype.readInt8=function(a,b){b||(q(void 0!==a&&null!==a,"missing offset"),q(a=this.length))return this[a]&128?-1*(255-this[a]+1):this[a]};e.prototype.readInt16LE=function(a,b){return g(this,a,!0,b)};e.prototype.readInt16BE=function(a,b){return g(this,a,!1,b)};e.prototype.readInt32LE=function(a,b){return d(this,a,!0,b)};e.prototype.readInt32BE=function(a,b){return d(this, +a,!1,b)};e.prototype.readFloatLE=function(a,b){return k(this,a,!0,b)};e.prototype.readFloatBE=function(a,b){return k(this,a,!1,b)};e.prototype.readDoubleLE=function(a,b){return l(this,a,!0,b)};e.prototype.readDoubleBE=function(a,b){return l(this,a,!1,b)};e.prototype.writeUInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b=this.length||(this[b]=a)};e.prototype.writeUInt16LE=function(a, +b,d){c(this,a,b,!0,d)};e.prototype.writeUInt16BE=function(a,b,d){c(this,a,b,!1,d)};e.prototype.writeUInt32LE=function(b,c,d){a(this,b,c,!0,d)};e.prototype.writeUInt32BE=function(b,c,d){a(this,b,c,!1,d)};e.prototype.writeInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b=this.length||(0<=a?this.writeUInt8(a,b,c):this.writeUInt8(255+a+1,b,c))};e.prototype.writeInt16LE=function(a, +c,d){b(this,a,c,!0,d)};e.prototype.writeInt16BE=function(a,c,d){b(this,a,c,!1,d)};e.prototype.writeInt32LE=function(a,b,c){z(this,a,b,!0,c)};e.prototype.writeInt32BE=function(a,b,c){z(this,a,b,!1,c)};e.prototype.writeFloatLE=function(a,b,c){D(this,a,b,!0,c)};e.prototype.writeFloatBE=function(a,b,c){D(this,a,b,!1,c)};e.prototype.writeDoubleLE=function(a,b,c){B(this,a,b,!0,c)};e.prototype.writeDoubleBE=function(a,b,c){B(this,a,b,!1,c)};e.prototype.fill=function(a,b,c){a||(a=0);b||(b=0);c||(c=this.length); +"string"===typeof a&&(a=a.charCodeAt(0));q("number"===typeof a&&!isNaN(a),"value is not a number");q(c>=b,"end < start");if(c!==b&&0!==this.length)for(q(0<=b&&b"};e.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(e._useTypedArrays)return(new e(this)).buffer; +for(var a=new Uint8Array(this.length),b=0,c=a.length;be)return-1;if(58>e)return e-48+52;if(91>e)return e-65;if(123>e)return e-97+26}var v="undefined"!==typeof Uint8Array? +Uint8Array:Array;e.toByteArray=function(e){function g(c){a[b++]=c}var d,k,l,c,a;if(0>16),g((l&65280)>>8),g(l&255);2===c?(l=p(e.charAt(d))<<2|p(e.charAt(d+1))>>4,g(l&255)):1===c&&(l=p(e.charAt(d))<<10| +p(e.charAt(d+1))<<4|p(e.charAt(d+2))>>2,g(l>>8&255),g(l&255));return a};e.fromByteArray=function(e){var g,d=e.length%3,k="",l,c;g=0;for(c=e.length-d;g>18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l& +63),k+=l;switch(d){case 1:l=e[e.length-1];k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>2);k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<<4&63);k+="==";break;case 2:l=(e[e.length-2]<<8)+e[e.length-1],k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>10),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>4&63),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<< +2&63),k+="="}return k}})("undefined"===typeof m?this.base64js={}:m)},{}],5:[function(h,r,m){m.read=function(e,p,v,h,g){var d;d=8*g-h-1;var k=(1<>1,c=-7;g=v?g-1:0;var a=v?-1:1,b=e[p+g];g+=a;v=b&(1<<-c)-1;b>>=-c;for(c+=d;0>=-c;for(c+=h;0>1,b= +23===g?Math.pow(2,-24)-Math.pow(2,-77):0;d=h?0:d-1;var z=h?1:-1,D=0>p||0===p&&0>1/p?1:0;p=Math.abs(p);isNaN(p)||Infinity===p?(p=isNaN(p)?1:0,h=c):(h=Math.floor(Math.log(p)/Math.LN2),1>p*(k=Math.pow(2,-h))&&(h--,k*=2),p=1<=h+a?p+b/k:p+b*Math.pow(2,1-a),2<=p*k&&(h++,k/=2),h+a>=c?(p=0,h=c):1<=h+a?(p=(p*k-1)*Math.pow(2,g),h+=a):(p=p*Math.pow(2,a-1)*Math.pow(2,g),h=0));for(;8<=g;e[v+d]=p&255,d+=z,p/=256,g-=8);h=h<c?[]:a.slice(b, +c-b+1)}d=m.resolve(d).substr(1);e=m.resolve(e).substr(1);for(var c=l(d.split("/")),a=l(e.split("/")),b=Math.min(c.length,a.length),g=b,h=0;he&&(e=d.length+e);return d.substr(e,l)}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"))},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6}],8:[function(h,r,m){m.SourceMapGenerator=h("./source-map/source-map-generator").SourceMapGenerator; +m.SourceMapConsumer=h("./source-map/source-map-consumer").SourceMapConsumer;m.SourceNode=h("./source-map/source-node").SourceNode},{"./source-map/source-map-consumer":13,"./source-map/source-map-generator":14,"./source-map/source-node":15}],9:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(){this._array=[];this._set={}}var d=e("./util");g.fromArray=function(d,e){for(var c=new g,a=0,b=d.length;ad?(-d<<1)+1:(d<<1)+0;do d=l&31,l>>>=5,0=l)throw Error("Expected more digits in base 64 VLQ value.");h=g.decode(d.charAt(e++));b=!!(h&32);h&=31;c+=h<>1;return{value:1===(c&1)?-l:l,rest:d.slice(e)}}})}, +{"./base64":11,amdefine:17}],11:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){var g={},d={};"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").forEach(function(e,l){g[e]=l;d[l]=e});h.encode=function(e){if(e in d)return d[e];throw new TypeError("Must be between 0 and 63: "+e);};h.decode=function(d){if(d in g)return g[d];throw new TypeError("Not a valid base 64 digit: "+d);}})},{amdefine:17}],12:[function(h,r,m){if("function"!==typeof e)var e= +h("amdefine")(r,h);e(function(e,h,m){function g(d,e,l,c,a){var b=Math.floor((e-d)/2)+d,h=a(l,c[b],!0);return 0===h?c[b]:0d?null:c[d]}h.search=function(d,e,l){return 0=a[c])throw new TypeError("Line must be greater than or equal to 1, got "+a[c]);if(0>a[d])throw new TypeError("Column must be greater than or equal to 0, got "+a[d]);return k.search(a,b,e)};g.prototype.originalPositionFor=function(a){a={generatedLine:d.getArg(a,"line"),generatedColumn:d.getArg(a,"column")};if(a=this._findMapping(a,this._generatedMappings,"generatedLine","generatedColumn", +d.compareByGeneratedPositions)){var b=d.getArg(a,"source",null);b&&this.sourceRoot&&(b=d.join(this.sourceRoot,b));return{source:b,line:d.getArg(a,"originalLine",null),column:d.getArg(a,"originalColumn",null),name:d.getArg(a,"name",null)}}return{source:null,line:null,column:null,name:null}};g.prototype.sourceContentFor=function(a){if(!this.sourcesContent)return null;this.sourceRoot&&(a=d.relative(this.sourceRoot,a));if(this._sources.has(a))return this.sourcesContent[this._sources.indexOf(a)];var b; +if(this.sourceRoot&&(b=d.urlParse(this.sourceRoot))){var c=a.replace(/^file:\/\//,"");if("file"==b.scheme&&this._sources.has(c))return this.sourcesContent[this._sources.indexOf(c)];if((!b.path||"/"==b.path)&&this._sources.has("/"+a))return this.sourcesContent[this._sources.indexOf("/"+a)]}throw Error('"'+a+'" is not in the SourceMap.');};g.prototype.generatedPositionFor=function(a){a={source:d.getArg(a,"source"),originalLine:d.getArg(a,"line"),originalColumn:d.getArg(a,"column")};this.sourceRoot&& +(a.source=d.relative(this.sourceRoot,a.source));return(a=this._findMapping(a,this._originalMappings,"originalLine","originalColumn",d.compareByOriginalPositions))?{line:d.getArg(a,"generatedLine",null),column:d.getArg(a,"generatedColumn",null)}:{line:null,column:null}};g.GENERATED_ORDER=1;g.ORIGINAL_ORDER=2;g.prototype.eachMapping=function(a,b,c){b=b||null;switch(c||g.GENERATED_ORDER){case g.GENERATED_ORDER:c=this._generatedMappings;break;case g.ORIGINAL_ORDER:c=this._originalMappings;break;default:throw Error("Unknown order of iteration."); +}var e=this.sourceRoot;c.map(function(a){var b=a.source;b&&e&&(b=d.join(e,b));return{source:b,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,originalLine:a.originalLine,originalColumn:a.originalColumn,name:a.name}}).forEach(a,b)};h.SourceMapConsumer=g})},{"./array-set":9,"./base64-vlq":10,"./binary-search":12,"./util":16,amdefine:17}],14:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(c){this._file=k.getArg(c,"file");this._sourceRoot= +k.getArg(c,"sourceRoot",null);this._sources=new l;this._names=new l;this._mappings=[];this._sourcesContents=null}var d=e("./base64-vlq"),k=e("./util"),l=e("./array-set").ArraySet;g.prototype._version=3;g.fromSourceMap=function(c){var a=c.sourceRoot,b=new g({file:c.file,sourceRoot:a});c.eachMapping(function(c){var d={generated:{line:c.generatedLine,column:c.generatedColumn}};c.source&&(d.source=c.source,a&&(d.source=k.relative(a,d.source)),d.original={line:c.originalLine,column:c.originalColumn},c.name&& +(d.name=c.name));b.addMapping(d)});c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&b.setSourceContent(a,d)});return b};g.prototype.addMapping=function(c){var a=k.getArg(c,"generated"),b=k.getArg(c,"original",null),d=k.getArg(c,"source",null);c=k.getArg(c,"name",null);this._validateMapping(a,b,d,c);d&&!this._sources.has(d)&&this._sources.add(d);c&&!this._names.has(c)&&this._names.add(c);this._mappings.push({generatedLine:a.line,generatedColumn:a.column,originalLine:null!=b&&b.line,originalColumn:null!= +b&&b.column,source:d,name:c})};g.prototype.setSourceContent=function(c,a){var b=c;this._sourceRoot&&(b=k.relative(this._sourceRoot,b));null!==a?(this._sourcesContents||(this._sourcesContents={}),this._sourcesContents[k.toSetString(b)]=a):(delete this._sourcesContents[k.toSetString(b)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};g.prototype.applySourceMap=function(c,a){a||(a=c.file);var b=this._sourceRoot;b&&(a=k.relative(b,a));var d=new l,e=new l;this._mappings.forEach(function(g){if(g.source=== +a&&g.originalLine){var l=c.originalPositionFor({line:g.originalLine,column:g.originalColumn});null!==l.source&&(g.source=b?k.relative(b,l.source):l.source,g.originalLine=l.line,g.originalColumn=l.column,null!==l.name&&null!==g.name&&(g.name=l.name))}(l=g.source)&&!d.has(l)&&d.add(l);(g=g.name)&&!e.has(g)&&e.add(g)},this);this._sources=d;this._names=e;c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&(b&&(a=k.relative(b,a)),this.setSourceContent(a,d))},this)};g.prototype._validateMapping= +function(c,a,b,d){if(!(c&&"line"in c&&"column"in c&&0d)-(c",a=this.getLineNumber(),null!=a&&(b+=":"+a,(a=this.getColumnNumber())&&(b+=":"+a)));a="";var c=this.getFunctionName(), +d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?a+="new "+(c||""):c?a+=c:(a+=b,d=!1);else{var e=this.getTypeName(),g=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(a+=e+"."),a+=c,g&&c.indexOf("."+g)!=c.length-g.length-1&&(a+=" [as "+g+"]")):a+=e+"."+(g||"")}d&&(a+=" ("+b+")");return a}function a(a){var b={};Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(function(c){b[c]=/^(?:is|get)/.test(c)?function(){return a[c].call(a)}:a[c]});b.toString=c;return b}function b(b){var c= +b.getFileName()||b.getScriptNameOrSourceURL();if(c){var d=k({source:c,line:b.getLineNumber(),column:b.getColumnNumber()-1});b=a(b);b.getFileName=function(){return d.source};b.getLineNumber=function(){return d.line};b.getColumnNumber=function(){return d.column+1};b.getScriptNameOrSourceURL=function(){return d.source};return b}var e=b.isEval()&&b.getEvalOrigin();e&&(e=l(e),b=a(b),b.getEvalOrigin=function(){return e});return b}function z(a,c){t&&(F={},C={});return a+c.map(function(a){return"\n at "+ +b(a)}).join("")}function D(a){var b=/\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2],b=+b[3],d=F[a];!d&&y.existsSync(a)&&(d=y.readFileSync(a,"utf8"));if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return"\n"+a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function B(a){if(a&&a.stack){var b=D(a);null!==b&&console.log(b);console.log(a.stack)}else console.log("Uncaught exception:",a);e.exit(1)}var E=h("source-map").SourceMapConsumer,w=h("path"),y=h("fs"),H=!1,t=!1,F={},C= +{};m.wrapCallSite=b;m.getErrorSource=D;m.mapSourcePosition=k;m.retrieveSourceMap=d;m.install=function(a){if(!H){H=!0;Error.prepareStackTrace=z;a=a||{};var b="handleUncaughtExceptions"in a?a.handleUncaughtExceptions:!0;t="emptyCacheBetweenOperations"in a?a.emptyCacheBetweenOperations:!1;a.retrieveFile&&(A=a.retrieveFile);a.retrieveSourceMap&&(d=a.retrieveSourceMap);if(b&&!r())e.on("uncaughtException",B)}}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"), +h("buffer").Buffer)},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6,buffer:3,fs:2,path:7,"source-map":8}]},{},[1]);return K}); diff --git a/react-app/node_modules/source-map-support/browser-test/index.html b/react-app/node_modules/source-map-support/browser-test/index.html new file mode 100644 index 0000000000..3b18830750 --- /dev/null +++ b/react-app/node_modules/source-map-support/browser-test/index.html @@ -0,0 +1,6 @@ +

+Make sure to run build.js. +This test should say either "Test failed" or "Test passed": +

+ + diff --git a/react-app/node_modules/source-map-support/browser-test/script.coffee b/react-app/node_modules/source-map-support/browser-test/script.coffee new file mode 100644 index 0000000000..57210686c2 --- /dev/null +++ b/react-app/node_modules/source-map-support/browser-test/script.coffee @@ -0,0 +1,12 @@ +sourceMapSupport.install() + +foo = -> throw new Error 'foo' + +try + foo() +catch e + if /\bscript\.coffee\b/.test e.stack + document.body.appendChild document.createTextNode 'Test passed' + else + document.body.appendChild document.createTextNode 'Test failed' + console.log e.stack diff --git a/react-app/node_modules/source-map-support/browser-test/script.js b/react-app/node_modules/source-map-support/browser-test/script.js new file mode 100644 index 0000000000..e16d41419d --- /dev/null +++ b/react-app/node_modules/source-map-support/browser-test/script.js @@ -0,0 +1,25 @@ +// Generated by CoffeeScript 1.7.1 +(function() { + var e, foo; + + sourceMapSupport.install(); + + foo = function() { + throw new Error('foo'); + }; + + try { + foo(); + } catch (_error) { + e = _error; + if (/\bscript\.coffee\b/.test(e.stack)) { + document.body.appendChild(document.createTextNode('Test passed')); + } else { + document.body.appendChild(document.createTextNode('Test failed')); + console.log(e.stack); + } + } + +}).call(this); + +//# sourceMappingURL=script.map diff --git a/react-app/node_modules/source-map-support/browser-test/script.map b/react-app/node_modules/source-map-support/browser-test/script.map new file mode 100644 index 0000000000..127a2b6dac --- /dev/null +++ b/react-app/node_modules/source-map-support/browser-test/script.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "file": "script.js", + "sourceRoot": "..", + "sources": [ + "browser-test/script.coffee" + ], + "names": [], + "mappings": ";AAAA;AAAA,MAAA,MAAA;;AAAA,EAAA,gBAAgB,CAAC,OAAjB,CAAA,CAAA,CAAA;;AAAA,EAEA,GAAA,GAAM,SAAA,GAAA;AAAG,UAAU,IAAA,KAAA,CAAM,KAAN,CAAV,CAAH;EAAA,CAFN,CAAA;;AAIA;AACE,IAAA,GAAA,CAAA,CAAA,CADF;GAAA,cAAA;AAGE,IADI,UACJ,CAAA;AAAA,IAAA,IAAG,oBAAoB,CAAC,IAArB,CAA0B,CAAC,CAAC,KAA5B,CAAH;AACE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CADF;KAAA,MAAA;AAGE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CAAA;AAAA,MACA,OAAO,CAAC,GAAR,CAAY,CAAC,CAAC,KAAd,CADA,CAHF;KAHF;GAJA;AAAA" +} \ No newline at end of file diff --git a/react-app/node_modules/source-map-support/build.js b/react-app/node_modules/source-map-support/build.js new file mode 100755 index 0000000000..d23df0f2e6 --- /dev/null +++ b/react-app/node_modules/source-map-support/build.js @@ -0,0 +1,69 @@ +#!/usr/bin/env node + +var fs = require('fs'); +var querystring = require('querystring'); +var child_process = require('child_process'); + +function run(command, callback) { + console.log(command); + child_process.exec(command, callback); +} + +// Use browserify to package up source-map-support.js +fs.writeFileSync('.temp.js', 'sourceMapSupport = require("./source-map-support");'); +run('node_modules/browserify/bin/cmd.js .temp.js', function(error, stdout) { + if (error) throw error; + + // Wrap the code so it works both as a normal + diff --git a/react-app/node_modules/source-map-support/header-test/script.coffee b/react-app/node_modules/source-map-support/header-test/script.coffee new file mode 100644 index 0000000000..57210686c2 --- /dev/null +++ b/react-app/node_modules/source-map-support/header-test/script.coffee @@ -0,0 +1,12 @@ +sourceMapSupport.install() + +foo = -> throw new Error 'foo' + +try + foo() +catch e + if /\bscript\.coffee\b/.test e.stack + document.body.appendChild document.createTextNode 'Test passed' + else + document.body.appendChild document.createTextNode 'Test failed' + console.log e.stack diff --git a/react-app/node_modules/source-map-support/header-test/script.js b/react-app/node_modules/source-map-support/header-test/script.js new file mode 100644 index 0000000000..012db6b90c --- /dev/null +++ b/react-app/node_modules/source-map-support/header-test/script.js @@ -0,0 +1,25 @@ +// Generated by CoffeeScript 1.7.1 +(function() { + var e, foo; + + sourceMapSupport.install(); + + foo = function() { + throw new Error('foo'); + }; + + try { + foo(); + } catch (_error) { + e = _error; + if (/\bscript\.coffee\b/.test(e.stack)) { + document.body.appendChild(document.createTextNode('Test passed')); + } else { + document.body.appendChild(document.createTextNode('Test failed')); + console.log(e.stack); + } + } + +}).call(this); + + diff --git a/react-app/node_modules/source-map-support/header-test/script.map b/react-app/node_modules/source-map-support/header-test/script.map new file mode 100644 index 0000000000..0e890f8fc8 --- /dev/null +++ b/react-app/node_modules/source-map-support/header-test/script.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "file": "script.js", + "sourceRoot": "..", + "sources": [ + "header-test/script.coffee" + ], + "names": [], + "mappings": ";AAAA;AAAA,MAAA,MAAA;;AAAA,EAAA,gBAAgB,CAAC,OAAjB,CAAA,CAAA,CAAA;;AAAA,EAEA,GAAA,GAAM,SAAA,GAAA;AAAG,UAAU,IAAA,KAAA,CAAM,KAAN,CAAV,CAAH;EAAA,CAFN,CAAA;;AAIA;AACE,IAAA,GAAA,CAAA,CAAA,CADF;GAAA,cAAA;AAGE,IADI,UACJ,CAAA;AAAA,IAAA,IAAG,oBAAoB,CAAC,IAArB,CAA0B,CAAC,CAAC,KAA5B,CAAH;AACE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CADF;KAAA,MAAA;AAGE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CAAA;AAAA,MACA,OAAO,CAAC,GAAR,CAAY,CAAC,CAAC,KAAd,CADA,CAHF;KAHF;GAJA;AAAA" +} \ No newline at end of file diff --git a/react-app/node_modules/source-map-support/header-test/server.js b/react-app/node_modules/source-map-support/header-test/server.js new file mode 100644 index 0000000000..ecc0cdfaa3 --- /dev/null +++ b/react-app/node_modules/source-map-support/header-test/server.js @@ -0,0 +1,45 @@ +var fs = require('fs'); +var http = require('http'); + +http.createServer(function(req, res) { + switch (req.url) { + case '/': + case '/index.html': { + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(fs.readFileSync('index.html', 'utf8')); + break; + } + + case '/browser-source-map-support.js': { + res.writeHead(200, { 'Content-Type': 'text/javascript' }); + res.end(fs.readFileSync('../browser-source-map-support.js', 'utf8')); + break; + } + + case '/script.js': { + res.writeHead(200, { 'Content-Type': 'text/javascript', 'SourceMap': 'script-source-map.map' }); + res.end(fs.readFileSync('script.js', 'utf8')); + break; + } + + case '/script-source-map.map': { + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(fs.readFileSync('script.map', 'utf8')); + break; + } + + case '/header-test/script.coffee': { + res.writeHead(200, { 'Content-Type': 'text/x-coffeescript' }); + res.end(fs.readFileSync('script.coffee', 'utf8')); + break; + } + + default: { + res.writeHead(404, { 'Content-Type': 'text/html' }); + res.end('404 not found'); + break; + } + } +}).listen(1337, '127.0.0.1'); + +console.log('Server running at http://127.0.0.1:1337/'); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/.npmignore b/react-app/node_modules/source-map-support/node_modules/source-map/.npmignore new file mode 100644 index 0000000000..3dddf3f670 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/.npmignore @@ -0,0 +1,2 @@ +dist/* +node_modules/* diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/.travis.yml b/react-app/node_modules/source-map-support/node_modules/source-map/.travis.yml new file mode 100644 index 0000000000..ddc9c4f989 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.8 + - "0.10" \ No newline at end of file diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/CHANGELOG.md b/react-app/node_modules/source-map-support/node_modules/source-map/CHANGELOG.md new file mode 100644 index 0000000000..3796e07a72 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/CHANGELOG.md @@ -0,0 +1,121 @@ +# Change Log + +## 0.1.32 + +* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns + (issue 92). + +* Fixed test runner to actually report number of failed tests as its process + exit code. + +* Fixed a typo when reporting bad mappings (issue 87). + +## 0.1.31 + +* Delay parsing the mappings in SourceMapConsumer until queried for a source + location. + +* Support Sass source maps (which at the time of writing deviate from the spec + in small ways) in SourceMapConsumer. + +## 0.1.30 + +* Do not join source root with a source, when the source is a data URI. + +* Extend the test runner to allow running single specific test files at a time. + +* Performance improvements in `SourceNode.prototype.walk` and + `SourceMapConsumer.prototype.eachMapping`. + +* Source map browser builds will now work inside Workers. + +* Better error messages when attempting to add an invalid mapping to a + `SourceMapGenerator`. + +## 0.1.29 + +* Allow duplicate entries in the `names` and `sources` arrays of source maps + (usually from TypeScript) we are parsing. Fixes github isse 72. + +## 0.1.28 + +* Skip duplicate mappings when creating source maps from SourceNode; github + issue 75. + +## 0.1.27 + +* Don't throw an error when the `file` property is missing in SourceMapConsumer, + we don't use it anyway. + +## 0.1.26 + +* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. + +## 0.1.25 + +* Make compatible with browserify + +## 0.1.24 + +* Fix issue with absolute paths and `file://` URIs. See + https://bugzilla.mozilla.org/show_bug.cgi?id=885597 + +## 0.1.23 + +* Fix issue with absolute paths and sourcesContent, github issue 64. + +## 0.1.22 + +* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. + +## 0.1.21 + +* Fixed handling of sources that start with a slash so that they are relative to + the source root's host. + +## 0.1.20 + +* Fixed github issue #43: absolute URLs aren't joined with the source root + anymore. + +## 0.1.19 + +* Using Travis CI to run tests. + +## 0.1.18 + +* Fixed a bug in the handling of sourceRoot. + +## 0.1.17 + +* Added SourceNode.fromStringWithSourceMap. + +## 0.1.16 + +* Added missing documentation. + +* Fixed the generating of empty mappings in SourceNode. + +## 0.1.15 + +* Added SourceMapGenerator.applySourceMap. + +## 0.1.14 + +* The sourceRoot is now handled consistently. + +## 0.1.13 + +* Added SourceMapGenerator.fromSourceMap. + +## 0.1.12 + +* SourceNode now generates empty mappings too. + +## 0.1.11 + +* Added name support to SourceNode. + +## 0.1.10 + +* Added sourcesContent support to the customer and generator. diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/LICENSE b/react-app/node_modules/source-map-support/node_modules/source-map/LICENSE new file mode 100644 index 0000000000..ed1b7cf27e --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/LICENSE @@ -0,0 +1,28 @@ + +Copyright (c) 2009-2011, Mozilla Foundation and contributors +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 names of the Mozilla Foundation nor the names of project + 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 HOLDER 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. diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/Makefile.dryice.js b/react-app/node_modules/source-map-support/node_modules/source-map/Makefile.dryice.js new file mode 100644 index 0000000000..d6fc26a790 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/Makefile.dryice.js @@ -0,0 +1,166 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var path = require('path'); +var fs = require('fs'); +var copy = require('dryice').copy; + +function removeAmdefine(src) { + src = String(src).replace( + /if\s*\(typeof\s*define\s*!==\s*'function'\)\s*{\s*var\s*define\s*=\s*require\('amdefine'\)\(module,\s*require\);\s*}\s*/g, + ''); + src = src.replace( + /\b(define\(.*)('amdefine',?)/gm, + '$1'); + return src; +} +removeAmdefine.onRead = true; + +function makeNonRelative(src) { + return src + .replace(/require\('.\//g, 'require(\'source-map/') + .replace(/\.\.\/\.\.\/lib\//g, ''); +} +makeNonRelative.onRead = true; + +function buildBrowser() { + console.log('\nCreating dist/source-map.js'); + + var project = copy.createCommonJsProject({ + roots: [ path.join(__dirname, 'lib') ] + }); + + copy({ + source: [ + 'build/mini-require.js', + { + project: project, + require: [ 'source-map/source-map-generator', + 'source-map/source-map-consumer', + 'source-map/source-node'] + }, + 'build/suffix-browser.js' + ], + filter: [ + copy.filter.moduleDefines, + removeAmdefine + ], + dest: 'dist/source-map.js' + }); +} + +function buildBrowserMin() { + console.log('\nCreating dist/source-map.min.js'); + + copy({ + source: 'dist/source-map.js', + filter: copy.filter.uglifyjs, + dest: 'dist/source-map.min.js' + }); +} + +function buildFirefox() { + console.log('\nCreating dist/SourceMap.jsm'); + + var project = copy.createCommonJsProject({ + roots: [ path.join(__dirname, 'lib') ] + }); + + copy({ + source: [ + 'build/prefix-source-map.jsm', + { + project: project, + require: [ 'source-map/source-map-consumer', + 'source-map/source-map-generator', + 'source-map/source-node' ] + }, + 'build/suffix-source-map.jsm' + ], + filter: [ + copy.filter.moduleDefines, + removeAmdefine, + makeNonRelative + ], + dest: 'dist/SourceMap.jsm' + }); + + // Create dist/test/Utils.jsm + console.log('\nCreating dist/test/Utils.jsm'); + + project = copy.createCommonJsProject({ + roots: [ __dirname, path.join(__dirname, 'lib') ] + }); + + copy({ + source: [ + 'build/prefix-utils.jsm', + 'build/assert-shim.js', + { + project: project, + require: [ 'test/source-map/util' ] + }, + 'build/suffix-utils.jsm' + ], + filter: [ + copy.filter.moduleDefines, + removeAmdefine, + makeNonRelative + ], + dest: 'dist/test/Utils.jsm' + }); + + function isTestFile(f) { + return /^test\-.*?\.js/.test(f); + } + + var testFiles = fs.readdirSync(path.join(__dirname, 'test', 'source-map')).filter(isTestFile); + + testFiles.forEach(function (testFile) { + console.log('\nCreating', path.join('dist', 'test', testFile.replace(/\-/g, '_'))); + + copy({ + source: [ + 'build/test-prefix.js', + path.join('test', 'source-map', testFile), + 'build/test-suffix.js' + ], + filter: [ + removeAmdefine, + makeNonRelative, + function (input, source) { + return input.replace('define(', + 'define("' + + path.join('test', 'source-map', testFile.replace(/\.js$/, '')) + + '", ["require", "exports", "module"], '); + }, + function (input, source) { + return input.replace('{THIS_MODULE}', function () { + return "test/source-map/" + testFile.replace(/\.js$/, ''); + }); + } + ], + dest: path.join('dist', 'test', testFile.replace(/\-/g, '_')) + }); + }); +} + +function ensureDir(name) { + var dirExists = false; + try { + dirExists = fs.statSync(name).isDirectory(); + } catch (err) {} + + if (!dirExists) { + fs.mkdirSync(name, 0777); + } +} + +ensureDir("dist"); +ensureDir("dist/test"); +buildFirefox(); +buildBrowser(); +buildBrowserMin(); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/README.md b/react-app/node_modules/source-map-support/node_modules/source-map/README.md new file mode 100644 index 0000000000..c20437bc60 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/README.md @@ -0,0 +1,434 @@ +# Source Map + +This is a library to generate and consume the source map format +[described here][format]. + +This library is written in the Asynchronous Module Definition format, and works +in the following environments: + +* Modern Browsers supporting ECMAScript 5 (either after the build, or with an + AMD loader such as RequireJS) + +* Inside Firefox (as a JSM file, after the build) + +* With NodeJS versions 0.8.X and higher + +## Node + + $ npm install source-map + +## Building from Source (for everywhere else) + +Install Node and then run + + $ git clone https://fitzgen@github.com/mozilla/source-map.git + $ cd source-map + $ npm link . + +Next, run + + $ node Makefile.dryice.js + +This should spew a bunch of stuff to stdout, and create the following files: + +* `dist/source-map.js` - The unminified browser version. + +* `dist/source-map.min.js` - The minified browser version. + +* `dist/SourceMap.jsm` - The JavaScript Module for inclusion in Firefox source. + +## Examples + +### Consuming a source map + + var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' + }; + + var smc = new SourceMapConsumer(rawSourceMap); + + console.log(smc.sources); + // [ 'http://example.com/www/js/one.js', + // 'http://example.com/www/js/two.js' ] + + console.log(smc.originalPositionFor({ + line: 2, + column: 28 + })); + // { source: 'http://example.com/www/js/two.js', + // line: 2, + // column: 10, + // name: 'n' } + + console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 + })); + // { line: 2, column: 28 } + + smc.eachMapping(function (m) { + // ... + }); + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + + function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } + } + + var ast = parse("40 + 2", "add.js"); + console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' + })); + // { code: '40 + 2', + // map: [object SourceMapGenerator] } + +#### With SourceMapGenerator (low level API) + + var map = new SourceMapGenerator({ + file: "source-mapped.js" + }); + + map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" + }); + + console.log(map.toString()); + // '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' + +## API + +Get a reference to the module: + + // NodeJS + var sourceMap = require('source-map'); + + // Browser builds + var sourceMap = window.sourceMap; + + // Inside Firefox + let sourceMap = {}; + Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referrenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: The generated filename this source map is associated with. + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. + +* `column`: The column number in the generated source. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. + +* `column`: The column number in the original source, or null or null if this + information is not available. + +* `name`: The original identifier, or null if this information is not available. + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: The column number in the original source. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +#### SourceMapConsumer.prototype.sourceContentFor(source) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator(startOfSourceMap) + +To create a new one, you must pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: An optional root for all relative URLs in this source map. + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new SourceMapGenerator based on a SourceMapConsumer + +* `sourceMapConsumer` The SourceMap. + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimium of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used. + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode(line, column, source[, chunk[, name]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. + +* `source`: The original source's filename. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming whitespace from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +### SourceNode.prototype.toStringWithSourceMap(startOfSourceMap) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +## Tests + +[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) + +Install NodeJS version 0.8.0 or greater, then run `node test/run-tests.js`. + +To add new tests, create a new file named `test/test-.js` +and export your test functions with names that start with "test", for example + + exports["test doing the foo bar"] = function (assert, util) { + ... + }; + +The new test will be located automatically when you run the suite. + +The `util` argument is the test utility module located at `test/source-map/util`. + +The `assert` argument is a cut down version of node's assert module. You have +access to the following assertion functions: + +* `doesNotThrow` + +* `equal` + +* `ok` + +* `strictEqual` + +* `throws` + +(The reason for the restricted set of test functions is because we need the +tests to run inside Firefox's test suite as well and so the assert module is +shimmed in that environment. See `build/assert-shim.js`.) + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit +[feature]: https://wiki.mozilla.org/DevTools/Features/SourceMap +[Dryice]: https://github.com/mozilla/dryice diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/assert-shim.js b/react-app/node_modules/source-map-support/node_modules/source-map/build/assert-shim.js new file mode 100644 index 0000000000..daa1a623c7 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/assert-shim.js @@ -0,0 +1,56 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +define('test/source-map/assert', ['exports'], function (exports) { + + let do_throw = function (msg) { + throw new Error(msg); + }; + + exports.init = function (throw_fn) { + do_throw = throw_fn; + }; + + exports.doesNotThrow = function (fn) { + try { + fn(); + } + catch (e) { + do_throw(e.message); + } + }; + + exports.equal = function (actual, expected, msg) { + msg = msg || String(actual) + ' != ' + String(expected); + if (actual != expected) { + do_throw(msg); + } + }; + + exports.ok = function (val, msg) { + msg = msg || String(val) + ' is falsey'; + if (!Boolean(val)) { + do_throw(msg); + } + }; + + exports.strictEqual = function (actual, expected, msg) { + msg = msg || String(actual) + ' !== ' + String(expected); + if (actual !== expected) { + do_throw(msg); + } + }; + + exports.throws = function (fn) { + try { + fn(); + do_throw('Expected an error to be thrown, but it wasn\'t.'); + } + catch (e) { + } + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/mini-require.js b/react-app/node_modules/source-map-support/node_modules/source-map/build/mini-require.js new file mode 100644 index 0000000000..0daf453773 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/mini-require.js @@ -0,0 +1,152 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/** + * Define a module along with a payload. + * @param {string} moduleName Name for the payload + * @param {ignored} deps Ignored. For compatibility with CommonJS AMD Spec + * @param {function} payload Function with (require, exports, module) params + */ +function define(moduleName, deps, payload) { + if (typeof moduleName != "string") { + throw new TypeError('Expected string, got: ' + moduleName); + } + + if (arguments.length == 2) { + payload = deps; + } + + if (moduleName in define.modules) { + throw new Error("Module already defined: " + moduleName); + } + define.modules[moduleName] = payload; +}; + +/** + * The global store of un-instantiated modules + */ +define.modules = {}; + + +/** + * We invoke require() in the context of a Domain so we can have multiple + * sets of modules running separate from each other. + * This contrasts with JSMs which are singletons, Domains allows us to + * optionally load a CommonJS module twice with separate data each time. + * Perhaps you want 2 command lines with a different set of commands in each, + * for example. + */ +function Domain() { + this.modules = {}; + this._currentModule = null; +} + +(function () { + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * There are 2 ways to call this, either with an array of dependencies and a + * callback to call when the dependencies are found (which can happen + * asynchronously in an in-page context) or with a single string an no callback + * where the dependency is resolved synchronously and returned. + * The API is designed to be compatible with the CommonJS AMD spec and + * RequireJS. + * @param {string[]|string} deps A name, or names for the payload + * @param {function|undefined} callback Function to call when the dependencies + * are resolved + * @return {undefined|object} The module required or undefined for + * array/callback method + */ + Domain.prototype.require = function(deps, callback) { + if (Array.isArray(deps)) { + var params = deps.map(function(dep) { + return this.lookup(dep); + }, this); + if (callback) { + callback.apply(null, params); + } + return undefined; + } + else { + return this.lookup(deps); + } + }; + + function normalize(path) { + var bits = path.split('/'); + var i = 1; + while (i < bits.length) { + if (bits[i] === '..') { + bits.splice(i-1, 1); + } else if (bits[i] === '.') { + bits.splice(i, 1); + } else { + i++; + } + } + return bits.join('/'); + } + + function join(a, b) { + a = a.trim(); + b = b.trim(); + if (/^\//.test(b)) { + return b; + } else { + return a.replace(/\/*$/, '/') + b; + } + } + + function dirname(path) { + var bits = path.split('/'); + bits.pop(); + return bits.join('/'); + } + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * @param {string} moduleName A name for the payload to lookup + * @return {object} The module specified by aModuleName or null if not found. + */ + Domain.prototype.lookup = function(moduleName) { + if (/^\./.test(moduleName)) { + moduleName = normalize(join(dirname(this._currentModule), moduleName)); + } + + if (moduleName in this.modules) { + var module = this.modules[moduleName]; + return module; + } + + if (!(moduleName in define.modules)) { + throw new Error("Module not defined: " + moduleName); + } + + var module = define.modules[moduleName]; + + if (typeof module == "function") { + var exports = {}; + var previousModule = this._currentModule; + this._currentModule = moduleName; + module(this.require.bind(this), exports, { id: moduleName, uri: "" }); + this._currentModule = previousModule; + module = exports; + } + + // cache the resulting module object for next time + this.modules[moduleName] = module; + + return module; + }; + +}()); + +define.Domain = Domain; +define.globalDomain = new Domain(); +var require = define.globalDomain.require.bind(define.globalDomain); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/prefix-source-map.jsm b/react-app/node_modules/source-map-support/node_modules/source-map/build/prefix-source-map.jsm new file mode 100644 index 0000000000..ee2539d815 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/prefix-source-map.jsm @@ -0,0 +1,20 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +/////////////////////////////////////////////////////////////////////////////// + + +this.EXPORTED_SYMBOLS = [ "SourceMapConsumer", "SourceMapGenerator", "SourceNode" ]; + +Components.utils.import('resource://gre/modules/devtools/Require.jsm'); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/prefix-utils.jsm b/react-app/node_modules/source-map-support/node_modules/source-map/build/prefix-utils.jsm new file mode 100644 index 0000000000..80341d4528 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/prefix-utils.jsm @@ -0,0 +1,18 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +Components.utils.import('resource://gre/modules/devtools/Require.jsm'); +Components.utils.import('resource://gre/modules/devtools/SourceMap.jsm'); + +this.EXPORTED_SYMBOLS = [ "define", "runSourceMapTests" ]; diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-browser.js b/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-browser.js new file mode 100644 index 0000000000..fb29ff5fd2 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-browser.js @@ -0,0 +1,8 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/////////////////////////////////////////////////////////////////////////////// + +this.sourceMap = { + SourceMapConsumer: require('source-map/source-map-consumer').SourceMapConsumer, + SourceMapGenerator: require('source-map/source-map-generator').SourceMapGenerator, + SourceNode: require('source-map/source-node').SourceNode +}; diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-source-map.jsm b/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-source-map.jsm new file mode 100644 index 0000000000..cf3c2d8d30 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-source-map.jsm @@ -0,0 +1,6 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/////////////////////////////////////////////////////////////////////////////// + +this.SourceMapConsumer = require('source-map/source-map-consumer').SourceMapConsumer; +this.SourceMapGenerator = require('source-map/source-map-generator').SourceMapGenerator; +this.SourceNode = require('source-map/source-node').SourceNode; diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-utils.jsm b/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-utils.jsm new file mode 100644 index 0000000000..b31b84cb61 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/suffix-utils.jsm @@ -0,0 +1,21 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +function runSourceMapTests(modName, do_throw) { + let mod = require(modName); + let assert = require('test/source-map/assert'); + let util = require('test/source-map/util'); + + assert.init(do_throw); + + for (let k in mod) { + if (/^test/.test(k)) { + mod[k](assert, util); + } + } + +} +this.runSourceMapTests = runSourceMapTests; diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/test-prefix.js b/react-app/node_modules/source-map-support/node_modules/source-map/build/test-prefix.js new file mode 100644 index 0000000000..1b13f300e5 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/test-prefix.js @@ -0,0 +1,8 @@ +/* + * WARNING! + * + * Do not edit this file directly, it is built from the sources at + * https://github.com/mozilla/source-map/ + */ + +Components.utils.import('resource://test/Utils.jsm'); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/build/test-suffix.js b/react-app/node_modules/source-map-support/node_modules/source-map/build/test-suffix.js new file mode 100644 index 0000000000..bec2de3f26 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/build/test-suffix.js @@ -0,0 +1,3 @@ +function run_test() { + runSourceMapTests('{THIS_MODULE}', do_throw); +} diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map.js new file mode 100644 index 0000000000..121ad24163 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./source-map/source-node').SourceNode; diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js new file mode 100644 index 0000000000..40f9a18b18 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js @@ -0,0 +1,97 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var util = require('./util'); + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = {}; + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var isDuplicate = this.has(aStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + this._set[util.toSetString(aStr)] = idx; + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + return Object.prototype.hasOwnProperty.call(this._set, + util.toSetString(aStr)); + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (this.has(aStr)) { + return this._set[util.toSetString(aStr)]; + } + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js new file mode 100644 index 0000000000..1b67bb375f --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js @@ -0,0 +1,144 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler 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. + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64 = require('./base64'); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string. + */ + exports.decode = function base64VLQ_decode(aStr) { + var i = 0; + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (i >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + digit = base64.decode(aStr.charAt(i++)); + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + return { + value: fromVLQSigned(result), + rest: aStr.slice(i) + }; + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js new file mode 100644 index 0000000000..863cc4650c --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js @@ -0,0 +1,42 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var charToIntMap = {}; + var intToCharMap = {}; + + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + .split('') + .forEach(function (ch, index) { + charToIntMap[ch] = index; + intToCharMap[index] = ch; + }); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function base64_encode(aNumber) { + if (aNumber in intToCharMap) { + return intToCharMap[aNumber]; + } + throw new TypeError("Must be between 0 and 63: " + aNumber); + }; + + /** + * Decode a single base 64 digit to an integer. + */ + exports.decode = function base64_decode(aChar) { + if (aChar in charToIntMap) { + return charToIntMap[aChar]; + } + throw new TypeError("Not a valid base 64 digit: " + aChar); + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js new file mode 100644 index 0000000000..ff347c68ba --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js @@ -0,0 +1,81 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the next + // closest element that is less than that element. + // + // 3. We did not find the exact element, and there is no next-closest + // element which is less than the one we are searching for, so we + // return null. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return aHaystack[mid]; + } + else if (cmp > 0) { + // aHaystack[mid] is greater than our needle. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare); + } + // We did not find an exact match, return the next closest one + // (termination case 2). + return aHaystack[mid]; + } + else { + // aHaystack[mid] is less than our needle. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare); + } + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (2) or (3) and return the appropriate thing. + return aLow < 0 + ? null + : aHaystack[aLow]; + } + } + + /** + * This is an implementation of binary search which will always try and return + * the next lowest value checked if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + */ + exports.search = function search(aNeedle, aHaystack, aCompare) { + return aHaystack.length > 0 + ? recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare) + : null; + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js new file mode 100644 index 0000000000..d7f10d8b4a --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js @@ -0,0 +1,478 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var util = require('./util'); + var binarySearch = require('./binary-search'); + var ArraySet = require('./array-set').ArraySet; + var base64VLQ = require('./base64-vlq'); + + /** + * A SourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names, true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + /** + * Create a SourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns SourceMapConsumer + */ + SourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(SourceMapConsumer.prototype); + + smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + smc.__generatedMappings = aSourceMap._mappings.slice() + .sort(util.compareByGeneratedPositions); + smc.__originalMappings = aSourceMap._mappings.slice() + .sort(util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(SourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this.__generatedMappings = []; + this.__originalMappings = []; + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this.__generatedMappings = []; + this.__originalMappings = []; + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var mappingSeparator = /^[,;]/; + var str = aStr; + var mapping; + var temp; + + while (str.length > 0) { + if (str.charAt(0) === ';') { + generatedLine++; + str = str.slice(1); + previousGeneratedColumn = 0; + } + else if (str.charAt(0) === ',') { + str = str.slice(1); + } + else { + mapping = {}; + mapping.generatedLine = generatedLine; + + // Generated column. + temp = base64VLQ.decode(str); + mapping.generatedColumn = previousGeneratedColumn + temp.value; + previousGeneratedColumn = mapping.generatedColumn; + str = temp.rest; + + if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { + // Original source. + temp = base64VLQ.decode(str); + mapping.source = this._sources.at(previousSource + temp.value); + previousSource += temp.value; + str = temp.rest; + if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { + throw new Error('Found a source, but no line and column'); + } + + // Original line. + temp = base64VLQ.decode(str); + mapping.originalLine = previousOriginalLine + temp.value; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + str = temp.rest; + if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { + throw new Error('Found a source and line, but no column'); + } + + // Original column. + temp = base64VLQ.decode(str); + mapping.originalColumn = previousOriginalColumn + temp.value; + previousOriginalColumn = mapping.originalColumn; + str = temp.rest; + + if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { + // Original name. + temp = base64VLQ.decode(str); + mapping.name = this._names.at(previousName + temp.value); + previousName += temp.value; + str = temp.rest; + } + } + + this.__generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + this.__originalMappings.push(mapping); + } + } + } + + this.__generatedMappings.sort(util.compareByGeneratedPositions); + this.__originalMappings.sort(util.compareByOriginalPositions); + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + SourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator); + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + SourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var mapping = this._findMapping(needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositions); + + if (mapping) { + var source = util.getArg(mapping, 'source', null); + if (source && this.sourceRoot) { + source = util.join(this.sourceRoot, source); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: util.getArg(mapping, 'name', null) + }; + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * availible. + */ + SourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + throw new Error('"' + aSource + '" is not in the SourceMap.'); + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + if (this.sourceRoot) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + + var mapping = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions); + + if (mapping) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null) + }; + } + + return { + line: null, + column: null + }; + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source; + if (source && sourceRoot) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name + }; + }).forEach(aCallback, context); + }; + + exports.SourceMapConsumer = SourceMapConsumer; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js new file mode 100644 index 0000000000..88b06ecb7d --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js @@ -0,0 +1,380 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64VLQ = require('./base64-vlq'); + var util = require('./util'); + var ArraySet = require('./array-set').ArraySet; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. To create a new one, you must pass an object + * with the following properties: + * + * - file: The filename of the generated source. + * - sourceRoot: An optional root for all URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + this._file = util.getArg(aArgs, 'file'); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = []; + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source) { + newMapping.source = mapping.source; + if (sourceRoot) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + this._validateMapping(generated, original, source, name); + + if (source && !this._sources.has(source)) { + this._sources.add(source); + } + + if (name && !this._names.has(name)) { + this._names.add(name); + } + + this._mappings.push({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent !== null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = {}; + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile) { + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (!aSourceFile) { + aSourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "aSourceFile" relative if an absolute Url is passed. + if (sourceRoot) { + aSourceFile = util.relative(sourceRoot, aSourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "aSourceFile" + this._mappings.forEach(function (mapping) { + if (mapping.source === aSourceFile && mapping.originalLine) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source !== null) { + // Copy mapping + if (sourceRoot) { + mapping.source = util.relative(sourceRoot, original.source); + } else { + mapping.source = original.source; + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name !== null && mapping.name !== null) { + // Only use the identifier name if it's an identifier + // in both SourceMaps + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + if (sourceRoot) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var mapping; + + // The mappings must be guaranteed to be in sorted order before we start + // serializing them or else the generated line numbers (which are defined + // via the ';' separators) will be all messed up. Note: it might be more + // performant to maintain the sorting as we insert them, rather than as we + // serialize them, but the big O is the same either way. + this._mappings.sort(util.compareByGeneratedPositions); + + for (var i = 0, len = this._mappings.length; i < len; i++) { + mapping = this._mappings[i]; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + result += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositions(mapping, this._mappings[i - 1])) { + continue; + } + result += ','; + } + } + + result += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source) { + result += base64VLQ.encode(this._sources.indexOf(mapping.source) + - previousSource); + previousSource = this._sources.indexOf(mapping.source); + + // lines are stored 0-based in SourceMap spec version 3 + result += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + result += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name) { + result += base64VLQ.encode(this._names.indexOf(mapping.name) + - previousName); + previousName = this._names.indexOf(mapping.name); + } + } + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, + key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + file: this._file, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._sourceRoot) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js new file mode 100644 index 0000000000..626cb65743 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js @@ -0,0 +1,371 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; + var util = require('./util'); + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine === undefined ? null : aLine; + this.column = aColumn === undefined ? null : aColumn; + this.source = aSource === undefined ? null : aSource; + this.name = aName === undefined ? null : aName; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // The generated code + // Processed fragments are removed from this array. + var remainingLines = aGeneratedCode.split('\n'); + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping === null) { + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(remainingLines.shift() + "\n"); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + } else { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + var code = ""; + // Associate full lines with "lastMapping" + do { + code += remainingLines.shift() + "\n"; + lastGeneratedLine++; + lastGeneratedColumn = 0; + } while (lastGeneratedLine < mapping.generatedLine); + // When we reached the correct line, we add code until we + // reach the correct column too. + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + code += nextLine.substr(0, mapping.generatedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + // Create the SourceNode. + addMappingWithCode(lastMapping, code); + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[0]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + } + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + // Associate the remaining code in the current line with "lastMapping" + // and add the remaining lines without any mapping + addMappingWithCode(lastMapping, remainingLines.join("\n")); + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + mapping.source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk instanceof SourceNode || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk instanceof SourceNode || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk instanceof SourceNode) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild instanceof SourceNode) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i] instanceof SourceNode) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + chunk.split('').forEach(function (ch) { + if (ch === '\n') { + generated.line++; + generated.column = 0; + } else { + generated.column++; + } + }); + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js new file mode 100644 index 0000000000..87946d3f78 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js @@ -0,0 +1,205 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/; + var dataUrlRegexp = /^data:.+\,.+/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[3], + host: match[4], + port: match[6], + path: match[7] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = aParsedUrl.scheme + "://"; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + "@" + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + function join(aRoot, aPath) { + var url; + + if (aPath.match(urlRegexp) || aPath.match(dataUrlRegexp)) { + return aPath; + } + + if (aPath.charAt(0) === '/' && (url = urlParse(aRoot))) { + url.path = aPath; + return urlGenerate(url); + } + + return aRoot.replace(/\/$/, '') + '/' + aPath; + } + exports.join = join; + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + return '$' + aStr; + } + exports.toSetString = toSetString; + + function fromSetString(aStr) { + return aStr.substr(1); + } + exports.fromSetString = fromSetString; + + function relative(aRoot, aPath) { + aRoot = aRoot.replace(/\/$/, ''); + + var url = urlParse(aRoot); + if (aPath.charAt(0) == "/" && url && url.path == "/") { + return aPath.slice(1); + } + + return aPath.indexOf(aRoot + '/') === 0 + ? aPath.substr(aRoot.length + 1) + : aPath; + } + exports.relative = relative; + + function strcmp(aStr1, aStr2) { + var s1 = aStr1 || ""; + var s2 = aStr2 || ""; + return (s1 > s2) - (s1 < s2); + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp; + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp || onlyCompareOriginal) { + return cmp; + } + + cmp = strcmp(mappingA.name, mappingB.name); + if (cmp) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp) { + return cmp; + } + + return mappingA.generatedColumn - mappingB.generatedColumn; + }; + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings where the generated positions are + * compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) { + var cmp; + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp || onlyCompareGenerated) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + }; + exports.compareByGeneratedPositions = compareByGeneratedPositions; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/package.json b/react-app/node_modules/source-map-support/node_modules/source-map/package.json new file mode 100644 index 0000000000..39d9db8e5e --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/package.json @@ -0,0 +1,167 @@ +{ + "_args": [ + [ + "source-map@0.1.32", + "/Users/mromano/dev/react-sfs/node_modules/source-map-support" + ] + ], + "_from": "source-map@0.1.32", + "_id": "source-map@0.1.32", + "_inCache": true, + "_installable": true, + "_location": "/source-map-support/source-map", + "_npmUser": { + "email": "fitzgen@gmail.com", + "name": "nickfitzgerald" + }, + "_npmVersion": "1.2.18", + "_phantomChildren": {}, + "_requested": { + "name": "source-map", + "raw": "source-map@0.1.32", + "rawSpec": "0.1.32", + "scope": null, + "spec": "0.1.32", + "type": "version" + }, + "_requiredBy": [ + "/source-map-support" + ], + "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "_shasum": "c8b6c167797ba4740a8ea33252162ff08591b266", + "_shrinkwrap": null, + "_spec": "source-map@0.1.32", + "_where": "/Users/mromano/dev/react-sfs/node_modules/source-map-support", + "author": { + "email": "nfitzgerald@mozilla.com", + "name": "Nick Fitzgerald" + }, + "bugs": { + "url": "https://github.com/mozilla/source-map/issues" + }, + "contributors": [ + { + "email": "tobias.koppers@googlemail.com", + "name": "Tobias Koppers" + }, + { + "email": "duncan@dweebd.com", + "name": "Duncan Beevers" + }, + { + "email": "scrane@mozilla.com", + "name": "Stephen Crane" + }, + { + "email": "seddon.ryan@gmail.com", + "name": "Ryan Seddon" + }, + { + "email": "miles.elam@deem.com", + "name": "Miles Elam" + }, + { + "email": "mihai.bazon@gmail.com", + "name": "Mihai Bazon" + }, + { + "email": "github.public.email@michael.ficarra.me", + "name": "Michael Ficarra" + }, + { + "email": "todd@twolfson.com", + "name": "Todd Wolfson" + }, + { + "email": "alexander@solovyov.net", + "name": "Alexander Solovyov" + }, + { + "email": "fgnass@gmail.com", + "name": "Felix Gnass" + }, + { + "email": "conrad.irwin@gmail.com", + "name": "Conrad Irwin" + }, + { + "email": "usrbincc@yahoo.com", + "name": "usrbincc" + }, + { + "email": "glasser@davidglasser.net", + "name": "David Glasser" + }, + { + "email": "chase@newrelic.com", + "name": "Chase Douglas" + }, + { + "email": "evan.exe@gmail.com", + "name": "Evan Wallace" + }, + { + "email": "fayearthur@gmail.com", + "name": "Heather Arthur" + }, + { + "email": "hughskennedy@gmail.com", + "name": "Hugh Kennedy" + }, + { + "email": "glasser@davidglasser.net", + "name": "David Glasser" + } + ], + "dependencies": { + "amdefine": ">=0.0.4" + }, + "description": "Generates and consumes source maps", + "devDependencies": { + "dryice": ">=0.4.8" + }, + "directories": { + "lib": "./lib" + }, + "dist": { + "shasum": "c8b6c167797ba4740a8ea33252162ff08591b266", + "tarball": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" + }, + "engines": { + "node": ">=0.8.0" + }, + "homepage": "https://github.com/mozilla/source-map", + "licenses": [ + { + "type": "BSD", + "url": "http://opensource.org/licenses/BSD-3-Clause" + } + ], + "main": "./lib/source-map.js", + "maintainers": [ + { + "email": "mozilla-developer-tools@googlegroups.com", + "name": "mozilla-devtools" + }, + { + "email": "dherman@mozilla.com", + "name": "mozilla" + }, + { + "email": "fitzgen@gmail.com", + "name": "nickfitzgerald" + } + ], + "name": "source-map", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/mozilla/source-map.git" + }, + "scripts": { + "build": "node Makefile.dryice.js", + "test": "node test/run-tests.js" + }, + "version": "0.1.32" +} diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/run-tests.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/run-tests.js new file mode 100755 index 0000000000..64a7c3a3d2 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/run-tests.js @@ -0,0 +1,62 @@ +#!/usr/bin/env node +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var assert = require('assert'); +var fs = require('fs'); +var path = require('path'); +var util = require('./source-map/util'); + +function run(tests) { + var total = 0; + var passed = 0; + + for (var i = 0; i < tests.length; i++) { + for (var k in tests[i].testCase) { + if (/^test/.test(k)) { + total++; + try { + tests[i].testCase[k](assert, util); + passed++; + } + catch (e) { + console.log('FAILED ' + tests[i].name + ': ' + k + '!'); + console.log(e.stack); + } + } + } + } + + console.log(''); + console.log(passed + ' / ' + total + ' tests passed.'); + console.log(''); + + return total - passed; +} + +function isTestFile(f) { + var testToRun = process.argv[2]; + return testToRun + ? path.basename(testToRun) === f + : /^test\-.*?\.js/.test(f); +} + +function toModule(f) { + return './source-map/' + f.replace(/\.js$/, ''); +} + +var requires = fs.readdirSync(path.join(__dirname, 'source-map')) + .filter(isTestFile) + .map(toModule); + +var code = run(requires.map(require).map(function (mod, i) { + return { + name: requires[i], + testCase: mod + }; +})); + +process.exit(code); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-api.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-api.js new file mode 100644 index 0000000000..3801233c0e --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-api.js @@ -0,0 +1,26 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2012 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var sourceMap; + try { + sourceMap = require('../../lib/source-map'); + } catch (e) { + sourceMap = {}; + Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); + } + + exports['test that the api is properly exposed in the top level'] = function (assert, util) { + assert.equal(typeof sourceMap.SourceMapGenerator, "function"); + assert.equal(typeof sourceMap.SourceMapConsumer, "function"); + assert.equal(typeof sourceMap.SourceNode, "function"); + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-array-set.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-array-set.js new file mode 100644 index 0000000000..b5797edd54 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-array-set.js @@ -0,0 +1,104 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var ArraySet = require('../../lib/source-map/array-set').ArraySet; + + function makeTestSet() { + var set = new ArraySet(); + for (var i = 0; i < 100; i++) { + set.add(String(i)); + } + return set; + } + + exports['test .has() membership'] = function (assert, util) { + var set = makeTestSet(); + for (var i = 0; i < 100; i++) { + assert.ok(set.has(String(i))); + } + }; + + exports['test .indexOf() elements'] = function (assert, util) { + var set = makeTestSet(); + for (var i = 0; i < 100; i++) { + assert.strictEqual(set.indexOf(String(i)), i); + } + }; + + exports['test .at() indexing'] = function (assert, util) { + var set = makeTestSet(); + for (var i = 0; i < 100; i++) { + assert.strictEqual(set.at(i), String(i)); + } + }; + + exports['test creating from an array'] = function (assert, util) { + var set = ArraySet.fromArray(['foo', 'bar', 'baz', 'quux', 'hasOwnProperty']); + + assert.ok(set.has('foo')); + assert.ok(set.has('bar')); + assert.ok(set.has('baz')); + assert.ok(set.has('quux')); + assert.ok(set.has('hasOwnProperty')); + + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.indexOf('bar'), 1); + assert.strictEqual(set.indexOf('baz'), 2); + assert.strictEqual(set.indexOf('quux'), 3); + + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.at(1), 'bar'); + assert.strictEqual(set.at(2), 'baz'); + assert.strictEqual(set.at(3), 'quux'); + }; + + exports['test that you can add __proto__; see github issue #30'] = function (assert, util) { + var set = new ArraySet(); + set.add('__proto__'); + assert.ok(set.has('__proto__')); + assert.strictEqual(set.at(0), '__proto__'); + assert.strictEqual(set.indexOf('__proto__'), 0); + }; + + exports['test .fromArray() with duplicates'] = function (assert, util) { + var set = ArraySet.fromArray(['foo', 'foo']); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 1); + + set = ArraySet.fromArray(['foo', 'foo'], true); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.at(1), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 2); + }; + + exports['test .add() with duplicates'] = function (assert, util) { + var set = new ArraySet(); + set.add('foo'); + + set.add('foo'); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 1); + + set.add('foo', true); + assert.ok(set.has('foo')); + assert.strictEqual(set.at(0), 'foo'); + assert.strictEqual(set.at(1), 'foo'); + assert.strictEqual(set.indexOf('foo'), 0); + assert.strictEqual(set.toArray().length, 2); + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-base64-vlq.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-base64-vlq.js new file mode 100644 index 0000000000..653a874e93 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-base64-vlq.js @@ -0,0 +1,24 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64VLQ = require('../../lib/source-map/base64-vlq'); + + exports['test normal encoding and decoding'] = function (assert, util) { + var result; + for (var i = -255; i < 256; i++) { + result = base64VLQ.decode(base64VLQ.encode(i)); + assert.ok(result); + assert.equal(result.value, i); + assert.equal(result.rest, ""); + } + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-base64.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-base64.js new file mode 100644 index 0000000000..ff3a24456d --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-base64.js @@ -0,0 +1,35 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var base64 = require('../../lib/source-map/base64'); + + exports['test out of range encoding'] = function (assert, util) { + assert.throws(function () { + base64.encode(-1); + }); + assert.throws(function () { + base64.encode(64); + }); + }; + + exports['test out of range decoding'] = function (assert, util) { + assert.throws(function () { + base64.decode('='); + }); + }; + + exports['test normal encoding and decoding'] = function (assert, util) { + for (var i = 0; i < 64; i++) { + assert.equal(base64.decode(base64.encode(i)), i); + } + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-binary-search.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-binary-search.js new file mode 100644 index 0000000000..ee306830dd --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-binary-search.js @@ -0,0 +1,54 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var binarySearch = require('../../lib/source-map/binary-search'); + + function numberCompare(a, b) { + return a - b; + } + + exports['test too high'] = function (assert, util) { + var needle = 30; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.doesNotThrow(function () { + binarySearch.search(needle, haystack, numberCompare); + }); + + assert.equal(binarySearch.search(needle, haystack, numberCompare), 20); + }; + + exports['test too low'] = function (assert, util) { + var needle = 1; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.doesNotThrow(function () { + binarySearch.search(needle, haystack, numberCompare); + }); + + assert.equal(binarySearch.search(needle, haystack, numberCompare), null); + }; + + exports['test exact search'] = function (assert, util) { + var needle = 4; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.equal(binarySearch.search(needle, haystack, numberCompare), 4); + }; + + exports['test fuzzy search'] = function (assert, util) { + var needle = 19; + var haystack = [2,4,6,8,10,12,14,16,18,20]; + + assert.equal(binarySearch.search(needle, haystack, numberCompare), 18); + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-dog-fooding.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-dog-fooding.js new file mode 100644 index 0000000000..d831b9262a --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-dog-fooding.js @@ -0,0 +1,72 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + + exports['test eating our own dog food'] = function (assert, util) { + var smg = new SourceMapGenerator({ + file: 'testing.js', + sourceRoot: '/wu/tang' + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 1, column: 0 }, + generated: { line: 2, column: 2 } + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 2, column: 0 }, + generated: { line: 3, column: 2 } + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 3, column: 0 }, + generated: { line: 4, column: 2 } + }); + + smg.addMapping({ + source: 'gza.coffee', + original: { line: 4, column: 0 }, + generated: { line: 5, column: 2 } + }); + + var smc = new SourceMapConsumer(smg.toString()); + + // Exact + util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 0, null, smc, assert); + util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 0, null, smc, assert); + util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 0, null, smc, assert); + util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 0, null, smc, assert); + + // Fuzzy + + // Original to generated + util.assertMapping(2, 0, null, null, null, null, smc, assert, true); + util.assertMapping(2, 9, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true); + util.assertMapping(3, 0, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true); + util.assertMapping(3, 9, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true); + util.assertMapping(4, 0, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true); + util.assertMapping(4, 9, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true); + util.assertMapping(5, 0, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true); + util.assertMapping(5, 9, '/wu/tang/gza.coffee', 4, 0, null, smc, assert, true); + + // Generated to original + util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 1, null, smc, assert, null, true); + util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 3, null, smc, assert, null, true); + util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 6, null, smc, assert, null, true); + util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 9, null, smc, assert, null, true); + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-map-consumer.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-map-consumer.js new file mode 100644 index 0000000000..f2c65a7f09 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-map-consumer.js @@ -0,0 +1,451 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + + exports['test that we can instantiate with a string or an objects'] = function (assert, util) { + assert.doesNotThrow(function () { + var map = new SourceMapConsumer(util.testMap); + }); + assert.doesNotThrow(function () { + var map = new SourceMapConsumer(JSON.stringify(util.testMap)); + }); + }; + + exports['test that the `sources` field has the original sources'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var sources = map.sources; + + assert.equal(sources[0], '/the/root/one.js'); + assert.equal(sources[1], '/the/root/two.js'); + assert.equal(sources.length, 2); + }; + + exports['test that the source root is reflected in a mapping\'s source field'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var mapping; + + mapping = map.originalPositionFor({ + line: 2, + column: 1 + }); + assert.equal(mapping.source, '/the/root/two.js'); + + mapping = map.originalPositionFor({ + line: 1, + column: 1 + }); + assert.equal(mapping.source, '/the/root/one.js'); + }; + + exports['test mapping tokens back exactly'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + + util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, map, assert); + util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, map, assert); + util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, map, assert); + util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', map, assert); + util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, map, assert); + util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', map, assert); + util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', map, assert); + + util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, map, assert); + util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, map, assert); + util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, map, assert); + util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', map, assert); + util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, map, assert); + util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', map, assert); + }; + + exports['test mapping tokens fuzzy'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + + // Finding original positions + util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', map, assert, true); + util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', map, assert, true); + util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, map, assert, true); + + // Finding generated positions + util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', map, assert, null, true); + util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', map, assert, null, true); + util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, map, assert, null, true); + }; + + exports['test creating source map consumers with )]}\' prefix'] = function (assert, util) { + assert.doesNotThrow(function () { + var map = new SourceMapConsumer(")]}'" + JSON.stringify(util.testMap)); + }); + }; + + exports['test eachMapping'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var previousLine = -Infinity; + var previousColumn = -Infinity; + map.eachMapping(function (mapping) { + assert.ok(mapping.generatedLine >= previousLine); + + if (mapping.source) { + assert.equal(mapping.source.indexOf(util.testMap.sourceRoot), 0); + } + + if (mapping.generatedLine === previousLine) { + assert.ok(mapping.generatedColumn >= previousColumn); + previousColumn = mapping.generatedColumn; + } + else { + previousLine = mapping.generatedLine; + previousColumn = -Infinity; + } + }); + }; + + exports['test iterating over mappings in a different order'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var previousLine = -Infinity; + var previousColumn = -Infinity; + var previousSource = ""; + map.eachMapping(function (mapping) { + assert.ok(mapping.source >= previousSource); + + if (mapping.source === previousSource) { + assert.ok(mapping.originalLine >= previousLine); + + if (mapping.originalLine === previousLine) { + assert.ok(mapping.originalColumn >= previousColumn); + previousColumn = mapping.originalColumn; + } + else { + previousLine = mapping.originalLine; + previousColumn = -Infinity; + } + } + else { + previousSource = mapping.source; + previousLine = -Infinity; + previousColumn = -Infinity; + } + }, null, SourceMapConsumer.ORIGINAL_ORDER); + }; + + exports['test that we can set the context for `this` in eachMapping'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMap); + var context = {}; + map.eachMapping(function () { + assert.equal(this, context); + }, context); + }; + + exports['test that the `sourcesContent` field has the original sources'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMapWithSourcesContent); + var sourcesContent = map.sourcesContent; + + assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };'); + assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };'); + assert.equal(sourcesContent.length, 2); + }; + + exports['test that we can get the original sources for the sources'] = function (assert, util) { + var map = new SourceMapConsumer(util.testMapWithSourcesContent); + var sources = map.sources; + + assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); + assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); + assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); + assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); + assert.throws(function () { + map.sourceContentFor(""); + }, Error); + assert.throws(function () { + map.sourceContentFor("/the/root/three.js"); + }, Error); + assert.throws(function () { + map.sourceContentFor("three.js"); + }, Error); + }; + + exports['test sourceRoot + generatedPositionFor'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'foo/bar', + file: 'baz.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'bang.coffee' + }); + map.addMapping({ + original: { line: 5, column: 5 }, + generated: { line: 6, column: 6 }, + source: 'bang.coffee' + }); + map = new SourceMapConsumer(map.toString()); + + // Should handle without sourceRoot. + var pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: 'bang.coffee' + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + // Should handle with sourceRoot. + var pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: 'foo/bar/bang.coffee' + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + }; + + exports['test sourceRoot + originalPositionFor'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'foo/bar', + file: 'baz.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'bang.coffee' + }); + map = new SourceMapConsumer(map.toString()); + + var pos = map.originalPositionFor({ + line: 2, + column: 2, + }); + + // Should always have the prepended source root + assert.equal(pos.source, 'foo/bar/bang.coffee'); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + }; + + exports['test github issue #56'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'http://', + file: 'www.example.com/foo.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'www.example.com/original.js' + }); + map = new SourceMapConsumer(map.toString()); + + var sources = map.sources; + assert.equal(sources.length, 1); + assert.equal(sources[0], 'http://www.example.com/original.js'); + }; + + exports['test github issue #43'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'http://example.com', + file: 'foo.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'http://cdn.example.com/original.js' + }); + map = new SourceMapConsumer(map.toString()); + + var sources = map.sources; + assert.equal(sources.length, 1, + 'Should only be one source.'); + assert.equal(sources[0], 'http://cdn.example.com/original.js', + 'Should not be joined with the sourceRoot.'); + }; + + exports['test absolute path, but same host sources'] = function (assert, util) { + var map = new SourceMapGenerator({ + sourceRoot: 'http://example.com/foo/bar', + file: 'foo.js' + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: '/original.js' + }); + map = new SourceMapConsumer(map.toString()); + + var sources = map.sources; + assert.equal(sources.length, 1, + 'Should only be one source.'); + assert.equal(sources[0], 'http://example.com/original.js', + 'Source should be relative the host of the source root.'); + }; + + exports['test github issue #64'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sourceRoot": "http://example.com/", + "sources": ["/a"], + "names": [], + "mappings": "AACA", + "sourcesContent": ["foo"] + }); + + assert.equal(map.sourceContentFor("a"), "foo"); + assert.equal(map.sourceContentFor("/a"), "foo"); + }; + + exports['test bug 885597'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/", + "sources": ["/a"], + "names": [], + "mappings": "AACA", + "sourcesContent": ["foo"] + }); + + var s = map.sources[0]; + assert.equal(map.sourceContentFor(s), "foo"); + }; + + exports['test github issue #72, duplicate sources'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sources": ["source1.js", "source1.js", "source3.js"], + "names": [], + "mappings": ";EAAC;;IAEE;;MEEE", + "sourceRoot": "http://example.com" + }); + + var pos = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.source, 'http://example.com/source1.js'); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + + var pos = map.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.source, 'http://example.com/source1.js'); + assert.equal(pos.line, 3); + assert.equal(pos.column, 3); + + var pos = map.originalPositionFor({ + line: 6, + column: 6 + }); + assert.equal(pos.source, 'http://example.com/source3.js'); + assert.equal(pos.line, 5); + assert.equal(pos.column, 5); + }; + + exports['test github issue #72, duplicate names'] = function (assert, util) { + var map = new SourceMapConsumer({ + "version": 3, + "file": "foo.js", + "sources": ["source.js"], + "names": ["name1", "name1", "name3"], + "mappings": ";EAACA;;IAEEA;;MAEEE", + "sourceRoot": "http://example.com" + }); + + var pos = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.name, 'name1'); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + + var pos = map.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.name, 'name1'); + assert.equal(pos.line, 3); + assert.equal(pos.column, 3); + + var pos = map.originalPositionFor({ + line: 6, + column: 6 + }); + assert.equal(pos.name, 'name3'); + assert.equal(pos.line, 5); + assert.equal(pos.column, 5); + }; + + exports['test SourceMapConsumer.fromSourceMap'] = function (assert, util) { + var smg = new SourceMapGenerator({ + sourceRoot: 'http://example.com/', + file: 'foo.js' + }); + smg.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: 'bar.js' + }); + smg.addMapping({ + original: { line: 2, column: 2 }, + generated: { line: 4, column: 4 }, + source: 'baz.js', + name: 'dirtMcGirt' + }); + smg.setSourceContent('baz.js', 'baz.js content'); + + var smc = SourceMapConsumer.fromSourceMap(smg); + assert.equal(smc.file, 'foo.js'); + assert.equal(smc.sourceRoot, 'http://example.com/'); + assert.equal(smc.sources.length, 2); + assert.equal(smc.sources[0], 'http://example.com/bar.js'); + assert.equal(smc.sources[1], 'http://example.com/baz.js'); + assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content'); + + var pos = smc.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + assert.equal(pos.source, 'http://example.com/bar.js'); + assert.equal(pos.name, null); + + pos = smc.generatedPositionFor({ + line: 1, + column: 1, + source: 'http://example.com/bar.js' + }); + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + pos = smc.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + assert.equal(pos.source, 'http://example.com/baz.js'); + assert.equal(pos.name, 'dirtMcGirt'); + + pos = smc.generatedPositionFor({ + line: 2, + column: 2, + source: 'http://example.com/baz.js' + }); + assert.equal(pos.line, 4); + assert.equal(pos.column, 4); + }; +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-map-generator.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-map-generator.js new file mode 100644 index 0000000000..ba292f5484 --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-map-generator.js @@ -0,0 +1,417 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceNode = require('../../lib/source-map/source-node').SourceNode; + var util = require('./util'); + + exports['test some simple stuff'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'foo.js', + sourceRoot: '.' + }); + assert.ok(true); + }; + + exports['test JSON serialization'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'foo.js', + sourceRoot: '.' + }); + assert.equal(map.toString(), JSON.stringify(map)); + }; + + exports['test adding mappings (case 1)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + assert.doesNotThrow(function () { + map.addMapping({ + generated: { line: 1, column: 1 } + }); + }); + }; + + exports['test adding mappings (case 2)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + assert.doesNotThrow(function () { + map.addMapping({ + generated: { line: 1, column: 1 }, + source: 'bar.js', + original: { line: 1, column: 1 } + }); + }); + }; + + exports['test adding mappings (case 3)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + assert.doesNotThrow(function () { + map.addMapping({ + generated: { line: 1, column: 1 }, + source: 'bar.js', + original: { line: 1, column: 1 }, + name: 'someToken' + }); + }); + }; + + exports['test adding mappings (invalid)'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'generated-foo.js', + sourceRoot: '.' + }); + + // Not enough info. + assert.throws(function () { + map.addMapping({}); + }); + + // Original file position, but no source. + assert.throws(function () { + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 1, column: 1 } + }); + }); + }; + + exports['test that the correct mappings are being generated'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'min.js', + sourceRoot: '/the/root' + }); + + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 1, column: 1 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 5 }, + original: { line: 1, column: 5 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 9 }, + original: { line: 1, column: 11 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 18 }, + original: { line: 1, column: 21 }, + source: 'one.js', + name: 'bar' + }); + map.addMapping({ + generated: { line: 1, column: 21 }, + original: { line: 2, column: 3 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 1, column: 28 }, + original: { line: 2, column: 10 }, + source: 'one.js', + name: 'baz' + }); + map.addMapping({ + generated: { line: 1, column: 32 }, + original: { line: 2, column: 14 }, + source: 'one.js', + name: 'bar' + }); + + map.addMapping({ + generated: { line: 2, column: 1 }, + original: { line: 1, column: 1 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 5 }, + original: { line: 1, column: 5 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 9 }, + original: { line: 1, column: 11 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 18 }, + original: { line: 1, column: 21 }, + source: 'two.js', + name: 'n' + }); + map.addMapping({ + generated: { line: 2, column: 21 }, + original: { line: 2, column: 3 }, + source: 'two.js' + }); + map.addMapping({ + generated: { line: 2, column: 28 }, + original: { line: 2, column: 10 }, + source: 'two.js', + name: 'n' + }); + + map = JSON.parse(map.toString()); + + util.assertEqualMaps(assert, map, util.testMap); + }; + + exports['test that source content can be set'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'min.js', + sourceRoot: '/the/root' + }); + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 1, column: 1 }, + source: 'one.js' + }); + map.addMapping({ + generated: { line: 2, column: 1 }, + original: { line: 1, column: 1 }, + source: 'two.js' + }); + map.setSourceContent('one.js', 'one file content'); + + map = JSON.parse(map.toString()); + assert.equal(map.sources[0], 'one.js'); + assert.equal(map.sources[1], 'two.js'); + assert.equal(map.sourcesContent[0], 'one file content'); + assert.equal(map.sourcesContent[1], null); + }; + + exports['test .fromSourceMap'] = function (assert, util) { + var map = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(util.testMap)); + util.assertEqualMaps(assert, map.toJSON(), util.testMap); + }; + + exports['test .fromSourceMap with sourcesContent'] = function (assert, util) { + var map = SourceMapGenerator.fromSourceMap( + new SourceMapConsumer(util.testMapWithSourcesContent)); + util.assertEqualMaps(assert, map.toJSON(), util.testMapWithSourcesContent); + }; + + exports['test applySourceMap'] = function (assert, util) { + var node = new SourceNode(null, null, null, [ + new SourceNode(2, 0, 'fileX', 'lineX2\n'), + 'genA1\n', + new SourceNode(2, 0, 'fileY', 'lineY2\n'), + 'genA2\n', + new SourceNode(1, 0, 'fileX', 'lineX1\n'), + 'genA3\n', + new SourceNode(1, 0, 'fileY', 'lineY1\n') + ]); + var mapStep1 = node.toStringWithSourceMap({ + file: 'fileA' + }).map; + mapStep1.setSourceContent('fileX', 'lineX1\nlineX2\n'); + mapStep1 = mapStep1.toJSON(); + + node = new SourceNode(null, null, null, [ + 'gen1\n', + new SourceNode(1, 0, 'fileA', 'lineA1\n'), + new SourceNode(2, 0, 'fileA', 'lineA2\n'), + new SourceNode(3, 0, 'fileA', 'lineA3\n'), + new SourceNode(4, 0, 'fileA', 'lineA4\n'), + new SourceNode(1, 0, 'fileB', 'lineB1\n'), + new SourceNode(2, 0, 'fileB', 'lineB2\n'), + 'gen2\n' + ]); + var mapStep2 = node.toStringWithSourceMap({ + file: 'fileGen' + }).map; + mapStep2.setSourceContent('fileB', 'lineB1\nlineB2\n'); + mapStep2 = mapStep2.toJSON(); + + node = new SourceNode(null, null, null, [ + 'gen1\n', + new SourceNode(2, 0, 'fileX', 'lineA1\n'), + new SourceNode(2, 0, 'fileA', 'lineA2\n'), + new SourceNode(2, 0, 'fileY', 'lineA3\n'), + new SourceNode(4, 0, 'fileA', 'lineA4\n'), + new SourceNode(1, 0, 'fileB', 'lineB1\n'), + new SourceNode(2, 0, 'fileB', 'lineB2\n'), + 'gen2\n' + ]); + var expectedMap = node.toStringWithSourceMap({ + file: 'fileGen' + }).map; + expectedMap.setSourceContent('fileX', 'lineX1\nlineX2\n'); + expectedMap.setSourceContent('fileB', 'lineB1\nlineB2\n'); + expectedMap = expectedMap.toJSON(); + + // apply source map "mapStep1" to "mapStep2" + var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(mapStep2)); + generator.applySourceMap(new SourceMapConsumer(mapStep1)); + var actualMap = generator.toJSON(); + + util.assertEqualMaps(assert, actualMap, expectedMap); + }; + + exports['test sorting with duplicate generated mappings'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'test.js' + }); + map.addMapping({ + generated: { line: 3, column: 0 }, + original: { line: 2, column: 0 }, + source: 'a.js' + }); + map.addMapping({ + generated: { line: 2, column: 0 } + }); + map.addMapping({ + generated: { line: 2, column: 0 } + }); + map.addMapping({ + generated: { line: 1, column: 0 }, + original: { line: 1, column: 0 }, + source: 'a.js' + }); + + util.assertEqualMaps(assert, map.toJSON(), { + version: 3, + file: 'test.js', + sources: ['a.js'], + names: [], + mappings: 'AAAA;A;AACA' + }); + }; + + exports['test ignore duplicate mappings.'] = function (assert, util) { + var init = { file: 'min.js', sourceRoot: '/the/root' }; + var map1, map2; + + // null original source location + var nullMapping1 = { + generated: { line: 1, column: 0 } + }; + var nullMapping2 = { + generated: { line: 2, column: 2 } + }; + + map1 = new SourceMapGenerator(init); + map2 = new SourceMapGenerator(init); + + map1.addMapping(nullMapping1); + map1.addMapping(nullMapping1); + + map2.addMapping(nullMapping1); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + map1.addMapping(nullMapping2); + map1.addMapping(nullMapping1); + + map2.addMapping(nullMapping2); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + // original source location + var srcMapping1 = { + generated: { line: 1, column: 0 }, + original: { line: 11, column: 0 }, + source: 'srcMapping1.js' + }; + var srcMapping2 = { + generated: { line: 2, column: 2 }, + original: { line: 11, column: 0 }, + source: 'srcMapping2.js' + }; + + map1 = new SourceMapGenerator(init); + map2 = new SourceMapGenerator(init); + + map1.addMapping(srcMapping1); + map1.addMapping(srcMapping1); + + map2.addMapping(srcMapping1); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + map1.addMapping(srcMapping2); + map1.addMapping(srcMapping1); + + map2.addMapping(srcMapping2); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + // full original source and name information + var fullMapping1 = { + generated: { line: 1, column: 0 }, + original: { line: 11, column: 0 }, + source: 'fullMapping1.js', + name: 'fullMapping1' + }; + var fullMapping2 = { + generated: { line: 2, column: 2 }, + original: { line: 11, column: 0 }, + source: 'fullMapping2.js', + name: 'fullMapping2' + }; + + map1 = new SourceMapGenerator(init); + map2 = new SourceMapGenerator(init); + + map1.addMapping(fullMapping1); + map1.addMapping(fullMapping1); + + map2.addMapping(fullMapping1); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + + map1.addMapping(fullMapping2); + map1.addMapping(fullMapping1); + + map2.addMapping(fullMapping2); + + util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); + }; + + exports['test github issue #72, check for duplicate names or sources'] = function (assert, util) { + var map = new SourceMapGenerator({ + file: 'test.js' + }); + map.addMapping({ + generated: { line: 1, column: 1 }, + original: { line: 2, column: 2 }, + source: 'a.js', + name: 'foo' + }); + map.addMapping({ + generated: { line: 3, column: 3 }, + original: { line: 4, column: 4 }, + source: 'a.js', + name: 'foo' + }); + util.assertEqualMaps(assert, map.toJSON(), { + version: 3, + file: 'test.js', + sources: ['a.js'], + names: ['foo'], + mappings: 'CACEA;;GAEEA' + }); + }; + +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-node.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-node.js new file mode 100644 index 0000000000..6e0eca82df --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/test-source-node.js @@ -0,0 +1,365 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; + var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; + var SourceNode = require('../../lib/source-map/source-node').SourceNode; + + exports['test .add()'] = function (assert, util) { + var node = new SourceNode(null, null, null); + + // Adding a string works. + node.add('function noop() {}'); + + // Adding another source node works. + node.add(new SourceNode(null, null, null)); + + // Adding an array works. + node.add(['function foo() {', + new SourceNode(null, null, null, + 'return 10;'), + '}']); + + // Adding other stuff doesn't. + assert.throws(function () { + node.add({}); + }); + assert.throws(function () { + node.add(function () {}); + }); + }; + + exports['test .prepend()'] = function (assert, util) { + var node = new SourceNode(null, null, null); + + // Prepending a string works. + node.prepend('function noop() {}'); + assert.equal(node.children[0], 'function noop() {}'); + assert.equal(node.children.length, 1); + + // Prepending another source node works. + node.prepend(new SourceNode(null, null, null)); + assert.equal(node.children[0], ''); + assert.equal(node.children[1], 'function noop() {}'); + assert.equal(node.children.length, 2); + + // Prepending an array works. + node.prepend(['function foo() {', + new SourceNode(null, null, null, + 'return 10;'), + '}']); + assert.equal(node.children[0], 'function foo() {'); + assert.equal(node.children[1], 'return 10;'); + assert.equal(node.children[2], '}'); + assert.equal(node.children[3], ''); + assert.equal(node.children[4], 'function noop() {}'); + assert.equal(node.children.length, 5); + + // Prepending other stuff doesn't. + assert.throws(function () { + node.prepend({}); + }); + assert.throws(function () { + node.prepend(function () {}); + }); + }; + + exports['test .toString()'] = function (assert, util) { + assert.equal((new SourceNode(null, null, null, + ['function foo() {', + new SourceNode(null, null, null, 'return 10;'), + '}'])).toString(), + 'function foo() {return 10;}'); + }; + + exports['test .join()'] = function (assert, util) { + assert.equal((new SourceNode(null, null, null, + ['a', 'b', 'c', 'd'])).join(', ').toString(), + 'a, b, c, d'); + }; + + exports['test .walk()'] = function (assert, util) { + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', new SourceNode(1, 0, 'a.js', ['someCall()']), ';\n', + ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n', + '}());']); + var expected = [ + { str: '(function () {\n', source: null, line: null, column: null }, + { str: ' ', source: null, line: null, column: null }, + { str: 'someCall()', source: 'a.js', line: 1, column: 0 }, + { str: ';\n', source: null, line: null, column: null }, + { str: ' ', source: null, line: null, column: null }, + { str: 'if (foo) bar()', source: 'b.js', line: 2, column: 0 }, + { str: ';\n', source: null, line: null, column: null }, + { str: '}());', source: null, line: null, column: null }, + ]; + var i = 0; + node.walk(function (chunk, loc) { + assert.equal(expected[i].str, chunk); + assert.equal(expected[i].source, loc.source); + assert.equal(expected[i].line, loc.line); + assert.equal(expected[i].column, loc.column); + i++; + }); + }; + + exports['test .replaceRight'] = function (assert, util) { + var node; + + // Not nested + node = new SourceNode(null, null, null, 'hello world'); + node.replaceRight(/world/, 'universe'); + assert.equal(node.toString(), 'hello universe'); + + // Nested + node = new SourceNode(null, null, null, + [new SourceNode(null, null, null, 'hey sexy mama, '), + new SourceNode(null, null, null, 'want to kill all humans?')]); + node.replaceRight(/kill all humans/, 'watch Futurama'); + assert.equal(node.toString(), 'hey sexy mama, want to watch Futurama?'); + }; + + exports['test .toStringWithSourceMap()'] = function (assert, util) { + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', + new SourceNode(1, 0, 'a.js', 'someCall', 'originalCall'), + new SourceNode(1, 8, 'a.js', '()'), + ';\n', + ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n', + '}());']); + var map = node.toStringWithSourceMap({ + file: 'foo.js' + }).map; + + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = new SourceMapConsumer(map.toString()); + + var actual; + + actual = map.originalPositionFor({ + line: 1, + column: 4 + }); + assert.equal(actual.source, null); + assert.equal(actual.line, null); + assert.equal(actual.column, null); + + actual = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(actual.source, 'a.js'); + assert.equal(actual.line, 1); + assert.equal(actual.column, 0); + assert.equal(actual.name, 'originalCall'); + + actual = map.originalPositionFor({ + line: 3, + column: 2 + }); + assert.equal(actual.source, 'b.js'); + assert.equal(actual.line, 2); + assert.equal(actual.column, 0); + + actual = map.originalPositionFor({ + line: 3, + column: 16 + }); + assert.equal(actual.source, null); + assert.equal(actual.line, null); + assert.equal(actual.column, null); + + actual = map.originalPositionFor({ + line: 4, + column: 2 + }); + assert.equal(actual.source, null); + assert.equal(actual.line, null); + assert.equal(actual.column, null); + }; + + exports['test .fromStringWithSourceMap()'] = function (assert, util) { + var node = SourceNode.fromStringWithSourceMap( + util.testGeneratedCode, + new SourceMapConsumer(util.testMap)); + + var result = node.toStringWithSourceMap({ + file: 'min.js' + }); + var map = result.map; + var code = result.code; + + assert.equal(code, util.testGeneratedCode); + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = map.toJSON(); + assert.equal(map.version, util.testMap.version); + assert.equal(map.file, util.testMap.file); + assert.equal(map.mappings, util.testMap.mappings); + }; + + exports['test .fromStringWithSourceMap() empty map'] = function (assert, util) { + var node = SourceNode.fromStringWithSourceMap( + util.testGeneratedCode, + new SourceMapConsumer(util.emptyMap)); + var result = node.toStringWithSourceMap({ + file: 'min.js' + }); + var map = result.map; + var code = result.code; + + assert.equal(code, util.testGeneratedCode); + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = map.toJSON(); + assert.equal(map.version, util.emptyMap.version); + assert.equal(map.file, util.emptyMap.file); + assert.equal(map.mappings.length, util.emptyMap.mappings.length); + assert.equal(map.mappings, util.emptyMap.mappings); + }; + + exports['test .fromStringWithSourceMap() complex version'] = function (assert, util) { + var input = new SourceNode(null, null, null, [ + "(function() {\n", + " var Test = {};\n", + " ", new SourceNode(1, 0, "a.js", "Test.A = { value: 1234 };\n"), + " ", new SourceNode(2, 0, "a.js", "Test.A.x = 'xyz';"), "\n", + "}());\n", + "/* Generated Source */"]); + input = input.toStringWithSourceMap({ + file: 'foo.js' + }); + + var node = SourceNode.fromStringWithSourceMap( + input.code, + new SourceMapConsumer(input.map.toString())); + + var result = node.toStringWithSourceMap({ + file: 'foo.js' + }); + var map = result.map; + var code = result.code; + + assert.equal(code, input.code); + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = map.toJSON(); + var inputMap = input.map.toJSON(); + util.assertEqualMaps(assert, map, inputMap); + }; + + exports['test .fromStringWithSourceMap() merging duplicate mappings'] = function (assert, util) { + var input = new SourceNode(null, null, null, [ + new SourceNode(1, 0, "a.js", "(function"), + new SourceNode(1, 0, "a.js", "() {\n"), + " ", + new SourceNode(1, 0, "a.js", "var Test = "), + new SourceNode(1, 0, "b.js", "{};\n"), + new SourceNode(2, 0, "b.js", "Test"), + new SourceNode(2, 0, "b.js", ".A", "A"), + new SourceNode(2, 20, "b.js", " = { value: 1234 };\n", "A"), + "}());\n", + "/* Generated Source */" + ]); + input = input.toStringWithSourceMap({ + file: 'foo.js' + }); + + var correctMap = new SourceMapGenerator({ + file: 'foo.js' + }); + correctMap.addMapping({ + generated: { line: 1, column: 0 }, + source: 'a.js', + original: { line: 1, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 2, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 2, column: 2 }, + source: 'a.js', + original: { line: 1, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 2, column: 13 }, + source: 'b.js', + original: { line: 1, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 3, column: 0 }, + source: 'b.js', + original: { line: 2, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 3, column: 4 }, + source: 'b.js', + name: 'A', + original: { line: 2, column: 0 } + }); + correctMap.addMapping({ + generated: { line: 3, column: 6 }, + source: 'b.js', + name: 'A', + original: { line: 2, column: 20 } + }); + correctMap.addMapping({ + generated: { line: 4, column: 0 } + }); + + var inputMap = input.map.toJSON(); + correctMap = correctMap.toJSON(); + util.assertEqualMaps(assert, correctMap, inputMap); + }; + + exports['test setSourceContent with toStringWithSourceMap'] = function (assert, util) { + var aNode = new SourceNode(1, 1, 'a.js', 'a'); + aNode.setSourceContent('a.js', 'someContent'); + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', aNode, + ' ', new SourceNode(1, 1, 'b.js', 'b'), + '}());']); + node.setSourceContent('b.js', 'otherContent'); + var map = node.toStringWithSourceMap({ + file: 'foo.js' + }).map; + + assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); + map = new SourceMapConsumer(map.toString()); + + assert.equal(map.sources.length, 2); + assert.equal(map.sources[0], 'a.js'); + assert.equal(map.sources[1], 'b.js'); + assert.equal(map.sourcesContent.length, 2); + assert.equal(map.sourcesContent[0], 'someContent'); + assert.equal(map.sourcesContent[1], 'otherContent'); + }; + + exports['test walkSourceContents'] = function (assert, util) { + var aNode = new SourceNode(1, 1, 'a.js', 'a'); + aNode.setSourceContent('a.js', 'someContent'); + var node = new SourceNode(null, null, null, + ['(function () {\n', + ' ', aNode, + ' ', new SourceNode(1, 1, 'b.js', 'b'), + '}());']); + node.setSourceContent('b.js', 'otherContent'); + var results = []; + node.walkSourceContents(function (sourceFile, sourceContent) { + results.push([sourceFile, sourceContent]); + }); + assert.equal(results.length, 2); + assert.equal(results[0][0], 'a.js'); + assert.equal(results[0][1], 'someContent'); + assert.equal(results[1][0], 'b.js'); + assert.equal(results[1][1], 'otherContent'); + }; +}); diff --git a/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/util.js b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/util.js new file mode 100644 index 0000000000..288046bfaa --- /dev/null +++ b/react-app/node_modules/source-map-support/node_modules/source-map/test/source-map/util.js @@ -0,0 +1,161 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +if (typeof define !== 'function') { + var define = require('amdefine')(module, require); +} +define(function (require, exports, module) { + + var util = require('../../lib/source-map/util'); + + // This is a test mapping which maps functions from two different files + // (one.js and two.js) to a minified generated source. + // + // Here is one.js: + // + // ONE.foo = function (bar) { + // return baz(bar); + // }; + // + // Here is two.js: + // + // TWO.inc = function (n) { + // return n + 1; + // }; + // + // And here is the generated code (min.js): + // + // ONE.foo=function(a){return baz(a);}; + // TWO.inc=function(a){return a+1;}; + exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+ + " TWO.inc=function(a){return a+1;};"; + exports.testMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: '/the/root', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' + }; + exports.testMapWithSourcesContent = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourcesContent: [ + ' ONE.foo = function (bar) {\n' + + ' return baz(bar);\n' + + ' };', + ' TWO.inc = function (n) {\n' + + ' return n + 1;\n' + + ' };' + ], + sourceRoot: '/the/root', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' + }; + exports.emptyMap = { + version: 3, + file: 'min.js', + names: [], + sources: [], + mappings: '' + }; + + + function assertMapping(generatedLine, generatedColumn, originalSource, + originalLine, originalColumn, name, map, assert, + dontTestGenerated, dontTestOriginal) { + if (!dontTestOriginal) { + var origMapping = map.originalPositionFor({ + line: generatedLine, + column: generatedColumn + }); + assert.equal(origMapping.name, name, + 'Incorrect name, expected ' + JSON.stringify(name) + + ', got ' + JSON.stringify(origMapping.name)); + assert.equal(origMapping.line, originalLine, + 'Incorrect line, expected ' + JSON.stringify(originalLine) + + ', got ' + JSON.stringify(origMapping.line)); + assert.equal(origMapping.column, originalColumn, + 'Incorrect column, expected ' + JSON.stringify(originalColumn) + + ', got ' + JSON.stringify(origMapping.column)); + + var expectedSource; + + if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) { + expectedSource = originalSource; + } else if (originalSource) { + expectedSource = map.sourceRoot + ? util.join(map.sourceRoot, originalSource) + : originalSource; + } else { + expectedSource = null; + } + + assert.equal(origMapping.source, expectedSource, + 'Incorrect source, expected ' + JSON.stringify(expectedSource) + + ', got ' + JSON.stringify(origMapping.source)); + } + + if (!dontTestGenerated) { + var genMapping = map.generatedPositionFor({ + source: originalSource, + line: originalLine, + column: originalColumn + }); + assert.equal(genMapping.line, generatedLine, + 'Incorrect line, expected ' + JSON.stringify(generatedLine) + + ', got ' + JSON.stringify(genMapping.line)); + assert.equal(genMapping.column, generatedColumn, + 'Incorrect column, expected ' + JSON.stringify(generatedColumn) + + ', got ' + JSON.stringify(genMapping.column)); + } + } + exports.assertMapping = assertMapping; + + function assertEqualMaps(assert, actualMap, expectedMap) { + assert.equal(actualMap.version, expectedMap.version, "version mismatch"); + assert.equal(actualMap.file, expectedMap.file, "file mismatch"); + assert.equal(actualMap.names.length, + expectedMap.names.length, + "names length mismatch: " + + actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); + for (var i = 0; i < actualMap.names.length; i++) { + assert.equal(actualMap.names[i], + expectedMap.names[i], + "names[" + i + "] mismatch: " + + actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); + } + assert.equal(actualMap.sources.length, + expectedMap.sources.length, + "sources length mismatch: " + + actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); + for (var i = 0; i < actualMap.sources.length; i++) { + assert.equal(actualMap.sources[i], + expectedMap.sources[i], + "sources[" + i + "] length mismatch: " + + actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); + } + assert.equal(actualMap.sourceRoot, + expectedMap.sourceRoot, + "sourceRoot mismatch: " + + actualMap.sourceRoot + " != " + expectedMap.sourceRoot); + assert.equal(actualMap.mappings, expectedMap.mappings, + "mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings); + if (actualMap.sourcesContent) { + assert.equal(actualMap.sourcesContent.length, + expectedMap.sourcesContent.length, + "sourcesContent length mismatch"); + for (var i = 0; i < actualMap.sourcesContent.length; i++) { + assert.equal(actualMap.sourcesContent[i], + expectedMap.sourcesContent[i], + "sourcesContent[" + i + "] mismatch"); + } + } + } + exports.assertEqualMaps = assertEqualMaps; + +}); diff --git a/react-app/node_modules/source-map-support/package.json b/react-app/node_modules/source-map-support/package.json new file mode 100644 index 0000000000..584f10ed24 --- /dev/null +++ b/react-app/node_modules/source-map-support/package.json @@ -0,0 +1,79 @@ +{ + "_args": [ + [ + "source-map-support@^0.2.10", + "/Users/mromano/dev/react-sfs/node_modules/babel-register" + ] + ], + "_from": "source-map-support@>=0.2.10 <0.3.0", + "_id": "source-map-support@0.2.10", + "_inCache": true, + "_installable": true, + "_location": "/source-map-support", + "_npmUser": { + "email": "evan.exe@gmail.com", + "name": "evanw" + }, + "_npmVersion": "1.4.28", + "_phantomChildren": { + "amdefine": "1.0.0" + }, + "_requested": { + "name": "source-map-support", + "raw": "source-map-support@^0.2.10", + "rawSpec": "^0.2.10", + "scope": null, + "spec": ">=0.2.10 <0.3.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-register" + ], + "_resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "_shasum": "ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc", + "_shrinkwrap": null, + "_spec": "source-map-support@^0.2.10", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babel-register", + "bugs": { + "url": "https://github.com/evanw/node-source-map-support/issues" + }, + "dependencies": { + "source-map": "0.1.32" + }, + "description": "Fixes stack traces for files with source maps", + "devDependencies": { + "browserify": "3.44.2", + "coffee-script": "1.7.1", + "mocha": "1.18.2" + }, + "directories": {}, + "dist": { + "shasum": "ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc", + "tarball": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz" + }, + "gitHead": "e1a092fe79a1abf1a6d7b59b7878ced3fa9e793d", + "homepage": "https://github.com/evanw/node-source-map-support", + "licenses": [ + { + "type": "MIT" + } + ], + "main": "./source-map-support.js", + "maintainers": [ + { + "email": "evan.exe@gmail.com", + "name": "evanw" + } + ], + "name": "source-map-support", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/evanw/node-source-map-support.git" + }, + "scripts": { + "test": "node_modules/mocha/bin/mocha" + }, + "version": "0.2.10" +} diff --git a/react-app/node_modules/source-map-support/source-map-support.js b/react-app/node_modules/source-map-support/source-map-support.js new file mode 100644 index 0000000000..07048d85de --- /dev/null +++ b/react-app/node_modules/source-map-support/source-map-support.js @@ -0,0 +1,386 @@ +var SourceMapConsumer = require('source-map').SourceMapConsumer; +var path = require('path'); +var fs = require('fs'); + +// Only install once if called multiple times +var alreadyInstalled = false; + +// If true, the caches are reset before a stack trace formatting operation +var emptyCacheBetweenOperations = false; + +// Maps a file path to a string containing the file contents +var fileContentsCache = {}; + +// Maps a file path to a source map for that file +var sourceMapCache = {}; + +function isInBrowser() { + return ((typeof window !== 'undefined') && (typeof XMLHttpRequest === 'function')); +} + +function retrieveFile(path) { + if (path in fileContentsCache) { + return fileContentsCache[path]; + } + + try { + // Use SJAX if we are in the browser + if (isInBrowser()) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', path, false); + xhr.send(null); + var contents = xhr.readyState === 4 ? xhr.responseText : null; + } + + // Otherwise, use the filesystem + else { + var contents = fs.readFileSync(path, 'utf8'); + } + } catch (e) { + var contents = null; + } + + return fileContentsCache[path] = contents; +} + +// Support URLs relative to a directory, but be careful about a protocol prefix +// in case we are in the browser (i.e. directories may start with "http://") +function supportRelativeURL(file, url) { + if (!file) return url; + var dir = path.dirname(file); + var match = /^\w+:\/\/[^\/]*/.exec(dir); + var protocol = match ? match[0] : ''; + return protocol + path.resolve(dir.slice(protocol.length), url); +} + +function retrieveSourceMapURL(source) { + var fileData; + + if (isInBrowser()) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', source, false); + xhr.send(null); + fileData = xhr.readyState === 4 ? xhr.responseText : null; + + // Support providing a sourceMappingURL via the SourceMap header + var sourceMapHeader = xhr.getResponseHeader("SourceMap") || + xhr.getResponseHeader("X-SourceMap"); + if (sourceMapHeader) { + return sourceMapHeader; + } + } + + // Get the URL of the source map + fileData = retrieveFile(source); + var match = /\/\/[#@]\s*sourceMappingURL=(.*)\s*$/m.exec(fileData); + if (!match) return null; + return match[1]; +}; + +// Can be overridden by the retrieveSourceMap option to install. Takes a +// generated source filename; returns a {map, optional url} object, or null if +// there is no source map. The map field may be either a string or the parsed +// JSON object (ie, it must be a valid argument to the SourceMapConsumer +// constructor). +function retrieveSourceMap(source) { + var sourceMappingURL = retrieveSourceMapURL(source); + if (!sourceMappingURL) return null; + + // Read the contents of the source map + var sourceMapData; + var dataUrlPrefix = "data:application/json;base64,"; + if (sourceMappingURL.slice(0, dataUrlPrefix.length).toLowerCase() == dataUrlPrefix) { + // Support source map URL as a data url + sourceMapData = new Buffer(sourceMappingURL.slice(dataUrlPrefix.length), "base64").toString(); + sourceMappingURL = null; + } else { + // Support source map URLs relative to the source URL + sourceMappingURL = supportRelativeURL(source, sourceMappingURL); + sourceMapData = retrieveFile(sourceMappingURL, 'utf8'); + } + + if (!sourceMapData) { + return null; + } + + return { + url: sourceMappingURL, + map: sourceMapData + }; +} + +function mapSourcePosition(position) { + var sourceMap = sourceMapCache[position.source]; + if (!sourceMap) { + // Call the (overrideable) retrieveSourceMap function to get the source map. + var urlAndMap = retrieveSourceMap(position.source); + if (urlAndMap) { + sourceMap = sourceMapCache[position.source] = { + url: urlAndMap.url, + map: new SourceMapConsumer(urlAndMap.map) + }; + + // Load all sources stored inline with the source map into the file cache + // to pretend like they are already loaded. They may not exist on disk. + if (sourceMap.map.sourcesContent) { + sourceMap.map.sources.forEach(function(source, i) { + var contents = sourceMap.map.sourcesContent[i]; + if (contents) { + var url = supportRelativeURL(sourceMap.url, source); + fileContentsCache[url] = contents; + } + }); + } + } else { + sourceMap = sourceMapCache[position.source] = { + url: null, + map: null + }; + } + } + + // Resolve the source URL relative to the URL of the source map + if (sourceMap && sourceMap.map) { + var originalPosition = sourceMap.map.originalPositionFor(position); + + // Only return the original position if a matching line was found. If no + // matching line is found then we return position instead, which will cause + // the stack trace to print the path and line for the compiled file. It is + // better to give a precise location in the compiled file than a vague + // location in the original file. + if (originalPosition.source !== null) { + originalPosition.source = supportRelativeURL( + sourceMap.url, originalPosition.source); + return originalPosition; + } + } + + return position; +} + +// Parses code generated by FormatEvalOrigin(), a function inside V8: +// https://code.google.com/p/v8/source/browse/trunk/src/messages.js +function mapEvalOrigin(origin) { + // Most eval() calls are in this format + var match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin); + if (match) { + var position = mapSourcePosition({ + source: match[2], + line: match[3], + column: match[4] - 1 + }); + return 'eval at ' + match[1] + ' (' + position.source + ':' + + position.line + ':' + (position.column + 1) + ')'; + } + + // Parse nested eval() calls using recursion + match = /^eval at ([^(]+) \((.+)\)$/.exec(origin); + if (match) { + return 'eval at ' + match[1] + ' (' + mapEvalOrigin(match[2]) + ')'; + } + + // Make sure we still return useful information if we didn't find anything + return origin; +} + +// This is copied almost verbatim from the V8 source code at +// https://code.google.com/p/v8/source/browse/trunk/src/messages.js. The +// implementation of wrapCallSite() used to just forward to the actual source +// code of CallSite.prototype.toString but unfortunately a new release of V8 +// did something to the prototype chain and broke the shim. The only fix I +// could find was copy/paste. +function CallSiteToString() { + var fileName; + var fileLocation = ""; + if (this.isNative()) { + fileLocation = "native"; + } else { + fileName = this.getScriptNameOrSourceURL(); + if (!fileName && this.isEval()) { + fileLocation = this.getEvalOrigin(); + fileLocation += ", "; // Expecting source position to follow. + } + + if (fileName) { + fileLocation += fileName; + } else { + // Source code does not originate from a file and is not native, but we + // can still get the source position inside the source string, e.g. in + // an eval string. + fileLocation += ""; + } + var lineNumber = this.getLineNumber(); + if (lineNumber != null) { + fileLocation += ":" + lineNumber; + var columnNumber = this.getColumnNumber(); + if (columnNumber) { + fileLocation += ":" + columnNumber; + } + } + } + + var line = ""; + var functionName = this.getFunctionName(); + var addSuffix = true; + var isConstructor = this.isConstructor(); + var isMethodCall = !(this.isToplevel() || isConstructor); + if (isMethodCall) { + var typeName = this.getTypeName(); + var methodName = this.getMethodName(); + if (functionName) { + if (typeName && functionName.indexOf(typeName) != 0) { + line += typeName + "."; + } + line += functionName; + if (methodName && functionName.indexOf("." + methodName) != functionName.length - methodName.length - 1) { + line += " [as " + methodName + "]"; + } + } else { + line += typeName + "." + (methodName || ""); + } + } else if (isConstructor) { + line += "new " + (functionName || ""); + } else if (functionName) { + line += functionName; + } else { + line += fileLocation; + addSuffix = false; + } + if (addSuffix) { + line += " (" + fileLocation + ")"; + } + return line; +} + +function cloneCallSite(frame) { + var object = {}; + Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach(function(name) { + object[name] = /^(?:is|get)/.test(name) ? function() { return frame[name].call(frame); } : frame[name]; + }); + object.toString = CallSiteToString; + return object; +} + +function wrapCallSite(frame) { + // Most call sites will return the source file from getFileName(), but code + // passed to eval() ending in "//# sourceURL=..." will return the source file + // from getScriptNameOrSourceURL() instead + var source = frame.getFileName() || frame.getScriptNameOrSourceURL(); + if (source) { + var position = mapSourcePosition({ + source: source, + line: frame.getLineNumber(), + column: frame.getColumnNumber() - 1 + }); + frame = cloneCallSite(frame); + frame.getFileName = function() { return position.source; }; + frame.getLineNumber = function() { return position.line; }; + frame.getColumnNumber = function() { return position.column + 1; }; + frame.getScriptNameOrSourceURL = function() { return position.source; }; + return frame; + } + + // Code called using eval() needs special handling + var origin = frame.isEval() && frame.getEvalOrigin(); + if (origin) { + origin = mapEvalOrigin(origin); + frame = cloneCallSite(frame); + frame.getEvalOrigin = function() { return origin; }; + return frame; + } + + // If we get here then we were unable to change the source position + return frame; +} + +// This function is part of the V8 stack trace API, for more info see: +// http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi +function prepareStackTrace(error, stack) { + if (emptyCacheBetweenOperations) { + fileContentsCache = {}; + sourceMapCache = {}; + } + return error + stack.map(function(frame) { + return '\n at ' + wrapCallSite(frame); + }).join(''); +} + +// Generate position and snippet of original source with pointer +function getErrorSource(error) { + var match = /\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(error.stack); + if (match) { + var source = match[1]; + var line = +match[2]; + var column = +match[3]; + + // Support the inline sourceContents inside the source map + var contents = fileContentsCache[source]; + + // Support files on disk + if (!contents && fs.existsSync(source)) { + contents = fs.readFileSync(source, 'utf8'); + } + + // Format the line from the original source code like node does + if (contents) { + var code = contents.split(/(?:\r\n|\r|\n)/)[line - 1]; + if (code) { + return '\n' + source + ':' + line + '\n' + code + '\n' + + new Array(column).join(' ') + '^'; + } + } + } + return null; +} + +// Mimic node's stack trace printing when an exception escapes the process +function handleUncaughtExceptions(error) { + if (!error || !error.stack) { + console.log('Uncaught exception:', error); + } else { + var source = getErrorSource(error); + if (source !== null) console.log(source); + console.log(error.stack); + } + process.exit(1); +} + +exports.wrapCallSite = wrapCallSite; +exports.getErrorSource = getErrorSource; +exports.mapSourcePosition = mapSourcePosition; +exports.retrieveSourceMap = retrieveSourceMap; + +exports.install = function(options) { + if (!alreadyInstalled) { + alreadyInstalled = true; + Error.prepareStackTrace = prepareStackTrace; + + // Configure options + options = options || {}; + var installHandler = 'handleUncaughtExceptions' in options ? + options.handleUncaughtExceptions : true; + emptyCacheBetweenOperations = 'emptyCacheBetweenOperations' in options ? + options.emptyCacheBetweenOperations : false; + + // Allow sources to be found by methods other than reading the files + // directly from disk. + if (options.retrieveFile) + retrieveFile = options.retrieveFile; + + // Allow source maps to be found by methods other than reading the files + // directly from disk. + if (options.retrieveSourceMap) + retrieveSourceMap = options.retrieveSourceMap; + + // Provide the option to not install the uncaught exception handler. This is + // to support other uncaught exception handlers (in test frameworks, for + // example). If this handler is not installed and there are no other uncaught + // exception handlers, uncaught exceptions will be caught by node's built-in + // exception handler and the process will still be terminated. However, the + // generated JavaScript code will be shown above the stack trace instead of + // the original source code. + if (installHandler && !isInBrowser()) { + process.on('uncaughtException', handleUncaughtExceptions); + } + } +}; diff --git a/react-app/node_modules/source-map-support/test.js b/react-app/node_modules/source-map-support/test.js new file mode 100644 index 0000000000..f2bf344dac --- /dev/null +++ b/react-app/node_modules/source-map-support/test.js @@ -0,0 +1,384 @@ +require('./source-map-support').install({ + emptyCacheBetweenOperations: true // Needed to be able to test for failure +}); + +var SourceMapGenerator = require('source-map').SourceMapGenerator; +var child_process = require('child_process'); +var assert = require('assert'); +var fs = require('fs'); + +function compareLines(actual, expected) { + assert(actual.length >= expected.length, 'got ' + actual.length + ' lines but expected at least ' + expected.length + ' lines'); + for (var i = 0; i < expected.length; i++) { + // Some tests are regular expressions because the output format changed slightly between node v0.9.2 and v0.9.3 + if (expected[i] instanceof RegExp) { + assert(expected[i].test(actual[i]), JSON.stringify(actual[i]) + ' does not match ' + expected[i]); + } else { + assert.equal(actual[i], expected[i]); + } + } +} + +function createEmptySourceMap() { + return new SourceMapGenerator({ + file: '.generated.js', + sourceRoot: '.' + }); +} + +function createSourceMapWithGap() { + var sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 100, column: 0 }, + original: { line: 100, column: 0 }, + source: '.original.js' + }); + return sourceMap; +} + +function createSingleLineSourceMap() { + var sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 1, column: 0 }, + original: { line: 1, column: 0 }, + source: '.original.js' + }); + return sourceMap; +} + +function createMultiLineSourceMap() { + var sourceMap = createEmptySourceMap(); + for (var i = 1; i <= 100; i++) { + sourceMap.addMapping({ + generated: { line: i, column: 0 }, + original: { line: 1000 + i, column: 99 + i }, + source: 'line' + i + '.js' + }); + } + return sourceMap; +} + +function createMultiLineSourceMapWithSourcesContent() { + var sourceMap = createEmptySourceMap(); + var original = new Array(1001).join('\n'); + for (var i = 1; i <= 100; i++) { + sourceMap.addMapping({ + generated: { line: i, column: 0 }, + original: { line: 1000 + i, column: 4 }, + source: 'original.js' + }); + original += ' line ' + i + '\n'; + } + sourceMap.setSourceContent('original.js', original); + return sourceMap; +} + +function compareStackTrace(sourceMap, source, expected) { + // Check once with a separate source map + fs.writeFileSync('.generated.js.map', sourceMap); + fs.writeFileSync('.generated.js', 'exports.test = function() {' + + source.join('\n') + '};//@ sourceMappingURL=.generated.js.map'); + try { + delete require.cache[require.resolve('./.generated')]; + require('./.generated').test(); + } catch (e) { + compareLines(e.stack.split('\n'), expected); + } + fs.unlinkSync('.generated.js'); + fs.unlinkSync('.generated.js.map'); + + // Check again with an inline source map (in a data URL) + fs.writeFileSync('.generated.js', 'exports.test = function() {' + + source.join('\n') + '};//@ sourceMappingURL=data:application/json;base64,' + + new Buffer(sourceMap.toString()).toString('base64')); + try { + delete require.cache[require.resolve('./.generated')]; + require('./.generated').test(); + } catch (e) { + compareLines(e.stack.split('\n'), expected); + } + fs.unlinkSync('.generated.js'); +} + +function compareStdout(done, sourceMap, source, expected) { + fs.writeFileSync('.original.js', 'this is the original code'); + fs.writeFileSync('.generated.js.map', sourceMap); + fs.writeFileSync('.generated.js', source.join('\n') + + '//@ sourceMappingURL=.generated.js.map'); + child_process.exec('node ./.generated', function(error, stdout, stderr) { + try { + compareLines((stdout + stderr).trim().split('\n'), expected); + } catch (e) { + return done(e); + } + fs.unlinkSync('.generated.js'); + fs.unlinkSync('.generated.js.map'); + fs.unlinkSync('.original.js'); + done(); + }); +} + +it('normal throw', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/ + ]); +}); + +it('throw inside function', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'function foo() {', + ' throw new Error("test");', + '}', + 'foo();' + ], [ + 'Error: test', + /^ at foo \(.*\/line2\.js:1002:102\)$/, + /^ at Object\.exports\.test \(.*\/line4\.js:1004:104\)$/ + ]); +}); + +it('throw inside function inside function', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'function foo() {', + ' function bar() {', + ' throw new Error("test");', + ' }', + ' bar();', + '}', + 'foo();' + ], [ + 'Error: test', + /^ at bar \(.*\/line3\.js:1003:103\)$/, + /^ at foo \(.*\/line5\.js:1005:105\)$/, + /^ at Object\.exports\.test \(.*\/line7\.js:1007:107\)$/ + ]); +}); + +it('eval', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("throw new Error(\'test\')");' + ], [ + 'Error: test', + /^ at Object\.eval \(eval at \(.*\/line1\.js:1001:101\)/, + /^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/ + ]); +}); + +it('eval inside eval', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("eval(\'throw new Error(\\"test\\")\')");' + ], [ + 'Error: test', + /^ at Object\.eval \(eval at \(eval at \(.*\/line1\.js:1001:101\)/, + /^ at Object\.eval \(eval at \(.*\/line1\.js:1001:101\)/, + /^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/ + ]); +}); + +it('eval inside function', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'function foo() {', + ' eval("throw new Error(\'test\')");', + '}', + 'foo();' + ], [ + 'Error: test', + /^ at eval \(eval at foo \(.*\/line2\.js:1002:102\)/, + /^ at foo \(.*\/line2\.js:1002:102\)/, + /^ at Object\.exports\.test \(.*\/line4\.js:1004:104\)$/ + ]); +}); + +it('eval with sourceURL', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("throw new Error(\'test\')//@ sourceURL=sourceURL.js");' + ], [ + 'Error: test', + ' at Object.eval (sourceURL.js:1:7)', + /^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/ + ]); +}); + +it('eval with sourceURL inside eval', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("eval(\'throw new Error(\\"test\\")//@ sourceURL=sourceURL.js\')");' + ], [ + 'Error: test', + ' at Object.eval (sourceURL.js:1:7)', + /^ at Object\.eval \(eval at \(.*\/line1\.js:1001:101\)/, + /^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/ + ]); +}); + +it('function constructor', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'throw new Function(")");' + ], [ + 'SyntaxError: Unexpected token )', + /^ at Object\.Function \((?:unknown source|)\)$/, + /^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/, + ]); +}); + +it('throw with empty source map', function() { + compareStackTrace(createEmptySourceMap(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \(.*\/.generated.js:1:96\)$/ + ]); +}); + +it('throw with source map with gap', function() { + compareStackTrace(createSourceMapWithGap(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \(.*\/.generated.js:1:96\)$/ + ]); +}); + +it('sourcesContent with data URL', function() { + compareStackTrace(createMultiLineSourceMapWithSourcesContent(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \(.*\/original.js:1001:5\)$/ + ]); +}); + +it('default options', function(done) { + compareStdout(done, createSingleLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);', + 'process.nextTick(function() { process.exit(1); });' + ], [ + /\/.original\.js:1$/, + 'this is the original code', + '^', + 'Error: this is the error', + /^ at foo \(.*\/.original\.js:1:1\)$/ + ]); +}); + +it('handleUncaughtExceptions is true', function(done) { + compareStdout(done, createSingleLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install({ handleUncaughtExceptions: true });', + 'process.nextTick(foo);' + ], [ + /\/.original\.js:1$/, + 'this is the original code', + '^', + 'Error: this is the error', + /^ at foo \(.*\/.original\.js:1:1\)$/ + ]); +}); + +it('handleUncaughtExceptions is false', function(done) { + compareStdout(done, createSingleLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install({ handleUncaughtExceptions: false });', + 'process.nextTick(foo);' + ], [ + /\/.generated.js:2$/, + 'function foo() { throw new Error("this is the error"); }', + ' ^', + 'Error: this is the error', + /^ at foo \(.*\/.original\.js:1:1\)$/ + ]); +}); + +it('default options with empty source map', function(done) { + compareStdout(done, createEmptySourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);' + ], [ + /\/.generated.js:2$/, + 'function foo() { throw new Error("this is the error"); }', + ' ^', + 'Error: this is the error', + /^ at foo \(.*\/.generated.js:2:24\)$/ + ]); +}); + +it('default options with source map with gap', function(done) { + compareStdout(done, createSourceMapWithGap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);' + ], [ + /\/.generated.js:2$/, + 'function foo() { throw new Error("this is the error"); }', + ' ^', + 'Error: this is the error', + /^ at foo \(.*\/.generated.js:2:24\)$/ + ]); +}); + +it('specifically requested error source', function(done) { + compareStdout(done, createSingleLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'var sms = require("./source-map-support");', + 'sms.install({ handleUncaughtExceptions: false });', + 'process.on("uncaughtException", function (e) { console.log("SRC:" + sms.getErrorSource(e)); });', + 'process.nextTick(foo);' + ], [ + 'SRC:', + /\/.original.js:1$/, + 'this is the original code', + '^' + ]); +}); + +it('sourcesContent', function(done) { + compareStdout(done, createMultiLineSourceMapWithSourcesContent(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);', + 'process.nextTick(function() { process.exit(1); });' + ], [ + /\/original\.js:1002$/, + ' line 2', + ' ^', + 'Error: this is the error', + /^ at foo \(.*\/original\.js:1002:5\)$/ + ]); +}); + +it('missing source maps should also be cached', function(done) { + compareStdout(done, createSingleLineSourceMap(), [ + '', + 'var count = 0;', + 'function foo() {', + ' console.log(new Error("this is the error").stack.split("\\n").slice(0, 2).join("\\n"));', + '}', + 'require("./source-map-support").install({', + ' retrieveSourceMap: function(name) {', + ' if (/\\.generated.js$/.test(name)) count++;', + ' return null;', + ' }', + '});', + 'process.nextTick(foo);', + 'process.nextTick(foo);', + 'process.nextTick(function() { console.log(count); });', + ], [ + 'Error: this is the error', + /^ at foo \(.*\/.generated.js:4:15\)$/, + 'Error: this is the error', + /^ at foo \(.*\/.generated.js:4:15\)$/, + '1', // The retrieval should only be attempted once + ]); +}); diff --git a/react-app/node_modules/source-map/README.md b/react-app/node_modules/source-map/README.md new file mode 100644 index 0000000000..8922fe8b0e --- /dev/null +++ b/react-app/node_modules/source-map/README.md @@ -0,0 +1,729 @@ +# Source Map + +[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) + +[![NPM](https://nodei.co/npm/source-map.png?downloads=true&downloadRank=true)](https://www.npmjs.com/package/source-map) + +This is a library to generate and consume the source map format +[described here][format]. + +[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit + +## Use with Node + + $ npm install source-map + +## Use on the Web + + + +-------------------------------------------------------------------------------- + + + + + +## Table of Contents + +- [Examples](#examples) + - [Consuming a source map](#consuming-a-source-map) + - [Generating a source map](#generating-a-source-map) + - [With SourceNode (high level API)](#with-sourcenode-high-level-api) + - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api) +- [API](#api) + - [SourceMapConsumer](#sourcemapconsumer) + - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap) + - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans) + - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition) + - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition) + - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition) + - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources) + - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing) + - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order) + - [SourceMapGenerator](#sourcemapgenerator) + - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap) + - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer) + - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping) + - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath) + - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring) + - [SourceNode](#sourcenode) + - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name) + - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath) + - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk) + - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk) + - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent) + - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn) + - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn) + - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep) + - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement) + - [SourceNode.prototype.toString()](#sourcenodeprototypetostring) + - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap) + + + +## Examples + +### Consuming a source map + +```js +var rawSourceMap = { + version: 3, + file: 'min.js', + names: ['bar', 'baz', 'n'], + sources: ['one.js', 'two.js'], + sourceRoot: 'http://example.com/www/js/', + mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' +}; + +var smc = new SourceMapConsumer(rawSourceMap); + +console.log(smc.sources); +// [ 'http://example.com/www/js/one.js', +// 'http://example.com/www/js/two.js' ] + +console.log(smc.originalPositionFor({ + line: 2, + column: 28 +})); +// { source: 'http://example.com/www/js/two.js', +// line: 2, +// column: 10, +// name: 'n' } + +console.log(smc.generatedPositionFor({ + source: 'http://example.com/www/js/two.js', + line: 2, + column: 10 +})); +// { line: 2, column: 28 } + +smc.eachMapping(function (m) { + // ... +}); +``` + +### Generating a source map + +In depth guide: +[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) + +#### With SourceNode (high level API) + +```js +function compile(ast) { + switch (ast.type) { + case 'BinaryExpression': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + [compile(ast.left), " + ", compile(ast.right)] + ); + case 'Literal': + return new SourceNode( + ast.location.line, + ast.location.column, + ast.location.source, + String(ast.value) + ); + // ... + default: + throw new Error("Bad AST"); + } +} + +var ast = parse("40 + 2", "add.js"); +console.log(compile(ast).toStringWithSourceMap({ + file: 'add.js' +})); +// { code: '40 + 2', +// map: [object SourceMapGenerator] } +``` + +#### With SourceMapGenerator (low level API) + +```js +var map = new SourceMapGenerator({ + file: "source-mapped.js" +}); + +map.addMapping({ + generated: { + line: 10, + column: 35 + }, + source: "foo.js", + original: { + line: 33, + column: 2 + }, + name: "christopher" +}); + +console.log(map.toString()); +// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' +``` + +## API + +Get a reference to the module: + +```js +// Node.js +var sourceMap = require('source-map'); + +// Browser builds +var sourceMap = window.sourceMap; + +// Inside Firefox +const sourceMap = require("devtools/toolkit/sourcemap/source-map.js"); +``` + +### SourceMapConsumer + +A SourceMapConsumer instance represents a parsed source map which we can query +for information about the original file positions by giving it a file position +in the generated source. + +#### new SourceMapConsumer(rawSourceMap) + +The only parameter is the raw source map (either as a string which can be +`JSON.parse`'d, or an object). According to the spec, source maps have the +following attributes: + +* `version`: Which version of the source map spec this map is following. + +* `sources`: An array of URLs to the original source files. + +* `names`: An array of identifiers which can be referenced by individual + mappings. + +* `sourceRoot`: Optional. The URL root from which all sources are relative. + +* `sourcesContent`: Optional. An array of contents of the original source files. + +* `mappings`: A string of base64 VLQs which contain the actual mappings. + +* `file`: Optional. The generated filename this source map is associated with. + +```js +var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData); +``` + +#### SourceMapConsumer.prototype.computeColumnSpans() + +Compute the last column for each generated mapping. The last column is +inclusive. + +```js +// Before: +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] + +consumer.computeColumnSpans(); + +// After: +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1, +// lastColumn: 9 }, +// { line: 2, +// column: 10, +// lastColumn: 19 }, +// { line: 2, +// column: 20, +// lastColumn: Infinity } ] + +``` + +#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) + +Returns the original source, line, and column information for the generated +source's line and column positions provided. The only argument is an object with +the following properties: + +* `line`: The line number in the generated source. + +* `column`: The column number in the generated source. + +* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or + `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest + element that is smaller than or greater than the one we are searching for, + respectively, if the exact element cannot be found. Defaults to + `SourceMapConsumer.GREATEST_LOWER_BOUND`. + +and an object is returned with the following properties: + +* `source`: The original source file, or null if this information is not + available. + +* `line`: The line number in the original source, or null if this information is + not available. + +* `column`: The column number in the original source, or null or null if this + information is not available. + +* `name`: The original identifier, or null if this information is not available. + +```js +consumer.originalPositionFor({ line: 2, column: 10 }) +// { source: 'foo.coffee', +// line: 2, +// column: 2, +// name: null } + +consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 }) +// { source: null, +// line: null, +// column: null, +// name: null } +``` + +#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) + +Returns the generated line and column information for the original source, +line, and column positions provided. The only argument is an object with +the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: The column number in the original source. + +and an object is returned with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 }) +// { line: 1, +// column: 56 } +``` + +#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) + +Returns all generated line and column information for the original source, line, +and column provided. If no column is provided, returns all mappings +corresponding to a either the line we are searching for or the next closest line +that has any mappings. Otherwise, returns all mappings corresponding to the +given line and either the column we are searching for or the next closest column +that has any offsets. + +The only argument is an object with the following properties: + +* `source`: The filename of the original source. + +* `line`: The line number in the original source. + +* `column`: Optional. The column number in the original source. + +and an array of objects is returned, each with the following properties: + +* `line`: The line number in the generated source, or null. + +* `column`: The column number in the generated source, or null. + +```js +consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" }) +// [ { line: 2, +// column: 1 }, +// { line: 2, +// column: 10 }, +// { line: 2, +// column: 20 } ] +``` + +#### SourceMapConsumer.prototype.hasContentsOfAllSources() + +Return true if we have the embedded source content for every source listed in +the source map, false otherwise. + +In other words, if this method returns `true`, then +`consumer.sourceContentFor(s)` will succeed for every source `s` in +`consumer.sources`. + +```js +// ... +if (consumer.hasContentsOfAllSources()) { + consumerReadyCallback(consumer); +} else { + fetchSources(consumer, consumerReadyCallback); +} +// ... +``` + +#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing]) + +Returns the original source content for the source provided. The only +argument is the URL of the original source file. + +If the source content for the given source is not found, then an error is +thrown. Optionally, pass `true` as the second param to have `null` returned +instead. + +```js +consumer.sources +// [ "my-cool-lib.clj" ] + +consumer.sourceContentFor("my-cool-lib.clj") +// "..." + +consumer.sourceContentFor("this is not in the source map"); +// Error: "this is not in the source map" is not in the source map + +consumer.sourceContentFor("this is not in the source map", true); +// null +``` + +#### SourceMapConsumer.prototype.eachMapping(callback, context, order) + +Iterate over each mapping between an original source/line/column and a +generated line/column in this source map. + +* `callback`: The function that is called with each mapping. Mappings have the + form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, + name }` + +* `context`: Optional. If specified, this object will be the value of `this` + every time that `callback` is called. + +* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or + `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over + the mappings sorted by the generated file's line/column order or the + original's source/line/column order, respectively. Defaults to + `SourceMapConsumer.GENERATED_ORDER`. + +```js +consumer.eachMapping(function (m) { console.log(m); }) +// ... +// { source: 'illmatic.js', +// generatedLine: 1, +// generatedColumn: 0, +// originalLine: 1, +// originalColumn: 0, +// name: null } +// { source: 'illmatic.js', +// generatedLine: 2, +// generatedColumn: 0, +// originalLine: 2, +// originalColumn: 0, +// name: null } +// ... +``` +### SourceMapGenerator + +An instance of the SourceMapGenerator represents a source map which is being +built incrementally. + +#### new SourceMapGenerator([startOfSourceMap]) + +You may pass an object with the following properties: + +* `file`: The filename of the generated source that this source map is + associated with. + +* `sourceRoot`: A root for all relative URLs in this source map. + +* `skipValidation`: Optional. When `true`, disables validation of mappings as + they are added. This can improve performance but should be used with + discretion, as a last resort. Even then, one should avoid using this flag when + running tests, if possible. + +```js +var generator = new sourceMap.SourceMapGenerator({ + file: "my-generated-javascript-file.js", + sourceRoot: "http://example.com/app/js/" +}); +``` + +#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) + +Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance. + +* `sourceMapConsumer` The SourceMap. + +```js +var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer); +``` + +#### SourceMapGenerator.prototype.addMapping(mapping) + +Add a single mapping from original source line and column to the generated +source's line and column for this source map being created. The mapping object +should have the following properties: + +* `generated`: An object with the generated line and column positions. + +* `original`: An object with the original line and column positions. + +* `source`: The original source file (relative to the sourceRoot). + +* `name`: An optional original token name for this mapping. + +```js +generator.addMapping({ + source: "module-one.scm", + original: { line: 128, column: 0 }, + generated: { line: 3, column: 456 } +}) +``` + +#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for an original source file. + +* `sourceFile` the URL of the original source file. + +* `sourceContent` the content of the source file. + +```js +generator.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) + +Applies a SourceMap for a source file to the SourceMap. +Each mapping to the supplied source file is rewritten using the +supplied SourceMap. Note: The resolution for the resulting mappings +is the minimum of this map and the supplied map. + +* `sourceMapConsumer`: The SourceMap to be applied. + +* `sourceFile`: Optional. The filename of the source file. + If omitted, sourceMapConsumer.file will be used, if it exists. + Otherwise an error will be thrown. + +* `sourceMapPath`: Optional. The dirname of the path to the SourceMap + to be applied. If relative, it is relative to the SourceMap. + + This parameter is needed when the two SourceMaps aren't in the same + directory, and the SourceMap to be applied contains relative source + paths. If so, those relative source paths need to be rewritten + relative to the SourceMap. + + If omitted, it is assumed that both SourceMaps are in the same directory, + thus not needing any rewriting. (Supplying `'.'` has the same effect.) + +#### SourceMapGenerator.prototype.toString() + +Renders the source map being generated to a string. + +```js +generator.toString() +// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}' +``` + +### SourceNode + +SourceNodes provide a way to abstract over interpolating and/or concatenating +snippets of generated JavaScript source code, while maintaining the line and +column information associated between those snippets and the original source +code. This is useful as the final intermediate representation a compiler might +use before outputting the generated JS and source map. + +#### new SourceNode([line, column, source[, chunk[, name]]]) + +* `line`: The original line number associated with this source node, or null if + it isn't associated with an original line. + +* `column`: The original column number associated with this source node, or null + if it isn't associated with an original column. + +* `source`: The original source's filename; null if no filename is provided. + +* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see + below. + +* `name`: Optional. The original identifier. + +```js +var node = new SourceNode(1, 2, "a.cpp", [ + new SourceNode(3, 4, "b.cpp", "extern int status;\n"), + new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"), + new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"), +]); +``` + +#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) + +Creates a SourceNode from generated code and a SourceMapConsumer. + +* `code`: The generated code + +* `sourceMapConsumer` The SourceMap for the generated code + +* `relativePath` The optional path that relative sources in `sourceMapConsumer` + should be relative to. + +```js +var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map")); +var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"), + consumer); +``` + +#### SourceNode.prototype.add(chunk) + +Add a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.add(" + "); +node.add(otherNode); +node.add([leftHandOperandNode, " + ", rightHandOperandNode]); +``` + +#### SourceNode.prototype.prepend(chunk) + +Prepend a chunk of generated JS to this source node. + +* `chunk`: A string snippet of generated JS code, another instance of + `SourceNode`, or an array where each member is one of those things. + +```js +node.prepend("/** Build Id: f783haef86324gf **/\n\n"); +``` + +#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) + +Set the source content for a source file. This will be added to the +`SourceMap` in the `sourcesContent` field. + +* `sourceFile`: The filename of the source file + +* `sourceContent`: The content of the source file + +```js +node.setSourceContent("module-one.scm", + fs.readFileSync("path/to/module-one.scm")) +``` + +#### SourceNode.prototype.walk(fn) + +Walk over the tree of JS snippets in this node and its children. The walking +function is called once for each snippet of JS and is passed that snippet and +the its original associated source's line/column location. + +* `fn`: The traversal function. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.walk(function (code, loc) { console.log("WALK:", code, loc); }) +// WALK: uno { source: 'b.js', line: 3, column: 4, name: null } +// WALK: dos { source: 'a.js', line: 1, column: 2, name: null } +// WALK: tres { source: 'a.js', line: 1, column: 2, name: null } +// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null } +``` + +#### SourceNode.prototype.walkSourceContents(fn) + +Walk over the tree of SourceNodes. The walking function is called for each +source file content and is passed the filename and source content. + +* `fn`: The traversal function. + +```js +var a = new SourceNode(1, 2, "a.js", "generated from a"); +a.setSourceContent("a.js", "original a"); +var b = new SourceNode(1, 2, "b.js", "generated from b"); +b.setSourceContent("b.js", "original b"); +var c = new SourceNode(1, 2, "c.js", "generated from c"); +c.setSourceContent("c.js", "original c"); + +var node = new SourceNode(null, null, null, [a, b, c]); +node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); }) +// WALK: a.js : original a +// WALK: b.js : original b +// WALK: c.js : original c +``` + +#### SourceNode.prototype.join(sep) + +Like `Array.prototype.join` except for SourceNodes. Inserts the separator +between each of this source node's children. + +* `sep`: The separator. + +```js +var lhs = new SourceNode(1, 2, "a.rs", "my_copy"); +var operand = new SourceNode(3, 4, "a.rs", "="); +var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()"); + +var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]); +var joinedNode = node.join(" "); +``` + +#### SourceNode.prototype.replaceRight(pattern, replacement) + +Call `String.prototype.replace` on the very right-most source snippet. Useful +for trimming white space from the end of a source node, etc. + +* `pattern`: The pattern to replace. + +* `replacement`: The thing to replace the pattern with. + +```js +// Trim trailing white space. +node.replaceRight(/\s*$/, ""); +``` + +#### SourceNode.prototype.toString() + +Return the string representation of this source node. Walks over the tree and +concatenates all the various snippets together to one string. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toString() +// 'unodostresquatro' +``` + +#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) + +Returns the string representation of this tree of source nodes, plus a +SourceMapGenerator which contains all the mappings between the generated and +original sources. + +The arguments are the same as those to `new SourceMapGenerator`. + +```js +var node = new SourceNode(1, 2, "a.js", [ + new SourceNode(3, 4, "b.js", "uno"), + "dos", + [ + "tres", + new SourceNode(5, 6, "c.js", "quatro") + ] +]); + +node.toStringWithSourceMap({ file: "my-output-file.js" }) +// { code: 'unodostresquatro', +// map: [object SourceMapGenerator] } +``` diff --git a/react-app/node_modules/source-map/dist/source-map.debug.js b/react-app/node_modules/source-map/dist/source-map.debug.js new file mode 100644 index 0000000000..aca3ca5453 --- /dev/null +++ b/react-app/node_modules/source-map/dist/source-map.debug.js @@ -0,0 +1,3006 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null && !this._sources.has(source)) { + this._sources.add(source); + } + + if (name != null && !this._names.has(name)) { + this._names.add(name); + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = {}; + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + result += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + result += ','; + } + } + + result += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + result += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + result += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + result += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + result += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, + key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + } + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler 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. + */ + { + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + } + + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + } + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consequtive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + return '$' + aStr; + } + exports.toSetString = toSetString; + + function fromSetString(aStr) { + return aStr.substr(1); + } + exports.fromSetString = fromSetString; + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + } + + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var util = __webpack_require__(4); + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = {}; + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = util.toSetString(aStr); + var isDuplicate = this._set.hasOwnProperty(sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + this._set[sStr] = idx; + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + var sStr = util.toSetString(aStr); + return this._set.hasOwnProperty(sStr); + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + var sStr = util.toSetString(aStr); + if (this._set.hasOwnProperty(sStr)) { + return this._set[sStr]; + } + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + } + + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + } + + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names, true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + } + + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + } + + +/***/ }, +/* 9 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + } + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are removed from this array, by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var shiftNextLine = function() { + var lineContents = remainingLines.shift(); + // The last line of a file might not have a newline. + var newLine = remainingLines.shift() || ""; + return lineContents + newLine; + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[0]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLines.length > 0) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + } + + +/***/ } +/******/ ]) +}); +; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAzMzE2M2Q1YTFmMDY1MDk5Y2MwYiIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTRDLFNBQVM7QUFDckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUMzWUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTJEO0FBQzNELHFCQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQzVJQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQWtCO0FBQ2xCLG1CQUFrQjs7QUFFbEIsc0JBQXFCO0FBQ3JCLHVCQUFzQjs7QUFFdEIsbUJBQWtCO0FBQ2xCLG1CQUFrQjs7QUFFbEIsbUJBQWtCO0FBQ2xCLG9CQUFtQjs7QUFFbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ25FQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaURBQWdELFFBQVE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDaFhBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdkdBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDL0VBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5REFBd0Q7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxzQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7O0FBRWI7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQTZCLE1BQU07QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBd0Q7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5REFBd0QsWUFBWTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUF5Qix3Q0FBd0M7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFpRCxtQkFBbUIsRUFBRTtBQUN0RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsb0JBQW9CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBK0IsTUFBTTtBQUNyQztBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF3RDtBQUN4RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBcUIsMkJBQTJCO0FBQ2hELHdCQUF1QiwrQ0FBK0M7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFxQiwyQkFBMkI7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXFCLDJCQUEyQjtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBcUIsMkJBQTJCO0FBQ2hEO0FBQ0E7QUFDQSx3QkFBdUIsNEJBQTRCO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDempDQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7OztBQy9HQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFhLE1BQU07QUFDbkI7QUFDQSxjQUFhLE9BQU87QUFDcEI7QUFDQSxjQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYSxPQUFPO0FBQ3BCO0FBQ0EsY0FBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYSxNQUFNO0FBQ25CO0FBQ0EsY0FBYSxTQUFTO0FBQ3RCO0FBQ0EsY0FBYSxPQUFPO0FBQ3BCO0FBQ0EsY0FBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBcUIsT0FBTztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYSxNQUFNO0FBQ25CO0FBQ0EsY0FBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ2xIQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxTQUFTO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUFzQjtBQUN0QjtBQUNBO0FBQ0EseUNBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixXQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBaUQsU0FBUztBQUMxRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRDQUEyQyxTQUFTO0FBQ3BEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQ0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxnQkFBZTtBQUNmO0FBQ0EsY0FBYTtBQUNiO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSzs7QUFFTCxhQUFZO0FBQ1o7O0FBRUE7QUFDQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvblxuICoqLyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgMzMxNjNkNWExZjA2NTA5OWNjMGJcbiAqKi8iLCIvKlxuICogQ29weXJpZ2h0IDIwMDktMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0UudHh0IG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtY29uc3VtZXInKS5Tb3VyY2VNYXBDb25zdW1lcjtcbmV4cG9ydHMuU291cmNlTm9kZSA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1ub2RlJykuU291cmNlTm9kZTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zb3VyY2UtbWFwLmpzXG4gKiogbW9kdWxlIGlkID0gMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xue1xuICB2YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG4gIHZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG4gIHZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG4gIHZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAgICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICogICAtIHNvdXJjZVJvb3Q6IEEgcm9vdCBmb3IgYWxsIHJlbGF0aXZlIFVSTHMgaW4gdGhpcyBzb3VyY2UgbWFwLlxuICAgKi9cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gICAgaWYgKCFhQXJncykge1xuICAgICAgYUFyZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5fZmlsZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZmlsZScsIG51bGwpO1xuICAgIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICB9XG5cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAgICpcbiAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXBDb25zdW1lcikge1xuICAgICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgICAgZmlsZTogYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUsXG4gICAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICAgIH0pO1xuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdNYXBwaW5nLm9yaWdpbmFsID0ge1xuICAgICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgICB9KTtcbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBnZW5lcmF0b3I7XG4gICAgfTtcblxuICAvKipcbiAgICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAgICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAgICogb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICAgKiAgIC0gb3JpZ2luYWw6IEFuIG9iamVjdCB3aXRoIHRoZSBvcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICAgKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAgICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICAgIHZhciBnZW5lcmF0ZWQgPSB1dGlsLmdldEFyZyhhQXJncywgJ2dlbmVyYXRlZCcpO1xuICAgICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbmFtZScsIG51bGwpO1xuXG4gICAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbWFwcGluZ3MuYWRkKHtcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgICAgb3JpZ2luYWxMaW5lOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmxpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgIG5hbWU6IG5hbWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhU291cmNlQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgICBkZWxldGUgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV07XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICAgKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICAgKiByZXdyaXR0ZW4gdXNpbmcgdGhlIHN1cHBsaWVkIHNvdXJjZSBtYXAuIE5vdGU6IFRoZSByZXNvbHV0aW9uIGZvciB0aGVcbiAgICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAgICpcbiAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkLlxuICAgKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gICAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBAcGFyYW0gYVNvdXJjZU1hcFBhdGggT3B0aW9uYWwuIFRoZSBkaXJuYW1lIG9mIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgbWFwXG4gICAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAgICogICAgICAgIGRpcmVjdG9yeSwgYW5kIHRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQgY29udGFpbnMgcmVsYXRpdmUgc291cmNlXG4gICAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICAgKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgICAgdmFyIHNvdXJjZUZpbGUgPSBhU291cmNlRmlsZTtcbiAgICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwQ29uc3VtZXIuZmlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAgICdvciB0aGUgc291cmNlIG1hcFxcJ3MgXCJmaWxlXCIgcHJvcGVydHkuIEJvdGggd2VyZSBvbWl0dGVkLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHNvdXJjZUZpbGUgPSBhU291cmNlTWFwQ29uc3VtZXIuZmlsZTtcbiAgICAgIH1cbiAgICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAgIC8vIE1ha2UgXCJzb3VyY2VGaWxlXCIgcmVsYXRpdmUgaWYgYW4gYWJzb2x1dGUgVXJsIGlzIHBhc3NlZC5cbiAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG4gICAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgICAgdmFyIG5ld1NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICAgIHRoaXMuX21hcHBpbmdzLnVuc29ydGVkRm9yRWFjaChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICAgIHZhciBvcmlnaW5hbCA9IGFTb3VyY2VNYXBDb25zdW1lci5vcmlnaW5hbFBvc2l0aW9uRm9yKHtcbiAgICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gb3JpZ2luYWwuc291cmNlO1xuICAgICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbC5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiAhbmV3U291cmNlcy5oYXMoc291cmNlKSkge1xuICAgICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmFtZSA9IG1hcHBpbmcubmFtZTtcbiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgIH0sIHRoaXMpO1xuICAgICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgICB0aGlzLl9uYW1lcyA9IG5ld05hbWVzO1xuXG4gICAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfTtcblxuICAvKipcbiAgICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gICAqXG4gICAqICAgMS4gSnVzdCB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICAgKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAgICogICAgICB0b2tlbi5cbiAgICpcbiAgICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gICAqIGluIHRvIG9uZSBvZiB0aGVzZSBjYXRlZ29yaWVzLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdmFsaWRhdGVNYXBwaW5nKGFHZW5lcmF0ZWQsIGFPcmlnaW5hbCwgYVNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgICBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgICAgLy8gQ2FzZSAxLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgICAmJiBhT3JpZ2luYWwubGluZSA+IDAgJiYgYU9yaWdpbmFsLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWFwcGluZzogJyArIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiBhT3JpZ2luYWwsXG4gICAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gdG8gdGhlIHN0cmVhbSBvZiBiYXNlIDY0IFZMUXNcbiAgICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3NlcmlhbGl6ZU1hcHBpbmdzID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkTGluZSA9IDE7XG4gICAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG1hcHBpbmc7XG4gICAgICB2YXIgbmFtZUlkeDtcbiAgICAgIHZhciBzb3VyY2VJZHg7XG5cbiAgICAgIHZhciBtYXBwaW5ncyA9IHRoaXMuX21hcHBpbmdzLnRvQXJyYXkoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICc7JztcbiAgICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGlmICghdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nLCBtYXBwaW5nc1tpIC0gMV0pKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUlkeCA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihtYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUoc291cmNlSWR4IC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlID0gc291cmNlSWR4O1xuXG4gICAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50ID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhU291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5ID0gdXRpbC50b1NldFN0cmluZyhzb3VyY2UpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkpXG4gICAgICAgICAgPyB0aGlzLl9zb3VyY2VzQ29udGVudHNba2V5XVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgICB2YXIgbWFwID0ge1xuICAgICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgICAgbmFtZXM6IHRoaXMuX25hbWVzLnRvQXJyYXkoKSxcbiAgICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5fZmlsZSAhPSBudWxsKSB7XG4gICAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZCB0byBhIHN0cmluZy5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgICB9O1xuXG4gIGV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gU291cmNlTWFwR2VuZXJhdG9yO1xufVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuICoqIG1vZHVsZSBpZCA9IDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cbntcbiAgdmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbiAgLy8gQSBzaW5nbGUgYmFzZSA2NCBkaWdpdCBjYW4gY29udGFpbiA2IGJpdHMgb2YgZGF0YS4gRm9yIHRoZSBiYXNlIDY0IHZhcmlhYmxlXG4gIC8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuICAvLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbiAgLy8gY29udGludWF0aW9uIGJpdC4gVGhlIGNvbnRpbnVhdGlvbiBiaXQgdGVsbHMgdXMgd2hldGhlciB0aGVyZSBhcmUgbW9yZVxuICAvLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbiAgLy9cbiAgLy8gICBDb250aW51YXRpb25cbiAgLy8gICB8ICAgIFNpZ25cbiAgLy8gICB8ICAgIHxcbiAgLy8gICBWICAgIFZcbiAgLy8gICAxMDEwMTFcblxuICB2YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4gIC8vIGJpbmFyeTogMTAwMDAwXG4gIHZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbiAgLy8gYmluYXJ5OiAwMTExMTFcbiAgdmFyIFZMUV9CQVNFX01BU0sgPSBWTFFfQkFTRSAtIDE7XG5cbiAgLy8gYmluYXJ5OiAxMDAwMDBcbiAgdmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICAgKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAgICogICAxIGJlY29tZXMgMiAoMTAgYmluYXJ5KSwgLTEgYmVjb21lcyAzICgxMSBiaW5hcnkpXG4gICAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gICAqL1xuICBmdW5jdGlvbiB0b1ZMUVNpZ25lZChhVmFsdWUpIHtcbiAgICByZXR1cm4gYVZhbHVlIDwgMFxuICAgICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgICAgOiAoYVZhbHVlIDw8IDEpICsgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0byBhIHR3by1jb21wbGVtZW50IHZhbHVlIGZyb20gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXNcbiAgICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gICAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICAgKiAgIDQgKDEwMCBiaW5hcnkpIGJlY29tZXMgMiwgNSAoMTAxIGJpbmFyeSkgYmVjb21lcyAtMlxuICAgKi9cbiAgZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgICB2YXIgaXNOZWdhdGl2ZSA9IChhVmFsdWUgJiAxKSA9PT0gMTtcbiAgICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICAgIHJldHVybiBpc05lZ2F0aXZlXG4gICAgICA/IC1zaGlmdGVkXG4gICAgICA6IHNoaWZ0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAgICovXG4gIGV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2VuY29kZShhVmFsdWUpIHtcbiAgICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gICAgdmFyIGRpZ2l0O1xuXG4gICAgdmFyIHZscSA9IHRvVkxRU2lnbmVkKGFWYWx1ZSk7XG5cbiAgICBkbyB7XG4gICAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgICB2bHEgPj4+PSBWTFFfQkFTRV9TSElGVDtcbiAgICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgICAgLy8gY29udGludWF0aW9uIGJpdCBpcyBtYXJrZWQuXG4gICAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgICAgfVxuICAgICAgZW5jb2RlZCArPSBiYXNlNjQuZW5jb2RlKGRpZ2l0KTtcbiAgICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICAgIHJldHVybiBlbmNvZGVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAgICogdmFsdWUgYW5kIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgdmlhIHRoZSBvdXQgcGFyYW1ldGVyLlxuICAgKi9cbiAgZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gICAgdmFyIHN0ckxlbiA9IGFTdHIubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSAwO1xuICAgIHZhciBzaGlmdCA9IDA7XG4gICAgdmFyIGNvbnRpbnVhdGlvbiwgZGlnaXQ7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBtb3JlIGRpZ2l0cyBpbiBiYXNlIDY0IFZMUSB2YWx1ZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICAgIGlmIChkaWdpdCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgICAgfVxuXG4gICAgICBjb250aW51YXRpb24gPSAhIShkaWdpdCAmIFZMUV9DT05USU5VQVRJT05fQklUKTtcbiAgICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgICAgc2hpZnQgKz0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICAgIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgICBhT3V0UGFyYW0ucmVzdCA9IGFJbmRleDtcbiAgfTtcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvYmFzZTY0LXZscS5qc1xuICoqIG1vZHVsZSBpZCA9IDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbntcbiAgdmFyIGludFRvQ2hhck1hcCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJy5zcGxpdCgnJyk7XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gICAqL1xuICBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICBpZiAoMCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgaW50VG9DaGFyTWFwLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGludFRvQ2hhck1hcFtudW1iZXJdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIG51bWJlcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGNoYXJhY3RlciBjb2RlIGRpZ2l0IHRvIGFuIGludGVnZXIuIFJldHVybnMgLTEgb25cbiAgICogZmFpbHVyZS5cbiAgICovXG4gIGV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gICAgdmFyIGJpZ0EgPSA2NTsgICAgIC8vICdBJ1xuICAgIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICAgIHZhciBsaXR0bGVBID0gOTc7ICAvLyAnYSdcbiAgICB2YXIgbGl0dGxlWiA9IDEyMjsgLy8gJ3onXG5cbiAgICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gICAgdmFyIG5pbmUgPSA1NzsgICAgIC8vICc5J1xuXG4gICAgdmFyIHBsdXMgPSA0MzsgICAgIC8vICcrJ1xuICAgIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICAgIHZhciBsaXR0bGVPZmZzZXQgPSAyNjtcbiAgICB2YXIgbnVtYmVyT2Zmc2V0ID0gNTI7XG5cbiAgICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gICAgaWYgKGJpZ0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gYmlnWikge1xuICAgICAgcmV0dXJuIChjaGFyQ29kZSAtIGJpZ0EpO1xuICAgIH1cblxuICAgIC8vIDI2IC0gNTE6IGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XG4gICAgaWYgKGxpdHRsZUEgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbGl0dGxlWikge1xuICAgICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIDUyIC0gNjE6IDAxMjM0NTY3ODlcbiAgICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgICByZXR1cm4gKGNoYXJDb2RlIC0gemVybyArIG51bWJlck9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gNjI6ICtcbiAgICBpZiAoY2hhckNvZGUgPT0gcGx1cykge1xuICAgICAgcmV0dXJuIDYyO1xuICAgIH1cblxuICAgIC8vIDYzOiAvXG4gICAgaWYgKGNoYXJDb2RlID09IHNsYXNoKSB7XG4gICAgICByZXR1cm4gNjM7XG4gICAgfVxuXG4gICAgLy8gSW52YWxpZCBiYXNlNjQgZGlnaXQuXG4gICAgcmV0dXJuIC0xO1xuICB9O1xufVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9iYXNlNjQuanNcbiAqKiBtb2R1bGUgaWQgPSAzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG57XG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gICAqIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICAgKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gICAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICAgIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gICAgfVxuICB9XG4gIGV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG4gIHZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Ll0qKSg/OjooXFxkKykpPyhcXFMqKSQvO1xuICB2YXIgZGF0YVVybFJlZ2V4cCA9IC9eZGF0YTouK1xcLC4rJC87XG5cbiAgZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICAgIHZhciBtYXRjaCA9IGFVcmwubWF0Y2godXJsUmVnZXhwKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgICBhdXRoOiBtYXRjaFsyXSxcbiAgICAgIGhvc3Q6IG1hdGNoWzNdLFxuICAgICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgICBwYXRoOiBtYXRjaFs1XVxuICAgIH07XG4gIH1cbiAgZXhwb3J0cy51cmxQYXJzZSA9IHVybFBhcnNlO1xuXG4gIGZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHtcbiAgICB2YXIgdXJsID0gJyc7XG4gICAgaWYgKGFQYXJzZWRVcmwuc2NoZW1lKSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5zY2hlbWUgKyAnOic7XG4gICAgfVxuICAgIHVybCArPSAnLy8nO1xuICAgIGlmIChhUGFyc2VkVXJsLmF1dGgpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gICAgfVxuICAgIGlmIChhUGFyc2VkVXJsLmhvc3QpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gICAgfVxuICAgIGlmIChhUGFyc2VkVXJsLnBvcnQpIHtcbiAgICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICAgIH1cbiAgICBpZiAoYVBhcnNlZFVybC5wYXRoKSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGV4cG9ydHMudXJsR2VuZXJhdGUgPSB1cmxHZW5lcmF0ZTtcblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gICAqXG4gICAqIC0gUmVwbGFjZXMgY29uc2VxdXRpdmUgc2xhc2hlcyB3aXRoIG9uZSBzbGFzaC5cbiAgICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAgICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICc8ZGlyPi8uLicgcGFydHMuXG4gICAqXG4gICAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICAgKlxuICAgKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgdXJsIHRvIG5vcm1hbGl6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZShhUGF0aCkge1xuICAgIHZhciBwYXRoID0gYVBhdGg7XG4gICAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgICBpZiAodXJsKSB7XG4gICAgICBpZiAoIXVybC5wYXRoKSB7XG4gICAgICAgIHJldHVybiBhUGF0aDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSB1cmwucGF0aDtcbiAgICB9XG4gICAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCk7XG5cbiAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cXC8rLyk7XG4gICAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgIHVwKys7XG4gICAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgICBpZiAocGFydCA9PT0gJycpIHtcbiAgICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBibGFuayBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4gVHJ5aW5nIHRvIGdvXG4gICAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgICAvLyBkaXJlY3RseSBhZnRlciB0aGUgcm9vdC5cbiAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSArIDEsIHVwKTtcbiAgICAgICAgICB1cCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMuc3BsaWNlKGksIDIpO1xuICAgICAgICAgIHVwLS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblxuICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gICAgfVxuXG4gICAgaWYgKHVybCkge1xuICAgICAgdXJsLnBhdGggPSBwYXRoO1xuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKHVybCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xuICB9XG4gIGV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xuXG4gIC8qKlxuICAgKiBKb2lucyB0d28gcGF0aHMvVVJMcy5cbiAgICpcbiAgICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICAgKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIGpvaW5lZCB3aXRoIHRoZSByb290LlxuICAgKlxuICAgKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICAgKiAgIHNjaGVtZS1yZWxhdGl2ZSBVUkw6IFRoZW4gdGhlIHNjaGVtZSBvZiBhUm9vdCwgaWYgYW55LCBpcyBwcmVwZW5kZWRcbiAgICogICBmaXJzdC5cbiAgICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gICAqICAgaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHQgYW5kIGFSb290IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIHJlc3VsdFxuICAgKiAgIGlzIHJldHVybmVkLlxuICAgKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gICAqICAgLSBPdGhlcndpc2UgdGhlIHR3byBwYXRocyBhcmUgam9pbmVkIHdpdGggYSBzbGFzaC5cbiAgICogLSBKb2luaW5nIGZvciBleGFtcGxlICdodHRwOi8vJyBhbmQgJ3d3dy5leGFtcGxlLmNvbScgaXMgYWxzbyBzdXBwb3J0ZWQuXG4gICAqL1xuICBmdW5jdGlvbiBqb2luKGFSb290LCBhUGF0aCkge1xuICAgIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgICAgYVJvb3QgPSBcIi5cIjtcbiAgICB9XG4gICAgaWYgKGFQYXRoID09PSBcIlwiKSB7XG4gICAgICBhUGF0aCA9IFwiLlwiO1xuICAgIH1cbiAgICB2YXIgYVBhdGhVcmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gICAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICcvJztcbiAgICB9XG5cbiAgICAvLyBgam9pbihmb28sICcvL3d3dy5leGFtcGxlLm9yZycpYFxuICAgIGlmIChhUGF0aFVybCAmJiAhYVBhdGhVcmwuc2NoZW1lKSB7XG4gICAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgICAgYVBhdGhVcmwuc2NoZW1lID0gYVJvb3RVcmwuc2NoZW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgICB9XG5cbiAgICBpZiAoYVBhdGhVcmwgfHwgYVBhdGgubWF0Y2goZGF0YVVybFJlZ2V4cCkpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBgam9pbignaHR0cDovLycsICd3d3cuZXhhbXBsZS5jb20nKWBcbiAgICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICAgIGFSb290VXJsLmhvc3QgPSBhUGF0aDtcbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgICA/IGFQYXRoXG4gICAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVJvb3RVcmwucGF0aCA9IGpvaW5lZDtcbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gICAgfVxuICAgIHJldHVybiBqb2luZWQ7XG4gIH1cbiAgZXhwb3J0cy5qb2luID0gam9pbjtcblxuICBleHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbiAoYVBhdGgpIHtcbiAgICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgISFhUGF0aC5tYXRjaCh1cmxSZWdleHApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAgICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICAgKi9cbiAgZnVuY3Rpb24gcmVsYXRpdmUoYVJvb3QsIGFQYXRoKSB7XG4gICAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgICBhUm9vdCA9IFwiLlwiO1xuICAgIH1cblxuICAgIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcGF0aCB0byBiZSBhYm92ZSB0aGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBzaW1wbHlcbiAgICAvLyBjaGVja2luZyB3aGV0aGVyIHRoZSByb290IGlzIGEgcHJlZml4IG9mIHRoZSBwYXRoIHdvbid0IHdvcmsuIEluc3RlYWQsIHdlXG4gICAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gICAgLy8gYSBwcmVmaXggdGhhdCBmaXRzLCBvciB3ZSBydW4gb3V0IG9mIGNvbXBvbmVudHMgdG8gcmVtb3ZlLlxuICAgIHZhciBsZXZlbCA9IDA7XG4gICAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBhUm9vdC5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBhUGF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG9ubHkgcGFydCBvZiB0aGUgcm9vdCB0aGF0IGlzIGxlZnQgaXMgdGhlIHNjaGVtZSAoaS5lLiBodHRwOi8vLFxuICAgICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgICAgLy8gaGF2ZSBleGhhdXN0ZWQgYWxsIGNvbXBvbmVudHMsIHNvIHRoZSBwYXRoIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcm9vdC5cbiAgICAgIGFSb290ID0gYVJvb3Quc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICAgIHJldHVybiBhUGF0aDtcbiAgICAgIH1cblxuICAgICAgKytsZXZlbDtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgd2UgYWRkIGEgXCIuLi9cIiBmb3IgZWFjaCBjb21wb25lbnQgd2UgcmVtb3ZlZCBmcm9tIHRoZSByb290LlxuICAgIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG4gIH1cbiAgZXhwb3J0cy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuXG4gIC8qKlxuICAgKiBCZWNhdXNlIGJlaGF2aW9yIGdvZXMgd2Fja3kgd2hlbiB5b3Ugc2V0IGBfX3Byb3RvX19gIG9uIG9iamVjdHMsIHdlXG4gICAqIGhhdmUgdG8gcHJlZml4IGFsbCB0aGUgc3RyaW5ncyBpbiBvdXIgc2V0IHdpdGggYW4gYXJiaXRyYXJ5IGNoYXJhY3Rlci5cbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvcHVsbC8zMSBhbmRcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMzBcbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBmdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cbiAgZXhwb3J0cy50b1NldFN0cmluZyA9IHRvU2V0U3RyaW5nO1xuXG4gIGZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICAgIHJldHVybiBhU3RyLnN1YnN0cigxKTtcbiAgfVxuICBleHBvcnRzLmZyb21TZXRTdHJpbmcgPSBmcm9tU2V0U3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gICAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uLCBidXQgZGlmZmVyZW50IGdlbmVyYXRlZFxuICAgKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICAgKiBzdHViYmVkIG91dCBtYXBwaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgdmFyIGNtcCA9IG1hcHBpbmdBLnNvdXJjZSAtIG1hcHBpbmdCLnNvdXJjZTtcbiAgICBpZiAoY21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgICBpZiAoY21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gICAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgICBpZiAoY21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICAgIGlmIChjbXAgIT09IDApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xuICB9XG4gIGV4cG9ydHMuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMgPSBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucztcblxuICAvKipcbiAgICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gICAqIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAgICpcbiAgICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICAgKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4sIGJ1dCBkaWZmZXJlbnRcbiAgICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAgICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gICAgaWYgKGNtcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gICAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5zb3VyY2UgLSBtYXBwaW5nQi5zb3VyY2U7XG4gICAgaWYgKGNtcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gICAgaWYgKGNtcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICAgIGlmIChjbXAgIT09IDApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdBLm5hbWUgLSBtYXBwaW5nQi5uYW1lO1xuICB9XG4gIGV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuICBmdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7XG4gICAgaWYgKGFTdHIxID09PSBhU3RyMikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKGFTdHIxID4gYVN0cjIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdpdGggaW5mbGF0ZWQgc291cmNlIGFuZCBuYW1lIHN0cmluZ3Mgd2hlcmVcbiAgICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gICAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICAgIGlmIChjbXAgIT09IDApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICAgIGlmIChjbXAgIT09IDApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgICBpZiAoY21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgICBpZiAoY21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gICAgaWYgKGNtcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xuICB9XG4gIGV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvdXRpbC5qc1xuICoqIG1vZHVsZSBpZCA9IDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbntcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuICAvKipcbiAgICogQSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIGFycmF5IGFuZCBhIHNldC4gQWRkaW5nIGEgbmV3XG4gICAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICAgKiBlbGVtZW50IGlzIE8oMSkuIFJlbW92aW5nIGVsZW1lbnRzIGZyb20gdGhlIHNldCBpcyBub3Qgc3VwcG9ydGVkLiBPbmx5XG4gICAqIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgbWVtYmVyc2hpcC5cbiAgICovXG4gIGZ1bmN0aW9uIEFycmF5U2V0KCkge1xuICAgIHRoaXMuX2FycmF5ID0gW107XG4gICAgdGhpcy5fc2V0ID0ge307XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCBmb3IgY3JlYXRpbmcgQXJyYXlTZXQgaW5zdGFuY2VzIGZyb20gYW4gZXhpc3RpbmcgYXJyYXkuXG4gICAqL1xuICBBcnJheVNldC5mcm9tQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF9mcm9tQXJyYXkoYUFycmF5LCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdmFyIHNldCA9IG5ldyBBcnJheVNldCgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHNldC5hZGQoYUFycmF5W2ldLCBhQWxsb3dEdXBsaWNhdGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHNldDtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAgICogYWRkZWQsIHRoYW4gdGhvc2UgZG8gbm90IGNvdW50IHRvd2FyZHMgdGhlIHNpemUuXG4gICAqXG4gICAqIEByZXR1cm5zIE51bWJlclxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiBBcnJheVNldF9zaXplKCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9zZXQpLmxlbmd0aDtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHZhciBpc0R1cGxpY2F0ZSA9IHRoaXMuX3NldC5oYXNPd25Qcm9wZXJ0eShzU3RyKTtcbiAgICB2YXIgaWR4ID0gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICAgIGlmICghaXNEdXBsaWNhdGUgfHwgYUFsbG93RHVwbGljYXRlcykge1xuICAgICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgICB9XG4gICAgaWYgKCFpc0R1cGxpY2F0ZSkge1xuICAgICAgdGhpcy5fc2V0W3NTdHJdID0gaWR4O1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhlIGdpdmVuIHN0cmluZyBhIG1lbWJlciBvZiB0aGlzIHNldD9cbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gQXJyYXlTZXRfaGFzKGFTdHIpIHtcbiAgICB2YXIgc1N0ciA9IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXNPd25Qcm9wZXJ0eShzU3RyKTtcbiAgfTtcblxuICAvKipcbiAgICogV2hhdCBpcyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHN0cmluZyBpbiB0aGUgYXJyYXk/XG4gICAqXG4gICAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBBcnJheVNldF9pbmRleE9mKGFTdHIpIHtcbiAgICB2YXIgc1N0ciA9IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gICAgaWYgKHRoaXMuX3NldC5oYXNPd25Qcm9wZXJ0eShzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU3RyICsgJ1wiIGlzIG5vdCBpbiB0aGUgc2V0LicpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleD9cbiAgICpcbiAgICogQHBhcmFtIE51bWJlciBhSWR4XG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gICAgaWYgKGFJZHggPj0gMCAmJiBhSWR4IDwgdGhpcy5fYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXJyYXlbYUlkeF07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm8gZWxlbWVudCBpbmRleGVkIGJ5ICcgKyBhSWR4KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZXQgKHdoaWNoIGhhcyB0aGUgcHJvcGVyIGluZGljZXNcbiAgICogaW5kaWNhdGVkIGJ5IGluZGV4T2YpLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGFycmF5IHVzZWRcbiAgICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAgICovXG4gIEFycmF5U2V0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfdG9BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbiAgfTtcblxuICBleHBvcnRzLkFycmF5U2V0ID0gQXJyYXlTZXQ7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2FycmF5LXNldC5qc1xuICoqIG1vZHVsZSBpZCA9IDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbntcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICAgKiBwb3NpdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gICAgLy8gT3B0aW1pemVkIGZvciBtb3N0IGNvbW1vbiBjYXNlXG4gICAgdmFyIGxpbmVBID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZTtcbiAgICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICAgIHZhciBjb2x1bW5BID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uO1xuICAgIHZhciBjb2x1bW5CID0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICAgIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikgPD0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGRhdGEgc3RydWN0dXJlIHRvIHByb3ZpZGUgYSBzb3J0ZWQgdmlldyBvZiBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiBhXG4gICAqIHBlcmZvcm1hbmNlIGNvbnNjaW91cyBtYW5uZXIuIEl0IHRyYWRlcyBhIG5lZ2xpYmFibGUgb3ZlcmhlYWQgaW4gZ2VuZXJhbFxuICAgKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAgICovXG4gIGZ1bmN0aW9uIE1hcHBpbmdMaXN0KCkge1xuICAgIHRoaXMuX2FycmF5ID0gW107XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgICAvLyBTZXJ2ZXMgYXMgaW5maW11bVxuICAgIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICAgKiBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIHRha2VzLlxuICAgKlxuICAgKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICAgKi9cbiAgTWFwcGluZ0xpc3QucHJvdG90eXBlLnVuc29ydGVkRm9yRWFjaCA9XG4gICAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgICB0aGlzLl9hcnJheS5mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgZ2l2ZW4gc291cmNlIG1hcHBpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAgICovXG4gIE1hcHBpbmdMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF9hZGQoYU1hcHBpbmcpIHtcbiAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICAgIHRoaXMuX2xhc3QgPSBhTWFwcGluZztcbiAgICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zb3J0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICAgKiBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gICAqXG4gICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICAgKiBwZXJmb3JtYW5jZS4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IE5PVCBiZSBtdXRhdGVkLCBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXNcbiAgICogYW4gaW1tdXRhYmxlIGJvcnJvdy4gSWYgeW91IHdhbnQgdG8gdGFrZSBvd25lcnNoaXAsIHlvdSBtdXN0IG1ha2UgeW91ciBvd25cbiAgICogY29weS5cbiAgICovXG4gIE1hcHBpbmdMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfdG9BcnJheSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgICAgdGhpcy5fYXJyYXkuc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKTtcbiAgICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcnJheTtcbiAgfTtcblxuICBleHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL21hcHBpbmctbGlzdC5qc1xuICoqIG1vZHVsZSBpZCA9IDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbntcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbiAgdmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xuICB2YXIgQXJyYXlTZXQgPSByZXF1aXJlKCcuL2FycmF5LXNldCcpLkFycmF5U2V0O1xuICB2YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG4gIHZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICAgIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICAgIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwKVxuICAgICAgOiBuZXcgQmFzaWNTb3VyY2VNYXBDb25zdW1lcihzb3VyY2VNYXApO1xuICB9XG5cbiAgU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXApIHtcbiAgICByZXR1cm4gQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwKGFTb3VyY2VNYXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbiAgLy8gYF9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZCBgX19vcmlnaW5hbE1hcHBpbmdzYCBhcmUgYXJyYXlzIHRoYXQgaG9sZCB0aGVcbiAgLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbiAgLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gIC8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgZ2V0dGVycyByZXNwZWN0aXZlbHksIGFuZCB3ZSBvbmx5IHBhcnNlIHRoZSBtYXBwaW5nc1xuICAvLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbiAgLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4gIC8vIHRoZW0gaXMgZXhwZW5zaXZlLCBzbyB3ZSBvbmx5IHdhbnQgdG8gZG8gaXQgaWYgd2UgbXVzdC5cbiAgLy9cbiAgLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbiAgLy9cbiAgLy8gICAgIHtcbiAgLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgLy8gICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gIC8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbiAgLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuICAvLyAgICAgICBvcmlnaW5hbExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoYXRcbiAgLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4gIC8vICAgICAgICAgICAgIGNvZGUuXG4gIC8vICAgICB9XG4gIC8vXG4gIC8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbiAgLy8gYG51bGxgLlxuICAvL1xuICAvLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuICAvL1xuICAvLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfZ2VuZXJhdGVkTWFwcGluZ3MnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykge1xuICAgICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgIH1cbiAgfSk7XG5cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG51bGw7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzO1xuICAgIH1cbiAgfSk7XG5cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGluZGV4KSB7XG4gICAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICAgIHJldHVybiBjID09PSBcIjtcIiB8fCBjID09PSBcIixcIjtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gICAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICAgKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IF9wYXJzZU1hcHBpbmdzXCIpO1xuICAgIH07XG5cbiAgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcbiAgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVIgPSAyO1xuXG4gIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcbiAgU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgZWFjaCBtYXBwaW5nIGJldHdlZW4gYW4gb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uIGFuZCBhXG4gICAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gICAqXG4gICAqIEBwYXJhbSBGdW5jdGlvbiBhQ2FsbGJhY2tcbiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAgICogQHBhcmFtIE9iamVjdCBhQ29udGV4dFxuICAgKiAgICAgICAgT3B0aW9uYWwuIElmIHNwZWNpZmllZCwgdGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHRoaXNgIGV2ZXJ5XG4gICAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICAgKiBAcGFyYW0gYU9yZGVyXG4gICAqICAgICAgICBFaXRoZXIgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAgb3JcbiAgICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gICAqICAgICAgICBpdGVyYXRlIG92ZXIgdGhlIG1hcHBpbmdzIHNvcnRlZCBieSB0aGUgZ2VuZXJhdGVkIGZpbGUncyBsaW5lL2NvbHVtblxuICAgKiAgICAgICAgb3JkZXIgb3IgdGhlIG9yaWdpbmFsJ3Mgc291cmNlL2xpbmUvY29sdW1uIG9yZGVyLCByZXNwZWN0aXZlbHkuIERlZmF1bHRzIHRvXG4gICAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5lYWNoTWFwcGluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgICB2YXIgY29udGV4dCA9IGFDb250ZXh0IHx8IG51bGw7XG4gICAgICB2YXIgb3JkZXIgPSBhT3JkZXIgfHwgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSO1xuXG4gICAgICB2YXIgbWFwcGluZ3M7XG4gICAgICBzd2l0Y2ggKG9yZGVyKSB7XG4gICAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjpcbiAgICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSOlxuICAgICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuc291cmNlUm9vdDtcbiAgICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2UgPT09IG51bGwgPyBudWxsIDogdGhpcy5fc291cmNlcy5hdChtYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4oc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogbWFwcGluZy5uYW1lID09PSBudWxsID8gbnVsbCA6IHRoaXMuX25hbWVzLmF0KG1hcHBpbmcubmFtZSlcbiAgICAgICAgfTtcbiAgICAgIH0sIHRoaXMpLmZvckVhY2goYUNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICAgKiBsaW5lLCBhbmQgY29sdW1uIHByb3ZpZGVkLiBJZiBubyBjb2x1bW4gaXMgcHJvdmlkZWQsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAgICogY2xvc2VzdCBsaW5lIHRoYXQgaGFzIGFueSBtYXBwaW5ncy4gT3RoZXJ3aXNlLCByZXR1cm5zIGFsbCBtYXBwaW5nc1xuICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaW5lIGFuZCBlaXRoZXIgdGhlIGNvbHVtbiB3ZSBhcmUgc2VhcmNoaW5nIGZvclxuICAgKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAgICpcbiAgICogVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICpcbiAgICogYW5kIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcmV0dXJuZWQsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgICB2YXIgbGluZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpO1xuXG4gICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmdcbiAgICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgICAvLyBzZXR0aW5nIG5lZWRsZS5vcmlnaW5hbENvbHVtbiB0byAwLCB3ZSB0aHVzIGZpbmQgdGhlIGxhc3QgbWFwcGluZyBmb3JcbiAgICAgIC8vIHRoZSBnaXZlbiBsaW5lLCBwcm92aWRlZCBzdWNoIGEgbWFwcGluZyBleGlzdHMuXG4gICAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICAgIG9yaWdpbmFsTGluZTogbGluZSxcbiAgICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBuZWVkbGUuc291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIG5lZWRsZS5zb3VyY2UpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhuZWVkbGUuc291cmNlKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuZWVkbGUuc291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG5lZWRsZS5zb3VyY2UpO1xuXG4gICAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG9yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuXG4gICAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAgIC8vIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgICAvLyB0aGUgbGluZSB3ZSBmb3VuZC5cbiAgICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSB3ZXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAgIC8vIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICAgIHdoaWxlIChtYXBwaW5nICYmXG4gICAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gb3JpZ2luYWxDb2x1bW4pIHtcbiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGluZ3M7XG4gICAgfTtcblxuICBleHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbiAgLyoqXG4gICAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gICAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICAgKiBwb3NpdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICpcbiAgICogVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gICAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAgICogZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gICAqXG4gICAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICAgKiAgIC0gc291cmNlczogQW4gYXJyYXkgb2YgVVJMcyB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICAgKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICAgKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAgICogICAtIHNvdXJjZXNDb250ZW50OiBPcHRpb25hbC4gQW4gYXJyYXkgb2YgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAgICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gICAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqXG4gICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gICAqXG4gICAqICAgICB7XG4gICAqICAgICAgIHZlcnNpb24gOiAzLFxuICAgKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICAgKiAgICAgICBzb3VyY2VSb290IDogXCJcIixcbiAgICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICAgKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAgICogICAgICAgbWFwcGluZ3M6IFwiQUEsQUI7O0FCQ0RFO1wiXG4gICAqICAgICB9XG4gICAqXG4gICAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0P3BsaT0xI1xuICAgKi9cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwKSB7XG4gICAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gICAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgICAgc291cmNlTWFwID0gSlNPTi5wYXJzZShhU291cmNlTWFwLnJlcGxhY2UoL15cXClcXF1cXH0nLywgJycpKTtcbiAgICB9XG5cbiAgICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgICAvLyBTYXNzIDMuMyBsZWF2ZXMgb3V0IHRoZSAnbmFtZXMnIGFycmF5LCBzbyB3ZSBkZXZpYXRlIGZyb20gdGhlIHNwZWMgKHdoaWNoXG4gICAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgICB2YXIgc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICAgIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gICAgdmFyIGZpbGUgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdmaWxlJywgbnVsbCk7XG5cbiAgICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICAgIGlmICh2ZXJzaW9uICE9IHRoaXMuX3ZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICAgIH1cblxuICAgIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgICAvLyBTb21lIHNvdXJjZSBtYXBzIHByb2R1Y2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGxpa2UgXCIuL2Zvby5qc1wiIGluc3RlYWQgb2ZcbiAgICAgIC8vIFwiZm9vLmpzXCIuICBOb3JtYWxpemUgdGhlc2UgZmlyc3Qgc28gdGhhdCBmdXR1cmUgY29tcGFyaXNvbnMgd2lsbCBzdWNjZWVkLlxuICAgICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgICAgLm1hcCh1dGlsLm5vcm1hbGl6ZSlcbiAgICAgIC8vIEFsd2F5cyBlbnN1cmUgdGhhdCBhYnNvbHV0ZSBzb3VyY2VzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCByZWxhdGl2ZSB0b1xuICAgICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgICAvLyBiZSBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgd2hlbiB0aGUgc291cmNlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlXG4gICAgICAvLyBzb3VyY2UgKHZhbGlkLCBidXQgd2h5Pz8pLiBTZWUgZ2l0aHViIGlzc3VlICMxOTkgYW5kIGJ1Z3ppbC5sYS8xMTg4OTgyLlxuICAgICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2VSb290ICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2VSb290KSAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlKVxuICAgICAgICAgID8gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2UpXG4gICAgICAgICAgOiBzb3VyY2U7XG4gICAgICB9KTtcblxuICAgIC8vIFBhc3MgYHRydWVgIGJlbG93IHRvIGFsbG93IGR1cGxpY2F0ZSBuYW1lcyBhbmQgc291cmNlcy4gV2hpbGUgc291cmNlIG1hcHNcbiAgICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAgIC8vIHNvbWV0aW1lcyBnZW5lcmF0ZXMgc291cmNlIG1hcHMgd2l0aCBkdXBsaWNhdGVzIGluIHRoZW0uIFNlZSBHaXRodWIgaXNzdWVcbiAgICAvLyAjNzIgYW5kIGJ1Z3ppbC5sYS84ODk0OTIuXG4gICAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMsIHRydWUpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7XG5cbiAgICB0aGlzLnNvdXJjZVJvb3QgPSBzb3VyY2VSb290O1xuICAgIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgICB0aGlzLl9tYXBwaW5ncyA9IG1hcHBpbmdzO1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gIH1cblxuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbiAgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gU291cmNlTWFwR2VuZXJhdG9yIGFTb3VyY2VNYXBcbiAgICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAgICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICAgKi9cbiAgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXApIHtcbiAgICAgIHZhciBzbWMgPSBPYmplY3QuY3JlYXRlKEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcblxuICAgICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgICAgc21jLnNvdXJjZVJvb3QgPSBhU291cmNlTWFwLl9zb3VyY2VSb290O1xuICAgICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgICBzbWMuZmlsZSA9IGFTb3VyY2VNYXAuX2ZpbGU7XG5cbiAgICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAgIC8vIG5hbWVzIHRvIGluZGljZXMgaW50byB0aGUgc291cmNlcyBhbmQgbmFtZXMgQXJyYXlTZXRzKSwgd2UgaGF2ZSB0byBtYWtlXG4gICAgICAvLyBhIGNvcHkgb2YgdGhlIGVudHJ5IG9yIGVsc2UgYmFkIHRoaW5ncyBoYXBwZW4uIFNoYXJlZCBtdXRhYmxlIHN0YXRlXG4gICAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICAgIHZhciBnZW5lcmF0ZWRNYXBwaW5ncyA9IGFTb3VyY2VNYXAuX21hcHBpbmdzLnRvQXJyYXkoKS5zbGljZSgpO1xuICAgICAgdmFyIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncyA9IHNtYy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3JjTWFwcGluZyA9IGdlbmVyYXRlZE1hcHBpbmdzW2ldO1xuICAgICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgICAgZGVzdE1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9IHNyY01hcHBpbmcuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgZGVzdE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgICAgZGVzdE1hcHBpbmcuc291cmNlID0gc291cmNlcy5pbmRleE9mKHNyY01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbExpbmUgPSBzcmNNYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc3JjTWFwcGluZy5uYW1lKSB7XG4gICAgICAgICAgICBkZXN0TWFwcGluZy5uYW1lID0gbmFtZXMuaW5kZXhPZihzcmNNYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlc3RPcmlnaW5hbE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgICAgfVxuXG4gICAgICBxdWlja1NvcnQoc21jLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICAgIHJldHVybiBzbWM7XG4gICAgfTtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICAgKi9cbiAgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBvcmlnaW5hbCBzb3VyY2VzLlxuICAgKi9cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlUm9vdCAhPSBudWxsID8gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgcykgOiBzO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogUHJvdmlkZSB0aGUgSklUIHdpdGggYSBuaWNlIHNoYXBlIC8gaGlkZGVuIGNsYXNzLlxuICAgKi9cbiAgZnVuY3Rpb24gTWFwcGluZygpIHtcbiAgICB0aGlzLmdlbmVyYXRlZExpbmUgPSAwO1xuICAgIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW5hbExpbmUgPSBudWxsO1xuICAgIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICAgKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAgICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgICB2YXIgZ2VuZXJhdGVkTGluZSA9IDE7XG4gICAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICAgIHZhciBsZW5ndGggPSBhU3RyLmxlbmd0aDtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICAgIHZhciB0ZW1wID0ge307XG4gICAgICB2YXIgb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgICB2YXIgbWFwcGluZywgc3RyLCBzZWdtZW50LCBlbmQsIHZhbHVlO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgICAgZ2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJywnKSB7XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBnZW5lcmF0ZWRMaW5lO1xuXG4gICAgICAgICAgLy8gQmVjYXVzZSBlYWNoIG9mZnNldCBpcyBlbmNvZGVkIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBvbmUsXG4gICAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgICAgLy8gZmFjdCBieSBjYWNoaW5nIHRoZSBwYXJzZWQgdmFyaWFibGUgbGVuZ3RoIGZpZWxkcyBvZiBlYWNoIHNlZ21lbnQsXG4gICAgICAgICAgLy8gYWxsb3dpbmcgdXMgdG8gYXZvaWQgYSBzZWNvbmQgcGFyc2UgaWYgd2UgZW5jb3VudGVyIHRoZSBzYW1lXG4gICAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgICBmb3IgKGVuZCA9IGluZGV4OyBlbmQgPCBsZW5ndGg7IGVuZCsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyLCBlbmQpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgICAgc2VnbWVudCA9IGNhY2hlZFNlZ21lbnRzW3N0cl07XG4gICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlZ21lbnQgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKGFTdHIsIGluZGV4LCB0ZW1wKTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgICAgc2VnbWVudC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgYSBzb3VyY2UsIGJ1dCBubyBsaW5lIGFuZCBjb2x1bW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgYSBzb3VyY2UgYW5kIGxpbmUsIGJ1dCBubyBjb2x1bW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBwcmV2aW91c1NvdXJjZSArIHNlZ21lbnRbMV07XG4gICAgICAgICAgICBwcmV2aW91c1NvdXJjZSArPSBzZWdtZW50WzFdO1xuXG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBwcmV2aW91c09yaWdpbmFsTGluZSArIHNlZ21lbnRbMl07XG4gICAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSArPSAxO1xuXG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBjb2x1bW4uXG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBwcmV2aW91c05hbWUgKyBzZWdtZW50WzRdO1xuICAgICAgICAgICAgICBwcmV2aW91c05hbWUgKz0gc2VnbWVudFs0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBnZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBvcmlnaW5hbE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHF1aWNrU29ydChnZW5lcmF0ZWRNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCk7XG4gICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgICAgcXVpY2tTb3J0KG9yaWdpbmFsTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBvcmlnaW5hbE1hcHBpbmdzO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG1hcHBpbmcgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGh5cG90aGV0aWNhbCBcIm5lZWRsZVwiIG1hcHBpbmcgdGhhdFxuICAgKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICAgKi9cbiAgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ29sdW1uTmFtZSwgYUNvbXBhcmF0b3IsIGFCaWFzKSB7XG4gICAgICAvLyBUbyByZXR1cm4gdGhlIHBvc2l0aW9uIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCB3ZSBtdXN0IGZpcnN0IGZpbmQgdGhlXG4gICAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgICAgLy8gcG9pbnRzIHRvLiBCZWNhdXNlIHRoZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2ggdG9cbiAgICAgIC8vIGZpbmQgdGhlIGJlc3QgbWFwcGluZy5cblxuICAgICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xpbmUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUxpbmVOYW1lXSk7XG4gICAgICB9XG4gICAgICBpZiAoYU5lZWRsZVthQ29sdW1uTmFtZV0gPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbHVtbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmluYXJ5U2VhcmNoLnNlYXJjaChhTmVlZGxlLCBhTWFwcGluZ3MsIGFDb21wYXJhdG9yLCBhQmlhcyk7XG4gICAgfTtcblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgbGFzdCBjb2x1bW4gZm9yIGVhY2ggZ2VuZXJhdGVkIG1hcHBpbmcuIFRoZSBsYXN0IGNvbHVtbiBpc1xuICAgKiBpbmNsdXNpdmUuXG4gICAqL1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb21wdXRlQ29sdW1uU3BhbnMgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAgIC8vIGNhbiBjb21lIHVwIHdpdGggYW4gb3B0aW1pc3RpYyBlc3RpbWF0ZSwgaG93ZXZlciwgYnkgYXNzdW1pbmcgdGhhdFxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgY29udGlndW91cyAoaS5lLiBnaXZlbiB0d28gY29uc2VjdXRpdmUgbWFwcGluZ3MsIHRoZVxuICAgICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgICAgaWYgKGluZGV4ICsgMSA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBuZXh0TWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4ICsgMV07XG5cbiAgICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgICBtYXBwaW5nLmxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLSAxO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGxhc3QgbWFwcGluZyBmb3IgZWFjaCBsaW5lIHNwYW5zIHRoZSBlbnRpcmUgbGluZS5cbiAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gICAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICAgKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICAgKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICAgKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gICAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICAgKlxuICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICAgKi9cbiAgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUub3JpZ2luYWxQb3NpdGlvbkZvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgICAgfTtcblxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICAgIG5lZWRsZSxcbiAgICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICAgIFwiZ2VuZXJhdGVkTGluZVwiLFxuICAgICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgICBpZiAoc291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgc291cmNlID0gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuYXQobmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbmFtZTogbnVsbFxuICAgICAgfTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAgICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gICAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudC5sZW5ndGggPj0gdGhpcy5fc291cmNlcy5zaXplKCkgJiZcbiAgICAgICAgIXRoaXMuc291cmNlc0NvbnRlbnQuc29tZShmdW5jdGlvbiAoc2MpIHsgcmV0dXJuIHNjID09IG51bGw7IH0pO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICAgKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gICAqIGF2YWlsYWJsZS5cbiAgICovXG4gIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgYVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCBhU291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3NvdXJjZXMuaGFzKGFTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihhU291cmNlKV07XG4gICAgICB9XG5cbiAgICAgIHZhciB1cmw7XG4gICAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgICAvLyBYWFg6IGZpbGU6Ly8gVVJJcyBhbmQgYWJzb2x1dGUgcGF0aHMgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIGZvclxuICAgICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NTk3LlxuICAgICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSBhU291cmNlLnJlcGxhY2UoL15maWxlOlxcL1xcLy8sIFwiXCIpO1xuICAgICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGZpbGVVcmlBYnNQYXRoKV1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoXCIvXCIgKyBhU291cmNlKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIGFTb3VyY2UpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgcmVjdXJzaXZlbHkgZnJvbVxuICAgICAgLy8gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yLiBJbiB0aGF0IGNhc2UsIHdlXG4gICAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgICAgLy8gcmV0dXJuIG51bGwsIHNvIHdlIHByb3ZpZGUgYSBmbGFnIHRvIGV4aXQgZ3JhY2VmdWxseS5cbiAgICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYVNvdXJjZSArICdcIiBpcyBub3QgaW4gdGhlIFNvdXJjZU1hcC4nKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICAgKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAgICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gYmlhczogRWl0aGVyICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAgICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAgICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAgICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICAgKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAgICpcbiAgICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gICAqL1xuICBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpO1xuICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKHNvdXJjZSk7XG5cbiAgICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgICAgfTtcblxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICAgIG5lZWRsZSxcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlID09PSBuZWVkbGUuc291cmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9O1xuXG4gIGV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbiAgLyoqXG4gICAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAgICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAgICogdGhhdCBpdCB0YWtlcyBcImluZGV4ZWRcIiBzb3VyY2UgbWFwcyAoaS5lLiBvbmVzIHdpdGggYSBcInNlY3Rpb25zXCIgZmllbGQpIGFzXG4gICAqIGlucHV0LlxuICAgKlxuICAgKiBUaGUgb25seSBwYXJhbWV0ZXIgaXMgYSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yIGFscmVhZHlcbiAgICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICAgKiBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAgICpcbiAgICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gICAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqICAgLSBzZWN0aW9uczogQSBsaXN0IG9mIHNlY3Rpb24gZGVmaW5pdGlvbnMuXG4gICAqXG4gICAqIEVhY2ggdmFsdWUgdW5kZXIgdGhlIFwic2VjdGlvbnNcIiBmaWVsZCBoYXMgdHdvIGZpZWxkczpcbiAgICogICAtIG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgYXQgd2hpY2ggdGhpcyBzZWN0aW9uXG4gICAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gICAqICAgICAgIGZpZWxkLlxuICAgKiAgIC0gbWFwOiBBIHNvdXJjZSBtYXAgZGVmaW5pdGlvbi4gVGhpcyBzb3VyY2UgbWFwIGNvdWxkIGFsc28gYmUgaW5kZXhlZCxcbiAgICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAgICpcbiAgICogSW5zdGVhZCBvZiB0aGUgXCJtYXBcIiBmaWVsZCwgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBcInVybFwiIGZpZWxkXG4gICAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gICAqIHVuc3VwcG9ydGVkLlxuICAgKlxuICAgKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICAgKiBtb2RpZmllZCB0byBvbWl0IGEgc2VjdGlvbiB3aGljaCB1c2VzIHRoZSBcInVybFwiIGZpZWxkLlxuICAgKlxuICAgKiAge1xuICAgKiAgICB2ZXJzaW9uIDogMyxcbiAgICogICAgZmlsZTogXCJhcHAuanNcIixcbiAgICogICAgc2VjdGlvbnM6IFt7XG4gICAqICAgICAgb2Zmc2V0OiB7bGluZToxMDAsIGNvbHVtbjoxMH0sXG4gICAqICAgICAgbWFwOiB7XG4gICAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAgICogICAgICAgIGZpbGU6IFwic2VjdGlvbi5qc1wiLFxuICAgKiAgICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICAgKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gICAqICAgICAgICBtYXBwaW5nczogXCJBQUFBLEU7O0FCQ0RFO1wiXG4gICAqICAgICAgfVxuICAgKiAgICB9XSxcbiAgICogIH1cbiAgICpcbiAgICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQjaGVhZGluZz1oLjUzNWVzM3hlcHJndFxuICAgKi9cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXApIHtcbiAgICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKGFTb3VyY2VNYXAucmVwbGFjZSgvXlxcKVxcXVxcfScvLCAnJykpO1xuICAgIH1cblxuICAgIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICAgIHZhciBzZWN0aW9ucyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NlY3Rpb25zJyk7XG5cbiAgICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHZlcnNpb246ICcgKyB2ZXJzaW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcblxuICAgIHZhciBsYXN0T2Zmc2V0ID0ge1xuICAgICAgbGluZTogLTEsXG4gICAgICBjb2x1bW46IDBcbiAgICB9O1xuICAgIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICBpZiAocy51cmwpIHtcbiAgICAgICAgLy8gVGhlIHVybCBmaWVsZCB3aWxsIHJlcXVpcmUgc3VwcG9ydCBmb3IgYXN5bmNocm9uaWNpdHkuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgZm9yIHVybCBmaWVsZCBpbiBzZWN0aW9ucyBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgICB9XG4gICAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgICAgdmFyIG9mZnNldExpbmUgPSB1dGlsLmdldEFyZyhvZmZzZXQsICdsaW5lJyk7XG4gICAgICB2YXIgb2Zmc2V0Q29sdW1uID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnY29sdW1uJyk7XG5cbiAgICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgICAgKG9mZnNldExpbmUgPT09IGxhc3RPZmZzZXQubGluZSAmJiBvZmZzZXRDb2x1bW4gPCBsYXN0T2Zmc2V0LmNvbHVtbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN0aW9uIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkIGFuZCBub24tb3ZlcmxhcHBpbmcuJyk7XG4gICAgICB9XG4gICAgICBsYXN0T2Zmc2V0ID0gb2Zmc2V0O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgICAvLyBUaGUgb2Zmc2V0IGZpZWxkcyBhcmUgMC1iYXNlZCwgYnV0IHdlIHVzZSAxLWJhc2VkIGluZGljZXMgd2hlblxuICAgICAgICAgIC8vIGVuY29kaW5nL2RlY29kaW5nIGZyb20gVkxRLlxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogb2Zmc2V0Q29sdW1uICsgMVxuICAgICAgICB9LFxuICAgICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICAgKi9cbiAgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gICAqL1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3VyY2VzO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICAgKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAgICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICAgKlxuICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICAgKi9cbiAgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgICAgfTtcblxuICAgICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgICB2YXIgc2VjdGlvbkluZGV4ID0gYmluYXJ5U2VhcmNoLnNlYXJjaChuZWVkbGUsIHRoaXMuX3NlY3Rpb25zLFxuICAgICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICAgIGlmIChjbXApIHtcbiAgICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIChuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgIH0pO1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuXG4gICAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgICAgbmFtZTogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VjdGlvbi5jb25zdW1lci5vcmlnaW5hbFBvc2l0aW9uRm9yKHtcbiAgICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgIGNvbHVtbjogbmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgICA6IDApLFxuICAgICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgICB9KTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAgICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICAgKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gICAqIGF2YWlsYWJsZS5cbiAgICovXG4gIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gICAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAgICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gICAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gICAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICpcbiAgICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gICAqL1xuICBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcblxuICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIHRoaXMgc2VjdGlvbiBpZiB0aGUgcmVxdWVzdGVkIHNvdXJjZSBpcyBpbiB0aGUgbGlzdCBvZlxuICAgICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlcy5pbmRleE9mKHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgICB2YXIgcmV0ID0ge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZFBvc2l0aW9uLmNvbHVtbiArXG4gICAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICAgIDogMClcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsXG4gICAgICB9O1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAgICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gICAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gICAqL1xuICBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgICB2YXIgc2VjdGlvbk1hcHBpbmdzID0gc2VjdGlvbi5jb25zdW1lci5fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgICB2YXIgc291cmNlID0gc2VjdGlvbi5jb25zdW1lci5fc291cmNlcy5hdChtYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlID0gdXRpbC5qb2luKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmluZGV4T2Yoc291cmNlKTtcblxuICAgICAgICAgIHZhciBuYW1lID0gc2VjdGlvbi5jb25zdW1lci5fbmFtZXMuYXQobWFwcGluZy5uYW1lKTtcbiAgICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG5cbiAgICAgICAgICAvLyBUaGUgbWFwcGluZ3MgY29taW5nIGZyb20gdGhlIGNvbnN1bWVyIGZvciB0aGUgc2VjdGlvbiBoYXZlXG4gICAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBvZmZzZXQgdGhlbSB0byBiZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbmNhdGVuYXRlZFxuICAgICAgICAgIC8vIGdlbmVyYXRlZCBmaWxlLlxuICAgICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSArXG4gICAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uICtcbiAgICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICAgOiAwKSxcbiAgICAgICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgICBpZiAodHlwZW9mIGFkanVzdGVkTWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgICAgcXVpY2tTb3J0KHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB9O1xuXG4gIGV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xufVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzXG4gKiogbW9kdWxlIGlkID0gN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xue1xuICBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcbiAgZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoLlxuICAgKlxuICAgKiBAcGFyYW0gYUxvdyBJbmRpY2VzIGhlcmUgYW5kIGxvd2VyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gICAqIEBwYXJhbSBhSGlnaCBJbmRpY2VzIGhlcmUgYW5kIGhpZ2hlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICAgKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gICAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIG5vbi1lbXB0eSBhcnJheSBiZWluZyBzZWFyY2hlZC5cbiAgICogQHBhcmFtIGFDb21wYXJlIEZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBlbGVtZW50cyBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMS5cbiAgICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICAgKiAgICAgJ2JpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAgICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAgICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVjdXJzaXZlU2VhcmNoKGFMb3csIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gICAgLy9cbiAgICAvLyAgIDEuIFdlIGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIC8vXG4gICAgLy8gICAyLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGJ1dCB3ZSBjYW4gcmV0dXJuIHRoZSBpbmRleCBvZlxuICAgIC8vICAgICAgdGhlIG5leHQtY2xvc2VzdCBlbGVtZW50LlxuICAgIC8vXG4gICAgLy8gICAzLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGFuZCB0aGVyZSBpcyBubyBuZXh0LWNsb3Nlc3RcbiAgICAvLyAgICAgIGVsZW1lbnQgdGhhbiB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCBzbyB3ZSByZXR1cm4gLTEuXG4gICAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gICAgdmFyIGNtcCA9IGFDb21wYXJlKGFOZWVkbGUsIGFIYXlzdGFja1ttaWRdLCB0cnVlKTtcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgICByZXR1cm4gbWlkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICAvLyBPdXIgbmVlZGxlIGlzIGdyZWF0ZXIgdGhhbiBhSGF5c3RhY2tbbWlkXS5cbiAgICAgIGlmIChhSGlnaCAtIG1pZCA+IDEpIHtcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2gobWlkLCBhSGlnaCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgzKSBvciAoMikgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBtaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgICBpZiAobWlkIC0gYUxvdyA+IDEpIHtcbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxvd2VyIGhhbGYuXG4gICAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgzKSBvciAoMikgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgICByZXR1cm4gbWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2ggd2hpY2ggd2lsbCBhbHdheXMgdHJ5IGFuZCByZXR1cm5cbiAgICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAgICogbWFwcGluZ3MgYmV0d2VlbiBvcmlnaW5hbCBhbmQgZ2VuZXJhdGVkIGxpbmUvY29sIHBhaXJzIGFyZSBzaW5nbGUgcG9pbnRzLFxuICAgKiBhbmQgdGhlcmUgaXMgYW4gaW1wbGljaXQgcmVnaW9uIGJldHdlZW4gZWFjaCBvZiB0aGVtLCBzbyBhIG1pc3MganVzdCBtZWFuc1xuICAgKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gICAqXG4gICAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IHlvdSBhcmUgbG9va2luZyBmb3IuXG4gICAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gICAqIEBwYXJhbSBhQ29tcGFyZSBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHRoZSBuZWVkbGUgYW5kIGFuIGVsZW1lbnQgaW4gdGhlXG4gICAqICAgICBhcnJheSBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmVlZGxlIGlzIGxlc3NcbiAgICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAgICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICAgKiAgICAgJ2JpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAgICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAgICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICAgKiAgICAgRGVmYXVsdHMgdG8gJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gICAqL1xuICBleHBvcnRzLnNlYXJjaCA9IGZ1bmN0aW9uIHNlYXJjaChhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykge1xuICAgIGlmIChhSGF5c3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gcmVjdXJzaXZlU2VhcmNoKC0xLCBhSGF5c3RhY2subGVuZ3RoLCBhTmVlZGxlLCBhSGF5c3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLy8gV2UgaGF2ZSBmb3VuZCBlaXRoZXIgdGhlIGV4YWN0IGVsZW1lbnQsIG9yIHRoZSBuZXh0LWNsb3Nlc3QgZWxlbWVudCB0aGFuXG4gICAgLy8gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gSG93ZXZlciwgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgc3VjaFxuICAgIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgICB3aGlsZSAoaW5kZXggLSAxID49IDApIHtcbiAgICAgIGlmIChhQ29tcGFyZShhSGF5c3RhY2tbaW5kZXhdLCBhSGF5c3RhY2tbaW5kZXggLSAxXSwgdHJ1ZSkgIT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAtLWluZGV4O1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfTtcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuICoqIG1vZHVsZSBpZCA9IDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbntcbiAgLy8gSXQgdHVybnMgb3V0IHRoYXQgc29tZSAobW9zdD8pIEphdmFTY3JpcHQgZW5naW5lcyBkb24ndCBzZWxmLWhvc3RcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlIEMrKyB3aWxsIGxpa2VseSByZW1haW5cbiAgLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbiAgLy8gY3VzdG9tIGNvbXBhcmF0b3IgZnVuY3Rpb24sIGNhbGxpbmcgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgVk0ncyBDKysgYW5kXG4gIC8vIEpJVCdkIEpTIGlzIHJhdGhlciBzbG93ICphbmQqIGxvc2VzIEpJVCB0eXBlIGluZm9ybWF0aW9uLCByZXN1bHRpbmcgaW5cbiAgLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbiAgLy8gZmFjdCwgd2hlbiBzb3J0aW5nIHdpdGggYSBjb21wYXJhdG9yLCB0aGVzZSBjb3N0cyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgb2ZcbiAgLy8gc29ydGluZyBpbiBDKysuIEJ5IHVzaW5nIG91ciBvd24gSlMtaW1wbGVtZW50ZWQgUXVpY2sgU29ydCAoYmVsb3cpLCB3ZSBnZXRcbiAgLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4gIC8qKlxuICAgKiBTd2FwIHRoZSBlbGVtZW50cyBpbmRleGVkIGJ5IGB4YCBhbmQgYHlgIGluIHRoZSBhcnJheSBgYXJ5YC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gICAqICAgICAgICBUaGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gICAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcChhcnksIHgsIHkpIHtcbiAgICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgICBhcnlbeF0gPSBhcnlbeV07XG4gICAgYXJ5W3ldID0gdGVtcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgd2l0aGluIHRoZSByYW5nZSBgbG93IC4uIGhpZ2hgIGluY2x1c2l2ZS5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxvd1xuICAgKiAgICAgICAgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAgICogICAgICAgIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgcmFuZ2UuXG4gICAqL1xuICBmdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGxvdyArIChNYXRoLnJhbmRvbSgpICogKGhpZ2ggLSBsb3cpKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFF1aWNrIFNvcnQgYWxnb3JpdGhtLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAgICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXBhcmF0b3JcbiAgICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBcbiAgICogICAgICAgIFN0YXJ0IGluZGV4IG9mIHRoZSBhcnJheVxuICAgKiBAcGFyYW0ge051bWJlcn0gclxuICAgKiAgICAgICAgRW5kIGluZGV4IG9mIHRoZSBhcnJheVxuICAgKi9cbiAgZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gICAgLy8gSWYgb3VyIGxvd2VyIGJvdW5kIGlzIGxlc3MgdGhhbiBvdXIgdXBwZXIgYm91bmQsIHdlICgxKSBwYXJ0aXRpb24gdGhlXG4gICAgLy8gYXJyYXkgaW50byB0d28gcGllY2VzIGFuZCAoMikgcmVjdXJzZSBvbiBlYWNoIGhhbGYuIElmIGl0IGlzIG5vdCwgdGhpcyBpc1xuICAgIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICAgIGlmIChwIDwgcikge1xuICAgICAgLy8gKDEpIFBhcnRpdGlvbmluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcGFydGl0aW9uaW5nIGNob29zZXMgYSBwaXZvdCBiZXR3ZWVuIGBwYCBhbmQgYHJgIGFuZCBtb3ZlcyBhbGxcbiAgICAgIC8vIGVsZW1lbnRzIHRoYXQgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGl2b3QgdG8gdGhlIGJlZm9yZSBpdCwgYW5kXG4gICAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgICAvLyBvbmNlIHBhcnRpdGlvbiBpcyBkb25lLCB0aGUgcGl2b3QgaXMgaW4gdGhlIGV4YWN0IHBsYWNlIGl0IHdpbGwgYmUgd2hlblxuICAgICAgLy8gdGhlIGFycmF5IGlzIHB1dCBpbiBzb3J0ZWQgb3JkZXIsIGFuZCBpdCB3aWxsIG5vdCBuZWVkIHRvIGJlIG1vdmVkXG4gICAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgICAgLy8gQWx3YXlzIGNob29zZSBhIHJhbmRvbSBwaXZvdCBzbyB0aGF0IGFuIGlucHV0IGFycmF5IHdoaWNoIGlzIHJldmVyc2VcbiAgICAgIC8vIHNvcnRlZCBkb2VzIG5vdCBjYXVzZSBPKG5eMikgcnVubmluZyB0aW1lLlxuICAgICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgICAgdmFyIGkgPSBwIC0gMTtcblxuICAgICAgc3dhcChhcnksIHBpdm90SW5kZXgsIHIpO1xuICAgICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgICAvLyBJbW1lZGlhdGVseSBhZnRlciBgamAgaXMgaW5jcmVtZW50ZWQgaW4gdGhpcyBsb29wLCB0aGUgZm9sbG93aW5nIGhvbGRcbiAgICAgIC8vIHRydWU6XG4gICAgICAvL1xuICAgICAgLy8gICAqIEV2ZXJ5IGVsZW1lbnQgaW4gYGFyeVtwIC4uIGldYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBpdm90LlxuICAgICAgLy9cbiAgICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgICBmb3IgKHZhciBqID0gcDsgaiA8IHI7IGorKykge1xuICAgICAgICBpZiAoY29tcGFyYXRvcihhcnlbal0sIHBpdm90KSA8PSAwKSB7XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICAgIHN3YXAoYXJ5LCBpLCBqKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2FwKGFyeSwgaSArIDEsIGopO1xuICAgICAgdmFyIHEgPSBpICsgMTtcblxuICAgICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgICBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIHAsIHEgLSAxKTtcbiAgICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcSArIDEsIHIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAgICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXBhcmF0b3JcbiAgICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAgICovXG4gIGV4cG9ydHMucXVpY2tTb3J0ID0gZnVuY3Rpb24gKGFyeSwgY29tcGFyYXRvcikge1xuICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgMCwgYXJ5Lmxlbmd0aCAtIDEpO1xuICB9O1xufVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9xdWljay1zb3J0LmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xue1xuICB2YXIgU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuICAvLyBNYXRjaGVzIGEgV2luZG93cy1zdHlsZSBgXFxyXFxuYCBuZXdsaW5lIG9yIGEgYFxcbmAgbmV3bGluZSB1c2VkIGJ5IGFsbCBvdGhlclxuICAvLyBvcGVyYXRpbmcgc3lzdGVtcyB0aGVzZSBkYXlzIChjYXB0dXJpbmcgdGhlIHJlc3VsdCkuXG4gIHZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbiAgLy8gTmV3bGluZSBjaGFyYWN0ZXIgY29kZSBmb3IgY2hhckNvZGVBdCgpIGNvbXBhcmlzb25zXG4gIHZhciBORVdMSU5FX0NPREUgPSAxMDtcblxuICAvLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4gIC8vIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkgYXJlIGxvYWRlZC4gVGhpcyBNVVNUIE5PVCBDSEFOR0UgYWNyb3NzXG4gIC8vIHZlcnNpb25zIVxuICB2YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuICAvKipcbiAgICogU291cmNlTm9kZXMgcHJvdmlkZSBhIHdheSB0byBhYnN0cmFjdCBvdmVyIGludGVycG9sYXRpbmcvY29uY2F0ZW5hdGluZ1xuICAgKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAgICogY29sdW1uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gICAqIEBwYXJhbSBhQ29sdW1uIFRoZSBvcmlnaW5hbCBjb2x1bW4gbnVtYmVyLlxuICAgKiBAcGFyYW0gYVNvdXJjZSBUaGUgb3JpZ2luYWwgc291cmNlJ3MgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICAgKiAgICAgICAgZ2VuZXJhdGVkIEpTLCBvciBvdGhlciBTb3VyY2VOb2Rlcy5cbiAgICogQHBhcmFtIGFOYW1lIFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLlxuICAgKi9cbiAgZnVuY3Rpb24gU291cmNlTm9kZShhTGluZSwgYUNvbHVtbiwgYVNvdXJjZSwgYUNodW5rcywgYU5hbWUpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICAgIHRoaXMubGluZSA9IGFMaW5lID09IG51bGwgPyBudWxsIDogYUxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBhQ29sdW1uID09IG51bGwgPyBudWxsIDogYUNvbHVtbjtcbiAgICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICAgIHRoaXMubmFtZSA9IGFOYW1lID09IG51bGwgPyBudWxsIDogYU5hbWU7XG4gICAgdGhpc1tpc1NvdXJjZU5vZGVdID0gdHJ1ZTtcbiAgICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICAgKlxuICAgKiBAcGFyYW0gYUdlbmVyYXRlZENvZGUgVGhlIGdlbmVyYXRlZCBjb2RlXG4gICAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gICAqIEBwYXJhbSBhUmVsYXRpdmVQYXRoIE9wdGlvbmFsLiBUaGUgcGF0aCB0aGF0IHJlbGF0aXZlIHNvdXJjZXMgaW4gdGhlXG4gICAqICAgICAgICBTb3VyY2VNYXBDb25zdW1lciBzaG91bGQgYmUgcmVsYXRpdmUgdG8uXG4gICAqL1xuICBTb3VyY2VOb2RlLmZyb21TdHJpbmdXaXRoU291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VOb2RlX2Zyb21TdHJpbmdXaXRoU291cmNlTWFwKGFHZW5lcmF0ZWRDb2RlLCBhU291cmNlTWFwQ29uc3VtZXIsIGFSZWxhdGl2ZVBhdGgpIHtcbiAgICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgICAgLy8gYW5kIHRoZSBTb3VyY2VNYXBcbiAgICAgIHZhciBub2RlID0gbmV3IFNvdXJjZU5vZGUoKTtcblxuICAgICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgICAvLyB3aGlsZSBhbGwgb2RkIGluZGljZXMgYXJlIHRoZSBuZXdsaW5lcyBiZXR3ZWVuIHR3byBhZGphY2VudCBsaW5lc1xuICAgICAgLy8gKHNpbmNlIGBSRUdFWF9ORVdMSU5FYCBjYXB0dXJlcyBpdHMgbWF0Y2gpLlxuICAgICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoaXMgYXJyYXksIGJ5IGNhbGxpbmcgYHNoaWZ0TmV4dExpbmVgLlxuICAgICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgICB2YXIgc2hpZnROZXh0TGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbGluZUNvbnRlbnRzID0gcmVtYWluaW5nTGluZXMuc2hpZnQoKTtcbiAgICAgICAgLy8gVGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgbWlnaHQgbm90IGhhdmUgYSBuZXdsaW5lLlxuICAgICAgICB2YXIgbmV3TGluZSA9IHJlbWFpbmluZ0xpbmVzLnNoaWZ0KCkgfHwgXCJcIjtcbiAgICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG4gICAgICB9O1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICAgIHZhciBsYXN0R2VuZXJhdGVkTGluZSA9IDEsIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuXG4gICAgICAvLyBUaGUgZ2VuZXJhdGUgU291cmNlTm9kZXMgd2UgbmVlZCBhIGNvZGUgcmFuZ2UuXG4gICAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgICAgLy8gSGVyZSB3ZSBzdG9yZSB0aGUgbGFzdCBtYXBwaW5nLlxuICAgICAgdmFyIGxhc3RNYXBwaW5nID0gbnVsbDtcblxuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICAgIGlmIChsYXN0TWFwcGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGFkZCB0aGUgY29kZSBmcm9tIFwibGFzdE1hcHBpbmdcIiB0byBcIm1hcHBpbmdcIjpcbiAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgICAvLyBBc3NvY2lhdGUgZmlyc3QgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZXcgbGluZSBpbiBiZXR3ZWVuLlxuICAgICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgICAvLyBcIm1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXCIgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzWzBdO1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1swXSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgY29kZSk7XG4gICAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBhZGQgdGhlIGdlbmVyYXRlZCBjb2RlIHVudGlsIHRoZSBmaXJzdCBtYXBwaW5nXG4gICAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAgIC8vIEVhY2ggbGluZSBpcyBhZGRlZCBhcyBzZXBhcmF0ZSBzdHJpbmcuXG4gICAgICAgIHdoaWxlIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbMF07XG4gICAgICAgICAgbm9kZS5hZGQobmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSk7XG4gICAgICAgICAgcmVtYWluaW5nTGluZXNbMF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgfVxuICAgICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIC8vIFdlIGhhdmUgcHJvY2Vzc2VkIGFsbCBtYXBwaW5ncy5cbiAgICAgIGlmIChyZW1haW5pbmdMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChsYXN0TWFwcGluZykge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgcmVtYWluaW5nIGNvZGUgaW4gdGhlIGN1cnJlbnQgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbmQgYWRkIHRoZSByZW1haW5pbmcgbGluZXMgd2l0aG91dCBhbnkgbWFwcGluZ1xuICAgICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5qb2luKFwiXCIpKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChhUmVsYXRpdmVQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBub2RlO1xuXG4gICAgICBmdW5jdGlvbiBhZGRNYXBwaW5nV2l0aENvZGUobWFwcGluZywgY29kZSkge1xuICAgICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbm9kZS5hZGQoY29kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICAgID8gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgICAgOiBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcubmFtZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICAgKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfYWRkKGFDaHVuaykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICAgIGFDaHVuay5mb3JFYWNoKGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICB0aGlzLmFkZChjaHVuayk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKGFDaHVuaykge1xuICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goYUNodW5rKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gICAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcHJlcGVuZChhQ2h1bmspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgICBmb3IgKHZhciBpID0gYUNodW5rLmxlbmd0aC0xOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLnByZXBlbmQoYUNodW5rW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBKUyBzbmlwcGV0cyBpbiB0aGlzIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi4gVGhlXG4gICAqIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc25pcHBldCBvZiBKUyBhbmQgaXMgcGFzc2VkIHRoYXRcbiAgICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gU291cmNlTm9kZV93YWxrKGFGbikge1xuICAgIHZhciBjaHVuaztcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2h1bmsgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGNodW5rW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgICBhRm4oY2h1bmssIHsgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIExpa2UgYFN0cmluZy5wcm90b3R5cGUuam9pbmAgZXhjZXB0IGZvciBTb3VyY2VOb2Rlcy4gSW5zZXJ0cyBgYVN0cmAgYmV0d2VlblxuICAgKiBlYWNoIG9mIGB0aGlzLmNoaWxkcmVuYC5cbiAgICpcbiAgICogQHBhcmFtIGFTZXAgVGhlIHNlcGFyYXRvci5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICAgIHZhciBuZXdDaGlsZHJlbjtcbiAgICB2YXIgaTtcbiAgICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgaWYgKGxlbiA+IDApIHtcbiAgICAgIG5ld0NoaWxkcmVuID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGFTZXApO1xuICAgICAgfVxuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlIG9uIHRoZSB2ZXJ5IHJpZ2h0LW1vc3Qgc291cmNlIHNuaXBwZXQuIFVzZWZ1bFxuICAgKiBmb3IgdHJpbW1pbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBlbmQgb2YgYSBzb3VyY2Ugbm9kZSwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gYVBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICogQHBhcmFtIGFSZXBsYWNlbWVudCBUaGUgdGhpbmcgdG8gcmVwbGFjZSB0aGUgcGF0dGVybiB3aXRoLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUucmVwbGFjZVJpZ2h0ID0gZnVuY3Rpb24gU291cmNlTm9kZV9yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkge1xuICAgIHZhciBsYXN0Q2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgICBsYXN0Q2hpbGQucmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdID0gbGFzdENoaWxkLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKCcnLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAgICogaW4gdGhlIHNvdXJjZXNDb250ZW50IGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICAgKiBAcGFyYW0gYVNvdXJjZUNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgICBmdW5jdGlvbiBTb3VyY2VOb2RlX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgICB0aGlzLnNvdXJjZUNvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoYVNvdXJjZUZpbGUpXSA9IGFTb3VyY2VDb250ZW50O1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBTb3VyY2VOb2Rlcy4gVGhlIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoXG4gICAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrU291cmNlQ29udGVudHMgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2Fsa1NvdXJjZUNvbnRlbnRzKGFGbikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV1baXNTb3VyY2VOb2RlXSkge1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ud2Fsa1NvdXJjZUNvbnRlbnRzKGFGbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUNvbnRlbnRzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFGbih1dGlsLmZyb21TZXRTdHJpbmcoc291cmNlc1tpXSksIHRoaXMuc291cmNlQ29udGVudHNbc291cmNlc1tpXV0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUuIFdhbGtzIG92ZXIgdGhlIHRyZWVcbiAgICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZygpIHtcbiAgICB2YXIgc3RyID0gXCJcIjtcbiAgICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICBzdHIgKz0gY2h1bms7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUgYWxvbmcgd2l0aCBhIHNvdXJjZVxuICAgKiBtYXAuXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZ1dpdGhTb3VyY2VNYXAgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nV2l0aFNvdXJjZU1hcChhQXJncykge1xuICAgIHZhciBnZW5lcmF0ZWQgPSB7XG4gICAgICBjb2RlOiBcIlwiLFxuICAgICAgbGluZTogMSxcbiAgICAgIGNvbHVtbjogMFxuICAgIH07XG4gICAgdmFyIG1hcCA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IoYUFyZ3MpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgdmFyIGxhc3RPcmlnaW5hbExpbmUgPSBudWxsO1xuICAgIHZhciBsYXN0T3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICAgIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rLCBvcmlnaW5hbCkge1xuICAgICAgZ2VuZXJhdGVkLmNvZGUgKz0gY2h1bms7XG4gICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICAgJiYgb3JpZ2luYWwubGluZSAhPT0gbnVsbFxuICAgICAgICAgICYmIG9yaWdpbmFsLmNvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgICB8fCBsYXN0T3JpZ2luYWxMaW5lICE9PSBvcmlnaW5hbC5saW5lXG4gICAgICAgICAgIHx8IGxhc3RPcmlnaW5hbENvbHVtbiAhPT0gb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gb3JpZ2luYWwuc291cmNlO1xuICAgICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgICAgbGFzdE9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWwuY29sdW1uO1xuICAgICAgICBsYXN0T3JpZ2luYWxOYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW5ndGggPSBjaHVuay5sZW5ndGg7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgICAgZ2VuZXJhdGVkLmxpbmUrKztcbiAgICAgICAgICBnZW5lcmF0ZWQuY29sdW1uID0gMDtcbiAgICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgICAgaWYgKGlkeCArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdlbmVyYXRlZC5jb2x1bW4rKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMud2Fsa1NvdXJjZUNvbnRlbnRzKGZ1bmN0aW9uIChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KSB7XG4gICAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGU6IGdlbmVyYXRlZC5jb2RlLCBtYXA6IG1hcCB9O1xuICB9O1xuXG4gIGV4cG9ydHMuU291cmNlTm9kZSA9IFNvdXJjZU5vZGU7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL3NvdXJjZS1ub2RlLmpzXG4gKiogbW9kdWxlIGlkID0gMTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/react-app/node_modules/source-map/dist/source-map.js b/react-app/node_modules/source-map/dist/source-map.js new file mode 100644 index 0000000000..25199a64c6 --- /dev/null +++ b/react-app/node_modules/source-map/dist/source-map.js @@ -0,0 +1,3005 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["sourceMap"] = factory(); + else + root["sourceMap"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ + exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer; + exports.SourceNode = __webpack_require__(10).SourceNode; + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var base64VLQ = __webpack_require__(2); + var util = __webpack_require__(4); + var ArraySet = __webpack_require__(5).ArraySet; + var MappingList = __webpack_require__(6).MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null && !this._sources.has(source)) { + this._sources.add(source); + } + + if (name != null && !this._names.has(name)) { + this._names.add(name); + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = {}; + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + result += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + result += ','; + } + } + + result += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + result += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + result += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + result += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + result += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, + key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + } + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler 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. + */ + { + var base64 = __webpack_require__(3); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + } + + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; + } + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consequtive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + return '$' + aStr; + } + exports.toSetString = toSetString; + + function fromSetString(aStr) { + return aStr.substr(1); + } + exports.fromSetString = fromSetString; + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + } + + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var util = __webpack_require__(4); + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = {}; + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = util.toSetString(aStr); + var isDuplicate = this._set.hasOwnProperty(sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + this._set[sStr] = idx; + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + var sStr = util.toSetString(aStr); + return this._set.hasOwnProperty(sStr); + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + var sStr = util.toSetString(aStr); + if (this._set.hasOwnProperty(sStr)) { + return this._set[sStr]; + } + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + } + + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var util = __webpack_require__(4); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; + } + + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var util = __webpack_require__(4); + var binarySearch = __webpack_require__(8); + var ArraySet = __webpack_require__(5).ArraySet; + var base64VLQ = __webpack_require__(2); + var quickSort = __webpack_require__(9).quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names, true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + } + + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; + } + + +/***/ }, +/* 9 */ +/***/ function(module, exports) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + } + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + { + var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator; + var util = __webpack_require__(4); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are removed from this array, by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var shiftNextLine = function() { + var lineContents = remainingLines.shift(); + // The last line of a file might not have a newline. + var newLine = remainingLines.shift() || ""; + return lineContents + newLine; + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[0]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLines.length > 0) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; + } + + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/react-app/node_modules/source-map/dist/source-map.min.js b/react-app/node_modules/source-map/dist/source-map.min.js new file mode 100644 index 0000000000..3de3bd2e4e --- /dev/null +++ b/react-app/node_modules/source-map/dist/source-map.min.js @@ -0,0 +1,2 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&r.setSourceContent(n,t)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null==t||this._sources.has(t)||this._sources.add(t),null==o||this._names.has(o)||this._names.add(o),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents={}),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t=0,s=1,a=0,u=0,l=0,c=0,g="",p=this._mappings.toArray(),h=0,f=p.length;f>h;h++){if(e=p[h],e.generatedLine!==s)for(t=0;e.generatedLine!==s;)g+=";",s++;else if(h>0){if(!i.compareByGeneratedPositionsInflated(e,p[h-1]))continue;g+=","}g+=o.encode(e.generatedColumn-t),t=e.generatedColumn,null!=e.source&&(r=this._sources.indexOf(e.source),g+=o.encode(r-c),c=r,g+=o.encode(e.originalLine-1-u),u=e.originalLine-1,g+=o.encode(e.originalColumn-a),a=e.originalColumn,null!=e.name&&(n=this._names.indexOf(e.name),g+=o.encode(n-l),l=n))}return g},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return 0>e?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),-1===a)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<=0&&e=n&&r>=e?e-n:e>=t&&o>=e?e-t+l:e>=i&&s>=e?e-i+c:e==a?62:e==u?63:-1}},function(e,n){function r(e,n,r){if(n in e)return e[n];if(3===arguments.length)return r;throw new Error('"'+n+'" is a required argument.')}function t(e){var n=e.match(f);return n?{scheme:n[1],auth:n[2],host:n[3],port:n[4],path:n[5]}:null}function o(e){var n="";return e.scheme&&(n+=e.scheme+":"),n+="//",e.auth&&(n+=e.auth+"@"),e.host&&(n+=e.host),e.port&&(n+=":"+e.port),e.path&&(n+=e.path),n}function i(e){var r=e,i=t(e);if(i){if(!i.path)return e;r=i.path}for(var s,a=n.isAbsolute(r),u=r.split(/\/+/),l=0,c=u.length-1;c>=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(d))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(0>t)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return"$"+e}function l(e){return e.substr(1)}function c(e,n,r){var t=e.source-n.source;return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:e.name-n.name))))}function g(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=e.source-n.source,0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:e.name-n.name))))}function p(e,n){return e===n?0:e>n?1:-1}function h(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=p(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:p(e.name,n.name)))))}n.getArg=r;var f=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/,d=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(f)},n.relative=a,n.toSetString=u,n.fromSetString=l,n.compareByOriginalPositions=c,n.compareByGeneratedPositionsDeflated=g,n.compareByGeneratedPositionsInflated=h},function(e,n,r){function t(){this._array=[],this._set={}}var o=r(4);t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;i>o;o++)r.add(e[o],n);return r},t.prototype.size=function(){return Object.getOwnPropertyNames(this._set).length},t.prototype.add=function(e,n){var r=o.toSetString(e),t=this._set.hasOwnProperty(r),i=this._array.length;(!t||n)&&this._array.push(e),t||(this._set[r]=i)},t.prototype.has=function(e){var n=o.toSetString(e);return this._set.hasOwnProperty(n)},t.prototype.indexOf=function(e){var n=o.toSetString(e);if(this._set.hasOwnProperty(n))return this._set[n];throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&er||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e){var n=e;return"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,""))),null!=n.sections?new s(n):new o(n)}function o(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),t=a.getArg(n,"sources"),o=a.getArg(n,"names",[]),i=a.getArg(n,"sourceRoot",null),s=a.getArg(n,"sourcesContent",null),u=a.getArg(n,"mappings"),c=a.getArg(n,"file",null);if(r!=this._version)throw new Error("Unsupported version: "+r);t=t.map(a.normalize).map(function(e){return i&&a.isAbsolute(i)&&a.isAbsolute(e)?a.relative(i,e):e}),this._names=l.fromArray(o,!0),this._sources=l.fromArray(t,!0),this.sourceRoot=i,this.sourcesContent=s,this._mappings=u,this.file=c}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=a.getArg(n,"version"),o=a.getArg(n,"sections");if(r!=this._version)throw new Error("Unsupported version: "+r);this._sources=new l,this._names=new l;var i={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var n=a.getArg(e,"offset"),r=a.getArg(n,"line"),o=a.getArg(n,"column");if(r=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.fromSourceMap=function(e){var n=Object.create(o.prototype),r=n._names=l.fromArray(e._names.toArray(),!0),t=n._sources=l.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var s=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=s.length;h>p;p++){var f=s[p],d=new i;d.generatedLine=f.generatedLine,d.generatedColumn=f.generatedColumn,f.source&&(d.source=t.indexOf(f.source),d.originalLine=f.originalLine,d.originalColumn=f.originalColumn,f.name&&(d.name=r.indexOf(f.name)),c.push(d)),u.push(d)}return g(n.__originalMappings,a.compareByOriginalPositions),n},o.prototype._version=3,Object.defineProperty(o.prototype,"sources",{get:function(){return this._sources.toArray().map(function(e){return null!=this.sourceRoot?a.join(this.sourceRoot,e):e},this)}}),o.prototype._parseMappings=function(e,n){for(var r,t,o,s,u,l=1,p=0,h=0,f=0,d=0,m=0,_=e.length,v=0,y={},C={},A=[],S=[];_>v;)if(";"===e.charAt(v))l++,v++,p=0;else if(","===e.charAt(v))v++;else{for(r=new i,r.generatedLine=l,s=v;_>s&&!this._charIsMappingSeparator(e,s);s++);if(t=e.slice(v,s),o=y[t])v+=t.length;else{for(o=[];s>v;)c.decode(e,v,C),u=C.value,v=C.rest,o.push(u);if(2===o.length)throw new Error("Found a source, but no line and column");if(3===o.length)throw new Error("Found a source and line, but no column");y[t]=o}r.generatedColumn=p+o[0],p=r.generatedColumn,o.length>1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),S.push(r),"number"==typeof r.originalLine&&A.push(r)}g(S,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=S,g(A,a.compareByOriginalPositions),this.__originalMappings=A},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=a.join(this.sourceRoot,i)));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return this.sourcesContent?this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}):!1},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=a.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=a.urlParse(this.sourceRoot))){var t=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(t))return this.sourcesContent[this._sources.indexOf(t)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};n=this._sources.indexOf(n);var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:0>e?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(0>s)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(s>i){var a=t(i,s),u=i-1;r(e,a,s);for(var l=e[s],c=i;s>c;c++)n(e[c],l)<=0&&(u+=1,r(e,u,c));r(e,u+1,c);var g=u+1;o(e,n,i,g-1),o(e,n,g+1,s)}}n.quickSort=function(e,n){o(e,n,0,e.length-1)}},function(e,n,r){function t(e,n,r,t,o){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==n?null:n,this.source=null==r?null:r,this.name=null==o?null:o,this[u]=!0,null!=t&&this.add(t)}var o=r(1).SourceMapGenerator,i=r(4),s=/(\r?\n)/,a=10,u="$$$isSourceNode$$$";t.fromStringWithSourceMap=function(e,n,r){function o(e,n){if(null===e||void 0===e.source)a.add(n);else{var o=r?i.join(r,e.source):e.source;a.add(new t(e.originalLine,e.originalColumn,o,n,e.name))}}var a=new t,u=e.split(s),l=function(){var e=u.shift(),n=u.shift()||"";return e+n},c=1,g=0,p=null;return n.eachMapping(function(e){if(null!==p){if(!(c0&&(p&&o(p,l()),a.add(u.join(""))),n.sources.forEach(function(e){var t=n.sourceContentFor(e);null!=t&&(null!=r&&(e=i.join(r,e)),a.setSourceContent(e,t))}),a},t.prototype.add=function(e){if(Array.isArray(e))e.forEach(function(e){this.add(e)},this);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);e&&this.children.push(e)}return this},t.prototype.prepend=function(e){if(Array.isArray(e))for(var n=e.length-1;n>=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;t>r;r++)n=this.children[r],n[u]?n.walk(e):""!==n&&e(n,{source:this.source,line:this.line,column:this.column,name:this.name})},t.prototype.join=function(e){var n,r,t=this.children.length;if(t>0){for(n=[],r=0;t-1>r;r++)n.push(this.children[r]),n.push(e);n.push(this.children[r]),this.children=n}return this},t.prototype.replaceRight=function(e,n){var r=this.children[this.children.length-1];return r[u]?r.replaceRight(e,n):"string"==typeof r?this.children[this.children.length-1]=r.replace(e,n):this.children.push("".replace(e,n)),this},t.prototype.setSourceContent=function(e,n){this.sourceContents[i.toSetString(e)]=n},t.prototype.walkSourceContents=function(e){for(var n=0,r=this.children.length;r>n;n++)this.children[n][u]&&this.children[n].walkSourceContents(e);for(var t=Object.keys(this.sourceContents),n=0,r=t.length;r>n;n++)e(i.fromSetString(t[n]),this.sourceContents[t[n]])},t.prototype.toString=function(){var e="";return this.walk(function(n){e+=n}),e},t.prototype.toStringWithSourceMap=function(e){var n={code:"",line:1,column:0},r=new o(e),t=!1,i=null,s=null,u=null,l=null;return this.walk(function(e,o){n.code+=e,null!==o.source&&null!==o.line&&null!==o.column?((i!==o.source||s!==o.line||u!==o.column||l!==o.name)&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name}),i=o.source,s=o.line,u=o.column,l=o.name,t=!0):t&&(r.addMapping({generated:{line:n.line,column:n.column}}),i=null,t=!1);for(var c=0,g=e.length;g>c;c++)e.charCodeAt(c)===a?(n.line++,n.column=0,c+1===g?(i=null,t=!1):t&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name})):n.column++}),this.walkSourceContents(function(e,n){r.setSourceContent(e,n)}),{code:n.code,map:r}},n.SourceNode=t}])}); +//# sourceMappingURL=source-map.min.js.map \ No newline at end of file diff --git a/react-app/node_modules/source-map/dist/source-map.min.js.map b/react-app/node_modules/source-map/dist/source-map.min.js.map new file mode 100644 index 0000000000..8470bde426 --- /dev/null +++ b/react-app/node_modules/source-map/dist/source-map.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///source-map.min.js","webpack:///webpack/bootstrap a7d787c028005295f8d2","webpack:///./source-map.js","webpack:///./lib/source-map-generator.js","webpack:///./lib/base64-vlq.js","webpack:///./lib/base64.js","webpack:///./lib/util.js","webpack:///./lib/array-set.js","webpack:///./lib/mapping-list.js","webpack:///./lib/source-map-consumer.js","webpack:///./lib/binary-search.js","webpack:///./lib/quick-sort.js","webpack:///./lib/source-node.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","SourceMapGenerator","SourceMapConsumer","SourceNode","aArgs","_file","util","getArg","_sourceRoot","_skipValidation","_sources","ArraySet","_names","_mappings","MappingList","_sourcesContents","base64VLQ","prototype","_version","fromSourceMap","aSourceMapConsumer","sourceRoot","generator","file","eachMapping","mapping","newMapping","generated","line","generatedLine","column","generatedColumn","source","relative","original","originalLine","originalColumn","name","addMapping","sources","forEach","sourceFile","content","sourceContentFor","setSourceContent","_validateMapping","has","add","aSourceFile","aSourceContent","toSetString","Object","keys","length","applySourceMap","aSourceMapPath","Error","newSources","newNames","unsortedForEach","originalPositionFor","join","aGenerated","aOriginal","aSource","aName","JSON","stringify","_serializeMappings","nameIdx","sourceIdx","previousGeneratedColumn","previousGeneratedLine","previousOriginalColumn","previousOriginalLine","previousName","previousSource","result","mappings","toArray","i","len","compareByGeneratedPositionsInflated","encode","indexOf","_generateSourcesContent","aSources","aSourceRoot","map","key","hasOwnProperty","toJSON","version","names","sourcesContent","toString","toVLQSigned","aValue","fromVLQSigned","isNegative","shifted","base64","VLQ_BASE_SHIFT","VLQ_BASE","VLQ_BASE_MASK","VLQ_CONTINUATION_BIT","digit","encoded","vlq","decode","aStr","aIndex","aOutParam","continuation","strLen","shift","charCodeAt","charAt","value","rest","intToCharMap","split","number","TypeError","charCode","bigA","bigZ","littleA","littleZ","zero","nine","plus","slash","littleOffset","numberOffset","aDefaultValue","arguments","urlParse","aUrl","match","urlRegexp","scheme","auth","host","port","path","urlGenerate","aParsedUrl","url","normalize","aPath","part","isAbsolute","parts","up","splice","aRoot","aPathUrl","aRootUrl","dataUrlRegexp","joined","replace","level","index","lastIndexOf","slice","Array","substr","fromSetString","compareByOriginalPositions","mappingA","mappingB","onlyCompareOriginal","cmp","compareByGeneratedPositionsDeflated","onlyCompareGenerated","strcmp","aStr1","aStr2","_array","_set","fromArray","aArray","aAllowDuplicates","set","size","getOwnPropertyNames","sStr","isDuplicate","idx","push","at","aIdx","generatedPositionAfter","lineA","lineB","columnA","columnB","_sorted","_last","aCallback","aThisArg","aMapping","sort","aSourceMap","sourceMap","parse","sections","IndexedSourceMapConsumer","BasicSourceMapConsumer","Mapping","lastOffset","_sections","s","offset","offsetLine","offsetColumn","generatedOffset","consumer","binarySearch","quickSort","__generatedMappings","defineProperty","get","_parseMappings","__originalMappings","_charIsMappingSeparator","GENERATED_ORDER","ORIGINAL_ORDER","GREATEST_LOWER_BOUND","LEAST_UPPER_BOUND","aContext","aOrder","context","order","_generatedMappings","_originalMappings","allGeneratedPositionsFor","needle","_findMapping","undefined","lastColumn","create","smc","generatedMappings","destGeneratedMappings","destOriginalMappings","srcMapping","destMapping","str","segment","end","cachedSegments","temp","originalMappings","aNeedle","aMappings","aLineName","aColumnName","aComparator","aBias","search","computeColumnSpans","nextMapping","lastGeneratedColumn","Infinity","hasContentsOfAllSources","some","sc","nullOnMissing","fileUriAbsPath","generatedPositionFor","constructor","j","sectionIndex","section","bias","every","generatedPosition","ret","sectionMappings","adjustedMapping","recursiveSearch","aLow","aHigh","aHaystack","aCompare","mid","Math","floor","swap","ary","x","y","randomIntInRange","low","high","round","random","doQuickSort","comparator","r","pivotIndex","pivot","q","aLine","aColumn","aChunks","children","sourceContents","isSourceNode","REGEX_NEWLINE","NEWLINE_CODE","fromStringWithSourceMap","aGeneratedCode","aRelativePath","addMappingWithCode","code","node","remainingLines","shiftNextLine","lineContents","newLine","lastGeneratedLine","lastMapping","nextLine","aChunk","isArray","chunk","prepend","unshift","walk","aFn","aSep","newChildren","replaceRight","aPattern","aReplacement","lastChild","walkSourceContents","toStringWithSourceMap","sourceMappingActive","lastOriginalSource","lastOriginalLine","lastOriginalColumn","lastOriginalName","sourceContent"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,UAAAD,IAEAD,EAAA,UAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAASL,EAAQD,EAASM,GEjDhCN,EAAAe,mBAAAT,EAAA,GAAAS,mBACAf,EAAAgB,kBAAAV,EAAA,GAAAU,kBACAhB,EAAAiB,WAAAX,EAAA,IAAAW,YF6DM,SAAShB,EAAQD,EAASM,GGhDhC,QAAAS,GAAAG,GACAA,IACAA,MAEAd,KAAAe,MAAAC,EAAAC,OAAAH,EAAA,aACAd,KAAAkB,YAAAF,EAAAC,OAAAH,EAAA,mBACAd,KAAAmB,gBAAAH,EAAAC,OAAAH,EAAA,qBACAd,KAAAoB,SAAA,GAAAC,GACArB,KAAAsB,OAAA,GAAAD,GACArB,KAAAuB,UAAA,GAAAC,GACAxB,KAAAyB,iBAAA,KAvBA,GAAAC,GAAAxB,EAAA,GACAc,EAAAd,EAAA,GACAmB,EAAAnB,EAAA,GAAAmB,SACAG,EAAAtB,EAAA,GAAAsB,WAuBAb,GAAAgB,UAAAC,SAAA,EAOAjB,EAAAkB,cACA,SAAAC,GACA,GAAAC,GAAAD,EAAAC,WACAC,EAAA,GAAArB,IACAsB,KAAAH,EAAAG,KACAF,cAkCA,OAhCAD,GAAAI,YAAA,SAAAC,GACA,GAAAC,IACAC,WACAC,KAAAH,EAAAI,cACAC,OAAAL,EAAAM,iBAIA,OAAAN,EAAAO,SACAN,EAAAM,OAAAP,EAAAO,OACA,MAAAX,IACAK,EAAAM,OAAA1B,EAAA2B,SAAAZ,EAAAK,EAAAM,SAGAN,EAAAQ,UACAN,KAAAH,EAAAU,aACAL,OAAAL,EAAAW,gBAGA,MAAAX,EAAAY,OACAX,EAAAW,KAAAZ,EAAAY,OAIAf,EAAAgB,WAAAZ,KAEAN,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAC,GAAAtB,EAAAuB,iBAAAF,EACA,OAAAC,GACApB,EAAAsB,iBAAAH,EAAAC,KAGApB,GAaArB,EAAAgB,UAAAqB,WACA,SAAAlC,GACA,GAAAuB,GAAArB,EAAAC,OAAAH,EAAA,aACA8B,EAAA5B,EAAAC,OAAAH,EAAA,iBACA4B,EAAA1B,EAAAC,OAAAH,EAAA,eACAiC,EAAA/B,EAAAC,OAAAH,EAAA,YAEAd,MAAAmB,iBACAnB,KAAAuD,iBAAAlB,EAAAO,EAAAF,EAAAK,GAGA,MAAAL,GAAA1C,KAAAoB,SAAAoC,IAAAd,IACA1C,KAAAoB,SAAAqC,IAAAf,GAGA,MAAAK,GAAA/C,KAAAsB,OAAAkC,IAAAT,IACA/C,KAAAsB,OAAAmC,IAAAV,GAGA/C,KAAAuB,UAAAkC,KACAlB,cAAAF,EAAAC,KACAG,gBAAAJ,EAAAG,OACAK,aAAA,MAAAD,KAAAN,KACAQ,eAAA,MAAAF,KAAAJ,OACAE,SACAK,UAOApC,EAAAgB,UAAA2B,iBACA,SAAAI,EAAAC,GACA,GAAAjB,GAAAgB,CACA,OAAA1D,KAAAkB,cACAwB,EAAA1B,EAAA2B,SAAA3C,KAAAkB,YAAAwB,IAGA,MAAAiB,GAGA3D,KAAAyB,mBACAzB,KAAAyB,qBAEAzB,KAAAyB,iBAAAT,EAAA4C,YAAAlB,IAAAiB,GACO3D,KAAAyB,yBAGPzB,MAAAyB,iBAAAT,EAAA4C,YAAAlB,IACA,IAAAmB,OAAAC,KAAA9D,KAAAyB,kBAAAsC,SACA/D,KAAAyB,iBAAA,QAqBAd,EAAAgB,UAAAqC,eACA,SAAAlC,EAAA4B,EAAAO,GACA,GAAAd,GAAAO,CAEA,UAAAA,EAAA,CACA,SAAA5B,EAAAG,KACA,SAAAiC,OACA,gJAIAf,GAAArB,EAAAG,KAEA,GAAAF,GAAA/B,KAAAkB,WAEA,OAAAa,IACAoB,EAAAnC,EAAA2B,SAAAZ,EAAAoB,GAIA,IAAAgB,GAAA,GAAA9C,GACA+C,EAAA,GAAA/C,EAGArB,MAAAuB,UAAA8C,gBAAA,SAAAlC,GACA,GAAAA,EAAAO,SAAAS,GAAA,MAAAhB,EAAAU,aAAA,CAEA,GAAAD,GAAAd,EAAAwC,qBACAhC,KAAAH,EAAAU,aACAL,OAAAL,EAAAW,gBAEA,OAAAF,EAAAF,SAEAP,EAAAO,OAAAE,EAAAF,OACA,MAAAuB,IACA9B,EAAAO,OAAA1B,EAAAuD,KAAAN,EAAA9B,EAAAO,SAEA,MAAAX,IACAI,EAAAO,OAAA1B,EAAA2B,SAAAZ,EAAAI,EAAAO,SAEAP,EAAAU,aAAAD,EAAAN,KACAH,EAAAW,eAAAF,EAAAJ,OACA,MAAAI,EAAAG,OACAZ,EAAAY,KAAAH,EAAAG,OAKA,GAAAL,GAAAP,EAAAO,MACA,OAAAA,GAAAyB,EAAAX,IAAAd,IACAyB,EAAAV,IAAAf,EAGA,IAAAK,GAAAZ,EAAAY,IACA,OAAAA,GAAAqB,EAAAZ,IAAAT,IACAqB,EAAAX,IAAAV,IAGO/C,MACPA,KAAAoB,SAAA+C,EACAnE,KAAAsB,OAAA8C,EAGAtC,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAC,GAAAtB,EAAAuB,iBAAAF,EACA,OAAAC,IACA,MAAAa,IACAd,EAAAnC,EAAAuD,KAAAN,EAAAd,IAEA,MAAApB,IACAoB,EAAAnC,EAAA2B,SAAAZ,EAAAoB,IAEAnD,KAAAsD,iBAAAH,EAAAC,KAEOpD,OAcPW,EAAAgB,UAAA4B,iBACA,SAAAiB,EAAAC,EAAAC,EACAC,GACA,MAAAH,GAAA,QAAAA,IAAA,UAAAA,IACAA,EAAAlC,KAAA,GAAAkC,EAAAhC,QAAA,IACAiC,GAAAC,GAAAC,MAIAH,GAAA,QAAAA,IAAA,UAAAA,IACAC,GAAA,QAAAA,IAAA,UAAAA,IACAD,EAAAlC,KAAA,GAAAkC,EAAAhC,QAAA,GACAiC,EAAAnC,KAAA,GAAAmC,EAAAjC,QAAA,GACAkC,GAKA,SAAAR,OAAA,oBAAAU,KAAAC,WACAxC,UAAAmC,EACA9B,OAAAgC,EACA9B,SAAA6B,EACA1B,KAAA4B,MASAhE,EAAAgB,UAAAmD,mBACA,WAaA,OALA3C,GACA4C,EACAC,EATAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,GAKAC,EAAAxF,KAAAuB,UAAAkE,UACAC,EAAA,EAAAC,EAAAH,EAAAzB,OAA4C4B,EAAAD,EAASA,IAAA,CAGrD,GAFAvD,EAAAqD,EAAAE,GAEAvD,EAAAI,gBAAA2C,EAEA,IADAD,EAAA,EACA9C,EAAAI,gBAAA2C,GACAK,GAAA,IACAL,QAIA,IAAAQ,EAAA,GACA,IAAA1E,EAAA4E,oCAAAzD,EAAAqD,EAAAE,EAAA,IACA,QAEAH,IAAA,IAIAA,GAAA7D,EAAAmE,OAAA1D,EAAAM,gBACAwC,GACAA,EAAA9C,EAAAM,gBAEA,MAAAN,EAAAO,SACAsC,EAAAhF,KAAAoB,SAAA0E,QAAA3D,EAAAO,QACA6C,GAAA7D,EAAAmE,OAAAb,EAAAM,GACAA,EAAAN,EAGAO,GAAA7D,EAAAmE,OAAA1D,EAAAU,aAAA,EACAuC,GACAA,EAAAjD,EAAAU,aAAA,EAEA0C,GAAA7D,EAAAmE,OAAA1D,EAAAW,eACAqC,GACAA,EAAAhD,EAAAW,eAEA,MAAAX,EAAAY,OACAgC,EAAA/E,KAAAsB,OAAAwE,QAAA3D,EAAAY,MACAwC,GAAA7D,EAAAmE,OAAAd,EAAAM,GACAA,EAAAN,IAKA,MAAAQ,IAGA5E,EAAAgB,UAAAoE,wBACA,SAAAC,EAAAC,GACA,MAAAD,GAAAE,IAAA,SAAAxD,GACA,IAAA1C,KAAAyB,iBACA,WAEA,OAAAwE,IACAvD,EAAA1B,EAAA2B,SAAAsD,EAAAvD,GAEA,IAAAyD,GAAAnF,EAAA4C,YAAAlB,EACA,OAAAmB,QAAAlC,UAAAyE,eAAA7F,KAAAP,KAAAyB,iBACA0E,GACAnG,KAAAyB,iBAAA0E,GACA,MACOnG,OAMPW,EAAAgB,UAAA0E,OACA,WACA,GAAAH,IACAI,QAAAtG,KAAA4B,SACAqB,QAAAjD,KAAAoB,SAAAqE,UACAc,MAAAvG,KAAAsB,OAAAmE,UACAD,SAAAxF,KAAA8E,qBAYA,OAVA,OAAA9E,KAAAe,QACAmF,EAAAjE,KAAAjC,KAAAe,OAEA,MAAAf,KAAAkB,cACAgF,EAAAnE,WAAA/B,KAAAkB,aAEAlB,KAAAyB,mBACAyE,EAAAM,eAAAxG,KAAA+F,wBAAAG,EAAAjD,QAAAiD,EAAAnE,aAGAmE,GAMAvF,EAAAgB,UAAA8E,SACA,WACA,MAAA7B,MAAAC,UAAA7E,KAAAqG,WAGAzG,EAAAe,sBH4EM,SAASd,EAAQD,EAASM,GIlZhC,QAAAwG,GAAAC,GACA,SAAAA,IACAA,GAAA,MACAA,GAAA,KASA,QAAAC,GAAAD,GACA,GAAAE,GAAA,OAAAF,GACAG,EAAAH,GAAA,CACA,OAAAE,IACAC,EACAA,EAhDA,GAAAC,GAAA7G,EAAA,GAcA8G,EAAA,EAGAC,EAAA,GAAAD,EAGAE,EAAAD,EAAA,EAGAE,EAAAF,CA+BArH,GAAAiG,OAAA,SAAAc,GACA,GACAS,GADAC,EAAA,GAGAC,EAAAZ,EAAAC,EAEA,GACAS,GAAAE,EAAAJ,EACAI,KAAAN,EACAM,EAAA,IAGAF,GAAAD,GAEAE,GAAAN,EAAAlB,OAAAuB,SACKE,EAAA,EAEL,OAAAD,IAOAzH,EAAA2H,OAAA,SAAAC,EAAAC,EAAAC,GACA,GAGAC,GAAAP,EAHAQ,EAAAJ,EAAAzD,OACAwB,EAAA,EACAsC,EAAA,CAGA,IACA,GAAAJ,GAAAG,EACA,SAAA1D,OAAA,6CAIA,IADAkD,EAAAL,EAAAQ,OAAAC,EAAAM,WAAAL,MACA,KAAAL,EACA,SAAAlD,OAAA,yBAAAsD,EAAAO,OAAAN,EAAA,GAGAE,MAAAP,EAAAD,GACAC,GAAAF,EACA3B,GAAA6B,GAAAS,EACAA,GAAAb,QACKW,EAELD,GAAAM,MAAApB,EAAArB,GACAmC,EAAAO,KAAAR,IJ+dM,SAAS5H,EAAQD,GKlmBvB,GAAAsI,GAAA,mEAAAC,MAAA,GAKAvI,GAAAiG,OAAA,SAAAuC,GACA,GAAAA,GAAA,GAAAA,EAAAF,EAAAnE,OACA,MAAAmE,GAAAE,EAEA,UAAAC,WAAA,6BAAAD,IAOAxI,EAAA2H,OAAA,SAAAe,GACA,GAAAC,GAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,IAEAC,EAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,EAGA,OAAAV,IAAAC,GAAAC,GAAAF,EACAA,EAAAC,EAIAD,GAAAG,GAAAC,GAAAJ,EACAA,EAAAG,EAAAM,EAIAT,GAAAK,GAAAC,GAAAN,EACAA,EAAAK,EAAAK,EAIAV,GAAAO,EACA,GAIAP,GAAAQ,EACA,GAIA,KLknBM,SAASjJ,EAAQD,GMlqBvB,QAAAqB,GAAAH,EAAA6D,EAAAsE,GACA,GAAAtE,IAAA7D,GACA,MAAAA,GAAA6D,EACK,QAAAuE,UAAAnF,OACL,MAAAkF,EAEA,UAAA/E,OAAA,IAAAS,EAAA,6BAQA,QAAAwE,GAAAC,GACA,GAAAC,GAAAD,EAAAC,MAAAC,EACA,OAAAD,IAIAE,OAAAF,EAAA,GACAG,KAAAH,EAAA,GACAI,KAAAJ,EAAA,GACAK,KAAAL,EAAA,GACAM,KAAAN,EAAA,IAPA,KAYA,QAAAO,GAAAC,GACA,GAAAC,GAAA,EAiBA,OAhBAD,GAAAN,SACAO,GAAAD,EAAAN,OAAA,KAEAO,GAAA,KACAD,EAAAL,OACAM,GAAAD,EAAAL,KAAA,KAEAK,EAAAJ,OACAK,GAAAD,EAAAJ,MAEAI,EAAAH,OACAI,GAAA,IAAAD,EAAAH,MAEAG,EAAAF,OACAG,GAAAD,EAAAF,MAEAG,EAeA,QAAAC,GAAAC,GACA,GAAAL,GAAAK,EACAF,EAAAX,EAAAa,EACA,IAAAF,EAAA,CACA,IAAAA,EAAAH,KACA,MAAAK,EAEAL,GAAAG,EAAAH,KAKA,OAAAM,GAHAC,EAAAtK,EAAAsK,WAAAP,GAEAQ,EAAAR,EAAAxB,MAAA,OACAiC,EAAA,EAAA1E,EAAAyE,EAAApG,OAAA,EAAgD2B,GAAA,EAAQA,IACxDuE,EAAAE,EAAAzE,GACA,MAAAuE,EACAE,EAAAE,OAAA3E,EAAA,GACO,OAAAuE,EACPG,IACOA,EAAA,IACP,KAAAH,GAIAE,EAAAE,OAAA3E,EAAA,EAAA0E,GACAA,EAAA,IAEAD,EAAAE,OAAA3E,EAAA,GACA0E,KAUA,OANAT,GAAAQ,EAAA5F,KAAA,KAEA,KAAAoF,IACAA,EAAAO,EAAA,SAGAJ,GACAA,EAAAH,OACAC,EAAAE,IAEAH,EAoBA,QAAApF,GAAA+F,EAAAN,GACA,KAAAM,IACAA,EAAA,KAEA,KAAAN,IACAA,EAAA,IAEA,IAAAO,GAAApB,EAAAa,GACAQ,EAAArB,EAAAmB,EAMA,IALAE,IACAF,EAAAE,EAAAb,MAAA,KAIAY,MAAAhB,OAIA,MAHAiB,KACAD,EAAAhB,OAAAiB,EAAAjB,QAEAK,EAAAW,EAGA,IAAAA,GAAAP,EAAAX,MAAAoB,GACA,MAAAT,EAIA,IAAAQ,MAAAf,OAAAe,EAAAb,KAEA,MADAa,GAAAf,KAAAO,EACAJ,EAAAY,EAGA,IAAAE,GAAA,MAAAV,EAAAjC,OAAA,GACAiC,EACAD,EAAAO,EAAAK,QAAA,eAAAX,EAEA,OAAAQ,IACAA,EAAAb,KAAAe,EACAd,EAAAY,IAEAE,EAcA,QAAA/H,GAAA2H,EAAAN,GACA,KAAAM,IACAA,EAAA,KAGAA,IAAAK,QAAA,SAOA,KADA,GAAAC,GAAA,EACA,IAAAZ,EAAAlE,QAAAwE,EAAA,OACA,GAAAO,GAAAP,EAAAQ,YAAA,IACA,MAAAD,EACA,MAAAb,EAOA,IADAM,IAAAS,MAAA,EAAAF,GACAP,EAAAjB,MAAA,qBACA,MAAAW,KAGAY,EAIA,MAAAI,OAAAJ,EAAA,GAAArG,KAAA,OAAAyF,EAAAiB,OAAAX,EAAAvG,OAAA,GAaA,QAAAH,GAAA4D,GACA,UAAAA,EAIA,QAAA0D,GAAA1D,GACA,MAAAA,GAAAyD,OAAA,GAYA,QAAAE,GAAAC,EAAAC,EAAAC,GACA,GAAAC,GAAAH,EAAA1I,OAAA2I,EAAA3I,MACA,YAAA6I,EACAA,GAGAA,EAAAH,EAAAvI,aAAAwI,EAAAxI,aACA,IAAA0I,EACAA,GAGAA,EAAAH,EAAAtI,eAAAuI,EAAAvI,eACA,IAAAyI,GAAAD,EACAC,GAGAA,EAAAH,EAAA3I,gBAAA4I,EAAA5I,gBACA,IAAA8I,EACAA,GAGAA,EAAAH,EAAA7I,cAAA8I,EAAA9I,cACA,IAAAgJ,EACAA,EAGAH,EAAArI,KAAAsI,EAAAtI,SAaA,QAAAyI,GAAAJ,EAAAC,EAAAI,GACA,GAAAF,GAAAH,EAAA7I,cAAA8I,EAAA9I,aACA,YAAAgJ,EACAA,GAGAA,EAAAH,EAAA3I,gBAAA4I,EAAA5I,gBACA,IAAA8I,GAAAE,EACAF,GAGAA,EAAAH,EAAA1I,OAAA2I,EAAA3I,OACA,IAAA6I,EACAA,GAGAA,EAAAH,EAAAvI,aAAAwI,EAAAxI,aACA,IAAA0I,EACAA,GAGAA,EAAAH,EAAAtI,eAAAuI,EAAAvI,eACA,IAAAyI,EACAA,EAGAH,EAAArI,KAAAsI,EAAAtI,SAIA,QAAA2I,GAAAC,EAAAC,GACA,MAAAD,KAAAC,EACA,EAGAD,EAAAC,EACA,EAGA,GAOA,QAAAhG,GAAAwF,EAAAC,GACA,GAAAE,GAAAH,EAAA7I,cAAA8I,EAAA9I,aACA,YAAAgJ,EACAA,GAGAA,EAAAH,EAAA3I,gBAAA4I,EAAA5I,gBACA,IAAA8I,EACAA,GAGAA,EAAAG,EAAAN,EAAA1I,OAAA2I,EAAA3I,QACA,IAAA6I,EACAA,GAGAA,EAAAH,EAAAvI,aAAAwI,EAAAxI,aACA,IAAA0I,EACAA,GAGAA,EAAAH,EAAAtI,eAAAuI,EAAAvI,eACA,IAAAyI,EACAA,EAGAG,EAAAN,EAAArI,KAAAsI,EAAAtI,UAnVAnD,EAAAqB,QAEA,IAAAqI,GAAA,iEACAmB,EAAA,eAeA7K,GAAAuJ,WAsBAvJ,EAAAgK,cAwDAhK,EAAAmK,YA2DAnK,EAAA2E,OAEA3E,EAAAsK,WAAA,SAAAF,GACA,YAAAA,EAAAjC,OAAA,MAAAiC,EAAAX,MAAAC,IAyCA1J,EAAA+C,WAcA/C,EAAAgE,cAKAhE,EAAAsL,gBAsCAtL,EAAAuL,6BAuCAvL,EAAA4L,sCA8CA5L,EAAAgG,uCN2rBM,SAAS/F,EAAQD,EAASM,GO3hChC,QAAAmB,KACArB,KAAA6L,UACA7L,KAAA8L,QAVA,GAAA9K,GAAAd,EAAA,EAgBAmB,GAAA0K,UAAA,SAAAC,EAAAC,GAEA,OADAC,GAAA,GAAA7K,GACAqE,EAAA,EAAAC,EAAAqG,EAAAjI,OAAwC4B,EAAAD,EAASA,IACjDwG,EAAAzI,IAAAuI,EAAAtG,GAAAuG,EAEA,OAAAC,IASA7K,EAAAM,UAAAwK,KAAA,WACA,MAAAtI,QAAAuI,oBAAApM,KAAA8L,MAAA/H,QAQA1C,EAAAM,UAAA8B,IAAA,SAAA+D,EAAAyE,GACA,GAAAI,GAAArL,EAAA4C,YAAA4D,GACA8E,EAAAtM,KAAA8L,KAAA1F,eAAAiG,GACAE,EAAAvM,KAAA6L,OAAA9H,SACAuI,GAAAL,IACAjM,KAAA6L,OAAAW,KAAAhF,GAEA8E,IACAtM,KAAA8L,KAAAO,GAAAE,IASAlL,EAAAM,UAAA6B,IAAA,SAAAgE,GACA,GAAA6E,GAAArL,EAAA4C,YAAA4D,EACA,OAAAxH,MAAA8L,KAAA1F,eAAAiG,IAQAhL,EAAAM,UAAAmE,QAAA,SAAA0B,GACA,GAAA6E,GAAArL,EAAA4C,YAAA4D,EACA,IAAAxH,KAAA8L,KAAA1F,eAAAiG,GACA,MAAArM,MAAA8L,KAAAO,EAEA,UAAAnI,OAAA,IAAAsD,EAAA,yBAQAnG,EAAAM,UAAA8K,GAAA,SAAAC,GACA,GAAAA,GAAA,GAAAA,EAAA1M,KAAA6L,OAAA9H,OACA,MAAA/D,MAAA6L,OAAAa,EAEA,UAAAxI,OAAA,yBAAAwI,IAQArL,EAAAM,UAAA8D,QAAA,WACA,MAAAzF,MAAA6L,OAAAd,SAGAnL,EAAAyB,YPkjCM,SAASxB,EAAQD,EAASM,GQ3oChC,QAAAyM,GAAAvB,EAAAC,GAEA,GAAAuB,GAAAxB,EAAA7I,cACAsK,EAAAxB,EAAA9I,cACAuK,EAAA1B,EAAA3I,gBACAsK,EAAA1B,EAAA5I,eACA,OAAAoK,GAAAD,GAAAC,GAAAD,GAAAG,GAAAD,GACA9L,EAAA4E,oCAAAwF,EAAAC,IAAA,EAQA,QAAA7J,KACAxB,KAAA6L,UACA7L,KAAAgN,SAAA,EAEAhN,KAAAiN,OAAkB1K,cAAA,GAAAE,gBAAA,GAzBlB,GAAAzB,GAAAd,EAAA,EAkCAsB,GAAAG,UAAA0C,gBACA,SAAA6I,EAAAC,GACAnN,KAAA6L,OAAA3I,QAAAgK,EAAAC,IAQA3L,EAAAG,UAAA8B,IAAA,SAAA2J,GACAT,EAAA3M,KAAAiN,MAAAG,IACApN,KAAAiN,MAAAG,EACApN,KAAA6L,OAAAW,KAAAY,KAEApN,KAAAgN,SAAA,EACAhN,KAAA6L,OAAAW,KAAAY,KAaA5L,EAAAG,UAAA8D,QAAA,WAKA,MAJAzF,MAAAgN,UACAhN,KAAA6L,OAAAwB,KAAArM,EAAA4E,qCACA5F,KAAAgN,SAAA,GAEAhN,KAAA6L,QAGAjM,EAAA4B,eRgqCM,SAAS3B,EAAQD,EAASM,GSjuChC,QAAAU,GAAA0M,GACA,GAAAC,GAAAD,CAKA,OAJA,gBAAAA,KACAC,EAAA3I,KAAA4I,MAAAF,EAAA3C,QAAA,WAAwD,MAGxD,MAAA4C,EAAAE,SACA,GAAAC,GAAAH,GACA,GAAAI,GAAAJ,GAoQA,QAAAI,GAAAL,GACA,GAAAC,GAAAD,CACA,iBAAAA,KACAC,EAAA3I,KAAA4I,MAAAF,EAAA3C,QAAA,WAAwD,KAGxD,IAAArE,GAAAtF,EAAAC,OAAAsM,EAAA,WACAtK,EAAAjC,EAAAC,OAAAsM,EAAA,WAGAhH,EAAAvF,EAAAC,OAAAsM,EAAA,YACAxL,EAAAf,EAAAC,OAAAsM,EAAA,mBACA/G,EAAAxF,EAAAC,OAAAsM,EAAA,uBACA/H,EAAAxE,EAAAC,OAAAsM,EAAA,YACAtL,EAAAjB,EAAAC,OAAAsM,EAAA,YAIA,IAAAjH,GAAAtG,KAAA4B,SACA,SAAAsC,OAAA,wBAAAoC,EAGArD,KAIAiD,IAAAlF,EAAA+I,WAKA7D,IAAA,SAAAxD,GACA,MAAAX,IAAAf,EAAAkJ,WAAAnI,IAAAf,EAAAkJ,WAAAxH,GACA1B,EAAA2B,SAAAZ,EAAAW,GACAA,IAOA1C,KAAAsB,OAAAD,EAAA0K,UAAAxF,GAAA,GACAvG,KAAAoB,SAAAC,EAAA0K,UAAA9I,GAAA,GAEAjD,KAAA+B,aACA/B,KAAAwG,iBACAxG,KAAAuB,UAAAiE,EACAxF,KAAAiC,OA8EA,QAAA2L,KACA5N,KAAAuC,cAAA,EACAvC,KAAAyC,gBAAA,EACAzC,KAAA0C,OAAA,KACA1C,KAAA6C,aAAA,KACA7C,KAAA8C,eAAA,KACA9C,KAAA+C,KAAA,KAyZA,QAAA2K,GAAAJ,GACA,GAAAC,GAAAD,CACA,iBAAAA,KACAC,EAAA3I,KAAA4I,MAAAF,EAAA3C,QAAA,WAAwD,KAGxD,IAAArE,GAAAtF,EAAAC,OAAAsM,EAAA,WACAE,EAAAzM,EAAAC,OAAAsM,EAAA,WAEA,IAAAjH,GAAAtG,KAAA4B,SACA,SAAAsC,OAAA,wBAAAoC,EAGAtG,MAAAoB,SAAA,GAAAC,GACArB,KAAAsB,OAAA,GAAAD,EAEA,IAAAwM,IACAvL,KAAA,GACAE,OAAA,EAEAxC,MAAA8N,UAAAL,EAAAvH,IAAA,SAAA6H,GACA,GAAAA,EAAAjE,IAGA,SAAA5F,OAAA,qDAEA,IAAA8J,GAAAhN,EAAAC,OAAA8M,EAAA,UACAE,EAAAjN,EAAAC,OAAA+M,EAAA,QACAE,EAAAlN,EAAAC,OAAA+M,EAAA,SAEA,IAAAC,EAAAJ,EAAAvL,MACA2L,IAAAJ,EAAAvL,MAAA4L,EAAAL,EAAArL,OACA,SAAA0B,OAAA,uDAIA,OAFA2J,GAAAG,GAGAG,iBAGA5L,cAAA0L,EAAA,EACAxL,gBAAAyL,EAAA,GAEAE,SAAA,GAAAxN,GAAAI,EAAAC,OAAA8M,EAAA,WAz1BA,GAAA/M,GAAAd,EAAA,GACAmO,EAAAnO,EAAA,GACAmB,EAAAnB,EAAA,GAAAmB,SACAK,EAAAxB,EAAA,GACAoO,EAAApO,EAAA,GAAAoO,SAaA1N,GAAAiB,cAAA,SAAAyL,GACA,MAAAK,GAAA9L,cAAAyL,IAMA1M,EAAAe,UAAAC,SAAA,EAgCAhB,EAAAe,UAAA4M,oBAAA,KACA1K,OAAA2K,eAAA5N,EAAAe,UAAA,sBACA8M,IAAA,WAKA,MAJAzO,MAAAuO,qBACAvO,KAAA0O,eAAA1O,KAAAuB,UAAAvB,KAAA+B,YAGA/B,KAAAuO,uBAIA3N,EAAAe,UAAAgN,mBAAA,KACA9K,OAAA2K,eAAA5N,EAAAe,UAAA,qBACA8M,IAAA,WAKA,MAJAzO,MAAA2O,oBACA3O,KAAA0O,eAAA1O,KAAAuB,UAAAvB,KAAA+B,YAGA/B,KAAA2O,sBAIA/N,EAAAe,UAAAiN,wBACA,SAAApH,EAAAqD,GACA,GAAApK,GAAA+G,EAAAO,OAAA8C,EACA,aAAApK,GAAqB,MAAAA,GAQrBG,EAAAe,UAAA+M,eACA,SAAAlH,EAAAvB,GACA,SAAA/B,OAAA,6CAGAtD,EAAAiO,gBAAA,EACAjO,EAAAkO,eAAA,EAEAlO,EAAAmO,qBAAA,EACAnO,EAAAoO,kBAAA,EAkBApO,EAAAe,UAAAO,YACA,SAAAgL,EAAA+B,EAAAC,GACA,GAGA1J,GAHA2J,EAAAF,GAAA,KACAG,EAAAF,GAAAtO,EAAAiO,eAGA,QAAAO,GACA,IAAAxO,GAAAiO,gBACArJ,EAAAxF,KAAAqP,kBACA,MACA,KAAAzO,GAAAkO,eACAtJ,EAAAxF,KAAAsP,iBACA,MACA,SACA,SAAApL,OAAA,+BAGA,GAAAnC,GAAA/B,KAAA+B,UACAyD,GAAAU,IAAA,SAAA/D,GACA,GAAAO,GAAA,OAAAP,EAAAO,OAAA,KAAA1C,KAAAoB,SAAAqL,GAAAtK,EAAAO,OAIA,OAHA,OAAAA,GAAA,MAAAX,IACAW,EAAA1B,EAAAuD,KAAAxC,EAAAW,KAGAA,SACAH,cAAAJ,EAAAI,cACAE,gBAAAN,EAAAM,gBACAI,aAAAV,EAAAU,aACAC,eAAAX,EAAAW,eACAC,KAAA,OAAAZ,EAAAY,KAAA,KAAA/C,KAAAsB,OAAAmL,GAAAtK,EAAAY,QAEO/C,MAAAkD,QAAAgK,EAAAiC,IAsBPvO,EAAAe,UAAA4N,yBACA,SAAAzO,GACA,GAAAwB,GAAAtB,EAAAC,OAAAH,EAAA,QAMA0O,GACA9M,OAAA1B,EAAAC,OAAAH,EAAA,UACA+B,aAAAP,EACAQ,eAAA9B,EAAAC,OAAAH,EAAA,YAMA,IAHA,MAAAd,KAAA+B,aACAyN,EAAA9M,OAAA1B,EAAA2B,SAAA3C,KAAA+B,WAAAyN,EAAA9M,UAEA1C,KAAAoB,SAAAoC,IAAAgM,EAAA9M,QACA,QAEA8M,GAAA9M,OAAA1C,KAAAoB,SAAA0E,QAAA0J,EAAA9M,OAEA,IAAA8C,MAEAqF,EAAA7K,KAAAyP,aAAAD,EACAxP,KAAAsP,kBACA,eACA,iBACAtO,EAAAmK,2BACAkD,EAAAW,kBACA,IAAAnE,GAAA,GACA,GAAA1I,GAAAnC,KAAAsP,kBAAAzE,EAEA,IAAA6E,SAAA5O,EAAA0B,OAOA,IANA,GAAAK,GAAAV,EAAAU,aAMAV,KAAAU,kBACA2C,EAAAgH,MACAlK,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAwN,WAAA3O,EAAAC,OAAAkB,EAAA,8BAGAA,EAAAnC,KAAAsP,oBAAAzE,OASA,KANA,GAAA/H,GAAAX,EAAAW,eAMAX,GACAA,EAAAU,eAAAP,GACAH,EAAAW,mBACA0C,EAAAgH,MACAlK,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAwN,WAAA3O,EAAAC,OAAAkB,EAAA,8BAGAA,EAAAnC,KAAAsP,oBAAAzE,GAKA,MAAArF,IAGA5F,EAAAgB,oBAkFA+M,EAAAhM,UAAAkC,OAAA+L,OAAAhP,EAAAe,WACAgM,EAAAhM,UAAAyM,SAAAxN,EASA+M,EAAA9L,cACA,SAAAyL,GACA,GAAAuC,GAAAhM,OAAA+L,OAAAjC,EAAAhM,WAEA4E,EAAAsJ,EAAAvO,OAAAD,EAAA0K,UAAAuB,EAAAhM,OAAAmE,WAAA,GACAxC,EAAA4M,EAAAzO,SAAAC,EAAA0K,UAAAuB,EAAAlM,SAAAqE,WAAA,EACAoK,GAAA9N,WAAAuL,EAAApM,YACA2O,EAAArJ,eAAA8G,EAAAvH,wBAAA8J,EAAAzO,SAAAqE,UACAoK,EAAA9N,YACA8N,EAAA5N,KAAAqL,EAAAvM,KAWA,QAJA+O,GAAAxC,EAAA/L,UAAAkE,UAAAsF,QACAgF,EAAAF,EAAAtB,uBACAyB,EAAAH,EAAAlB,sBAEAjJ,EAAA,EAAA3B,EAAA+L,EAAA/L,OAAwDA,EAAA2B,EAAYA,IAAA,CACpE,GAAAuK,GAAAH,EAAApK,GACAwK,EAAA,GAAAtC,EACAsC,GAAA3N,cAAA0N,EAAA1N,cACA2N,EAAAzN,gBAAAwN,EAAAxN,gBAEAwN,EAAAvN,SACAwN,EAAAxN,OAAAO,EAAA6C,QAAAmK,EAAAvN,QACAwN,EAAArN,aAAAoN,EAAApN,aACAqN,EAAApN,eAAAmN,EAAAnN,eAEAmN,EAAAlN,OACAmN,EAAAnN,KAAAwD,EAAAT,QAAAmK,EAAAlN,OAGAiN,EAAAxD,KAAA0D,IAGAH,EAAAvD,KAAA0D,GAKA,MAFA5B,GAAAuB,EAAAlB,mBAAA3N,EAAAmK,4BAEA0E,GAMAlC,EAAAhM,UAAAC,SAAA,EAKAiC,OAAA2K,eAAAb,EAAAhM,UAAA,WACA8M,IAAA,WACA,MAAAzO,MAAAoB,SAAAqE,UAAAS,IAAA,SAAA6H,GACA,aAAA/N,KAAA+B,WAAAf,EAAAuD,KAAAvE,KAAA+B,WAAAgM,MACO/N,SAqBP2N,EAAAhM,UAAA+M,eACA,SAAAlH,EAAAvB,GAeA,IAdA,GAYA9D,GAAAgO,EAAAC,EAAAC,EAAArI,EAZAzF,EAAA,EACA0C,EAAA,EACAG,EAAA,EACAD,EAAA,EACAG,EAAA,EACAD,EAAA,EACAtB,EAAAyD,EAAAzD,OACA8G,EAAA,EACAyF,KACAC,KACAC,KACAV,KAGA/L,EAAA8G,GACA,SAAArD,EAAAO,OAAA8C,GACAtI,IACAsI,IACA5F,EAAA,MAEA,UAAAuC,EAAAO,OAAA8C,GACAA,QAEA,CASA,IARA1I,EAAA,GAAAyL,GACAzL,EAAAI,gBAOA8N,EAAAxF,EAA2B9G,EAAAsM,IAC3BrQ,KAAA4O,wBAAApH,EAAA6I,GADyCA,KAQzC,GAHAF,EAAA3I,EAAAuD,MAAAF,EAAAwF,GAEAD,EAAAE,EAAAH,GAEAtF,GAAAsF,EAAApM,WACW,CAEX,IADAqM,KACAC,EAAAxF,GACAnJ,EAAA6F,OAAAC,EAAAqD,EAAA0F,GACAvI,EAAAuI,EAAAvI,MACA6C,EAAA0F,EAAAtI,KACAmI,EAAA5D,KAAAxE,EAGA,QAAAoI,EAAArM,OACA,SAAAG,OAAA,yCAGA,QAAAkM,EAAArM,OACA,SAAAG,OAAA,yCAGAoM,GAAAH,GAAAC,EAIAjO,EAAAM,gBAAAwC,EAAAmL,EAAA,GACAnL,EAAA9C,EAAAM,gBAEA2N,EAAArM,OAAA,IAEA5B,EAAAO,OAAA4C,EAAA8K,EAAA,GACA9K,GAAA8K,EAAA,GAGAjO,EAAAU,aAAAuC,EAAAgL,EAAA,GACAhL,EAAAjD,EAAAU,aAEAV,EAAAU,cAAA,EAGAV,EAAAW,eAAAqC,EAAAiL,EAAA,GACAjL,EAAAhD,EAAAW,eAEAsN,EAAArM,OAAA,IAEA5B,EAAAY,KAAAsC,EAAA+K,EAAA,GACA/K,GAAA+K,EAAA,KAIAN,EAAAtD,KAAArK,GACA,gBAAAA,GAAAU,cACA2N,EAAAhE,KAAArK,GAKAmM,EAAAwB,EAAA9O,EAAAwK,qCACAxL,KAAAuO,oBAAAuB,EAEAxB,EAAAkC,EAAAxP,EAAAmK,4BACAnL,KAAA2O,mBAAA6B,GAOA7C,EAAAhM,UAAA8N,aACA,SAAAgB,EAAAC,EAAAC,EACAC,EAAAC,EAAAC,GAMA,GAAAL,EAAAE,IAAA,EACA,SAAAtI,WAAA,gDACAoI,EAAAE,GAEA,IAAAF,EAAAG,GAAA,EACA,SAAAvI,WAAA,kDACAoI,EAAAG,GAGA,OAAAvC,GAAA0C,OAAAN,EAAAC,EAAAG,EAAAC,IAOAnD,EAAAhM,UAAAqP,mBACA,WACA,OAAAnG,GAAA,EAAyBA,EAAA7K,KAAAqP,mBAAAtL,SAAwC8G,EAAA,CACjE,GAAA1I,GAAAnC,KAAAqP,mBAAAxE,EAMA,IAAAA,EAAA,EAAA7K,KAAAqP,mBAAAtL,OAAA,CACA,GAAAkN,GAAAjR,KAAAqP,mBAAAxE,EAAA,EAEA,IAAA1I,EAAAI,gBAAA0O,EAAA1O,cAAA,CACAJ,EAAA+O,oBAAAD,EAAAxO,gBAAA,CACA,WAKAN,EAAA+O,oBAAAC,MAwBAxD,EAAAhM,UAAA2C,oBACA,SAAAxD,GACA,GAAA0O,IACAjN,cAAAvB,EAAAC,OAAAH,EAAA,QACA2B,gBAAAzB,EAAAC,OAAAH,EAAA,WAGA+J,EAAA7K,KAAAyP,aACAD,EACAxP,KAAAqP,mBACA,gBACA,kBACArO,EAAAwK,oCACAxK,EAAAC,OAAAH,EAAA,OAAAF,EAAAmO,sBAGA,IAAAlE,GAAA,GACA,GAAA1I,GAAAnC,KAAAqP,mBAAAxE,EAEA,IAAA1I,EAAAI,gBAAAiN,EAAAjN,cAAA,CACA,GAAAG,GAAA1B,EAAAC,OAAAkB,EAAA,cACA,QAAAO,IACAA,EAAA1C,KAAAoB,SAAAqL,GAAA/J,GACA,MAAA1C,KAAA+B,aACAW,EAAA1B,EAAAuD,KAAAvE,KAAA+B,WAAAW,IAGA,IAAAK,GAAA/B,EAAAC,OAAAkB,EAAA,YAIA,OAHA,QAAAY,IACAA,EAAA/C,KAAAsB,OAAAmL,GAAA1J,KAGAL,SACAJ,KAAAtB,EAAAC,OAAAkB,EAAA,qBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,uBACAY,SAKA,OACAL,OAAA,KACAJ,KAAA,KACAE,OAAA,KACAO,KAAA,OAQA4K,EAAAhM,UAAAyP,wBACA,WACA,MAAApR,MAAAwG,eAGAxG,KAAAwG,eAAAzC,QAAA/D,KAAAoB,SAAA+K,SACAnM,KAAAwG,eAAA6K,KAAA,SAAAC,GAAiD,aAAAA,KAHjD,GAWA3D,EAAAhM,UAAA0B,iBACA,SAAAqB,EAAA6M,GACA,IAAAvR,KAAAwG,eACA,WAOA,IAJA,MAAAxG,KAAA+B,aACA2C,EAAA1D,EAAA2B,SAAA3C,KAAA+B,WAAA2C,IAGA1E,KAAAoB,SAAAoC,IAAAkB,GACA,MAAA1E,MAAAwG,eAAAxG,KAAAoB,SAAA0E,QAAApB,GAGA,IAAAoF,EACA,UAAA9J,KAAA+B,aACA+H,EAAA9I,EAAAmI,SAAAnJ,KAAA+B,aAAA,CAKA,GAAAyP,GAAA9M,EAAAiG,QAAA,gBACA,YAAAb,EAAAP,QACAvJ,KAAAoB,SAAAoC,IAAAgO,GACA,MAAAxR,MAAAwG,eAAAxG,KAAAoB,SAAA0E,QAAA0L,GAGA,MAAA1H,EAAAH,MAAA,KAAAG,EAAAH,OACA3J,KAAAoB,SAAAoC,IAAA,IAAAkB,GACA,MAAA1E,MAAAwG,eAAAxG,KAAAoB,SAAA0E,QAAA,IAAApB,IAQA,GAAA6M,EACA,WAGA,UAAArN,OAAA,IAAAQ,EAAA,+BAuBAiJ,EAAAhM,UAAA8P,qBACA,SAAA3Q,GACA,GAAA4B,GAAA1B,EAAAC,OAAAH,EAAA,SAIA,IAHA,MAAAd,KAAA+B,aACAW,EAAA1B,EAAA2B,SAAA3C,KAAA+B,WAAAW,KAEA1C,KAAAoB,SAAAoC,IAAAd,GACA,OACAJ,KAAA,KACAE,OAAA,KACAmN,WAAA,KAGAjN,GAAA1C,KAAAoB,SAAA0E,QAAApD,EAEA,IAAA8M,IACA9M,SACAG,aAAA7B,EAAAC,OAAAH,EAAA,QACAgC,eAAA9B,EAAAC,OAAAH,EAAA,WAGA+J,EAAA7K,KAAAyP,aACAD,EACAxP,KAAAsP,kBACA,eACA,iBACAtO,EAAAmK,2BACAnK,EAAAC,OAAAH,EAAA,OAAAF,EAAAmO,sBAGA,IAAAlE,GAAA,GACA,GAAA1I,GAAAnC,KAAAsP,kBAAAzE,EAEA,IAAA1I,EAAAO,SAAA8M,EAAA9M,OACA,OACAJ,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAwN,WAAA3O,EAAAC,OAAAkB,EAAA,6BAKA,OACAG,KAAA,KACAE,OAAA,KACAmN,WAAA,OAIA/P,EAAA+N,yBA+FAD,EAAA/L,UAAAkC,OAAA+L,OAAAhP,EAAAe,WACA+L,EAAA/L,UAAA+P,YAAA9Q,EAKA8M,EAAA/L,UAAAC,SAAA,EAKAiC,OAAA2K,eAAAd,EAAA/L,UAAA,WACA8M,IAAA,WAEA,OADAxL,MACAyC,EAAA,EAAqBA,EAAA1F,KAAA8N,UAAA/J,OAA2B2B,IAChD,OAAAiM,GAAA,EAAuBA,EAAA3R,KAAA8N,UAAApI,GAAA0I,SAAAnL,QAAAc,OAA+C4N,IACtE1O,EAAAuJ,KAAAxM,KAAA8N,UAAApI,GAAA0I,SAAAnL,QAAA0O,GAGA,OAAA1O,MAmBAyK,EAAA/L,UAAA2C,oBACA,SAAAxD,GACA,GAAA0O,IACAjN,cAAAvB,EAAAC,OAAAH,EAAA,QACA2B,gBAAAzB,EAAAC,OAAAH,EAAA,WAKA8Q,EAAAvD,EAAA0C,OAAAvB,EAAAxP,KAAA8N,UACA,SAAA0B,EAAAqC,GACA,GAAAtG,GAAAiE,EAAAjN,cAAAsP,EAAA1D,gBAAA5L,aACA,OAAAgJ,GACAA,EAGAiE,EAAA/M,gBACAoP,EAAA1D,gBAAA1L,kBAEAoP,EAAA7R,KAAA8N,UAAA8D,EAEA,OAAAC,GASAA,EAAAzD,SAAA9J,qBACAhC,KAAAkN,EAAAjN,eACAsP,EAAA1D,gBAAA5L,cAAA,GACAC,OAAAgN,EAAA/M,iBACAoP,EAAA1D,gBAAA5L,gBAAAiN,EAAAjN,cACAsP,EAAA1D,gBAAA1L,gBAAA,EACA,GACAqP,KAAAhR,EAAAgR,QAdApP,OAAA,KACAJ,KAAA,KACAE,OAAA,KACAO,KAAA,OAmBA2K,EAAA/L,UAAAyP,wBACA,WACA,MAAApR,MAAA8N,UAAAiE,MAAA,SAAAhE,GACA,MAAAA,GAAAK,SAAAgD,6BASA1D,EAAA/L,UAAA0B,iBACA,SAAAqB,EAAA6M,GACA,OAAA7L,GAAA,EAAqBA,EAAA1F,KAAA8N,UAAA/J,OAA2B2B,IAAA,CAChD,GAAAmM,GAAA7R,KAAA8N,UAAApI,GAEAtC,EAAAyO,EAAAzD,SAAA/K,iBAAAqB,GAAA,EACA,IAAAtB,EACA,MAAAA,GAGA,GAAAmO,EACA,WAGA,UAAArN,OAAA,IAAAQ,EAAA,+BAkBAgJ,EAAA/L,UAAA8P,qBACA,SAAA3Q,GACA,OAAA4E,GAAA,EAAqBA,EAAA1F,KAAA8N,UAAA/J,OAA2B2B,IAAA,CAChD,GAAAmM,GAAA7R,KAAA8N,UAAApI,EAIA,SAAAmM,EAAAzD,SAAAnL,QAAA6C,QAAA9E,EAAAC,OAAAH,EAAA,YAGA,GAAAkR,GAAAH,EAAAzD,SAAAqD,qBAAA3Q,EACA,IAAAkR,EAAA,CACA,GAAAC,IACA3P,KAAA0P,EAAA1P,MACAuP,EAAA1D,gBAAA5L,cAAA,GACAC,OAAAwP,EAAAxP,QACAqP,EAAA1D,gBAAA5L,gBAAAyP,EAAA1P,KACAuP,EAAA1D,gBAAA1L,gBAAA,EACA,GAEA,OAAAwP,KAIA,OACA3P,KAAA,KACAE,OAAA,OASAkL,EAAA/L,UAAA+M,eACA,SAAAlH,EAAAvB,GACAjG,KAAAuO,uBACAvO,KAAA2O,qBACA,QAAAjJ,GAAA,EAAqBA,EAAA1F,KAAA8N,UAAA/J,OAA2B2B,IAGhD,OAFAmM,GAAA7R,KAAA8N,UAAApI,GACAwM,EAAAL,EAAAzD,SAAAiB,mBACAsC,EAAA,EAAuBA,EAAAO,EAAAnO,OAA4B4N,IAAA,CACnD,GAAAxP,GAAA+P,EAAAP,GAEAjP,EAAAmP,EAAAzD,SAAAhN,SAAAqL,GAAAtK,EAAAO,OACA,QAAAmP,EAAAzD,SAAArM,aACAW,EAAA1B,EAAAuD,KAAAsN,EAAAzD,SAAArM,WAAAW,IAEA1C,KAAAoB,SAAAqC,IAAAf,GACAA,EAAA1C,KAAAoB,SAAA0E,QAAApD,EAEA,IAAAK,GAAA8O,EAAAzD,SAAA9M,OAAAmL,GAAAtK,EAAAY,KACA/C,MAAAsB,OAAAmC,IAAAV,GACAA,EAAA/C,KAAAsB,OAAAwE,QAAA/C,EAMA,IAAAoP,IACAzP,SACAH,cAAAJ,EAAAI,eACAsP,EAAA1D,gBAAA5L,cAAA,GACAE,gBAAAN,EAAAM,iBACAoP,EAAA1D,gBAAA5L,gBAAAJ,EAAAI,cACAsP,EAAA1D,gBAAA1L,gBAAA,EACA,GACAI,aAAAV,EAAAU,aACAC,eAAAX,EAAAW,eACAC,OAGA/C,MAAAuO,oBAAA/B,KAAA2F,GACA,gBAAAA,GAAAtP,cACA7C,KAAA2O,mBAAAnC,KAAA2F,GAKA7D,EAAAtO,KAAAuO,oBAAAvN,EAAAwK,qCACA8C,EAAAtO,KAAA2O,mBAAA3N,EAAAmK,6BAGAvL,EAAA8N,4BTsvCM,SAAS7N,EAAQD,GUvxEvB,QAAAwS,GAAAC,EAAAC,EAAA7B,EAAA8B,EAAAC,EAAA1B,GAUA,GAAA2B,GAAAC,KAAAC,OAAAL,EAAAD,GAAA,GAAAA,EACA9G,EAAAiH,EAAA/B,EAAA8B,EAAAE,IAAA,EACA,YAAAlH,EAEAkH,EAEAlH,EAAA,EAEA+G,EAAAG,EAAA,EAEAL,EAAAK,EAAAH,EAAA7B,EAAA8B,EAAAC,EAAA1B,GAKAA,GAAAlR,EAAAoP,kBACAsD,EAAAC,EAAAxO,OAAAuO,EAAA,GAEAG,EAKAA,EAAAJ,EAAA,EAEAD,EAAAC,EAAAI,EAAAhC,EAAA8B,EAAAC,EAAA1B,GAIAA,GAAAlR,EAAAoP,kBACAyD,EAEA,EAAAJ,EAAA,GAAAA,EA1DAzS,EAAAmP,qBAAA,EACAnP,EAAAoP,kBAAA,EAgFApP,EAAAmR,OAAA,SAAAN,EAAA8B,EAAAC,EAAA1B,GACA,OAAAyB,EAAAxO,OACA,QAGA,IAAA8G,GAAAuH,EAAA,GAAAG,EAAAxO,OAAA0M,EAAA8B,EACAC,EAAA1B,GAAAlR,EAAAmP,qBACA,MAAAlE,EACA,QAMA,MAAAA,EAAA,MACA,IAAA2H,EAAAD,EAAA1H,GAAA0H,EAAA1H,EAAA,UAGAA,CAGA,OAAAA,KVuzEM,SAAShL,EAAQD,GWz4EvB,QAAAgT,GAAAC,EAAAC,EAAAC,GACA,GAAAxC,GAAAsC,EAAAC,EACAD,GAAAC,GAAAD,EAAAE,GACAF,EAAAE,GAAAxC,EAWA,QAAAyC,GAAAC,EAAAC,GACA,MAAAR,MAAAS,MAAAF,EAAAP,KAAAU,UAAAF,EAAAD,IAeA,QAAAI,GAAAR,EAAAS,EAAA5S,EAAA6S,GAKA,GAAAA,EAAA7S,EAAA,CAYA,GAAA8S,GAAAR,EAAAtS,EAAA6S,GACA7N,EAAAhF,EAAA,CAEAkS,GAAAC,EAAAW,EAAAD,EASA,QARAE,GAAAZ,EAAAU,GAQA5B,EAAAjR,EAAqB6S,EAAA5B,EAAOA,IAC5B2B,EAAAT,EAAAlB,GAAA8B,IAAA,IACA/N,GAAA,EACAkN,EAAAC,EAAAnN,EAAAiM,GAIAiB,GAAAC,EAAAnN,EAAA,EAAAiM,EACA,IAAA+B,GAAAhO,EAAA,CAIA2N,GAAAR,EAAAS,EAAA5S,EAAAgT,EAAA,GACAL,EAAAR,EAAAS,EAAAI,EAAA,EAAAH,IAYA3T,EAAA0O,UAAA,SAAAuE,EAAAS,GACAD,EAAAR,EAAAS,EAAA,EAAAT,EAAA9O,OAAA,KX66EM,SAASlE,EAAQD,EAASM,GY3/EhC,QAAAW,GAAA8S,EAAAC,EAAAlP,EAAAmP,EAAAlP,GACA3E,KAAA8T,YACA9T,KAAA+T,kBACA/T,KAAAsC,KAAA,MAAAqR,EAAA,KAAAA,EACA3T,KAAAwC,OAAA,MAAAoR,EAAA,KAAAA,EACA5T,KAAA0C,OAAA,MAAAgC,EAAA,KAAAA,EACA1E,KAAA+C,KAAA,MAAA4B,EAAA,KAAAA,EACA3E,KAAAgU,IAAA,EACA,MAAAH,GAAA7T,KAAAyD,IAAAoQ,GAnCA,GAAAlT,GAAAT,EAAA,GAAAS,mBACAK,EAAAd,EAAA,GAIA+T,EAAA,UAGAC,EAAA,GAKAF,EAAA,oBAiCAnT,GAAAsT,wBACA,SAAAC,EAAAtS,EAAAuS,GAyFA,QAAAC,GAAAnS,EAAAoS,GACA,UAAApS,GAAAuN,SAAAvN,EAAAO,OACA8R,EAAA/Q,IAAA8Q,OACS,CACT,GAAA7R,GAAA2R,EACArT,EAAAuD,KAAA8P,EAAAlS,EAAAO,QACAP,EAAAO,MACA8R,GAAA/Q,IAAA,GAAA5C,GAAAsB,EAAAU,aACAV,EAAAW,eACAJ,EACA6R,EACApS,EAAAY,QAjGA,GAAAyR,GAAA,GAAA3T,GAMA4T,EAAAL,EAAAjM,MAAA8L,GACAS,EAAA,WACA,GAAAC,GAAAF,EAAA5M,QAEA+M,EAAAH,EAAA5M,SAAA,EACA,OAAA8M,GAAAC,GAIAC,EAAA,EAAA3D,EAAA,EAKA4D,EAAA,IAgEA,OA9DAhT,GAAAI,YAAA,SAAAC,GACA,UAAA2S,EAAA,CAGA,KAAAD,EAAA1S,EAAAI,eAMW,CAIX,GAAAwS,GAAAN,EAAA,GACAF,EAAAQ,EAAA9J,OAAA,EAAA9I,EAAAM,gBACAyO,EAOA,OANAuD,GAAA,GAAAM,EAAA9J,OAAA9I,EAAAM,gBACAyO,GACAA,EAAA/O,EAAAM,gBACA6R,EAAAQ,EAAAP,QAEAO,EAAA3S,GAhBAmS,EAAAQ,EAAAJ,KACAG,IACA3D,EAAA,EAqBA,KAAA2D,EAAA1S,EAAAI,eACAiS,EAAA/Q,IAAAiR,KACAG,GAEA,IAAA3D,EAAA/O,EAAAM,gBAAA,CACA,GAAAsS,GAAAN,EAAA,EACAD,GAAA/Q,IAAAsR,EAAA9J,OAAA,EAAA9I,EAAAM,kBACAgS,EAAA,GAAAM,EAAA9J,OAAA9I,EAAAM,iBACAyO,EAAA/O,EAAAM,gBAEAqS,EAAA3S,GACOnC,MAEPyU,EAAA1Q,OAAA,IACA+Q,GAEAR,EAAAQ,EAAAJ,KAGAF,EAAA/Q,IAAAgR,EAAAlQ,KAAA,MAIAzC,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAC,GAAAtB,EAAAuB,iBAAAF,EACA,OAAAC,IACA,MAAAiR,IACAlR,EAAAnC,EAAAuD,KAAA8P,EAAAlR,IAEAqR,EAAAlR,iBAAAH,EAAAC,MAIAoR,GAwBA3T,EAAAc,UAAA8B,IAAA,SAAAuR,GACA,GAAAhK,MAAAiK,QAAAD,GACAA,EAAA9R,QAAA,SAAAgS,GACAlV,KAAAyD,IAAAyR,IACOlV,UAEP,KAAAgV,EAAAhB,IAAA,gBAAAgB,GAMA,SAAA3M,WACA,8EAAA2M,EANAA,IACAhV,KAAA8T,SAAAtH,KAAAwI,GAQA,MAAAhV,OASAa,EAAAc,UAAAwT,QAAA,SAAAH,GACA,GAAAhK,MAAAiK,QAAAD,GACA,OAAAtP,GAAAsP,EAAAjR,OAAA,EAAmC2B,GAAA,EAAQA,IAC3C1F,KAAAmV,QAAAH,EAAAtP,QAGA,KAAAsP,EAAAhB,IAAA,gBAAAgB,GAIA,SAAA3M,WACA,8EAAA2M,EAJAhV,MAAA8T,SAAAsB,QAAAJ,GAOA,MAAAhV,OAUAa,EAAAc,UAAA0T,KAAA,SAAAC,GAEA,OADAJ,GACAxP,EAAA,EAAAC,EAAA3F,KAAA8T,SAAA/P,OAA+C4B,EAAAD,EAASA,IACxDwP,EAAAlV,KAAA8T,SAAApO,GACAwP,EAAAlB,GACAkB,EAAAG,KAAAC,GAGA,KAAAJ,GACAI,EAAAJ,GAAsBxS,OAAA1C,KAAA0C,OACtBJ,KAAAtC,KAAAsC,KACAE,OAAAxC,KAAAwC,OACAO,KAAA/C,KAAA+C,QAYAlC,EAAAc,UAAA4C,KAAA,SAAAgR,GACA,GAAAC,GACA9P,EACAC,EAAA3F,KAAA8T,SAAA/P,MACA,IAAA4B,EAAA,GAEA,IADA6P,KACA9P,EAAA,EAAiBC,EAAA,EAAAD,EAAWA,IAC5B8P,EAAAhJ,KAAAxM,KAAA8T,SAAApO,IACA8P,EAAAhJ,KAAA+I,EAEAC,GAAAhJ,KAAAxM,KAAA8T,SAAApO,IACA1F,KAAA8T,SAAA0B,EAEA,MAAAxV,OAUAa,EAAAc,UAAA8T,aAAA,SAAAC,EAAAC,GACA,GAAAC,GAAA5V,KAAA8T,SAAA9T,KAAA8T,SAAA/P,OAAA,EAUA,OATA6R,GAAA5B,GACA4B,EAAAH,aAAAC,EAAAC,GAEA,gBAAAC,GACA5V,KAAA8T,SAAA9T,KAAA8T,SAAA/P,OAAA,GAAA6R,EAAAjL,QAAA+K,EAAAC,GAGA3V,KAAA8T,SAAAtH,KAAA,GAAA7B,QAAA+K,EAAAC,IAEA3V,MAUAa,EAAAc,UAAA2B,iBACA,SAAAI,EAAAC,GACA3D,KAAA+T,eAAA/S,EAAA4C,YAAAF,IAAAC,GASA9C,EAAAc,UAAAkU,mBACA,SAAAP,GACA,OAAA5P,GAAA,EAAAC,EAAA3F,KAAA8T,SAAA/P,OAAiD4B,EAAAD,EAASA,IAC1D1F,KAAA8T,SAAApO,GAAAsO,IACAhU,KAAA8T,SAAApO,GAAAmQ,mBAAAP,EAKA,QADArS,GAAAY,OAAAC,KAAA9D,KAAA+T,gBACArO,EAAA,EAAAC,EAAA1C,EAAAc,OAA2C4B,EAAAD,EAASA,IACpD4P,EAAAtU,EAAAkK,cAAAjI,EAAAyC,IAAA1F,KAAA+T,eAAA9Q,EAAAyC,MAQA7E,EAAAc,UAAA8E,SAAA,WACA,GAAA0J,GAAA,EAIA,OAHAnQ,MAAAqV,KAAA,SAAAH,GACA/E,GAAA+E,IAEA/E,GAOAtP,EAAAc,UAAAmU,sBAAA,SAAAhV,GACA,GAAAuB,IACAkS,KAAA,GACAjS,KAAA,EACAE,OAAA,GAEA0D,EAAA,GAAAvF,GAAAG,GACAiV,GAAA,EACAC,EAAA,KACAC,EAAA,KACAC,EAAA,KACAC,EAAA,IAqEA,OApEAnW,MAAAqV,KAAA,SAAAH,EAAAtS,GACAP,EAAAkS,MAAAW,EACA,OAAAtS,EAAAF,QACA,OAAAE,EAAAN,MACA,OAAAM,EAAAJ,SACAwT,IAAApT,EAAAF,QACAuT,IAAArT,EAAAN,MACA4T,IAAAtT,EAAAJ,QACA2T,IAAAvT,EAAAG,OACAmD,EAAAlD,YACAN,OAAAE,EAAAF,OACAE,UACAN,KAAAM,EAAAN,KACAE,OAAAI,EAAAJ,QAEAH,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,QAEAO,KAAAH,EAAAG,OAGAiT,EAAApT,EAAAF,OACAuT,EAAArT,EAAAN,KACA4T,EAAAtT,EAAAJ,OACA2T,EAAAvT,EAAAG,KACAgT,GAAA,GACOA,IACP7P,EAAAlD,YACAX,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,UAGAwT,EAAA,KACAD,GAAA,EAEA,QAAAxJ,GAAA,EAAAxI,EAAAmR,EAAAnR,OAA8CA,EAAAwI,EAAcA,IAC5D2I,EAAApN,WAAAyE,KAAA2H,GACA7R,EAAAC,OACAD,EAAAG,OAAA,EAEA+J,EAAA,IAAAxI,GACAiS,EAAA,KACAD,GAAA,GACWA,GACX7P,EAAAlD,YACAN,OAAAE,EAAAF,OACAE,UACAN,KAAAM,EAAAN,KACAE,OAAAI,EAAAJ,QAEAH,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,QAEAO,KAAAH,EAAAG,QAIAV,EAAAG,WAIAxC,KAAA6V,mBAAA,SAAA1S,EAAAiT,GACAlQ,EAAA5C,iBAAAH,EAAAiT,MAGY7B,KAAAlS,EAAAkS,KAAArO,QAGZtG,EAAAiB","file":"source-map.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*\n\t * Copyright 2009-2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE.txt or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\texports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\texports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;\n\texports.SourceNode = __webpack_require__(10).SourceNode;\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t var base64VLQ = __webpack_require__(2);\n\t var util = __webpack_require__(4);\n\t var ArraySet = __webpack_require__(5).ArraySet;\n\t var MappingList = __webpack_require__(6).MappingList;\n\t\n\t /**\n\t * An instance of the SourceMapGenerator represents a source map which is\n\t * being built incrementally. You may pass an object with the following\n\t * properties:\n\t *\n\t * - file: The filename of the generated source.\n\t * - sourceRoot: A root for all relative URLs in this source map.\n\t */\n\t function SourceMapGenerator(aArgs) {\n\t if (!aArgs) {\n\t aArgs = {};\n\t }\n\t this._file = util.getArg(aArgs, 'file', null);\n\t this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n\t this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t this._mappings = new MappingList();\n\t this._sourcesContents = null;\n\t }\n\t\n\t SourceMapGenerator.prototype._version = 3;\n\t\n\t /**\n\t * Creates a new SourceMapGenerator based on a SourceMapConsumer\n\t *\n\t * @param aSourceMapConsumer The SourceMap.\n\t */\n\t SourceMapGenerator.fromSourceMap =\n\t function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n\t var sourceRoot = aSourceMapConsumer.sourceRoot;\n\t var generator = new SourceMapGenerator({\n\t file: aSourceMapConsumer.file,\n\t sourceRoot: sourceRoot\n\t });\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t var newMapping = {\n\t generated: {\n\t line: mapping.generatedLine,\n\t column: mapping.generatedColumn\n\t }\n\t };\n\t\n\t if (mapping.source != null) {\n\t newMapping.source = mapping.source;\n\t if (sourceRoot != null) {\n\t newMapping.source = util.relative(sourceRoot, newMapping.source);\n\t }\n\t\n\t newMapping.original = {\n\t line: mapping.originalLine,\n\t column: mapping.originalColumn\n\t };\n\t\n\t if (mapping.name != null) {\n\t newMapping.name = mapping.name;\n\t }\n\t }\n\t\n\t generator.addMapping(newMapping);\n\t });\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t generator.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t return generator;\n\t };\n\t\n\t /**\n\t * Add a single mapping from original source line and column to the generated\n\t * source's line and column for this source map being created. The mapping\n\t * object should have the following properties:\n\t *\n\t * - generated: An object with the generated line and column positions.\n\t * - original: An object with the original line and column positions.\n\t * - source: The original source file (relative to the sourceRoot).\n\t * - name: An optional original token name for this mapping.\n\t */\n\t SourceMapGenerator.prototype.addMapping =\n\t function SourceMapGenerator_addMapping(aArgs) {\n\t var generated = util.getArg(aArgs, 'generated');\n\t var original = util.getArg(aArgs, 'original', null);\n\t var source = util.getArg(aArgs, 'source', null);\n\t var name = util.getArg(aArgs, 'name', null);\n\t\n\t if (!this._skipValidation) {\n\t this._validateMapping(generated, original, source, name);\n\t }\n\t\n\t if (source != null && !this._sources.has(source)) {\n\t this._sources.add(source);\n\t }\n\t\n\t if (name != null && !this._names.has(name)) {\n\t this._names.add(name);\n\t }\n\t\n\t this._mappings.add({\n\t generatedLine: generated.line,\n\t generatedColumn: generated.column,\n\t originalLine: original != null && original.line,\n\t originalColumn: original != null && original.column,\n\t source: source,\n\t name: name\n\t });\n\t };\n\t\n\t /**\n\t * Set the source content for a source file.\n\t */\n\t SourceMapGenerator.prototype.setSourceContent =\n\t function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n\t var source = aSourceFile;\n\t if (this._sourceRoot != null) {\n\t source = util.relative(this._sourceRoot, source);\n\t }\n\t\n\t if (aSourceContent != null) {\n\t // Add the source content to the _sourcesContents map.\n\t // Create a new _sourcesContents map if the property is null.\n\t if (!this._sourcesContents) {\n\t this._sourcesContents = {};\n\t }\n\t this._sourcesContents[util.toSetString(source)] = aSourceContent;\n\t } else if (this._sourcesContents) {\n\t // Remove the source file from the _sourcesContents map.\n\t // If the _sourcesContents map is empty, set the property to null.\n\t delete this._sourcesContents[util.toSetString(source)];\n\t if (Object.keys(this._sourcesContents).length === 0) {\n\t this._sourcesContents = null;\n\t }\n\t }\n\t };\n\t\n\t /**\n\t * Applies the mappings of a sub-source-map for a specific source file to the\n\t * source map being generated. Each mapping to the supplied source file is\n\t * rewritten using the supplied source map. Note: The resolution for the\n\t * resulting mappings is the minimium of this map and the supplied map.\n\t *\n\t * @param aSourceMapConsumer The source map to be applied.\n\t * @param aSourceFile Optional. The filename of the source file.\n\t * If omitted, SourceMapConsumer's file property will be used.\n\t * @param aSourceMapPath Optional. The dirname of the path to the source map\n\t * to be applied. If relative, it is relative to the SourceMapConsumer.\n\t * This parameter is needed when the two source maps aren't in the same\n\t * directory, and the source map to be applied contains relative source\n\t * paths. If so, those relative source paths need to be rewritten\n\t * relative to the SourceMapGenerator.\n\t */\n\t SourceMapGenerator.prototype.applySourceMap =\n\t function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n\t var sourceFile = aSourceFile;\n\t // If aSourceFile is omitted, we will use the file property of the SourceMap\n\t if (aSourceFile == null) {\n\t if (aSourceMapConsumer.file == null) {\n\t throw new Error(\n\t 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n\t 'or the source map\\'s \"file\" property. Both were omitted.'\n\t );\n\t }\n\t sourceFile = aSourceMapConsumer.file;\n\t }\n\t var sourceRoot = this._sourceRoot;\n\t // Make \"sourceFile\" relative if an absolute Url is passed.\n\t if (sourceRoot != null) {\n\t sourceFile = util.relative(sourceRoot, sourceFile);\n\t }\n\t // Applying the SourceMap can add and remove items from the sources and\n\t // the names array.\n\t var newSources = new ArraySet();\n\t var newNames = new ArraySet();\n\t\n\t // Find mappings for the \"sourceFile\"\n\t this._mappings.unsortedForEach(function (mapping) {\n\t if (mapping.source === sourceFile && mapping.originalLine != null) {\n\t // Check if it can be mapped by the source map, then update the mapping.\n\t var original = aSourceMapConsumer.originalPositionFor({\n\t line: mapping.originalLine,\n\t column: mapping.originalColumn\n\t });\n\t if (original.source != null) {\n\t // Copy mapping\n\t mapping.source = original.source;\n\t if (aSourceMapPath != null) {\n\t mapping.source = util.join(aSourceMapPath, mapping.source)\n\t }\n\t if (sourceRoot != null) {\n\t mapping.source = util.relative(sourceRoot, mapping.source);\n\t }\n\t mapping.originalLine = original.line;\n\t mapping.originalColumn = original.column;\n\t if (original.name != null) {\n\t mapping.name = original.name;\n\t }\n\t }\n\t }\n\t\n\t var source = mapping.source;\n\t if (source != null && !newSources.has(source)) {\n\t newSources.add(source);\n\t }\n\t\n\t var name = mapping.name;\n\t if (name != null && !newNames.has(name)) {\n\t newNames.add(name);\n\t }\n\t\n\t }, this);\n\t this._sources = newSources;\n\t this._names = newNames;\n\t\n\t // Copy sourcesContents of applied map.\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aSourceMapPath != null) {\n\t sourceFile = util.join(aSourceMapPath, sourceFile);\n\t }\n\t if (sourceRoot != null) {\n\t sourceFile = util.relative(sourceRoot, sourceFile);\n\t }\n\t this.setSourceContent(sourceFile, content);\n\t }\n\t }, this);\n\t };\n\t\n\t /**\n\t * A mapping can have one of the three levels of data:\n\t *\n\t * 1. Just the generated position.\n\t * 2. The Generated position, original position, and original source.\n\t * 3. Generated and original position, original source, as well as a name\n\t * token.\n\t *\n\t * To maintain consistency, we validate that any new mapping being added falls\n\t * in to one of these categories.\n\t */\n\t SourceMapGenerator.prototype._validateMapping =\n\t function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n\t aName) {\n\t if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && !aOriginal && !aSource && !aName) {\n\t // Case 1.\n\t return;\n\t }\n\t else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && aOriginal.line > 0 && aOriginal.column >= 0\n\t && aSource) {\n\t // Cases 2 and 3.\n\t return;\n\t }\n\t else {\n\t throw new Error('Invalid mapping: ' + JSON.stringify({\n\t generated: aGenerated,\n\t source: aSource,\n\t original: aOriginal,\n\t name: aName\n\t }));\n\t }\n\t };\n\t\n\t /**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\t SourceMapGenerator.prototype._serializeMappings =\n\t function SourceMapGenerator_serializeMappings() {\n\t var previousGeneratedColumn = 0;\n\t var previousGeneratedLine = 1;\n\t var previousOriginalColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousName = 0;\n\t var previousSource = 0;\n\t var result = '';\n\t var mapping;\n\t var nameIdx;\n\t var sourceIdx;\n\t\n\t var mappings = this._mappings.toArray();\n\t for (var i = 0, len = mappings.length; i < len; i++) {\n\t mapping = mappings[i];\n\t\n\t if (mapping.generatedLine !== previousGeneratedLine) {\n\t previousGeneratedColumn = 0;\n\t while (mapping.generatedLine !== previousGeneratedLine) {\n\t result += ';';\n\t previousGeneratedLine++;\n\t }\n\t }\n\t else {\n\t if (i > 0) {\n\t if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t continue;\n\t }\n\t result += ',';\n\t }\n\t }\n\t\n\t result += base64VLQ.encode(mapping.generatedColumn\n\t - previousGeneratedColumn);\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (mapping.source != null) {\n\t sourceIdx = this._sources.indexOf(mapping.source);\n\t result += base64VLQ.encode(sourceIdx - previousSource);\n\t previousSource = sourceIdx;\n\t\n\t // lines are stored 0-based in SourceMap spec version 3\n\t result += base64VLQ.encode(mapping.originalLine - 1\n\t - previousOriginalLine);\n\t previousOriginalLine = mapping.originalLine - 1;\n\t\n\t result += base64VLQ.encode(mapping.originalColumn\n\t - previousOriginalColumn);\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (mapping.name != null) {\n\t nameIdx = this._names.indexOf(mapping.name);\n\t result += base64VLQ.encode(nameIdx - previousName);\n\t previousName = nameIdx;\n\t }\n\t }\n\t }\n\t\n\t return result;\n\t };\n\t\n\t SourceMapGenerator.prototype._generateSourcesContent =\n\t function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t return aSources.map(function (source) {\n\t if (!this._sourcesContents) {\n\t return null;\n\t }\n\t if (aSourceRoot != null) {\n\t source = util.relative(aSourceRoot, source);\n\t }\n\t var key = util.toSetString(source);\n\t return Object.prototype.hasOwnProperty.call(this._sourcesContents,\n\t key)\n\t ? this._sourcesContents[key]\n\t : null;\n\t }, this);\n\t };\n\t\n\t /**\n\t * Externalize the source map.\n\t */\n\t SourceMapGenerator.prototype.toJSON =\n\t function SourceMapGenerator_toJSON() {\n\t var map = {\n\t version: this._version,\n\t sources: this._sources.toArray(),\n\t names: this._names.toArray(),\n\t mappings: this._serializeMappings()\n\t };\n\t if (this._file != null) {\n\t map.file = this._file;\n\t }\n\t if (this._sourceRoot != null) {\n\t map.sourceRoot = this._sourceRoot;\n\t }\n\t if (this._sourcesContents) {\n\t map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t }\n\t\n\t return map;\n\t };\n\t\n\t /**\n\t * Render the source map being generated to a string.\n\t */\n\t SourceMapGenerator.prototype.toString =\n\t function SourceMapGenerator_toString() {\n\t return JSON.stringify(this.toJSON());\n\t };\n\t\n\t exports.SourceMapGenerator = SourceMapGenerator;\n\t}\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above\n\t * copyright notice, this list of conditions and the following\n\t * disclaimer in the documentation and/or other materials provided\n\t * with the distribution.\n\t * * Neither the name of Google Inc. nor the names of its\n\t * contributors may be used to endorse or promote products derived\n\t * from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t{\n\t var base64 = __webpack_require__(3);\n\t\n\t // A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t // length quantities we use in the source map spec, the first bit is the sign,\n\t // the next four bits are the actual value, and the 6th bit is the\n\t // continuation bit. The continuation bit tells us whether there are more\n\t // digits in this value following this digit.\n\t //\n\t // Continuation\n\t // | Sign\n\t // | |\n\t // V V\n\t // 101011\n\t\n\t var VLQ_BASE_SHIFT = 5;\n\t\n\t // binary: 100000\n\t var VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t // binary: 011111\n\t var VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t // binary: 100000\n\t var VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t /**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\t function toVLQSigned(aValue) {\n\t return aValue < 0\n\t ? ((-aValue) << 1) + 1\n\t : (aValue << 1) + 0;\n\t }\n\t\n\t /**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\t function fromVLQSigned(aValue) {\n\t var isNegative = (aValue & 1) === 1;\n\t var shifted = aValue >> 1;\n\t return isNegative\n\t ? -shifted\n\t : shifted;\n\t }\n\t\n\t /**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\t exports.encode = function base64VLQ_encode(aValue) {\n\t var encoded = \"\";\n\t var digit;\n\t\n\t var vlq = toVLQSigned(aValue);\n\t\n\t do {\n\t digit = vlq & VLQ_BASE_MASK;\n\t vlq >>>= VLQ_BASE_SHIFT;\n\t if (vlq > 0) {\n\t // There are still more digits in this value, so we must make sure the\n\t // continuation bit is marked.\n\t digit |= VLQ_CONTINUATION_BIT;\n\t }\n\t encoded += base64.encode(digit);\n\t } while (vlq > 0);\n\t\n\t return encoded;\n\t };\n\t\n\t /**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\t exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t var strLen = aStr.length;\n\t var result = 0;\n\t var shift = 0;\n\t var continuation, digit;\n\t\n\t do {\n\t if (aIndex >= strLen) {\n\t throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t }\n\t\n\t digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t if (digit === -1) {\n\t throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t }\n\t\n\t continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t digit &= VLQ_BASE_MASK;\n\t result = result + (digit << shift);\n\t shift += VLQ_BASE_SHIFT;\n\t } while (continuation);\n\t\n\t aOutParam.value = fromVLQSigned(result);\n\t aOutParam.rest = aIndex;\n\t };\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t /**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\t exports.encode = function (number) {\n\t if (0 <= number && number < intToCharMap.length) {\n\t return intToCharMap[number];\n\t }\n\t throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t };\n\t\n\t /**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\t exports.decode = function (charCode) {\n\t var bigA = 65; // 'A'\n\t var bigZ = 90; // 'Z'\n\t\n\t var littleA = 97; // 'a'\n\t var littleZ = 122; // 'z'\n\t\n\t var zero = 48; // '0'\n\t var nine = 57; // '9'\n\t\n\t var plus = 43; // '+'\n\t var slash = 47; // '/'\n\t\n\t var littleOffset = 26;\n\t var numberOffset = 52;\n\t\n\t // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t if (bigA <= charCode && charCode <= bigZ) {\n\t return (charCode - bigA);\n\t }\n\t\n\t // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t if (littleA <= charCode && charCode <= littleZ) {\n\t return (charCode - littleA + littleOffset);\n\t }\n\t\n\t // 52 - 61: 0123456789\n\t if (zero <= charCode && charCode <= nine) {\n\t return (charCode - zero + numberOffset);\n\t }\n\t\n\t // 62: +\n\t if (charCode == plus) {\n\t return 62;\n\t }\n\t\n\t // 63: /\n\t if (charCode == slash) {\n\t return 63;\n\t }\n\t\n\t // Invalid base64 digit.\n\t return -1;\n\t };\n\t}\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t /**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\t function getArg(aArgs, aName, aDefaultValue) {\n\t if (aName in aArgs) {\n\t return aArgs[aName];\n\t } else if (arguments.length === 3) {\n\t return aDefaultValue;\n\t } else {\n\t throw new Error('\"' + aName + '\" is a required argument.');\n\t }\n\t }\n\t exports.getArg = getArg;\n\t\n\t var urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\n\t var dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\t function urlParse(aUrl) {\n\t var match = aUrl.match(urlRegexp);\n\t if (!match) {\n\t return null;\n\t }\n\t return {\n\t scheme: match[1],\n\t auth: match[2],\n\t host: match[3],\n\t port: match[4],\n\t path: match[5]\n\t };\n\t }\n\t exports.urlParse = urlParse;\n\t\n\t function urlGenerate(aParsedUrl) {\n\t var url = '';\n\t if (aParsedUrl.scheme) {\n\t url += aParsedUrl.scheme + ':';\n\t }\n\t url += '//';\n\t if (aParsedUrl.auth) {\n\t url += aParsedUrl.auth + '@';\n\t }\n\t if (aParsedUrl.host) {\n\t url += aParsedUrl.host;\n\t }\n\t if (aParsedUrl.port) {\n\t url += \":\" + aParsedUrl.port\n\t }\n\t if (aParsedUrl.path) {\n\t url += aParsedUrl.path;\n\t }\n\t return url;\n\t }\n\t exports.urlGenerate = urlGenerate;\n\t\n\t /**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consequtive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\t function normalize(aPath) {\n\t var path = aPath;\n\t var url = urlParse(aPath);\n\t if (url) {\n\t if (!url.path) {\n\t return aPath;\n\t }\n\t path = url.path;\n\t }\n\t var isAbsolute = exports.isAbsolute(path);\n\t\n\t var parts = path.split(/\\/+/);\n\t for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t part = parts[i];\n\t if (part === '.') {\n\t parts.splice(i, 1);\n\t } else if (part === '..') {\n\t up++;\n\t } else if (up > 0) {\n\t if (part === '') {\n\t // The first part is blank if the path is absolute. Trying to go\n\t // above the root is a no-op. Therefore we can remove all '..' parts\n\t // directly after the root.\n\t parts.splice(i + 1, up);\n\t up = 0;\n\t } else {\n\t parts.splice(i, 2);\n\t up--;\n\t }\n\t }\n\t }\n\t path = parts.join('/');\n\t\n\t if (path === '') {\n\t path = isAbsolute ? '/' : '.';\n\t }\n\t\n\t if (url) {\n\t url.path = path;\n\t return urlGenerate(url);\n\t }\n\t return path;\n\t }\n\t exports.normalize = normalize;\n\t\n\t /**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t * first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t * is updated with the result and aRoot is returned. Otherwise the result\n\t * is returned.\n\t * - If aPath is absolute, the result is aPath.\n\t * - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\t function join(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t if (aPath === \"\") {\n\t aPath = \".\";\n\t }\n\t var aPathUrl = urlParse(aPath);\n\t var aRootUrl = urlParse(aRoot);\n\t if (aRootUrl) {\n\t aRoot = aRootUrl.path || '/';\n\t }\n\t\n\t // `join(foo, '//www.example.org')`\n\t if (aPathUrl && !aPathUrl.scheme) {\n\t if (aRootUrl) {\n\t aPathUrl.scheme = aRootUrl.scheme;\n\t }\n\t return urlGenerate(aPathUrl);\n\t }\n\t\n\t if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t return aPath;\n\t }\n\t\n\t // `join('http://', 'www.example.com')`\n\t if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t aRootUrl.host = aPath;\n\t return urlGenerate(aRootUrl);\n\t }\n\t\n\t var joined = aPath.charAt(0) === '/'\n\t ? aPath\n\t : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t if (aRootUrl) {\n\t aRootUrl.path = joined;\n\t return urlGenerate(aRootUrl);\n\t }\n\t return joined;\n\t }\n\t exports.join = join;\n\t\n\t exports.isAbsolute = function (aPath) {\n\t return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n\t };\n\t\n\t /**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\t function relative(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t\n\t aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t // It is possible for the path to be above the root. In this case, simply\n\t // checking whether the root is a prefix of the path won't work. Instead, we\n\t // need to remove components from the root one by one, until either we find\n\t // a prefix that fits, or we run out of components to remove.\n\t var level = 0;\n\t while (aPath.indexOf(aRoot + '/') !== 0) {\n\t var index = aRoot.lastIndexOf(\"/\");\n\t if (index < 0) {\n\t return aPath;\n\t }\n\t\n\t // If the only part of the root that is left is the scheme (i.e. http://,\n\t // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t // have exhausted all components, so the path is not relative to the root.\n\t aRoot = aRoot.slice(0, index);\n\t if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t return aPath;\n\t }\n\t\n\t ++level;\n\t }\n\t\n\t // Make sure we add a \"../\" for each component we removed from the root.\n\t return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t }\n\t exports.relative = relative;\n\t\n\t /**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\t function toSetString(aStr) {\n\t return '$' + aStr;\n\t }\n\t exports.toSetString = toSetString;\n\t\n\t function fromSetString(aStr) {\n\t return aStr.substr(1);\n\t }\n\t exports.fromSetString = fromSetString;\n\t\n\t /**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\t function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t var cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0 || onlyCompareOriginal) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t }\n\t exports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t /**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\t function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0 || onlyCompareGenerated) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.source - mappingB.source;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return mappingA.name - mappingB.name;\n\t }\n\t exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\t function strcmp(aStr1, aStr2) {\n\t if (aStr1 === aStr2) {\n\t return 0;\n\t }\n\t\n\t if (aStr1 > aStr2) {\n\t return 1;\n\t }\n\t\n\t return -1;\n\t }\n\t\n\t /**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\t function compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t }\n\t exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\t}\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t var util = __webpack_require__(4);\n\t\n\t /**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\t function ArraySet() {\n\t this._array = [];\n\t this._set = {};\n\t }\n\t\n\t /**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\t ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t var set = new ArraySet();\n\t for (var i = 0, len = aArray.length; i < len; i++) {\n\t set.add(aArray[i], aAllowDuplicates);\n\t }\n\t return set;\n\t };\n\t\n\t /**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\t ArraySet.prototype.size = function ArraySet_size() {\n\t return Object.getOwnPropertyNames(this._set).length;\n\t };\n\t\n\t /**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\t ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t var sStr = util.toSetString(aStr);\n\t var isDuplicate = this._set.hasOwnProperty(sStr);\n\t var idx = this._array.length;\n\t if (!isDuplicate || aAllowDuplicates) {\n\t this._array.push(aStr);\n\t }\n\t if (!isDuplicate) {\n\t this._set[sStr] = idx;\n\t }\n\t };\n\t\n\t /**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\t ArraySet.prototype.has = function ArraySet_has(aStr) {\n\t var sStr = util.toSetString(aStr);\n\t return this._set.hasOwnProperty(sStr);\n\t };\n\t\n\t /**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\t ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t var sStr = util.toSetString(aStr);\n\t if (this._set.hasOwnProperty(sStr)) {\n\t return this._set[sStr];\n\t }\n\t throw new Error('\"' + aStr + '\" is not in the set.');\n\t };\n\t\n\t /**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\t ArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t if (aIdx >= 0 && aIdx < this._array.length) {\n\t return this._array[aIdx];\n\t }\n\t throw new Error('No element indexed by ' + aIdx);\n\t };\n\t\n\t /**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\t ArraySet.prototype.toArray = function ArraySet_toArray() {\n\t return this._array.slice();\n\t };\n\t\n\t exports.ArraySet = ArraySet;\n\t}\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t var util = __webpack_require__(4);\n\t\n\t /**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\t function generatedPositionAfter(mappingA, mappingB) {\n\t // Optimized for most common case\n\t var lineA = mappingA.generatedLine;\n\t var lineB = mappingB.generatedLine;\n\t var columnA = mappingA.generatedColumn;\n\t var columnB = mappingB.generatedColumn;\n\t return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t }\n\t\n\t /**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\t function MappingList() {\n\t this._array = [];\n\t this._sorted = true;\n\t // Serves as infimum\n\t this._last = {generatedLine: -1, generatedColumn: 0};\n\t }\n\t\n\t /**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\t MappingList.prototype.unsortedForEach =\n\t function MappingList_forEach(aCallback, aThisArg) {\n\t this._array.forEach(aCallback, aThisArg);\n\t };\n\t\n\t /**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\t MappingList.prototype.add = function MappingList_add(aMapping) {\n\t if (generatedPositionAfter(this._last, aMapping)) {\n\t this._last = aMapping;\n\t this._array.push(aMapping);\n\t } else {\n\t this._sorted = false;\n\t this._array.push(aMapping);\n\t }\n\t };\n\t\n\t /**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\t MappingList.prototype.toArray = function MappingList_toArray() {\n\t if (!this._sorted) {\n\t this._array.sort(util.compareByGeneratedPositionsInflated);\n\t this._sorted = true;\n\t }\n\t return this._array;\n\t };\n\t\n\t exports.MappingList = MappingList;\n\t}\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t var util = __webpack_require__(4);\n\t var binarySearch = __webpack_require__(8);\n\t var ArraySet = __webpack_require__(5).ArraySet;\n\t var base64VLQ = __webpack_require__(2);\n\t var quickSort = __webpack_require__(9).quickSort;\n\t\n\t function SourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t return sourceMap.sections != null\n\t ? new IndexedSourceMapConsumer(sourceMap)\n\t : new BasicSourceMapConsumer(sourceMap);\n\t }\n\t\n\t SourceMapConsumer.fromSourceMap = function(aSourceMap) {\n\t return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n\t }\n\t\n\t /**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\t SourceMapConsumer.prototype._version = 3;\n\t\n\t // `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t // parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t // are lazily instantiated, accessed via the `_generatedMappings` and\n\t // `_originalMappings` getters respectively, and we only parse the mappings\n\t // and create these arrays once queried for a source location. We jump through\n\t // these hoops because there can be many thousands of mappings, and parsing\n\t // them is expensive, so we only want to do it if we must.\n\t //\n\t // Each object in the arrays is of the form:\n\t //\n\t // {\n\t // generatedLine: The line number in the generated code,\n\t // generatedColumn: The column number in the generated code,\n\t // source: The path to the original source file that generated this\n\t // chunk of code,\n\t // originalLine: The line number in the original source that\n\t // corresponds to this chunk of generated code,\n\t // originalColumn: The column number in the original source that\n\t // corresponds to this chunk of generated code,\n\t // name: The name of the original symbol which generated this chunk of\n\t // code.\n\t // }\n\t //\n\t // All properties except for `generatedLine` and `generatedColumn` can be\n\t // `null`.\n\t //\n\t // `_generatedMappings` is ordered by the generated positions.\n\t //\n\t // `_originalMappings` is ordered by the original positions.\n\t\n\t SourceMapConsumer.prototype.__generatedMappings = null;\n\t Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t get: function () {\n\t if (!this.__generatedMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__generatedMappings;\n\t }\n\t });\n\t\n\t SourceMapConsumer.prototype.__originalMappings = null;\n\t Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t get: function () {\n\t if (!this.__originalMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__originalMappings;\n\t }\n\t });\n\t\n\t SourceMapConsumer.prototype._charIsMappingSeparator =\n\t function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t var c = aStr.charAt(index);\n\t return c === \";\" || c === \",\";\n\t };\n\t\n\t /**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\t SourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t throw new Error(\"Subclasses must implement _parseMappings\");\n\t };\n\t\n\t SourceMapConsumer.GENERATED_ORDER = 1;\n\t SourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\t SourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\t SourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t /**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t * The function that is called with each mapping.\n\t * @param Object aContext\n\t * Optional. If specified, this object will be the value of `this` every\n\t * time that `aCallback` is called.\n\t * @param aOrder\n\t * Either `SourceMapConsumer.GENERATED_ORDER` or\n\t * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t * iterate over the mappings sorted by the generated file's line/column\n\t * order or the original's source/line/column order, respectively. Defaults to\n\t * `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\t SourceMapConsumer.prototype.eachMapping =\n\t function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t var context = aContext || null;\n\t var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t var mappings;\n\t switch (order) {\n\t case SourceMapConsumer.GENERATED_ORDER:\n\t mappings = this._generatedMappings;\n\t break;\n\t case SourceMapConsumer.ORIGINAL_ORDER:\n\t mappings = this._originalMappings;\n\t break;\n\t default:\n\t throw new Error(\"Unknown order of iteration.\");\n\t }\n\t\n\t var sourceRoot = this.sourceRoot;\n\t mappings.map(function (mapping) {\n\t var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t if (source != null && sourceRoot != null) {\n\t source = util.join(sourceRoot, source);\n\t }\n\t return {\n\t source: source,\n\t generatedLine: mapping.generatedLine,\n\t generatedColumn: mapping.generatedColumn,\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: mapping.name === null ? null : this._names.at(mapping.name)\n\t };\n\t }, this).forEach(aCallback, context);\n\t };\n\t\n\t /**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: Optional. the column number in the original source.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\t SourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t var line = util.getArg(aArgs, 'line');\n\t\n\t // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t // returns the index of the closest mapping less than the needle. By\n\t // setting needle.originalColumn to 0, we thus find the last mapping for\n\t // the given line, provided such a mapping exists.\n\t var needle = {\n\t source: util.getArg(aArgs, 'source'),\n\t originalLine: line,\n\t originalColumn: util.getArg(aArgs, 'column', 0)\n\t };\n\t\n\t if (this.sourceRoot != null) {\n\t needle.source = util.relative(this.sourceRoot, needle.source);\n\t }\n\t if (!this._sources.has(needle.source)) {\n\t return [];\n\t }\n\t needle.source = this._sources.indexOf(needle.source);\n\t\n\t var mappings = [];\n\t\n\t var index = this._findMapping(needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t binarySearch.LEAST_UPPER_BOUND);\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (aArgs.column === undefined) {\n\t var originalLine = mapping.originalLine;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we found. Since\n\t // mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we found.\n\t while (mapping && mapping.originalLine === originalLine) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t } else {\n\t var originalColumn = mapping.originalColumn;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we were searching for.\n\t // Since mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we are searching for.\n\t while (mapping &&\n\t mapping.originalLine === line &&\n\t mapping.originalColumn == originalColumn) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t }\n\t }\n\t\n\t return mappings;\n\t };\n\t\n\t exports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t /**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The only parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - sources: An array of URLs to the original source files.\n\t * - names: An array of identifiers which can be referrenced by individual mappings.\n\t * - sourceRoot: Optional. The URL root from which all sources are relative.\n\t * - sourcesContent: Optional. An array of contents of the original source files.\n\t * - mappings: A string of base64 VLQs which contain the actual mappings.\n\t * - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"out.js\",\n\t * sourceRoot : \"\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AA,AB;;ABCDE;\"\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\t function BasicSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sources = util.getArg(sourceMap, 'sources');\n\t // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t // requires the array) to play nice here.\n\t var names = util.getArg(sourceMap, 'names', []);\n\t var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t var mappings = util.getArg(sourceMap, 'mappings');\n\t var file = util.getArg(sourceMap, 'file', null);\n\t\n\t // Once again, Sass deviates from the spec and supplies the version as a\n\t // string rather than a number, so we use loose equality checking here.\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t sources = sources\n\t // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t // \"foo.js\". Normalize these first so that future comparisons will succeed.\n\t // See bugzil.la/1090768.\n\t .map(util.normalize)\n\t // Always ensure that absolute sources are internally stored relative to\n\t // the source root, if the source root is absolute. Not doing this would\n\t // be particularly problematic when the source root is a prefix of the\n\t // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t .map(function (source) {\n\t return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t ? util.relative(sourceRoot, source)\n\t : source;\n\t });\n\t\n\t // Pass `true` below to allow duplicate names and sources. While source maps\n\t // are intended to be compressed and deduplicated, the TypeScript compiler\n\t // sometimes generates source maps with duplicates in them. See Github issue\n\t // #72 and bugzil.la/889492.\n\t this._names = ArraySet.fromArray(names, true);\n\t this._sources = ArraySet.fromArray(sources, true);\n\t\n\t this.sourceRoot = sourceRoot;\n\t this.sourcesContent = sourcesContent;\n\t this._mappings = mappings;\n\t this.file = file;\n\t }\n\t\n\t BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\t BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t /**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t * The source map that will be consumed.\n\t * @returns BasicSourceMapConsumer\n\t */\n\t BasicSourceMapConsumer.fromSourceMap =\n\t function SourceMapConsumer_fromSourceMap(aSourceMap) {\n\t var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t smc.sourceRoot = aSourceMap._sourceRoot;\n\t smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t smc.sourceRoot);\n\t smc.file = aSourceMap._file;\n\t\n\t // Because we are modifying the entries (by converting string sources and\n\t // names to indices into the sources and names ArraySets), we have to make\n\t // a copy of the entry or else bad things happen. Shared mutable state\n\t // strikes again! See github issue #191.\n\t\n\t var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t var destGeneratedMappings = smc.__generatedMappings = [];\n\t var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t var srcMapping = generatedMappings[i];\n\t var destMapping = new Mapping;\n\t destMapping.generatedLine = srcMapping.generatedLine;\n\t destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t if (srcMapping.source) {\n\t destMapping.source = sources.indexOf(srcMapping.source);\n\t destMapping.originalLine = srcMapping.originalLine;\n\t destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t if (srcMapping.name) {\n\t destMapping.name = names.indexOf(srcMapping.name);\n\t }\n\t\n\t destOriginalMappings.push(destMapping);\n\t }\n\t\n\t destGeneratedMappings.push(destMapping);\n\t }\n\t\n\t quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t return smc;\n\t };\n\t\n\t /**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\t BasicSourceMapConsumer.prototype._version = 3;\n\t\n\t /**\n\t * The list of original sources.\n\t */\n\t Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t return this._sources.toArray().map(function (s) {\n\t return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n\t }, this);\n\t }\n\t });\n\t\n\t /**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\t function Mapping() {\n\t this.generatedLine = 0;\n\t this.generatedColumn = 0;\n\t this.source = null;\n\t this.originalLine = null;\n\t this.originalColumn = null;\n\t this.name = null;\n\t }\n\t\n\t /**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\t BasicSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t var generatedLine = 1;\n\t var previousGeneratedColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousOriginalColumn = 0;\n\t var previousSource = 0;\n\t var previousName = 0;\n\t var length = aStr.length;\n\t var index = 0;\n\t var cachedSegments = {};\n\t var temp = {};\n\t var originalMappings = [];\n\t var generatedMappings = [];\n\t var mapping, str, segment, end, value;\n\t\n\t while (index < length) {\n\t if (aStr.charAt(index) === ';') {\n\t generatedLine++;\n\t index++;\n\t previousGeneratedColumn = 0;\n\t }\n\t else if (aStr.charAt(index) === ',') {\n\t index++;\n\t }\n\t else {\n\t mapping = new Mapping();\n\t mapping.generatedLine = generatedLine;\n\t\n\t // Because each offset is encoded relative to the previous one,\n\t // many segments often have the same encoding. We can exploit this\n\t // fact by caching the parsed variable length fields of each segment,\n\t // allowing us to avoid a second parse if we encounter the same\n\t // segment again.\n\t for (end = index; end < length; end++) {\n\t if (this._charIsMappingSeparator(aStr, end)) {\n\t break;\n\t }\n\t }\n\t str = aStr.slice(index, end);\n\t\n\t segment = cachedSegments[str];\n\t if (segment) {\n\t index += str.length;\n\t } else {\n\t segment = [];\n\t while (index < end) {\n\t base64VLQ.decode(aStr, index, temp);\n\t value = temp.value;\n\t index = temp.rest;\n\t segment.push(value);\n\t }\n\t\n\t if (segment.length === 2) {\n\t throw new Error('Found a source, but no line and column');\n\t }\n\t\n\t if (segment.length === 3) {\n\t throw new Error('Found a source and line, but no column');\n\t }\n\t\n\t cachedSegments[str] = segment;\n\t }\n\t\n\t // Generated column.\n\t mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (segment.length > 1) {\n\t // Original source.\n\t mapping.source = previousSource + segment[1];\n\t previousSource += segment[1];\n\t\n\t // Original line.\n\t mapping.originalLine = previousOriginalLine + segment[2];\n\t previousOriginalLine = mapping.originalLine;\n\t // Lines are stored 0-based\n\t mapping.originalLine += 1;\n\t\n\t // Original column.\n\t mapping.originalColumn = previousOriginalColumn + segment[3];\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (segment.length > 4) {\n\t // Original name.\n\t mapping.name = previousName + segment[4];\n\t previousName += segment[4];\n\t }\n\t }\n\t\n\t generatedMappings.push(mapping);\n\t if (typeof mapping.originalLine === 'number') {\n\t originalMappings.push(mapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t this.__generatedMappings = generatedMappings;\n\t\n\t quickSort(originalMappings, util.compareByOriginalPositions);\n\t this.__originalMappings = originalMappings;\n\t };\n\t\n\t /**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\t BasicSourceMapConsumer.prototype._findMapping =\n\t function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t aColumnName, aComparator, aBias) {\n\t // To return the position we are searching for, we must first find the\n\t // mapping for the given position and then return the opposite position it\n\t // points to. Because the mappings are sorted, we can use binary search to\n\t // find the best mapping.\n\t\n\t if (aNeedle[aLineName] <= 0) {\n\t throw new TypeError('Line must be greater than or equal to 1, got '\n\t + aNeedle[aLineName]);\n\t }\n\t if (aNeedle[aColumnName] < 0) {\n\t throw new TypeError('Column must be greater than or equal to 0, got '\n\t + aNeedle[aColumnName]);\n\t }\n\t\n\t return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t };\n\t\n\t /**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\t BasicSourceMapConsumer.prototype.computeColumnSpans =\n\t function SourceMapConsumer_computeColumnSpans() {\n\t for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t // Mappings do not contain a field for the last generated columnt. We\n\t // can come up with an optimistic estimate, however, by assuming that\n\t // mappings are contiguous (i.e. given two consecutive mappings, the\n\t // first mapping ends where the second one starts).\n\t if (index + 1 < this._generatedMappings.length) {\n\t var nextMapping = this._generatedMappings[index + 1];\n\t\n\t if (mapping.generatedLine === nextMapping.generatedLine) {\n\t mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t continue;\n\t }\n\t }\n\t\n\t // The last mapping for each line spans the entire line.\n\t mapping.lastGeneratedColumn = Infinity;\n\t }\n\t };\n\t\n\t /**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\t BasicSourceMapConsumer.prototype.originalPositionFor =\n\t function SourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._generatedMappings,\n\t \"generatedLine\",\n\t \"generatedColumn\",\n\t util.compareByGeneratedPositionsDeflated,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t if (mapping.generatedLine === needle.generatedLine) {\n\t var source = util.getArg(mapping, 'source', null);\n\t if (source !== null) {\n\t source = this._sources.at(source);\n\t if (this.sourceRoot != null) {\n\t source = util.join(this.sourceRoot, source);\n\t }\n\t }\n\t var name = util.getArg(mapping, 'name', null);\n\t if (name !== null) {\n\t name = this._names.at(name);\n\t }\n\t return {\n\t source: source,\n\t line: util.getArg(mapping, 'originalLine', null),\n\t column: util.getArg(mapping, 'originalColumn', null),\n\t name: name\n\t };\n\t }\n\t }\n\t\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t };\n\t\n\t /**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\t BasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t if (!this.sourcesContent) {\n\t return false;\n\t }\n\t return this.sourcesContent.length >= this._sources.size() &&\n\t !this.sourcesContent.some(function (sc) { return sc == null; });\n\t };\n\t\n\t /**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\t BasicSourceMapConsumer.prototype.sourceContentFor =\n\t function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t if (!this.sourcesContent) {\n\t return null;\n\t }\n\t\n\t if (this.sourceRoot != null) {\n\t aSource = util.relative(this.sourceRoot, aSource);\n\t }\n\t\n\t if (this._sources.has(aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(aSource)];\n\t }\n\t\n\t var url;\n\t if (this.sourceRoot != null\n\t && (url = util.urlParse(this.sourceRoot))) {\n\t // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t // many users. We can help them out when they expect file:// URIs to\n\t // behave like it would if they were running a local HTTP server. See\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n\t if (url.scheme == \"file\"\n\t && this._sources.has(fileUriAbsPath)) {\n\t return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t }\n\t\n\t if ((!url.path || url.path == \"/\")\n\t && this._sources.has(\"/\" + aSource)) {\n\t return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n\t }\n\t }\n\t\n\t // This function is used recursively from\n\t // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t // don't want to throw if we can't find the source - we just want to\n\t // return null, so we provide a flag to exit gracefully.\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t /**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\t BasicSourceMapConsumer.prototype.generatedPositionFor =\n\t function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t var source = util.getArg(aArgs, 'source');\n\t if (this.sourceRoot != null) {\n\t source = util.relative(this.sourceRoot, source);\n\t }\n\t if (!this._sources.has(source)) {\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t }\n\t source = this._sources.indexOf(source);\n\t\n\t var needle = {\n\t source: source,\n\t originalLine: util.getArg(aArgs, 'line'),\n\t originalColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (mapping.source === needle.source) {\n\t return {\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t };\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t };\n\t\n\t exports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t /**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The only parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - file: Optional. The generated file this source map is associated with.\n\t * - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t * - offset: The offset into the original specified at which this section\n\t * begins to apply, defined as an object with a \"line\" and \"column\"\n\t * field.\n\t * - map: A source map definition. This source map could also be indexed,\n\t * but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"app.js\",\n\t * sections: [{\n\t * offset: {line:100, column:10},\n\t * map: {\n\t * version : 3,\n\t * file: \"section.js\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AAAA,E;;ABCDE;\"\n\t * }\n\t * }],\n\t * }\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\t function IndexedSourceMapConsumer(aSourceMap) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sections = util.getArg(sourceMap, 'sections');\n\t\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t\n\t var lastOffset = {\n\t line: -1,\n\t column: 0\n\t };\n\t this._sections = sections.map(function (s) {\n\t if (s.url) {\n\t // The url field will require support for asynchronicity.\n\t // See https://github.com/mozilla/source-map/issues/16\n\t throw new Error('Support for url field in sections not implemented.');\n\t }\n\t var offset = util.getArg(s, 'offset');\n\t var offsetLine = util.getArg(offset, 'line');\n\t var offsetColumn = util.getArg(offset, 'column');\n\t\n\t if (offsetLine < lastOffset.line ||\n\t (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t throw new Error('Section offsets must be ordered and non-overlapping.');\n\t }\n\t lastOffset = offset;\n\t\n\t return {\n\t generatedOffset: {\n\t // The offset fields are 0-based, but we use 1-based indices when\n\t // encoding/decoding from VLQ.\n\t generatedLine: offsetLine + 1,\n\t generatedColumn: offsetColumn + 1\n\t },\n\t consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n\t }\n\t });\n\t }\n\t\n\t IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\t IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t /**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\t IndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t /**\n\t * The list of original sources.\n\t */\n\t Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t var sources = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t sources.push(this._sections[i].consumer.sources[j]);\n\t }\n\t }\n\t return sources;\n\t }\n\t });\n\t\n\t /**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source.\n\t * - column: The column number in the generated source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null.\n\t * - column: The column number in the original source, or null.\n\t * - name: The original identifier, or null.\n\t */\n\t IndexedSourceMapConsumer.prototype.originalPositionFor =\n\t function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t // Find the section containing the generated position we're trying to map\n\t // to an original position.\n\t var sectionIndex = binarySearch.search(needle, this._sections,\n\t function(needle, section) {\n\t var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t if (cmp) {\n\t return cmp;\n\t }\n\t\n\t return (needle.generatedColumn -\n\t section.generatedOffset.generatedColumn);\n\t });\n\t var section = this._sections[sectionIndex];\n\t\n\t if (!section) {\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t }\n\t\n\t return section.consumer.originalPositionFor({\n\t line: needle.generatedLine -\n\t (section.generatedOffset.generatedLine - 1),\n\t column: needle.generatedColumn -\n\t (section.generatedOffset.generatedLine === needle.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t bias: aArgs.bias\n\t });\n\t };\n\t\n\t /**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\t IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t return this._sections.every(function (s) {\n\t return s.consumer.hasContentsOfAllSources();\n\t });\n\t };\n\t\n\t /**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\t IndexedSourceMapConsumer.prototype.sourceContentFor =\n\t function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t var content = section.consumer.sourceContentFor(aSource, true);\n\t if (content) {\n\t return content;\n\t }\n\t }\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t /**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source.\n\t * - column: The column number in the original source.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null.\n\t * - column: The column number in the generated source, or null.\n\t */\n\t IndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t // Only consider this section if the requested source is in the list of\n\t // sources of the consumer.\n\t if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n\t continue;\n\t }\n\t var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t if (generatedPosition) {\n\t var ret = {\n\t line: generatedPosition.line +\n\t (section.generatedOffset.generatedLine - 1),\n\t column: generatedPosition.column +\n\t (section.generatedOffset.generatedLine === generatedPosition.line\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0)\n\t };\n\t return ret;\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null\n\t };\n\t };\n\t\n\t /**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\t IndexedSourceMapConsumer.prototype._parseMappings =\n\t function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t this.__generatedMappings = [];\n\t this.__originalMappings = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t var sectionMappings = section.consumer._generatedMappings;\n\t for (var j = 0; j < sectionMappings.length; j++) {\n\t var mapping = sectionMappings[j];\n\t\n\t var source = section.consumer._sources.at(mapping.source);\n\t if (section.consumer.sourceRoot !== null) {\n\t source = util.join(section.consumer.sourceRoot, source);\n\t }\n\t this._sources.add(source);\n\t source = this._sources.indexOf(source);\n\t\n\t var name = section.consumer._names.at(mapping.name);\n\t this._names.add(name);\n\t name = this._names.indexOf(name);\n\t\n\t // The mappings coming from the consumer for the section have\n\t // generated positions relative to the start of the section, so we\n\t // need to offset them to be relative to the start of the concatenated\n\t // generated file.\n\t var adjustedMapping = {\n\t source: source,\n\t generatedLine: mapping.generatedLine +\n\t (section.generatedOffset.generatedLine - 1),\n\t generatedColumn: mapping.generatedColumn +\n\t (section.generatedOffset.generatedLine === mapping.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: name\n\t };\n\t\n\t this.__generatedMappings.push(adjustedMapping);\n\t if (typeof adjustedMapping.originalLine === 'number') {\n\t this.__originalMappings.push(adjustedMapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t };\n\t\n\t exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\t}\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t exports.GREATEST_LOWER_BOUND = 1;\n\t exports.LEAST_UPPER_BOUND = 2;\n\t\n\t /**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t */\n\t function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t // This function terminates when one of the following is true:\n\t //\n\t // 1. We find the exact element we are looking for.\n\t //\n\t // 2. We did not find the exact element, but we can return the index of\n\t // the next-closest element.\n\t //\n\t // 3. We did not find the exact element, and there is no next-closest\n\t // element than the one we are searching for, so we return -1.\n\t var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t if (cmp === 0) {\n\t // Found the element we are looking for.\n\t return mid;\n\t }\n\t else if (cmp > 0) {\n\t // Our needle is greater than aHaystack[mid].\n\t if (aHigh - mid > 1) {\n\t // The element is in the upper half.\n\t return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // The exact needle element was not found in this haystack. Determine if\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return aHigh < aHaystack.length ? aHigh : -1;\n\t } else {\n\t return mid;\n\t }\n\t }\n\t else {\n\t // Our needle is less than aHaystack[mid].\n\t if (mid - aLow > 1) {\n\t // The element is in the lower half.\n\t return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return mid;\n\t } else {\n\t return aLow < 0 ? -1 : aLow;\n\t }\n\t }\n\t }\n\t\n\t /**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t * array and returns -1, 0, or 1 depending on whether the needle is less\n\t * than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\t exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t if (aHaystack.length === 0) {\n\t return -1;\n\t }\n\t\n\t var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t if (index < 0) {\n\t return -1;\n\t }\n\t\n\t // We have found either the exact element, or the next-closest element than\n\t // the one we are searching for. However, there may be more than one such\n\t // element. Make sure we always return the smallest of these.\n\t while (index - 1 >= 0) {\n\t if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t break;\n\t }\n\t --index;\n\t }\n\t\n\t return index;\n\t };\n\t}\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t // It turns out that some (most?) JavaScript engines don't self-host\n\t // `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t // faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t // custom comparator function, calling back and forth between the VM's C++ and\n\t // JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t // worse generated code for the comparator function than would be optimal. In\n\t // fact, when sorting with a comparator, these costs outweigh the benefits of\n\t // sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t // a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t /**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t * The array.\n\t * @param {Number} x\n\t * The index of the first item.\n\t * @param {Number} y\n\t * The index of the second item.\n\t */\n\t function swap(ary, x, y) {\n\t var temp = ary[x];\n\t ary[x] = ary[y];\n\t ary[y] = temp;\n\t }\n\t\n\t /**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t * The lower bound on the range.\n\t * @param {Number} high\n\t * The upper bound on the range.\n\t */\n\t function randomIntInRange(low, high) {\n\t return Math.round(low + (Math.random() * (high - low)));\n\t }\n\t\n\t /**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t * @param {Number} p\n\t * Start index of the array\n\t * @param {Number} r\n\t * End index of the array\n\t */\n\t function doQuickSort(ary, comparator, p, r) {\n\t // If our lower bound is less than our upper bound, we (1) partition the\n\t // array into two pieces and (2) recurse on each half. If it is not, this is\n\t // the empty array and our base case.\n\t\n\t if (p < r) {\n\t // (1) Partitioning.\n\t //\n\t // The partitioning chooses a pivot between `p` and `r` and moves all\n\t // elements that are less than or equal to the pivot to the before it, and\n\t // all the elements that are greater than it after it. The effect is that\n\t // once partition is done, the pivot is in the exact place it will be when\n\t // the array is put in sorted order, and it will not need to be moved\n\t // again. This runs in O(n) time.\n\t\n\t // Always choose a random pivot so that an input array which is reverse\n\t // sorted does not cause O(n^2) running time.\n\t var pivotIndex = randomIntInRange(p, r);\n\t var i = p - 1;\n\t\n\t swap(ary, pivotIndex, r);\n\t var pivot = ary[r];\n\t\n\t // Immediately after `j` is incremented in this loop, the following hold\n\t // true:\n\t //\n\t // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t //\n\t // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t for (var j = p; j < r; j++) {\n\t if (comparator(ary[j], pivot) <= 0) {\n\t i += 1;\n\t swap(ary, i, j);\n\t }\n\t }\n\t\n\t swap(ary, i + 1, j);\n\t var q = i + 1;\n\t\n\t // (2) Recurse on each half.\n\t\n\t doQuickSort(ary, comparator, p, q - 1);\n\t doQuickSort(ary, comparator, q + 1, r);\n\t }\n\t }\n\t\n\t /**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t */\n\t exports.quickSort = function (ary, comparator) {\n\t doQuickSort(ary, comparator, 0, ary.length - 1);\n\t };\n\t}\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t{\n\t var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\t var util = __webpack_require__(4);\n\t\n\t // Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t // operating systems these days (capturing the result).\n\t var REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t // Newline character code for charCodeAt() comparisons\n\t var NEWLINE_CODE = 10;\n\t\n\t // Private symbol for identifying `SourceNode`s when multiple versions of\n\t // the source-map library are loaded. This MUST NOT CHANGE across\n\t // versions!\n\t var isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t /**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t * generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\t function SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t this.children = [];\n\t this.sourceContents = {};\n\t this.line = aLine == null ? null : aLine;\n\t this.column = aColumn == null ? null : aColumn;\n\t this.source = aSource == null ? null : aSource;\n\t this.name = aName == null ? null : aName;\n\t this[isSourceNode] = true;\n\t if (aChunks != null) this.add(aChunks);\n\t }\n\t\n\t /**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t * SourceMapConsumer should be relative to.\n\t */\n\t SourceNode.fromStringWithSourceMap =\n\t function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t // The SourceNode we want to fill with the generated code\n\t // and the SourceMap\n\t var node = new SourceNode();\n\t\n\t // All even indices of this array are one line of the generated code,\n\t // while all odd indices are the newlines between two adjacent lines\n\t // (since `REGEX_NEWLINE` captures its match).\n\t // Processed fragments are removed from this array, by calling `shiftNextLine`.\n\t var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t var shiftNextLine = function() {\n\t var lineContents = remainingLines.shift();\n\t // The last line of a file might not have a newline.\n\t var newLine = remainingLines.shift() || \"\";\n\t return lineContents + newLine;\n\t };\n\t\n\t // We need to remember the position of \"remainingLines\"\n\t var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t // The generate SourceNodes we need a code range.\n\t // To extract it current and last mapping is used.\n\t // Here we store the last mapping.\n\t var lastMapping = null;\n\t\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t if (lastMapping !== null) {\n\t // We add the code from \"lastMapping\" to \"mapping\":\n\t // First check if there is a new line in between.\n\t if (lastGeneratedLine < mapping.generatedLine) {\n\t // Associate first line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t lastGeneratedLine++;\n\t lastGeneratedColumn = 0;\n\t // The remaining code is added without mapping\n\t } else {\n\t // There is no new line in between.\n\t // Associate the code between \"lastGeneratedColumn\" and\n\t // \"mapping.generatedColumn\" with \"lastMapping\"\n\t var nextLine = remainingLines[0];\n\t var code = nextLine.substr(0, mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t remainingLines[0] = nextLine.substr(mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t addMappingWithCode(lastMapping, code);\n\t // No more remaining code, continue\n\t lastMapping = mapping;\n\t return;\n\t }\n\t }\n\t // We add the generated code until the first mapping\n\t // to the SourceNode without any mapping.\n\t // Each line is added as separate string.\n\t while (lastGeneratedLine < mapping.generatedLine) {\n\t node.add(shiftNextLine());\n\t lastGeneratedLine++;\n\t }\n\t if (lastGeneratedColumn < mapping.generatedColumn) {\n\t var nextLine = remainingLines[0];\n\t node.add(nextLine.substr(0, mapping.generatedColumn));\n\t remainingLines[0] = nextLine.substr(mapping.generatedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t }\n\t lastMapping = mapping;\n\t }, this);\n\t // We have processed all mappings.\n\t if (remainingLines.length > 0) {\n\t if (lastMapping) {\n\t // Associate the remaining code in the current line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t }\n\t // and add the remaining lines without any mapping\n\t node.add(remainingLines.join(\"\"));\n\t }\n\t\n\t // Copy sourcesContent into SourceNode\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aRelativePath != null) {\n\t sourceFile = util.join(aRelativePath, sourceFile);\n\t }\n\t node.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t\n\t return node;\n\t\n\t function addMappingWithCode(mapping, code) {\n\t if (mapping === null || mapping.source === undefined) {\n\t node.add(code);\n\t } else {\n\t var source = aRelativePath\n\t ? util.join(aRelativePath, mapping.source)\n\t : mapping.source;\n\t node.add(new SourceNode(mapping.originalLine,\n\t mapping.originalColumn,\n\t source,\n\t code,\n\t mapping.name));\n\t }\n\t }\n\t };\n\t\n\t /**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\t SourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t aChunk.forEach(function (chunk) {\n\t this.add(chunk);\n\t }, this);\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t if (aChunk) {\n\t this.children.push(aChunk);\n\t }\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t };\n\t\n\t /**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\t SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t for (var i = aChunk.length-1; i >= 0; i--) {\n\t this.prepend(aChunk[i]);\n\t }\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t this.children.unshift(aChunk);\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t };\n\t\n\t /**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\t SourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t var chunk;\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t chunk = this.children[i];\n\t if (chunk[isSourceNode]) {\n\t chunk.walk(aFn);\n\t }\n\t else {\n\t if (chunk !== '') {\n\t aFn(chunk, { source: this.source,\n\t line: this.line,\n\t column: this.column,\n\t name: this.name });\n\t }\n\t }\n\t }\n\t };\n\t\n\t /**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\t SourceNode.prototype.join = function SourceNode_join(aSep) {\n\t var newChildren;\n\t var i;\n\t var len = this.children.length;\n\t if (len > 0) {\n\t newChildren = [];\n\t for (i = 0; i < len-1; i++) {\n\t newChildren.push(this.children[i]);\n\t newChildren.push(aSep);\n\t }\n\t newChildren.push(this.children[i]);\n\t this.children = newChildren;\n\t }\n\t return this;\n\t };\n\t\n\t /**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\t SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t var lastChild = this.children[this.children.length - 1];\n\t if (lastChild[isSourceNode]) {\n\t lastChild.replaceRight(aPattern, aReplacement);\n\t }\n\t else if (typeof lastChild === 'string') {\n\t this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t }\n\t else {\n\t this.children.push(''.replace(aPattern, aReplacement));\n\t }\n\t return this;\n\t };\n\t\n\t /**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\t SourceNode.prototype.setSourceContent =\n\t function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t };\n\t\n\t /**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\t SourceNode.prototype.walkSourceContents =\n\t function SourceNode_walkSourceContents(aFn) {\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t if (this.children[i][isSourceNode]) {\n\t this.children[i].walkSourceContents(aFn);\n\t }\n\t }\n\t\n\t var sources = Object.keys(this.sourceContents);\n\t for (var i = 0, len = sources.length; i < len; i++) {\n\t aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t }\n\t };\n\t\n\t /**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\t SourceNode.prototype.toString = function SourceNode_toString() {\n\t var str = \"\";\n\t this.walk(function (chunk) {\n\t str += chunk;\n\t });\n\t return str;\n\t };\n\t\n\t /**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\t SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t var generated = {\n\t code: \"\",\n\t line: 1,\n\t column: 0\n\t };\n\t var map = new SourceMapGenerator(aArgs);\n\t var sourceMappingActive = false;\n\t var lastOriginalSource = null;\n\t var lastOriginalLine = null;\n\t var lastOriginalColumn = null;\n\t var lastOriginalName = null;\n\t this.walk(function (chunk, original) {\n\t generated.code += chunk;\n\t if (original.source !== null\n\t && original.line !== null\n\t && original.column !== null) {\n\t if(lastOriginalSource !== original.source\n\t || lastOriginalLine !== original.line\n\t || lastOriginalColumn !== original.column\n\t || lastOriginalName !== original.name) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t lastOriginalSource = original.source;\n\t lastOriginalLine = original.line;\n\t lastOriginalColumn = original.column;\n\t lastOriginalName = original.name;\n\t sourceMappingActive = true;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t }\n\t });\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t }\n\t for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t generated.line++;\n\t generated.column = 0;\n\t // Mappings end at eol\n\t if (idx + 1 === length) {\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t } else {\n\t generated.column++;\n\t }\n\t }\n\t });\n\t this.walkSourceContents(function (sourceFile, sourceContent) {\n\t map.setSourceContent(sourceFile, sourceContent);\n\t });\n\t\n\t return { code: generated.code, map: map };\n\t };\n\t\n\t exports.SourceNode = SourceNode;\n\t}\n\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** source-map.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap a7d787c028005295f8d2\n **/","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./source-map.js\n ** module id = 0\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n var base64VLQ = require('./base64-vlq');\n var util = require('./util');\n var ArraySet = require('./array-set').ArraySet;\n var MappingList = require('./mapping-list').MappingList;\n\n /**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\n function SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n }\n\n SourceMapGenerator.prototype._version = 3;\n\n /**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\n SourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n /**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\n SourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null && !this._sources.has(source)) {\n this._sources.add(source);\n }\n\n if (name != null && !this._names.has(name)) {\n this._names.add(name);\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n /**\n * Set the source content for a source file.\n */\n SourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = {};\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n /**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\n SourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n /**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\n SourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n /**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\n SourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n result += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n result += ',';\n }\n }\n\n result += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n result += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n result += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n result += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n result += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n }\n\n return result;\n };\n\n SourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents,\n key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n /**\n * Externalize the source map.\n */\n SourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n /**\n * Render the source map being generated to a string.\n */\n SourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\n exports.SourceMapGenerator = SourceMapGenerator;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/source-map-generator.js\n ** module id = 1\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n{\n var base64 = require('./base64');\n\n // A single base 64 digit can contain 6 bits of data. For the base 64 variable\n // length quantities we use in the source map spec, the first bit is the sign,\n // the next four bits are the actual value, and the 6th bit is the\n // continuation bit. The continuation bit tells us whether there are more\n // digits in this value following this digit.\n //\n // Continuation\n // | Sign\n // | |\n // V V\n // 101011\n\n var VLQ_BASE_SHIFT = 5;\n\n // binary: 100000\n var VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n // binary: 011111\n var VLQ_BASE_MASK = VLQ_BASE - 1;\n\n // binary: 100000\n var VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n /**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\n function toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n }\n\n /**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\n function fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n }\n\n /**\n * Returns the base 64 VLQ encoded value.\n */\n exports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n };\n\n /**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\n exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n };\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/base64-vlq.js\n ** module id = 2\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n /**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\n exports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n };\n\n /**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\n exports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n };\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/base64.js\n ** module id = 3\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n /**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\n function getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n }\n exports.getArg = getArg;\n\n var urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\n var dataUrlRegexp = /^data:.+\\,.+$/;\n\n function urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n }\n exports.urlParse = urlParse;\n\n function urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n }\n exports.urlGenerate = urlGenerate;\n\n /**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consequtive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\n function normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n }\n exports.normalize = normalize;\n\n /**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\n function join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n }\n exports.join = join;\n\n exports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n };\n\n /**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\n function relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n }\n exports.relative = relative;\n\n /**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\n function toSetString(aStr) {\n return '$' + aStr;\n }\n exports.toSetString = toSetString;\n\n function fromSetString(aStr) {\n return aStr.substr(1);\n }\n exports.fromSetString = fromSetString;\n\n /**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\n function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n }\n exports.compareByOriginalPositions = compareByOriginalPositions;\n\n /**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\n function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n }\n exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\n function strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n }\n\n /**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\n function compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n }\n exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/util.js\n ** module id = 4\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n var util = require('./util');\n\n /**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\n function ArraySet() {\n this._array = [];\n this._set = {};\n }\n\n /**\n * Static method for creating ArraySet instances from an existing array.\n */\n ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n };\n\n /**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\n ArraySet.prototype.size = function ArraySet_size() {\n return Object.getOwnPropertyNames(this._set).length;\n };\n\n /**\n * Add the given string to this set.\n *\n * @param String aStr\n */\n ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = util.toSetString(aStr);\n var isDuplicate = this._set.hasOwnProperty(sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n this._set[sStr] = idx;\n }\n };\n\n /**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\n ArraySet.prototype.has = function ArraySet_has(aStr) {\n var sStr = util.toSetString(aStr);\n return this._set.hasOwnProperty(sStr);\n };\n\n /**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\n ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n var sStr = util.toSetString(aStr);\n if (this._set.hasOwnProperty(sStr)) {\n return this._set[sStr];\n }\n throw new Error('\"' + aStr + '\" is not in the set.');\n };\n\n /**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\n ArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n };\n\n /**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\n ArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n };\n\n exports.ArraySet = ArraySet;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/array-set.js\n ** module id = 5\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n var util = require('./util');\n\n /**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\n function generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n }\n\n /**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\n function MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n }\n\n /**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\n MappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n /**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\n MappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n };\n\n /**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\n MappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n };\n\n exports.MappingList = MappingList;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/mapping-list.js\n ** module id = 6\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n var util = require('./util');\n var binarySearch = require('./binary-search');\n var ArraySet = require('./array-set').ArraySet;\n var base64VLQ = require('./base64-vlq');\n var quickSort = require('./quick-sort').quickSort;\n\n function SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap)\n : new BasicSourceMapConsumer(sourceMap);\n }\n\n SourceMapConsumer.fromSourceMap = function(aSourceMap) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n }\n\n /**\n * The version of the source mapping spec that we are consuming.\n */\n SourceMapConsumer.prototype._version = 3;\n\n // `__generatedMappings` and `__originalMappings` are arrays that hold the\n // parsed mapping coordinates from the source map's \"mappings\" attribute. They\n // are lazily instantiated, accessed via the `_generatedMappings` and\n // `_originalMappings` getters respectively, and we only parse the mappings\n // and create these arrays once queried for a source location. We jump through\n // these hoops because there can be many thousands of mappings, and parsing\n // them is expensive, so we only want to do it if we must.\n //\n // Each object in the arrays is of the form:\n //\n // {\n // generatedLine: The line number in the generated code,\n // generatedColumn: The column number in the generated code,\n // source: The path to the original source file that generated this\n // chunk of code,\n // originalLine: The line number in the original source that\n // corresponds to this chunk of generated code,\n // originalColumn: The column number in the original source that\n // corresponds to this chunk of generated code,\n // name: The name of the original symbol which generated this chunk of\n // code.\n // }\n //\n // All properties except for `generatedLine` and `generatedColumn` can be\n // `null`.\n //\n // `_generatedMappings` is ordered by the generated positions.\n //\n // `_originalMappings` is ordered by the original positions.\n\n SourceMapConsumer.prototype.__generatedMappings = null;\n Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n });\n\n SourceMapConsumer.prototype.__originalMappings = null;\n Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n });\n\n SourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n SourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\n SourceMapConsumer.GENERATED_ORDER = 1;\n SourceMapConsumer.ORIGINAL_ORDER = 2;\n\n SourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n SourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n /**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\n SourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n /**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: Optional. the column number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\n SourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n if (!this._sources.has(needle.source)) {\n return [];\n }\n needle.source = this._sources.indexOf(needle.source);\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\n exports.SourceMapConsumer = SourceMapConsumer;\n\n /**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\n function BasicSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n sources = sources\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names, true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n }\n\n BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n /**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns BasicSourceMapConsumer\n */\n BasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n /**\n * The version of the source mapping spec that we are consuming.\n */\n BasicSourceMapConsumer.prototype._version = 3;\n\n /**\n * The list of original sources.\n */\n Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n });\n\n /**\n * Provide the JIT with a nice shape / hidden class.\n */\n function Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n }\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n BasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n /**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\n BasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n /**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\n BasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n /**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\n BasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n if (this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n /**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\n BasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n /**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\n BasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n /**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\n BasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n if (this.sourceRoot != null) {\n source = util.relative(this.sourceRoot, source);\n }\n if (!this._sources.has(source)) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n source = this._sources.indexOf(source);\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\n exports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n /**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The only parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\n function IndexedSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n }\n });\n }\n\n IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n /**\n * The version of the source mapping spec that we are consuming.\n */\n IndexedSourceMapConsumer.prototype._version = 3;\n\n /**\n * The list of original sources.\n */\n Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n });\n\n /**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\n IndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n /**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\n IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n /**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\n IndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n /**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\n IndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n IndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if (section.consumer.sourceRoot !== null) {\n source = util.join(section.consumer.sourceRoot, source);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\n exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/source-map-consumer.js\n ** module id = 7\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n exports.GREATEST_LOWER_BOUND = 1;\n exports.LEAST_UPPER_BOUND = 2;\n\n /**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\n function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n }\n\n /**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\n exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n };\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/binary-search.js\n ** module id = 8\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n // It turns out that some (most?) JavaScript engines don't self-host\n // `Array.prototype.sort`. This makes sense because C++ will likely remain\n // faster than JS when doing raw CPU-intensive sorting. However, when using a\n // custom comparator function, calling back and forth between the VM's C++ and\n // JIT'd JS is rather slow *and* loses JIT type information, resulting in\n // worse generated code for the comparator function than would be optimal. In\n // fact, when sorting with a comparator, these costs outweigh the benefits of\n // sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n // a ~3500ms mean speed-up in `bench/bench.html`.\n\n /**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\n function swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n }\n\n /**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\n function randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n }\n\n /**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\n function doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n }\n\n /**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\n exports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n };\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/quick-sort.js\n ** module id = 9\n ** module chunks = 0\n **/","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n{\n var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\n var util = require('./util');\n\n // Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n // operating systems these days (capturing the result).\n var REGEX_NEWLINE = /(\\r?\\n)/;\n\n // Newline character code for charCodeAt() comparisons\n var NEWLINE_CODE = 10;\n\n // Private symbol for identifying `SourceNode`s when multiple versions of\n // the source-map library are loaded. This MUST NOT CHANGE across\n // versions!\n var isSourceNode = \"$$$isSourceNode$$$\";\n\n /**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\n function SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n }\n\n /**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\n SourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are removed from this array, by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var shiftNextLine = function() {\n var lineContents = remainingLines.shift();\n // The last line of a file might not have a newline.\n var newLine = remainingLines.shift() || \"\";\n return lineContents + newLine;\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[0];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[0] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[0];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[0] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLines.length > 0) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n /**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n SourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n };\n\n /**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n };\n\n /**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\n SourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n };\n\n /**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\n SourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n };\n\n /**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\n SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n };\n\n /**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\n SourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n /**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\n SourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n /**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\n SourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n };\n\n /**\n * Returns the string representation of this source node along with a source\n * map.\n */\n SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n };\n\n exports.SourceNode = SourceNode;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./lib/source-node.js\n ** module id = 10\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/react-app/node_modules/source-map/lib/array-set.js b/react-app/node_modules/source-map/lib/array-set.js new file mode 100644 index 0000000000..0ffbb9fd98 --- /dev/null +++ b/react-app/node_modules/source-map/lib/array-set.js @@ -0,0 +1,104 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + var util = require('./util'); + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = {}; + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + ArraySet.prototype.size = function ArraySet_size() { + return Object.getOwnPropertyNames(this._set).length; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = util.toSetString(aStr); + var isDuplicate = this._set.hasOwnProperty(sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + this._set[sStr] = idx; + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + var sStr = util.toSetString(aStr); + return this._set.hasOwnProperty(sStr); + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + var sStr = util.toSetString(aStr); + if (this._set.hasOwnProperty(sStr)) { + return this._set[sStr]; + } + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; +} diff --git a/react-app/node_modules/source-map/lib/base64-vlq.js b/react-app/node_modules/source-map/lib/base64-vlq.js new file mode 100644 index 0000000000..f2a07f7c37 --- /dev/null +++ b/react-app/node_modules/source-map/lib/base64-vlq.js @@ -0,0 +1,141 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler 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. + */ +{ + var base64 = require('./base64'); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; +} diff --git a/react-app/node_modules/source-map/lib/base64.js b/react-app/node_modules/source-map/lib/base64.js new file mode 100644 index 0000000000..dfda6ce186 --- /dev/null +++ b/react-app/node_modules/source-map/lib/base64.js @@ -0,0 +1,68 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); + }; + + /** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; + }; +} diff --git a/react-app/node_modules/source-map/lib/binary-search.js b/react-app/node_modules/source-map/lib/binary-search.js new file mode 100644 index 0000000000..03161e6bf3 --- /dev/null +++ b/react-app/node_modules/source-map/lib/binary-search.js @@ -0,0 +1,112 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + + /** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; + }; +} diff --git a/react-app/node_modules/source-map/lib/mapping-list.js b/react-app/node_modules/source-map/lib/mapping-list.js new file mode 100644 index 0000000000..287a6076a8 --- /dev/null +++ b/react-app/node_modules/source-map/lib/mapping-list.js @@ -0,0 +1,80 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + var util = require('./util'); + + /** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + + /** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; + } + + /** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + + /** + * Add the given source mapping. + * + * @param Object aMapping + */ + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + + /** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + + exports.MappingList = MappingList; +} diff --git a/react-app/node_modules/source-map/lib/quick-sort.js b/react-app/node_modules/source-map/lib/quick-sort.js new file mode 100644 index 0000000000..f92823cea5 --- /dev/null +++ b/react-app/node_modules/source-map/lib/quick-sort.js @@ -0,0 +1,115 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + // It turns out that some (most?) JavaScript engines don't self-host + // `Array.prototype.sort`. This makes sense because C++ will likely remain + // faster than JS when doing raw CPU-intensive sorting. However, when using a + // custom comparator function, calling back and forth between the VM's C++ and + // JIT'd JS is rather slow *and* loses JIT type information, resulting in + // worse generated code for the comparator function than would be optimal. In + // fact, when sorting with a comparator, these costs outweigh the benefits of + // sorting in C++. By using our own JS-implemented Quick Sort (below), we get + // a ~3500ms mean speed-up in `bench/bench.html`. + + /** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + + /** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); + } + + /** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + + /** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; +} diff --git a/react-app/node_modules/source-map/lib/source-map-consumer.js b/react-app/node_modules/source-map/lib/source-map-consumer.js new file mode 100644 index 0000000000..242f21c6c5 --- /dev/null +++ b/react-app/node_modules/source-map/lib/source-map-consumer.js @@ -0,0 +1,1082 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + var util = require('./util'); + var binarySearch = require('./binary-search'); + var ArraySet = require('./array-set').ArraySet; + var base64VLQ = require('./base64-vlq'); + var quickSort = require('./quick-sort').quickSort; + + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); + } + + SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); + } + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + /** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names, true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ + BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + BasicSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + /** + * Provide the JIT with a nice shape / hidden class. + */ + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + + /** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); + } + + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + + /** + * The version of the source mapping spec that we are consuming. + */ + IndexedSourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; +} diff --git a/react-app/node_modules/source-map/lib/source-map-generator.js b/react-app/node_modules/source-map/lib/source-map-generator.js new file mode 100644 index 0000000000..ffc76cdf51 --- /dev/null +++ b/react-app/node_modules/source-map/lib/source-map-generator.js @@ -0,0 +1,396 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + var base64VLQ = require('./base64-vlq'); + var util = require('./util'); + var ArraySet = require('./array-set').ArraySet; + var MappingList = require('./mapping-list').MappingList; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null && !this._sources.has(source)) { + this._sources.add(source); + } + + if (name != null && !this._names.has(name)) { + this._names.add(name); + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = {}; + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + result += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + result += ','; + } + } + + result += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + result += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + result += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + result += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + result += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, + key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + + exports.SourceMapGenerator = SourceMapGenerator; +} diff --git a/react-app/node_modules/source-map/lib/source-node.js b/react-app/node_modules/source-map/lib/source-node.js new file mode 100644 index 0000000000..8b0fd59184 --- /dev/null +++ b/react-app/node_modules/source-map/lib/source-node.js @@ -0,0 +1,408 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; + var util = require('./util'); + + // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other + // operating systems these days (capturing the result). + var REGEX_NEWLINE = /(\r?\n)/; + + // Newline character code for charCodeAt() comparisons + var NEWLINE_CODE = 10; + + // Private symbol for identifying `SourceNode`s when multiple versions of + // the source-map library are loaded. This MUST NOT CHANGE across + // versions! + var isSourceNode = "$$$isSourceNode$$$"; + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are removed from this array, by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var shiftNextLine = function() { + var lineContents = remainingLines.shift(); + // The last line of a file might not have a newline. + var newLine = remainingLines.shift() || ""; + return lineContents + newLine; + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[0]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLines.length > 0) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; + }; + + exports.SourceNode = SourceNode; +} diff --git a/react-app/node_modules/source-map/lib/util.js b/react-app/node_modules/source-map/lib/util.js new file mode 100644 index 0000000000..4581590224 --- /dev/null +++ b/react-app/node_modules/source-map/lib/util.js @@ -0,0 +1,369 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +{ + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + + /** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consequtive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + + /** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); + }; + + /** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + return '$' + aStr; + } + exports.toSetString = toSetString; + + function fromSetString(aStr) { + return aStr.substr(1); + } + exports.fromSetString = fromSetString; + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; + } + + /** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; +} diff --git a/react-app/node_modules/source-map/package.json b/react-app/node_modules/source-map/package.json new file mode 100644 index 0000000000..c36d607415 --- /dev/null +++ b/react-app/node_modules/source-map/package.json @@ -0,0 +1,241 @@ +{ + "_args": [ + [ + "source-map@^0.5.0", + "/Users/mromano/dev/react-sfs/node_modules/babel-core" + ] + ], + "_from": "source-map@>=0.5.0 <0.6.0", + "_id": "source-map@0.5.3", + "_inCache": true, + "_installable": true, + "_location": "/source-map", + "_npmUser": { + "email": "fitzgen@gmail.com", + "name": "nickfitzgerald" + }, + "_npmVersion": "1.4.9", + "_phantomChildren": {}, + "_requested": { + "name": "source-map", + "raw": "source-map@^0.5.0", + "rawSpec": "^0.5.0", + "scope": null, + "spec": ">=0.5.0 <0.6.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-core", + "/babel-generator" + ], + "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", + "_shasum": "82674b85a71b0be76c3e7416d15e9f5252eb3be0", + "_shrinkwrap": null, + "_spec": "source-map@^0.5.0", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babel-core", + "author": { + "email": "nfitzgerald@mozilla.com", + "name": "Nick Fitzgerald" + }, + "bugs": { + "url": "https://github.com/mozilla/source-map/issues" + }, + "contributors": [ + { + "email": "tobias.koppers@googlemail.com", + "name": "Tobias Koppers" + }, + { + "email": "duncan@dweebd.com", + "name": "Duncan Beevers" + }, + { + "email": "scrane@mozilla.com", + "name": "Stephen Crane" + }, + { + "email": "seddon.ryan@gmail.com", + "name": "Ryan Seddon" + }, + { + "email": "miles.elam@deem.com", + "name": "Miles Elam" + }, + { + "email": "mihai.bazon@gmail.com", + "name": "Mihai Bazon" + }, + { + "email": "github.public.email@michael.ficarra.me", + "name": "Michael Ficarra" + }, + { + "email": "todd@twolfson.com", + "name": "Todd Wolfson" + }, + { + "email": "alexander@solovyov.net", + "name": "Alexander Solovyov" + }, + { + "email": "fgnass@gmail.com", + "name": "Felix Gnass" + }, + { + "email": "conrad.irwin@gmail.com", + "name": "Conrad Irwin" + }, + { + "email": "usrbincc@yahoo.com", + "name": "usrbincc" + }, + { + "email": "glasser@davidglasser.net", + "name": "David Glasser" + }, + { + "email": "chase@newrelic.com", + "name": "Chase Douglas" + }, + { + "email": "evan.exe@gmail.com", + "name": "Evan Wallace" + }, + { + "email": "fayearthur@gmail.com", + "name": "Heather Arthur" + }, + { + "email": "hughskennedy@gmail.com", + "name": "Hugh Kennedy" + }, + { + "email": "glasser@davidglasser.net", + "name": "David Glasser" + }, + { + "email": "simon.lydell@gmail.com", + "name": "Simon Lydell" + }, + { + "email": "jellyes2@gmail.com", + "name": "Jmeas Smith" + }, + { + "email": "mzgoddard@gmail.com", + "name": "Michael Z Goddard" + }, + { + "email": "azu@users.noreply.github.com", + "name": "azu" + }, + { + "email": "john@gozde.ca", + "name": "John Gozde" + }, + { + "email": "akirkton@truefitinnovation.com", + "name": "Adam Kirkton" + }, + { + "email": "christopher.montgomery@dowjones.com", + "name": "Chris Montgomery" + }, + { + "email": "jryans@gmail.com", + "name": "J. Ryan Stinnett" + }, + { + "email": "jherrington@walmartlabs.com", + "name": "Jack Herrington" + }, + { + "email": "jeffpalentine@gmail.com", + "name": "Chris Truter" + }, + { + "email": "daniel@danielespeset.com", + "name": "Daniel Espeset" + }, + { + "email": "jamie.lf.wong@gmail.com", + "name": "Jamie Wong" + }, + { + "email": "ejpbruel@mozilla.com", + "name": "Eddy Bruël" + }, + { + "email": "hawkrives@gmail.com", + "name": "Hawken Rives" + }, + { + "email": "giladp007@gmail.com", + "name": "Gilad Peleg" + }, + { + "email": "djchie.dev@gmail.com", + "name": "djchie" + }, + { + "email": "garysye@gmail.com", + "name": "Gary Ye" + }, + { + "email": "nicolas.lalevee@hibnet.org", + "name": "Nicolas Lalevée" + } + ], + "dependencies": {}, + "description": "Generates and consumes source maps", + "devDependencies": { + "doctoc": "^0.15.0", + "webpack": "^1.12.0" + }, + "directories": {}, + "dist": { + "shasum": "82674b85a71b0be76c3e7416d15e9f5252eb3be0", + "tarball": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "source-map.js", + "lib/", + "dist/source-map.debug.js", + "dist/source-map.js", + "dist/source-map.min.js", + "dist/source-map.min.js.map" + ], + "homepage": "https://github.com/mozilla/source-map", + "license": "BSD-3-Clause", + "main": "./source-map.js", + "maintainers": [ + { + "email": "mozilla-developer-tools@googlegroups.com", + "name": "mozilla-devtools" + }, + { + "email": "dherman@mozilla.com", + "name": "mozilla" + }, + { + "email": "fitzgen@gmail.com", + "name": "nickfitzgerald" + } + ], + "name": "source-map", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/mozilla/source-map.git" + }, + "scripts": { + "build": "webpack --color", + "test": "node test/run-tests.js", + "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md" + }, + "version": "0.5.3" +} diff --git a/react-app/node_modules/source-map/source-map.js b/react-app/node_modules/source-map/source-map.js new file mode 100644 index 0000000000..bc88fe820c --- /dev/null +++ b/react-app/node_modules/source-map/source-map.js @@ -0,0 +1,8 @@ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; diff --git a/react-app/node_modules/strip-ansi/index.js b/react-app/node_modules/strip-ansi/index.js new file mode 100644 index 0000000000..099480fbfc --- /dev/null +++ b/react-app/node_modules/strip-ansi/index.js @@ -0,0 +1,6 @@ +'use strict'; +var ansiRegex = require('ansi-regex')(); + +module.exports = function (str) { + return typeof str === 'string' ? str.replace(ansiRegex, '') : str; +}; diff --git a/react-app/node_modules/strip-ansi/license b/react-app/node_modules/strip-ansi/license new file mode 100644 index 0000000000..654d0bfe94 --- /dev/null +++ b/react-app/node_modules/strip-ansi/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. diff --git a/react-app/node_modules/strip-ansi/package.json b/react-app/node_modules/strip-ansi/package.json new file mode 100644 index 0000000000..1511198484 --- /dev/null +++ b/react-app/node_modules/strip-ansi/package.json @@ -0,0 +1,115 @@ +{ + "_args": [ + [ + "strip-ansi@^3.0.0", + "/Users/mromano/dev/react-sfs/node_modules/chalk" + ] + ], + "_from": "strip-ansi@>=3.0.0 <4.0.0", + "_id": "strip-ansi@3.0.1", + "_inCache": true, + "_installable": true, + "_location": "/strip-ansi", + "_nodeVersion": "0.12.7", + "_npmOperationalInternal": { + "host": "packages-9-west.internal.npmjs.com", + "tmp": "tmp/strip-ansi-3.0.1.tgz_1456057278183_0.28958667791448534" + }, + "_npmUser": { + "email": "jappelman@xebia.com", + "name": "jbnicolai" + }, + "_npmVersion": "2.11.3", + "_phantomChildren": {}, + "_requested": { + "name": "strip-ansi", + "raw": "strip-ansi@^3.0.0", + "rawSpec": "^3.0.0", + "scope": null, + "spec": ">=3.0.0 <4.0.0", + "type": "range" + }, + "_requiredBy": [ + "/chalk" + ], + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "_shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "_shrinkwrap": null, + "_spec": "strip-ansi@^3.0.0", + "_where": "/Users/mromano/dev/react-sfs/node_modules/chalk", + "author": { + "email": "sindresorhus@gmail.com", + "name": "Sindre Sorhus", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/strip-ansi/issues" + }, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "description": "Strip ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "directories": {}, + "dist": { + "shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "gitHead": "8270705c704956da865623e564eba4875c3ea17f", + "homepage": "https://github.com/chalk/strip-ansi", + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "maintainers": [ + { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + { + "email": "jappelman@xebia.com", + "name": "jbnicolai" + } + ], + "name": "strip-ansi", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/strip-ansi.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "3.0.1" +} diff --git a/react-app/node_modules/strip-ansi/readme.md b/react-app/node_modules/strip-ansi/readme.md new file mode 100644 index 0000000000..cb7d9ff7ee --- /dev/null +++ b/react-app/node_modules/strip-ansi/readme.md @@ -0,0 +1,33 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install --save strip-ansi +``` + + +## Usage + +```js +var stripAnsi = require('strip-ansi'); + +stripAnsi('\u001b[4mcake\u001b[0m'); +//=> 'cake' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/react-app/node_modules/supports-color/index.js b/react-app/node_modules/supports-color/index.js new file mode 100644 index 0000000000..4346e272e1 --- /dev/null +++ b/react-app/node_modules/supports-color/index.js @@ -0,0 +1,50 @@ +'use strict'; +var argv = process.argv; + +var terminator = argv.indexOf('--'); +var hasFlag = function (flag) { + flag = '--' + flag; + var pos = argv.indexOf(flag); + return pos !== -1 && (terminator !== -1 ? pos < terminator : true); +}; + +module.exports = (function () { + if ('FORCE_COLOR' in process.env) { + return true; + } + + if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + return false; + } + + if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + return true; + } + + if (process.stdout && !process.stdout.isTTY) { + return false; + } + + if (process.platform === 'win32') { + return true; + } + + if ('COLORTERM' in process.env) { + return true; + } + + if (process.env.TERM === 'dumb') { + return false; + } + + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { + return true; + } + + return false; +})(); diff --git a/react-app/node_modules/supports-color/license b/react-app/node_modules/supports-color/license new file mode 100644 index 0000000000..654d0bfe94 --- /dev/null +++ b/react-app/node_modules/supports-color/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. diff --git a/react-app/node_modules/supports-color/package.json b/react-app/node_modules/supports-color/package.json new file mode 100644 index 0000000000..5a35ec7085 --- /dev/null +++ b/react-app/node_modules/supports-color/package.json @@ -0,0 +1,105 @@ +{ + "_args": [ + [ + "supports-color@^2.0.0", + "/Users/mromano/dev/react-sfs/node_modules/chalk" + ] + ], + "_from": "supports-color@>=2.0.0 <3.0.0", + "_id": "supports-color@2.0.0", + "_inCache": true, + "_installable": true, + "_location": "/supports-color", + "_nodeVersion": "0.12.5", + "_npmUser": { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + "_npmVersion": "2.11.2", + "_phantomChildren": {}, + "_requested": { + "name": "supports-color", + "raw": "supports-color@^2.0.0", + "rawSpec": "^2.0.0", + "scope": null, + "spec": ">=2.0.0 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "/chalk" + ], + "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "_shasum": "535d045ce6b6363fa40117084629995e9df324c7", + "_shrinkwrap": null, + "_spec": "supports-color@^2.0.0", + "_where": "/Users/mromano/dev/react-sfs/node_modules/chalk", + "author": { + "email": "sindresorhus@gmail.com", + "name": "Sindre Sorhus", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/supports-color/issues" + }, + "dependencies": {}, + "description": "Detect whether a terminal supports color", + "devDependencies": { + "mocha": "*", + "require-uncached": "^1.0.2" + }, + "directories": {}, + "dist": { + "shasum": "535d045ce6b6363fa40117084629995e9df324c7", + "tarball": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, + "engines": { + "node": ">=0.8.0" + }, + "files": [ + "index.js" + ], + "gitHead": "8400d98ade32b2adffd50902c06d9e725a5c6588", + "homepage": "https://github.com/chalk/supports-color", + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "ansi", + "styles", + "tty", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "support", + "supports", + "capability", + "detect" + ], + "license": "MIT", + "maintainers": [ + { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + { + "email": "jappelman@xebia.com", + "name": "jbnicolai" + } + ], + "name": "supports-color", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/supports-color.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "2.0.0" +} diff --git a/react-app/node_modules/supports-color/readme.md b/react-app/node_modules/supports-color/readme.md new file mode 100644 index 0000000000..b4761f1ecd --- /dev/null +++ b/react-app/node_modules/supports-color/readme.md @@ -0,0 +1,36 @@ +# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color) + +> Detect whether a terminal supports color + + +## Install + +``` +$ npm install --save supports-color +``` + + +## Usage + +```js +var supportsColor = require('supports-color'); + +if (supportsColor) { + console.log('Terminal supports color'); +} +``` + +It obeys the `--color` and `--no-color` CLI flags. + +For situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`. + + +## Related + +- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/react-app/node_modules/through/.travis.yml b/react-app/node_modules/through/.travis.yml new file mode 100644 index 0000000000..c693a939df --- /dev/null +++ b/react-app/node_modules/through/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - "0.10" diff --git a/react-app/node_modules/through/LICENSE.APACHE2 b/react-app/node_modules/through/LICENSE.APACHE2 new file mode 100644 index 0000000000..6366c04716 --- /dev/null +++ b/react-app/node_modules/through/LICENSE.APACHE2 @@ -0,0 +1,15 @@ +Apache License, Version 2.0 + +Copyright (c) 2011 Dominic Tarr + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/react-app/node_modules/through/LICENSE.MIT b/react-app/node_modules/through/LICENSE.MIT new file mode 100644 index 0000000000..6eafbd734a --- /dev/null +++ b/react-app/node_modules/through/LICENSE.MIT @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2011 Dominic Tarr + +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. diff --git a/react-app/node_modules/through/index.js b/react-app/node_modules/through/index.js new file mode 100644 index 0000000000..ca5fc5901f --- /dev/null +++ b/react-app/node_modules/through/index.js @@ -0,0 +1,108 @@ +var Stream = require('stream') + +// through +// +// a stream that does nothing but re-emit the input. +// useful for aggregating a series of changing but not ending streams into one stream) + +exports = module.exports = through +through.through = through + +//create a readable writable stream. + +function through (write, end, opts) { + write = write || function (data) { this.queue(data) } + end = end || function () { this.queue(null) } + + var ended = false, destroyed = false, buffer = [], _ended = false + var stream = new Stream() + stream.readable = stream.writable = true + stream.paused = false + +// stream.autoPause = !(opts && opts.autoPause === false) + stream.autoDestroy = !(opts && opts.autoDestroy === false) + + stream.write = function (data) { + write.call(this, data) + return !stream.paused + } + + function drain() { + while(buffer.length && !stream.paused) { + var data = buffer.shift() + if(null === data) + return stream.emit('end') + else + stream.emit('data', data) + } + } + + stream.queue = stream.push = function (data) { +// console.error(ended) + if(_ended) return stream + if(data === null) _ended = true + buffer.push(data) + drain() + return stream + } + + //this will be registered as the first 'end' listener + //must call destroy next tick, to make sure we're after any + //stream piped from here. + //this is only a problem if end is not emitted synchronously. + //a nicer way to do this is to make sure this is the last listener for 'end' + + stream.on('end', function () { + stream.readable = false + if(!stream.writable && stream.autoDestroy) + process.nextTick(function () { + stream.destroy() + }) + }) + + function _end () { + stream.writable = false + end.call(stream) + if(!stream.readable && stream.autoDestroy) + stream.destroy() + } + + stream.end = function (data) { + if(ended) return + ended = true + if(arguments.length) stream.write(data) + _end() // will emit or queue + return stream + } + + stream.destroy = function () { + if(destroyed) return + destroyed = true + ended = true + buffer.length = 0 + stream.writable = stream.readable = false + stream.emit('close') + return stream + } + + stream.pause = function () { + if(stream.paused) return + stream.paused = true + return stream + } + + stream.resume = function () { + if(stream.paused) { + stream.paused = false + stream.emit('resume') + } + drain() + //may have become paused again, + //as drain emits 'data'. + if(!stream.paused) + stream.emit('drain') + return stream + } + return stream +} + diff --git a/react-app/node_modules/through/package.json b/react-app/node_modules/through/package.json new file mode 100644 index 0000000000..2354a8bda3 --- /dev/null +++ b/react-app/node_modules/through/package.json @@ -0,0 +1,92 @@ +{ + "_args": [ + [ + "through@~2.3.4", + "/Users/mromano/dev/react-sfs/node_modules/envify" + ] + ], + "_from": "through@>=2.3.4 <2.4.0", + "_id": "through@2.3.8", + "_inCache": true, + "_installable": true, + "_location": "/through", + "_nodeVersion": "2.3.1", + "_npmUser": { + "email": "dominic.tarr@gmail.com", + "name": "dominictarr" + }, + "_npmVersion": "2.12.0", + "_phantomChildren": {}, + "_requested": { + "name": "through", + "raw": "through@~2.3.4", + "rawSpec": "~2.3.4", + "scope": null, + "spec": ">=2.3.4 <2.4.0", + "type": "range" + }, + "_requiredBy": [ + "/envify" + ], + "_resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "_shasum": "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5", + "_shrinkwrap": null, + "_spec": "through@~2.3.4", + "_where": "/Users/mromano/dev/react-sfs/node_modules/envify", + "author": { + "email": "dominic.tarr@gmail.com", + "name": "Dominic Tarr", + "url": "dominictarr.com" + }, + "bugs": { + "url": "https://github.com/dominictarr/through/issues" + }, + "dependencies": {}, + "description": "simplified stream construction", + "devDependencies": { + "from": "~0.1.3", + "stream-spec": "~0.3.5", + "tape": "~2.3.2" + }, + "directories": {}, + "dist": { + "shasum": "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5", + "tarball": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "gitHead": "2c5a6f9a0cc54da759b6e10964f2081c358e49dc", + "homepage": "https://github.com/dominictarr/through", + "keywords": [ + "stream", + "streams", + "user-streams", + "pipe" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "email": "dominic.tarr@gmail.com", + "name": "dominictarr" + } + ], + "name": "through", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/dominictarr/through.git" + }, + "scripts": { + "test": "set -e; for t in test/*.js; do node $t; done" + }, + "testling": { + "browsers": [ + "ie/8..latest", + "ff/15..latest", + "chrome/20..latest", + "safari/5.1..latest" + ], + "files": "test/*.js" + }, + "version": "2.3.8" +} diff --git a/react-app/node_modules/through/readme.markdown b/react-app/node_modules/through/readme.markdown new file mode 100644 index 0000000000..cb34c8135f --- /dev/null +++ b/react-app/node_modules/through/readme.markdown @@ -0,0 +1,64 @@ +#through + +[![build status](https://secure.travis-ci.org/dominictarr/through.png)](http://travis-ci.org/dominictarr/through) +[![testling badge](https://ci.testling.com/dominictarr/through.png)](https://ci.testling.com/dominictarr/through) + +Easy way to create a `Stream` that is both `readable` and `writable`. + +* Pass in optional `write` and `end` methods. +* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`. +* Use `this.pause()` and `this.resume()` to manage flow. +* Check `this.paused` to see current flow state. (`write` always returns `!this.paused`). + +This function is the basis for most of the synchronous streams in +[event-stream](http://github.com/dominictarr/event-stream). + +``` js +var through = require('through') + +through(function write(data) { + this.queue(data) //data *must* not be null + }, + function end () { //optional + this.queue(null) + }) +``` + +Or, can also be used _without_ buffering on pause, use `this.emit('data', data)`, +and this.emit('end') + +``` js +var through = require('through') + +through(function write(data) { + this.emit('data', data) + //this.pause() + }, + function end () { //optional + this.emit('end') + }) +``` + +## Extended Options + +You will probably not need these 99% of the time. + +### autoDestroy=false + +By default, `through` emits close when the writable +and readable side of the stream has ended. +If that is not desired, set `autoDestroy=false`. + +``` js +var through = require('through') + +//like this +var ts = through(write, end, {autoDestroy: false}) +//or like this +var ts = through(write, end) +ts.autoDestroy = false +``` + +## License + +MIT / Apache2 diff --git a/react-app/node_modules/through/test/async.js b/react-app/node_modules/through/test/async.js new file mode 100644 index 0000000000..46bdbaebcb --- /dev/null +++ b/react-app/node_modules/through/test/async.js @@ -0,0 +1,28 @@ +var from = require('from') +var through = require('../') + +var tape = require('tape') + +tape('simple async example', function (t) { + + var n = 0, expected = [1,2,3,4,5], actual = [] + from(expected) + .pipe(through(function(data) { + this.pause() + n ++ + setTimeout(function(){ + console.log('pushing data', data) + this.push(data) + this.resume() + }.bind(this), 300) + })).pipe(through(function(data) { + console.log('pushing data second time', data); + this.push(data) + })).on('data', function (d) { + actual.push(d) + }).on('end', function() { + t.deepEqual(actual, expected) + t.end() + }) + +}) diff --git a/react-app/node_modules/through/test/auto-destroy.js b/react-app/node_modules/through/test/auto-destroy.js new file mode 100644 index 0000000000..9a8fd0006f --- /dev/null +++ b/react-app/node_modules/through/test/auto-destroy.js @@ -0,0 +1,30 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('end before close', function (assert) { + var ts = through() + ts.autoDestroy = false + var ended = false, closed = false + + ts.on('end', function () { + assert.ok(!closed) + ended = true + }) + ts.on('close', function () { + assert.ok(ended) + closed = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.ok(ended) + assert.notOk(closed) + ts.destroy() + assert.ok(closed) + assert.end() +}) + diff --git a/react-app/node_modules/through/test/buffering.js b/react-app/node_modules/through/test/buffering.js new file mode 100644 index 0000000000..b0084bfc6e --- /dev/null +++ b/react-app/node_modules/through/test/buffering.js @@ -0,0 +1,71 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('buffering', function(assert) { + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + assert.deepEqual(actual, [1, 2, 3]) + ts.pause() + ts.write(4) + ts.write(5) + ts.write(6) + assert.deepEqual(actual, [1, 2, 3]) + ts.resume() + assert.deepEqual(actual, [1, 2, 3, 4, 5, 6]) + ts.pause() + ts.end() + assert.ok(!ended) + ts.resume() + assert.ok(ended) + assert.end() +}) + +test('buffering has data in queue, when ends', function (assert) { + + /* + * If stream ends while paused with data in the queue, + * stream should still emit end after all data is written + * on resume. + */ + + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.pause() + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.deepEqual(actual, [], 'no data written yet, still paused') + assert.ok(!ended, 'end not emitted yet, still paused') + ts.resume() + assert.deepEqual(actual, [1, 2, 3], 'resumed, all data should be delivered') + assert.ok(ended, 'end should be emitted once all data was delivered') + assert.end(); +}) diff --git a/react-app/node_modules/through/test/end.js b/react-app/node_modules/through/test/end.js new file mode 100644 index 0000000000..fa113f58e0 --- /dev/null +++ b/react-app/node_modules/through/test/end.js @@ -0,0 +1,45 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('end before close', function (assert) { + var ts = through() + var ended = false, closed = false + + ts.on('end', function () { + assert.ok(!closed) + ended = true + }) + ts.on('close', function () { + assert.ok(ended) + closed = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.ok(ended) + assert.ok(closed) + assert.end() +}) + +test('end only once', function (t) { + + var ts = through() + var ended = false, closed = false + + ts.on('end', function () { + t.equal(ended, false) + ended = true + }) + + ts.queue(null) + ts.queue(null) + ts.queue(null) + + ts.resume() + + t.end() +}) diff --git a/react-app/node_modules/through/test/index.js b/react-app/node_modules/through/test/index.js new file mode 100644 index 0000000000..96da82f97c --- /dev/null +++ b/react-app/node_modules/through/test/index.js @@ -0,0 +1,133 @@ + +var test = require('tape') +var spec = require('stream-spec') +var through = require('../') + +/* + I'm using these two functions, and not streams and pipe + so there is less to break. if this test fails it must be + the implementation of _through_ +*/ + +function write(array, stream) { + array = array.slice() + function next() { + while(array.length) + if(stream.write(array.shift()) === false) + return stream.once('drain', next) + + stream.end() + } + + next() +} + +function read(stream, callback) { + var actual = [] + stream.on('data', function (data) { + actual.push(data) + }) + stream.once('end', function () { + callback(null, actual) + }) + stream.once('error', function (err) { + callback(err) + }) +} + +test('simple defaults', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through() + var s = spec(t).through().pausable() + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + assert.end() + }) + + t.on('close', s.validate) + + write(expected, t) +}); + +test('simple functions', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through(function (data) { + this.emit('data', data*2) + }) + var s = spec(t).through().pausable() + + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected.map(function (data) { + return data*2 + })) + assert.end() + }) + + t.on('close', s.validate) + + write(expected, t) +}) + +test('pauses', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l) //Math.random()) + + var t = through() + + var s = spec(t) + .through() + .pausable() + + t.on('data', function () { + if(Math.random() > 0.1) return + t.pause() + process.nextTick(function () { + t.resume() + }) + }) + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + }) + + t.on('close', function () { + s.validate() + assert.end() + }) + + write(expected, t) +}) + +test('does not soft-end on `undefined`', function(assert) { + var stream = through() + , count = 0 + + stream.on('data', function (data) { + count++ + }) + + stream.write(undefined) + stream.write(undefined) + + assert.equal(count, 2) + + assert.end() +}) diff --git a/react-app/node_modules/to-fast-properties/index.js b/react-app/node_modules/to-fast-properties/index.js new file mode 100644 index 0000000000..33e594dcd0 --- /dev/null +++ b/react-app/node_modules/to-fast-properties/index.js @@ -0,0 +1,8 @@ +'use strict'; +module.exports = function toFastProperties(obj) { + function f() {} + f.prototype = obj; + new f(); + return; + eval(obj); +}; diff --git a/react-app/node_modules/to-fast-properties/license b/react-app/node_modules/to-fast-properties/license new file mode 100644 index 0000000000..55cc204eb3 --- /dev/null +++ b/react-app/node_modules/to-fast-properties/license @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014 Petka Antonov + 2015 Sindre Sorhus + +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. diff --git a/react-app/node_modules/to-fast-properties/package.json b/react-app/node_modules/to-fast-properties/package.json new file mode 100644 index 0000000000..fd235d79d4 --- /dev/null +++ b/react-app/node_modules/to-fast-properties/package.json @@ -0,0 +1,95 @@ +{ + "_args": [ + [ + "to-fast-properties@^1.0.1", + "/Users/mromano/dev/react-sfs/node_modules/babel-types" + ] + ], + "_from": "to-fast-properties@>=1.0.1 <2.0.0", + "_id": "to-fast-properties@1.0.2", + "_inCache": true, + "_installable": true, + "_location": "/to-fast-properties", + "_nodeVersion": "4.3.0", + "_npmOperationalInternal": { + "host": "packages-13-west.internal.npmjs.com", + "tmp": "tmp/to-fast-properties-1.0.2.tgz_1458494284238_0.9049524136353284" + }, + "_npmUser": { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + "_npmVersion": "2.14.12", + "_phantomChildren": {}, + "_requested": { + "name": "to-fast-properties", + "raw": "to-fast-properties@^1.0.1", + "rawSpec": "^1.0.1", + "scope": null, + "spec": ">=1.0.1 <2.0.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-types" + ], + "_resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", + "_shasum": "f3f5c0c3ba7299a7ef99427e44633257ade43320", + "_shrinkwrap": null, + "_spec": "to-fast-properties@^1.0.1", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babel-types", + "author": { + "email": "sindresorhus@gmail.com", + "name": "Sindre Sorhus", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/to-fast-properties/issues" + }, + "dependencies": {}, + "description": "Force V8 to use fast properties for an object", + "devDependencies": { + "ava": "0.0.4" + }, + "directories": {}, + "dist": { + "shasum": "f3f5c0c3ba7299a7ef99427e44633257ade43320", + "tarball": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "gitHead": "f65cab875234f8a9ee9b28df5d4db5c4a92fd0d9", + "homepage": "https://github.com/sindresorhus/to-fast-properties#readme", + "keywords": [ + "object", + "obj", + "properties", + "props", + "v8", + "optimize", + "fast", + "convert", + "mode" + ], + "license": "MIT", + "maintainers": [ + { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + } + ], + "name": "to-fast-properties", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/to-fast-properties.git" + }, + "scripts": { + "test": "node --allow-natives-syntax test.js" + }, + "version": "1.0.2" +} diff --git a/react-app/node_modules/to-fast-properties/readme.md b/react-app/node_modules/to-fast-properties/readme.md new file mode 100644 index 0000000000..e298c20897 --- /dev/null +++ b/react-app/node_modules/to-fast-properties/readme.md @@ -0,0 +1,37 @@ +# to-fast-properties [![Build Status](https://travis-ci.org/sindresorhus/to-fast-properties.svg?branch=master)](https://travis-ci.org/sindresorhus/to-fast-properties) + +> Force V8 to use fast properties for an object + +[Read more.](http://stackoverflow.com/questions/24987896/) + +Use `%HasFastProperties(object)` and `--allow-natives-syntax` to check whether an object already has fast properties. + + +## Install + +``` +$ npm install --save to-fast-properties +``` + + +## Usage + +```js +const toFastProperties = require('to-fast-properties'); + +const obj = { + foo: true, + bar: true +}; + +delete obj.foo; +// `obj` now has slow properties + +toFastProperties(obj); +// `obj` now has fast properties +``` + + +## License + +MIT © Petka Antonov, Sindre Sorhus diff --git a/react-app/node_modules/trim-right/index.js b/react-app/node_modules/trim-right/index.js new file mode 100644 index 0000000000..666f4b2f4e --- /dev/null +++ b/react-app/node_modules/trim-right/index.js @@ -0,0 +1,10 @@ +'use strict'; +module.exports = function (str) { + var tail = str.length; + + while (/[\s\uFEFF\u00A0]/.test(str[tail - 1])) { + tail--; + } + + return str.slice(0, tail); +}; diff --git a/react-app/node_modules/trim-right/license b/react-app/node_modules/trim-right/license new file mode 100644 index 0000000000..654d0bfe94 --- /dev/null +++ b/react-app/node_modules/trim-right/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. diff --git a/react-app/node_modules/trim-right/package.json b/react-app/node_modules/trim-right/package.json new file mode 100644 index 0000000000..46b7143dbd --- /dev/null +++ b/react-app/node_modules/trim-right/package.json @@ -0,0 +1,93 @@ +{ + "_args": [ + [ + "trim-right@^1.0.1", + "/Users/mromano/dev/react-sfs/node_modules/babel-generator" + ] + ], + "_from": "trim-right@>=1.0.1 <2.0.0", + "_id": "trim-right@1.0.1", + "_inCache": true, + "_installable": true, + "_location": "/trim-right", + "_nodeVersion": "0.12.5", + "_npmUser": { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + "_npmVersion": "2.11.2", + "_phantomChildren": {}, + "_requested": { + "name": "trim-right", + "raw": "trim-right@^1.0.1", + "rawSpec": "^1.0.1", + "scope": null, + "spec": ">=1.0.1 <2.0.0", + "type": "range" + }, + "_requiredBy": [ + "/babel-generator" + ], + "_resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "_shasum": "cb2e1203067e0c8de1f614094b9fe45704ea6003", + "_shrinkwrap": null, + "_spec": "trim-right@^1.0.1", + "_where": "/Users/mromano/dev/react-sfs/node_modules/babel-generator", + "author": { + "email": "sindresorhus@gmail.com", + "name": "Sindre Sorhus", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/trim-right/issues" + }, + "dependencies": {}, + "description": "Similar to String#trim() but removes only whitespace on the right", + "devDependencies": { + "ava": "0.0.4" + }, + "directories": {}, + "dist": { + "shasum": "cb2e1203067e0c8de1f614094b9fe45704ea6003", + "tarball": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "gitHead": "105fb46669afb0deb49d14bd688b276297e59dff", + "homepage": "https://github.com/sindresorhus/trim-right", + "keywords": [ + "trim", + "right", + "string", + "str", + "util", + "utils", + "utility", + "whitespace", + "space", + "remove", + "delete" + ], + "license": "MIT", + "maintainers": [ + { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + } + ], + "name": "trim-right", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/trim-right.git" + }, + "scripts": { + "test": "node test.js" + }, + "version": "1.0.1" +} diff --git a/react-app/node_modules/trim-right/readme.md b/react-app/node_modules/trim-right/readme.md new file mode 100644 index 0000000000..0a4438acd7 --- /dev/null +++ b/react-app/node_modules/trim-right/readme.md @@ -0,0 +1,30 @@ +# trim-right [![Build Status](https://travis-ci.org/sindresorhus/trim-right.svg?branch=master)](https://travis-ci.org/sindresorhus/trim-right) + +> Similar to [`String#trim()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) but removes only whitespace on the right + + +## Install + +``` +$ npm install --save trim-right +``` + + +## Usage + +```js +var trimRight = require('trim-right'); + +trimRight(' unicorn '); +//=> ' unicorn' +``` + + +## Related + +- [`trim-left`](https://github.com/sindresorhus/trim-left) - Similar to `String#trim()` but removes only whitespace on the left + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/react-app/node_modules/user-home/cli.js b/react-app/node_modules/user-home/cli.js new file mode 100755 index 0000000000..bacbd22755 --- /dev/null +++ b/react-app/node_modules/user-home/cli.js @@ -0,0 +1,26 @@ +#!/usr/bin/env node +'use strict'; +var pkg = require('./package.json'); +var userHome = require('./'); + +function help() { + console.log([ + pkg.description, + '', + 'Example', + ' $ user-home', + ' /Users/sindresorhus' + ].join('\n')); +} + +if (process.argv.indexOf('--help') !== -1) { + help(); + return; +} + +if (process.argv.indexOf('--version') !== -1) { + console.log(pkg.version); + return; +} + +process.stdout.write(userHome); diff --git a/react-app/node_modules/user-home/index.js b/react-app/node_modules/user-home/index.js new file mode 100644 index 0000000000..d53b7939ae --- /dev/null +++ b/react-app/node_modules/user-home/index.js @@ -0,0 +1,15 @@ +'use strict'; +var env = process.env; +var home = env.HOME; +var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME; + +if (process.platform === 'win32') { + module.exports = env.USERPROFILE || env.HOMEDRIVE + env.HOMEPATH || home || null; +} else if (process.platform === 'darwin') { + module.exports = home || (user ? '/Users/' + user : null) || null; +} else if (process.platform === 'linux') { + module.exports = home || + (user ? (process.getuid() === 0 ? '/root' : '/home/' + user) : null) || null; +} else { + module.exports = home || null; +} diff --git a/react-app/node_modules/user-home/license b/react-app/node_modules/user-home/license new file mode 100644 index 0000000000..654d0bfe94 --- /dev/null +++ b/react-app/node_modules/user-home/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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. diff --git a/react-app/node_modules/user-home/package.json b/react-app/node_modules/user-home/package.json new file mode 100644 index 0000000000..0ac0b69126 --- /dev/null +++ b/react-app/node_modules/user-home/package.json @@ -0,0 +1,95 @@ +{ + "_args": [ + [ + "user-home@^1.1.1", + "/Users/mromano/dev/react-sfs/node_modules/home-or-tmp" + ] + ], + "_from": "user-home@>=1.1.1 <2.0.0", + "_id": "user-home@1.1.1", + "_inCache": true, + "_installable": true, + "_location": "/user-home", + "_nodeVersion": "0.10.32", + "_npmUser": { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + }, + "_npmVersion": "2.1.16", + "_phantomChildren": {}, + "_requested": { + "name": "user-home", + "raw": "user-home@^1.1.1", + "rawSpec": "^1.1.1", + "scope": null, + "spec": ">=1.1.1 <2.0.0", + "type": "range" + }, + "_requiredBy": [ + "/home-or-tmp" + ], + "_resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "_shasum": "2b5be23a32b63a7c9deb8d0f28d485724a3df190", + "_shrinkwrap": null, + "_spec": "user-home@^1.1.1", + "_where": "/Users/mromano/dev/react-sfs/node_modules/home-or-tmp", + "author": { + "email": "sindresorhus@gmail.com", + "name": "Sindre Sorhus", + "url": "http://sindresorhus.com" + }, + "bin": { + "user-home": "cli.js" + }, + "bugs": { + "url": "https://github.com/sindresorhus/user-home/issues" + }, + "dependencies": {}, + "description": "Get the path to the user home directory", + "devDependencies": { + "ava": "0.0.3" + }, + "directories": {}, + "dist": { + "shasum": "2b5be23a32b63a7c9deb8d0f28d485724a3df190", + "tarball": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js", + "cli.js" + ], + "gitHead": "cf6ba885d3e6bf625fb3c15ad0334fa623968481", + "homepage": "https://github.com/sindresorhus/user-home", + "keywords": [ + "cli", + "bin", + "user", + "home", + "homedir", + "dir", + "directory", + "folder", + "path" + ], + "license": "MIT", + "maintainers": [ + { + "email": "sindresorhus@gmail.com", + "name": "sindresorhus" + } + ], + "name": "user-home", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/user-home.git" + }, + "scripts": { + "test": "node test.js" + }, + "version": "1.1.1" +} diff --git a/react-app/node_modules/user-home/readme.md b/react-app/node_modules/user-home/readme.md new file mode 100644 index 0000000000..5307a07ef5 --- /dev/null +++ b/react-app/node_modules/user-home/readme.md @@ -0,0 +1,42 @@ +# user-home [![Build Status](https://travis-ci.org/sindresorhus/user-home.svg?branch=master)](https://travis-ci.org/sindresorhus/user-home) + +> Get the path to the user home directory + + +## Install + +```sh +$ npm install --save user-home +``` + + +## Usage + +```js +var userHome = require('user-home'); + +console.log(userHome); +//=> /Users/sindresorhus +``` + +Returns `null` in the unlikely scenario that the home directory can't be found. + + +## CLI + +```sh +$ npm install --global user-home +``` + +```sh +$ user-home --help + +Example + $ user-home + /Users/sindresorhus +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/react-app/package.json b/react-app/package.json new file mode 100644 index 0000000000..b116c3a188 --- /dev/null +++ b/react-app/package.json @@ -0,0 +1,14 @@ +{ + "private": true, + "dependencies": { + "babel": "^6.5.2", + "babel-preset-react": "^6.5.0", + "babelify": "^7.2.0", + "director": "^1.2.0", + "history": "^2.0.1", + "react": "^0.13.3", + "react-dom": "^0.14.8", + "react-tap-event-plugin": "^0.2.2", + "todomvc-app-css": "^2.0.0" + } +} diff --git a/react-app/react-sfs.iml b/react-app/react-sfs.iml new file mode 100644 index 0000000000..8021953ed9 --- /dev/null +++ b/react-app/react-sfs.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/react-app/src/helloworld.js b/react-app/src/helloworld.js new file mode 100644 index 0000000000..fd0c69ec53 --- /dev/null +++ b/react-app/src/helloworld.js @@ -0,0 +1,51 @@ +var CommentBox = React.createClass({ + getInitialState: function() { + return { accept: 'image/*', action: 'target.php', droppable: ''}; + }, + + onChangeAccept: function(e) { + this.setState({accept: e.target.value}); + }, + + onChangeAction: function(e) { + this.setState({action: e.target.value}); + }, + + onChangeDroppable: function(e) { + this.setState({droppable: e.target.checked}); + }, + + render: function() { + return ( +
+
+ +

React

+
+
+ + +
+
+ + +
+
+ +
+
+
web component inside React
+ Choose File +
+
+
+
+ ); + } +}); +ReactDOM.render( +, + document.getElementById('example') +); diff --git a/react-app/tsd.json b/react-app/tsd.json new file mode 100644 index 0000000000..63b6ab78bc --- /dev/null +++ b/react-app/tsd.json @@ -0,0 +1,12 @@ +{ + "version": "v4", + "repo": "borisyankov/DefinitelyTyped", + "ref": "master", + "path": "typings", + "bundle": "typings/tsd.d.ts", + "installed": { + "react/react.d.ts": { + "commit": "d969b903d1fce89a5e43828ec68458b4f852db4d" + } + } +} diff --git a/react-app/typings/react/react-global.d.ts b/react-app/typings/react/react-global.d.ts new file mode 100644 index 0000000000..3a4cc07c3a --- /dev/null +++ b/react-app/typings/react/react-global.d.ts @@ -0,0 +1,22 @@ +// Type definitions for React v0.14 (namespace) +// Project: http://facebook.github.io/react/ +// Definitions by: Asana , AssureSign , Microsoft +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// + +import React = __React; +import ReactDOM = __React.__DOM; + +declare namespace __React { + export import addons = __React.__Addons; +} diff --git a/react-app/typings/react/react.d.ts b/react-app/typings/react/react.d.ts new file mode 100644 index 0000000000..04939558b5 --- /dev/null +++ b/react-app/typings/react/react.d.ts @@ -0,0 +1,2469 @@ +// Type definitions for React v0.14 +// Project: http://facebook.github.io/react/ +// Definitions by: Asana , AssureSign , Microsoft +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +declare namespace __React { + + // + // React Elements + // ---------------------------------------------------------------------- + + type ReactType = string | ComponentClass | StatelessComponent; + + type Key = string | number; + type Ref = string | ((instance: T) => any); + + interface Attributes { + key?: Key; + } + interface ClassAttributes extends Attributes { + ref?: Ref; + } + + interface ReactElement

{ + type: string | ComponentClass

| SFC

; + props: P; + key?: Key; + } + + interface SFCElement

extends ReactElement

{ + type: SFC

; + } + + type CElement> = ComponentElement; + interface ComponentElement> extends ReactElement

{ + type: ComponentClass

; + ref?: Ref; + } + + type ClassicElement

= CElement>; + + interface DOMElement

extends ReactElement

{ + type: string; + ref: Ref; + } + + interface ReactHTMLElement extends DOMElement { + } + + interface ReactSVGElement extends DOMElement { + } + + // + // Factories + // ---------------------------------------------------------------------- + + interface Factory

{ + (props?: P & Attributes, ...children: ReactNode[]): ReactElement

; + } + + interface SFCFactory

{ + (props?: P & Attributes, ...children: ReactNode[]): SFCElement

; + } + + interface ComponentFactory> { + (props?: P & ClassAttributes, ...children: ReactNode[]): CElement; + } + + type CFactory> = ComponentFactory; + type ClassicFactory

= CFactory>; + + interface DOMFactory

{ + (props?: P & ClassAttributes, ...children: ReactNode[]): DOMElement; + } + + interface HTMLFactory extends DOMFactory { + } + + interface SVGFactory extends DOMFactory { + } + + // + // React Nodes + // http://facebook.github.io/react/docs/glossary.html + // ---------------------------------------------------------------------- + + type ReactText = string | number; + type ReactChild = ReactElement | ReactText; + + // Should be Array but type aliases cannot be recursive + type ReactFragment = {} | Array; + type ReactNode = ReactChild | ReactFragment | boolean; + + // + // Top Level API + // ---------------------------------------------------------------------- + + function createClass(spec: ComponentSpec): ClassicComponentClass

; + + function createFactory

( + type: string): DOMFactory; + function createFactory

(type: SFC

): SFCFactory

; + function createFactory

( + type: ClassType, ClassicComponentClass

>): CFactory>; + function createFactory, C extends ComponentClass

>( + type: ClassType): CFactory; + function createFactory

(type: ComponentClass

| SFC

): Factory

; + + function createElement

( + type: string, + props?: P & ClassAttributes, + ...children: ReactNode[]): DOMElement; + function createElement

( + type: SFC

, + props?: P & Attributes, + ...children: ReactNode[]): SFCElement

; + function createElement

( + type: ClassType, ClassicComponentClass

>, + props?: P & ClassAttributes>, + ...children: ReactNode[]): CElement>; + function createElement, C extends ComponentClass

>( + type: ClassType, + props?: P & ClassAttributes, + ...children: ReactNode[]): CElement; + function createElement

( + type: ComponentClass

| SFC

, + props?: P & Attributes, + ...children: ReactNode[]): ReactElement

; + + function cloneElement

( + element: DOMElement, + props?: P & ClassAttributes, + ...children: ReactNode[]): DOMElement; + function cloneElement

( + element: SFCElement

, + props?: Q, // should be Q & Attributes, but then Q is inferred as {} + ...children: ReactNode[]): SFCElement

; + function cloneElement

>( + element: CElement, + props?: Q, // should be Q & ClassAttributes + ...children: ReactNode[]): CElement; + function cloneElement

( + element: ReactElement

, + props?: Q, // should be Q & Attributes + ...children: ReactNode[]): ReactElement

; + + function isValidElement

(object: {}): object is ReactElement

; + + var DOM: ReactDOM; + var PropTypes: ReactPropTypes; + var Children: ReactChildren; + + // + // Component API + // ---------------------------------------------------------------------- + + type ReactInstance = Component | Element; + + // Base component for plain JS classes + class Component implements ComponentLifecycle { + constructor(props?: P, context?: any); + setState(f: (prevState: S, props: P) => S, callback?: () => any): void; + setState(state: S, callback?: () => any): void; + forceUpdate(callBack?: () => any): void; + render(): JSX.Element; + + // React.Props is now deprecated, which means that the `children` + // property is not available on `P` by default, even though you can + // always pass children as variadic arguments to `createElement`. + // In the future, if we can define its call signature conditionally + // on the existence of `children` in `P`, then we should remove this. + props: P & { children?: ReactNode }; + state: S; + context: {}; + refs: { + [key: string]: ReactInstance + }; + } + + interface ClassicComponent extends Component { + replaceState(nextState: S, callback?: () => any): void; + isMounted(): boolean; + getInitialState?(): S; + } + + interface ChildContextProvider { + getChildContext(): CC; + } + + // + // Class Interfaces + // ---------------------------------------------------------------------- + + type SFC

= StatelessComponent

; + interface StatelessComponent

{ + (props?: P, context?: any): ReactElement; + propTypes?: ValidationMap

; + contextTypes?: ValidationMap; + defaultProps?: P; + displayName?: string; + } + + interface ComponentClass

{ + new(props?: P, context?: any): Component; + propTypes?: ValidationMap

; + contextTypes?: ValidationMap; + childContextTypes?: ValidationMap; + defaultProps?: P; + displayName?: string; + } + + interface ClassicComponentClass

extends ComponentClass

{ + new(props?: P, context?: any): ClassicComponent; + getDefaultProps?(): P; + } + + /** + * We use an intersection type to infer multiple type parameters from + * a single argument, which is useful for many top-level API defs. + * See https://github.com/Microsoft/TypeScript/issues/7234 for more info. + */ + type ClassType, C extends ComponentClass

> = + C & + (new() => T) & + (new() => { props: P }); + + // + // Component Specs and Lifecycle + // ---------------------------------------------------------------------- + + interface ComponentLifecycle { + componentWillMount?(): void; + componentDidMount?(): void; + componentWillReceiveProps?(nextProps: P, nextContext: any): void; + shouldComponentUpdate?(nextProps: P, nextState: S, nextContext: any): boolean; + componentWillUpdate?(nextProps: P, nextState: S, nextContext: any): void; + componentDidUpdate?(prevProps: P, prevState: S, prevContext: any): void; + componentWillUnmount?(): void; + } + + interface Mixin extends ComponentLifecycle { + mixins?: Mixin; + statics?: { + [key: string]: any; + }; + + displayName?: string; + propTypes?: ValidationMap; + contextTypes?: ValidationMap; + childContextTypes?: ValidationMap; + + getDefaultProps?(): P; + getInitialState?(): S; + } + + interface ComponentSpec extends Mixin { + render(): ReactElement; + + [propertyName: string]: any; + } + + // + // Event System + // ---------------------------------------------------------------------- + + interface SyntheticEvent { + bubbles: boolean; + cancelable: boolean; + currentTarget: EventTarget; + defaultPrevented: boolean; + eventPhase: number; + isTrusted: boolean; + nativeEvent: Event; + preventDefault(): void; + stopPropagation(): void; + target: EventTarget; + timeStamp: Date; + type: string; + } + + interface ClipboardEvent extends SyntheticEvent { + clipboardData: DataTransfer; + } + + interface CompositionEvent extends SyntheticEvent { + data: string; + } + + interface DragEvent extends SyntheticEvent { + dataTransfer: DataTransfer; + } + + interface FocusEvent extends SyntheticEvent { + relatedTarget: EventTarget; + } + + interface FormEvent extends SyntheticEvent { + } + + interface KeyboardEvent extends SyntheticEvent { + altKey: boolean; + charCode: number; + ctrlKey: boolean; + getModifierState(key: string): boolean; + key: string; + keyCode: number; + locale: string; + location: number; + metaKey: boolean; + repeat: boolean; + shiftKey: boolean; + which: number; + } + + interface MouseEvent extends SyntheticEvent { + altKey: boolean; + button: number; + buttons: number; + clientX: number; + clientY: number; + ctrlKey: boolean; + getModifierState(key: string): boolean; + metaKey: boolean; + pageX: number; + pageY: number; + relatedTarget: EventTarget; + screenX: number; + screenY: number; + shiftKey: boolean; + } + + interface TouchEvent extends SyntheticEvent { + altKey: boolean; + changedTouches: TouchList; + ctrlKey: boolean; + getModifierState(key: string): boolean; + metaKey: boolean; + shiftKey: boolean; + targetTouches: TouchList; + touches: TouchList; + } + + interface UIEvent extends SyntheticEvent { + detail: number; + view: AbstractView; + } + + interface WheelEvent extends SyntheticEvent { + deltaMode: number; + deltaX: number; + deltaY: number; + deltaZ: number; + } + + // + // Event Handler Types + // ---------------------------------------------------------------------- + + interface EventHandler { + (event: E): void; + } + + type ReactEventHandler = EventHandler; + + type ClipboardEventHandler = EventHandler; + type CompositionEventHandler = EventHandler; + type DragEventHandler = EventHandler; + type FocusEventHandler = EventHandler; + type FormEventHandler = EventHandler; + type KeyboardEventHandler = EventHandler; + type MouseEventHandler = EventHandler; + type TouchEventHandler = EventHandler; + type UIEventHandler = EventHandler; + type WheelEventHandler = EventHandler; + + // + // Props / DOM Attributes + // ---------------------------------------------------------------------- + + /** + * @deprecated. This was used to allow clients to pass `ref` and `key` + * to `createElement`, which is no longer necessary due to intersection + * types. If you need to declare a props object before passing it to + * `createElement` or a factory, use `ClassAttributes`: + * + * ```ts + * var b: Button; + * var props: ButtonProps & ClassAttributes