diff --git a/.gitignore b/.gitignore
index a4854be..48a823f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
vendor/
node_modules/
npm-debug.log
+test_responses/
# Laravel 4 specific
bootstrap/compiled.php
diff --git a/GameGab.pdf b/GameGab.pdf
new file mode 100644
index 0000000..2a34946
Binary files /dev/null and b/GameGab.pdf differ
diff --git a/app/Http/Controllers/PostController.php b/app/Http/Controllers/PostController.php
index f07d242..0ffb751 100644
--- a/app/Http/Controllers/PostController.php
+++ b/app/Http/Controllers/PostController.php
@@ -3,61 +3,58 @@
namespace App\Http\Controllers;
use App\Post;
+use App\Http\Resources\PostCollection;
use Illuminate\Http\Request;
class PostController extends Controller
{
- /**
- * Display a listing of the resource.
- *
- * @return \Illuminate\Http\Response
- */
- public function index()
- {
- //
- }
-
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
- public function create()
+ public function create(Thread $post)
{
- //
+ return view("create_post")->withThread($post);
}
/**
- * Store a newly created resource in storage.
+ * Show the form for editing the specified resource.
*
- * @param \Illuminate\Http\Request $request
+ * @param \App\Post $post
* @return \Illuminate\Http\Response
*/
- public function store(Request $request)
+ public function edit(Post $post)
{
- //
+ return view("edit_post")->withPost($post);
}
/**
- * Display the specified resource.
- *
- * @param \App\Post $post
- * @return \Illuminate\Http\Response
+ * Show the posts for a certain thread.
+ *
+ * @param int $thread
*/
- public function show(Post $post)
- {
- //
+ public function show(int $thread_id) {
+ $posts = new PostCollection(Post::with("poster")->get()->where("thread_id", $thread_id));
+//dd($posts);
+ return $posts;
}
/**
- * Show the form for editing the specified resource.
+ * Store a newly created resource in storage.
*
- * @param \App\Post $post
+ * @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
- public function edit(Post $post)
+ public function store(Request $request)
{
- //
+ $post = new Post;
+
+ $post->poster_id = $request->user_id;
+ $post->content = $request->content;
+ $post->thread_id = $request->thread_id;
+
+ $post->save();
}
/**
@@ -69,17 +66,19 @@ class PostController extends Controller
*/
public function update(Request $request, Post $post)
{
- //
+ $post->content = $request->content;
+
+ $post->save();
}
/**
* Remove the specified resource from storage.
*
- * @param \App\Post $post
+ * @param int $id
* @return \Illuminate\Http\Response
*/
- public function destroy(Post $post)
+ public function destroy(int $id)
{
- //
+ Post::find($id)->delete();
}
}
diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php
index 137d3d2..df60c70 100644
--- a/app/Http/Controllers/TagController.php
+++ b/app/Http/Controllers/TagController.php
@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Tag;
+use App\Http\Resources\TagCollection;
use Illuminate\Http\Request;
class TagController extends Controller
@@ -14,7 +15,7 @@ class TagController extends Controller
*/
public function index()
{
- //
+ return TagCollection(Tag::get());
}
/**
@@ -24,40 +25,34 @@ class TagController extends Controller
*/
public function create()
{
- //
+ return view("create_tag");
}
/**
- * Store a newly created resource in storage.
- *
- * @param \Illuminate\Http\Request $request
- * @return \Illuminate\Http\Response
- */
- public function store(Request $request)
- {
- //
- }
-
- /**
- * Display the specified resource.
+ * Show the form for editing the specified resource.
*
* @param \App\Tag $tag
* @return \Illuminate\Http\Response
*/
- public function show(Tag $tag)
+ public function edit(Tag $tag)
{
- //
+ return view("edit_tag");
}
/**
- * Show the form for editing the specified resource.
+ * Store a newly created resource in storage.
*
- * @param \App\Tag $tag
+ * @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
- public function edit(Tag $tag)
+ public function store(Request $request)
{
- //
+ $tag = new Tag;
+
+ $tag->tag_text = $request->tag_text;
+ $tag->creator_id = $request->user_id;
+
+ $tag->save();
}
/**
@@ -69,7 +64,8 @@ class TagController extends Controller
*/
public function update(Request $request, Tag $tag)
{
- //
+ $tag->tag_text = $request->tag_text;
+ $tag->save();
}
/**
@@ -80,6 +76,6 @@ class TagController extends Controller
*/
public function destroy(Tag $tag)
{
- //
+ $tag->delete();
}
}
diff --git a/app/Http/Controllers/ThreadController.php b/app/Http/Controllers/ThreadController.php
index 67bcbb8..0c3d981 100644
--- a/app/Http/Controllers/ThreadController.php
+++ b/app/Http/Controllers/ThreadController.php
@@ -29,6 +29,26 @@ class ThreadController extends Controller
return view("create_thread");
}
+ /**
+ * Show thread view.
+ *
+ * @param int $thread
+ */
+ public function view_thread(int $thread_id) {
+ return view("thread")->with("thread_id", $thread_id);
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param \App\Thread $thread
+ * @return \Illuminate\Http\Response
+ */
+ public function edit(Thread $thread)
+ {
+ return view("edit")->withThread($thread);
+ }
+
/**
* Store a newly created resource in storage.
*
@@ -38,9 +58,9 @@ class ThreadController extends Controller
public function store(Request $request)
{
$thread = new Thread;
-
+//dd($request);
$thread->thread_title = $request->thread_title;
- $thread->thread_poster_id = $request->user_id;
+ $thread->thread_creator_id = $request->user_id;
$thread->save();
}
@@ -48,23 +68,15 @@ class ThreadController extends Controller
/**
* Display the specified resource.
*
- * @param \App\Thread $thread
- * @return \Illuminate\Http\Response
- */
- public function show(Thread $thread)
- {
- return view("thread_view")->withThread($thread);
- }
-
- /**
- * Show the form for editing the specified resource.
- *
- * @param \App\Thread $thread
+ * @param integer $id
+ * - A thread ID
* @return \Illuminate\Http\Response
*/
- public function edit(Thread $thread)
+ public function show(int $id)
{
- //
+ $selected_thread = new ThreadsCollection(Thread::with("creator")->get()->where("id", $id));
+//dd(Thread::with("posts")->get()->where("id", $id));
+ return Thread::with("creator")->find($id);//$selected_thread;
}
/**
@@ -76,17 +88,18 @@ class ThreadController extends Controller
*/
public function update(Request $request, Thread $thread)
{
- //
+ $thread->thread_title = $request->thread_title;
+ $thread->save();
}
/**
* Remove the specified resource from storage.
*
- * @param \App\Thread $thread
+ * @param int $int
* @return \Illuminate\Http\Response
*/
- public function destroy(Thread $thread)
+ public function destroy(int $id)
{
- //
+ Thread::find($id)->delete();
}
}
diff --git a/app/Http/Resources/PostCollection.php b/app/Http/Resources/PostCollection.php
new file mode 100644
index 0000000..5afb80d
--- /dev/null
+++ b/app/Http/Resources/PostCollection.php
@@ -0,0 +1,21 @@
+ $this->collection
+ ];
+ }
+}
diff --git a/app/Http/Resources/TagCollection.php b/app/Http/Resources/TagCollection.php
new file mode 100644
index 0000000..59ee2ac
--- /dev/null
+++ b/app/Http/Resources/TagCollection.php
@@ -0,0 +1,21 @@
+ $this->$collection
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Resources/ThreadsCollection.php b/app/Http/Resources/ThreadsCollection.php
index 4de9ef9..421c1f5 100644
--- a/app/Http/Resources/ThreadsCollection.php
+++ b/app/Http/Resources/ThreadsCollection.php
@@ -19,6 +19,9 @@ class ThreadsCollection extends ResourceCollection
];
}
+ /**
+ * Deprecated, kept for posterity.
+ */
public function getCreators() {
foreach($this->collection as &$t) {
$creator = $t->creator;
diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
index 5ea48d3..1e08769 100644
--- a/app/Providers/RouteServiceProvider.php
+++ b/app/Providers/RouteServiceProvider.php
@@ -26,6 +26,10 @@ class RouteServiceProvider extends ServiceProvider
//
parent::boot();
+
+ Route::model('thread', 'App\Thread');
+ Route::model('post', 'App\Post');
+ Route::model('tag', 'App\Tag');
}
/**
diff --git a/app/Thread.php b/app/Thread.php
index 70cdd8d..5d7c0d3 100644
--- a/app/Thread.php
+++ b/app/Thread.php
@@ -6,8 +6,6 @@ use Illuminate\Database\Eloquent\Model;
class Thread extends Model
{
- private $creator_name;
-
/**
* Get the creator of the thread.
*/
@@ -21,4 +19,11 @@ class Thread extends Model
public function tags() {
return $this->belongsToMany('App\Tag');
}
+
+ /**
+ * Get the posts for the thread.
+ */
+ public function posts() {
+ return $this->hasMany('App\Post');
+ }
}
diff --git a/public/js/app.js b/public/js/app.js
index 998f46c..556789c 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -86,6 +86,18 @@
/************************************************************************/
/******/ ({
+/***/ "./node_modules/@babel/runtime/regenerator/index.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/@babel/runtime/regenerator/index.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js");
+
+
+/***/ }),
+
/***/ "./node_modules/axios/index.js":
/*!*************************************!*\
!*** ./node_modules/axios/index.js ***!
@@ -1752,6 +1764,193 @@ module.exports = {
};
+/***/ }),
+
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreatePostComponent.vue?vue&type=script&lang=js&":
+/*!******************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/CreatePostComponent.vue?vue&type=script&lang=js& ***!
+ \******************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+/* harmony default export */ __webpack_exports__["default"] = ({
+ props: ['user_id', 'thread_id'],
+ data: function data() {
+ return {
+ content: '',
+ edit: true
+ };
+ },
+ methods: {
+ addPost: function addPost() {
+ var _this = this;
+
+ fetch("../api/post/store", {
+ method: "post",
+ credentials: "same-origin",
+ headers: {
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ "content": this.content,
+ "thread_id": this.thread_id,
+ "user_id": this.user_id
+ })
+ }).then(function (res) {
+ _this.content = '';
+
+ _this.$emit("submitted");
+ }).catch(function (err) {
+ return console.log(err);
+ });
+ }
+ }
+});
+
+/***/ }),
+
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreateThreadComponent.vue?vue&type=script&lang=js&":
+/*!********************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/CreateThreadComponent.vue?vue&type=script&lang=js& ***!
+ \********************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+/* harmony default export */ __webpack_exports__["default"] = ({
+ props: ['user_id'],
+ data: function data() {
+ return {
+ thread_title: '',
+ edit: true
+ };
+ },
+ methods: {
+ createThread: function createThread() {
+ var _this = this;
+
+ fetch("api/thread/store", {
+ method: "post",
+ credentials: "same-origin",
+ headers: {
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ "thread_title": this.thread_title,
+ "user_id": this.user_id
+ })
+ }).then(function (res) {
+ console.log(res);
+ _this.thread_title = '';
+
+ _this.$emit("submitted");
+ }).catch(function (err) {
+ return console.log(err);
+ });
+ }
+ }
+});
+
+/***/ }),
+
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/GifSelectComponent.vue?vue&type=script&lang=js&":
+/*!*****************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/GifSelectComponent.vue?vue&type=script&lang=js& ***!
+ \*****************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+/* harmony default export */ __webpack_exports__["default"] = ({
+ data: function data() {
+ return {
+ search: '',
+ gifs: [],
+ gif: {
+ id: ''
+ }
+ };
+ },
+ methods: {
+ buildGifs: function buildGifs(json) {
+ this.gifs = json.data.map(function (gif) {
+ return gif.id;
+ }).map(function (gifId) {
+ return "https://media.giphy.com/media/".concat(gifId, "/giphy.gif");
+ });
+ }
+ },
+ watch: {
+ search: function search() {
+ var _this = this;
+
+ var apiKey = "nYQNPpAixuVqNPSYjOdhQAAS4oP1Q9rS";
+ var searchEndPoint = "https://api.giphy.com/v1/gifs/search?";
+ var limit = 5;
+ var url = "".concat(searchEndPoint, "&api_key=").concat(apiKey, "&q=").concat(this.search, "&limit=").concat(limit);
+ fetch(url).then(function (response) {
+ return response.json();
+ }).then(function (json) {
+ _this.buildGifs(json);
+ }).catch(function (err) {
+ console.log(err);
+ });
+ }
+ }
+});
+
/***/ }),
/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/ThreadComponent.vue?vue&type=script&lang=js&":
@@ -1763,6 +1962,25 @@ module.exports = {
"use strict";
__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js");
+/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
+
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
//
//
//
@@ -1774,17 +1992,25 @@ __webpack_require__.r(__webpack_exports__);
//
//
/* harmony default export */ __webpack_exports__["default"] = ({
+ props: ['user_id', 'with'],
data: function data() {
return {
+ logged_in: this.user_id,
threads: [],
thread: {
id: '',
thread_title: '',
creator: {
+ id: '',
name: ''
- }
+ },
+ filtered: false
},
thread_id: '',
+ filter: '',
+ filtered: [],
+ filter_flag: false,
+ scroll_flag: true,
edit: false
};
},
@@ -1799,6 +2025,153 @@ __webpack_require__.r(__webpack_exports__);
return res.json();
}).then(function (res) {
_this.threads = res.data;
+
+ if (_this.scroll_flag) {
+ window.scrollTo(0, document.body.scrollHeight);
+ } else _this.scroll_flag = true;
+ });
+ },
+ destroyThread: function destroyThread(thread_id) {
+ var _this2 = this;
+
+ fetch("api/thread/destroy/" + thread_id).then(function (res) {
+ _this2.scroll_flag = false;
+
+ _this2.fetchThreads();
+ });
+ },
+ deleteCheck: function deleteCheck(thread) {
+ return thread.creator != null && this.user_id == thread.creator.id;
+ },
+ filteredCheck: function filteredCheck(thread) {
+ return !this.filtered.include(thread.id);
+ }
+ },
+ watch: {
+ filter: function () {
+ var _filter2 = _asyncToGenerator(
+ /*#__PURE__*/
+ _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(_filter) {
+ var _this3 = this;
+
+ return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ console.log(_filter);
+ Object.keys(this.threads).forEach(function (thread) {
+ _this3.threads[thread].filtered = !_this3.threads[thread].thread_title.includes(_filter);
+ console.log(_this3.threads[thread]);
+ });
+ _context.next = 4;
+ return this.$nextTick(function () {
+ this.$forceUpdate();
+ });
+
+ case 4:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ function filter(_x) {
+ return _filter2.apply(this, arguments);
+ }
+
+ return filter;
+ }()
+ }
+});
+
+/***/ }),
+
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/ThreadViewComponent.vue?vue&type=script&lang=js&":
+/*!******************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/ThreadViewComponent.vue?vue&type=script&lang=js& ***!
+ \******************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+/* harmony default export */ __webpack_exports__["default"] = ({
+ props: ['user_id', 'thread_id', 'with'],
+ data: function data() {
+ return {
+ id: '',
+ thread_title: '',
+ creator: {
+ name: ''
+ },
+ posts: [],
+ post: {
+ id: '',
+ content: '',
+ poster: {
+ id: '',
+ name: ''
+ }
+ }
+ };
+ },
+ created: function created() {
+ this.fetchThread();
+ },
+ methods: {
+ fetchThread: function fetchThread() {
+ var _this = this;
+
+ fetch("../api/thread/" + this.thread_id).then(function (res) {
+ return res.json();
+ }).then(function (res) {
+ _this.id = res.id;
+ _this.thread_title = res.thread_title;
+ _this.creator = res.creator;
+ }).catch(function (err) {
+ return console.log(err);
+ });
+ fetch("../api/post/thread/" + this.thread_id).then(function (res) {
+ return res.json();
+ }).then(function (res) {
+ _this.posts = res.data;
+ }).catch(function (err) {
+ return console.log(err);
+ });
+ ;
+ },
+ deleteCheck: function deleteCheck(post) {
+ return post.poster != null && this.user_id == post.poster.id;
+ },
+ destroyPost: function destroyPost(post_id) {
+ var _this2 = this;
+
+ fetch("../api/post/destroy/" + post_id) //.then(res => res.json())
+ .then(function (res) {
+ _this2.fetchThread();
});
}
}
@@ -6249,6 +6622,112 @@ __webpack_require__.r(__webpack_exports__);
//# sourceMappingURL=bootstrap.js.map
+/***/ }),
+
+/***/ "./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/GifSelectComponent.vue?vue&type=style&index=0&lang=css&":
+/*!************************************************************************************************************************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/css-loader??ref--6-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/GifSelectComponent.vue?vue&type=style&index=0&lang=css& ***!
+ \************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
+// imports
+
+
+// module
+exports.push([module.i, "\n.gif-container {\n margin-top: 30px;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n", ""]);
+
+// exports
+
+
+/***/ }),
+
+/***/ "./node_modules/css-loader/lib/css-base.js":
+/*!*************************************************!*\
+ !*** ./node_modules/css-loader/lib/css-base.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+// css base code, injected by the css-loader
+module.exports = function(useSourceMap) {
+ var list = [];
+
+ // return the list of modules as css string
+ list.toString = function toString() {
+ return this.map(function (item) {
+ var content = cssWithMappingToString(item, useSourceMap);
+ if(item[2]) {
+ return "@media " + item[2] + "{" + content + "}";
+ } else {
+ return content;
+ }
+ }).join("");
+ };
+
+ // import a list of modules into the list
+ list.i = function(modules, mediaQuery) {
+ if(typeof modules === "string")
+ modules = [[null, modules, ""]];
+ var alreadyImportedModules = {};
+ for(var i = 0; i < this.length; i++) {
+ var id = this[i][0];
+ if(typeof id === "number")
+ alreadyImportedModules[id] = true;
+ }
+ for(i = 0; i < modules.length; i++) {
+ var item = modules[i];
+ // skip already imported module
+ // this implementation is not 100% perfect for weird media query combinations
+ // when a module is imported multiple times with different media queries.
+ // I hope this will never occur (Hey this way we have smaller bundles)
+ if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
+ if(mediaQuery && !item[2]) {
+ item[2] = mediaQuery;
+ } else if(mediaQuery) {
+ item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
+ }
+ list.push(item);
+ }
+ }
+ };
+ return list;
+};
+
+function cssWithMappingToString(item, useSourceMap) {
+ var content = item[1] || '';
+ var cssMapping = item[3];
+ if (!cssMapping) {
+ return content;
+ }
+
+ if (useSourceMap && typeof btoa === 'function') {
+ var sourceMapping = toComment(cssMapping);
+ var sourceURLs = cssMapping.sources.map(function (source) {
+ return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'
+ });
+
+ return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
+ }
+
+ return [content].join('\n');
+}
+
+// Adapted from convert-source-map (MIT)
+function toComment(sourceMap) {
+ // eslint-disable-next-line no-undef
+ var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
+ var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;
+
+ return '/*# ' + data + ' */';
+}
+
+
/***/ }),
/***/ "./node_modules/is-buffer/index.js":
@@ -36558,6 +37037,743 @@ process.chdir = function (dir) {
process.umask = function() { return 0; };
+/***/ }),
+
+/***/ "./node_modules/regenerator-runtime/runtime.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/regenerator-runtime/runtime.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/**
+ * Copyright (c) 2014-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+var runtime = (function (exports) {
+ "use strict";
+
+ var Op = Object.prototype;
+ var hasOwn = Op.hasOwnProperty;
+ var undefined; // More compressible than void 0.
+ var $Symbol = typeof Symbol === "function" ? Symbol : {};
+ var iteratorSymbol = $Symbol.iterator || "@@iterator";
+ var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+ var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
+ var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+ var generator = Object.create(protoGenerator.prototype);
+ var context = new Context(tryLocsList || []);
+
+ // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+ generator._invoke = makeInvokeMethod(innerFn, self, context);
+
+ return generator;
+ }
+ exports.wrap = wrap;
+
+ // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+ function tryCatch(fn, obj, arg) {
+ try {
+ return { type: "normal", arg: fn.call(obj, arg) };
+ } catch (err) {
+ return { type: "throw", arg: err };
+ }
+ }
+
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed";
+
+ // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+ var ContinueSentinel = {};
+
+ // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+ function Generator() {}
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+
+ // This is a polyfill for %IteratorPrototype% for environments that
+ // don't natively support it.
+ var IteratorPrototype = {};
+ IteratorPrototype[iteratorSymbol] = function () {
+ return this;
+ };
+
+ var getProto = Object.getPrototypeOf;
+ var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+ if (NativeIteratorPrototype &&
+ NativeIteratorPrototype !== Op &&
+ hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+ // This environment has a native %IteratorPrototype%; use it instead
+ // of the polyfill.
+ IteratorPrototype = NativeIteratorPrototype;
+ }
+
+ var Gp = GeneratorFunctionPrototype.prototype =
+ Generator.prototype = Object.create(IteratorPrototype);
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunctionPrototype[toStringTagSymbol] =
+ GeneratorFunction.displayName = "GeneratorFunction";
+
+ // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function(method) {
+ prototype[method] = function(arg) {
+ return this._invoke(method, arg);
+ };
+ });
+ }
+
+ exports.isGeneratorFunction = function(genFun) {
+ var ctor = typeof genFun === "function" && genFun.constructor;
+ return ctor
+ ? ctor === GeneratorFunction ||
+ // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) === "GeneratorFunction"
+ : false;
+ };
+
+ exports.mark = function(genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ if (!(toStringTagSymbol in genFun)) {
+ genFun[toStringTagSymbol] = "GeneratorFunction";
+ }
+ }
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ };
+
+ // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `hasOwn.call(value, "__await")` to determine if the yielded value is
+ // meant to be awaited.
+ exports.awrap = function(arg) {
+ return { __await: arg };
+ };
+
+ function AsyncIterator(generator) {
+ function invoke(method, arg, resolve, reject) {
+ var record = tryCatch(generator[method], generator, arg);
+ if (record.type === "throw") {
+ reject(record.arg);
+ } else {
+ var result = record.arg;
+ var value = result.value;
+ if (value &&
+ typeof value === "object" &&
+ hasOwn.call(value, "__await")) {
+ return Promise.resolve(value.__await).then(function(value) {
+ invoke("next", value, resolve, reject);
+ }, function(err) {
+ invoke("throw", err, resolve, reject);
+ });
+ }
+
+ return Promise.resolve(value).then(function(unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration.
+ result.value = unwrapped;
+ resolve(result);
+ }, function(error) {
+ // If a rejected Promise was yielded, throw the rejection back
+ // into the async generator function so it can be handled there.
+ return invoke("throw", error, resolve, reject);
+ });
+ }
+ }
+
+ var previousPromise;
+
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return new Promise(function(resolve, reject) {
+ invoke(method, arg, resolve, reject);
+ });
+ }
+
+ return previousPromise =
+ // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise ? previousPromise.then(
+ callInvokeWithMethodAndArg,
+ // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg
+ ) : callInvokeWithMethodAndArg();
+ }
+
+ // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+ this._invoke = enqueue;
+ }
+
+ defineIteratorMethods(AsyncIterator.prototype);
+ AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+ return this;
+ };
+ exports.AsyncIterator = AsyncIterator;
+
+ // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+ exports.async = function(innerFn, outerFn, self, tryLocsList) {
+ var iter = new AsyncIterator(
+ wrap(innerFn, outerFn, self, tryLocsList)
+ );
+
+ return exports.isGeneratorFunction(outerFn)
+ ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function(result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
+
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
+
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ }
+
+ // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+ return doneResult();
+ }
+
+ context.method = method;
+ context.arg = arg;
+
+ while (true) {
+ var delegate = context.delegate;
+ if (delegate) {
+ var delegateResult = maybeInvokeDelegate(delegate, context);
+ if (delegateResult) {
+ if (delegateResult === ContinueSentinel) continue;
+ return delegateResult;
+ }
+ }
+
+ if (context.method === "next") {
+ // Setting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ context.sent = context._sent = context.arg;
+
+ } else if (context.method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw context.arg;
+ }
+
+ context.dispatchException(context.arg);
+
+ } else if (context.method === "return") {
+ context.abrupt("return", context.arg);
+ }
+
+ state = GenStateExecuting;
+
+ var record = tryCatch(innerFn, self, context);
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done
+ ? GenStateCompleted
+ : GenStateSuspendedYield;
+
+ if (record.arg === ContinueSentinel) {
+ continue;
+ }
+
+ return {
+ value: record.arg,
+ done: context.done
+ };
+
+ } else if (record.type === "throw") {
+ state = GenStateCompleted;
+ // Dispatch the exception by looping back around to the
+ // context.dispatchException(context.arg) call above.
+ context.method = "throw";
+ context.arg = record.arg;
+ }
+ }
+ };
+ }
+
+ // Call delegate.iterator[context.method](context.arg) and handle the
+ // result, either by returning a { value, done } result from the
+ // delegate iterator, or by modifying context.method and context.arg,
+ // setting context.delegate to null, and returning the ContinueSentinel.
+ function maybeInvokeDelegate(delegate, context) {
+ var method = delegate.iterator[context.method];
+ if (method === undefined) {
+ // A .throw or .return when the delegate iterator has no .throw
+ // method always terminates the yield* loop.
+ context.delegate = null;
+
+ if (context.method === "throw") {
+ // Note: ["return"] must be used for ES3 parsing compatibility.
+ if (delegate.iterator["return"]) {
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ context.method = "return";
+ context.arg = undefined;
+ maybeInvokeDelegate(delegate, context);
+
+ if (context.method === "throw") {
+ // If maybeInvokeDelegate(context) changed context.method from
+ // "return" to "throw", let that override the TypeError below.
+ return ContinueSentinel;
+ }
+ }
+
+ context.method = "throw";
+ context.arg = new TypeError(
+ "The iterator does not provide a 'throw' method");
+ }
+
+ return ContinueSentinel;
+ }
+
+ var record = tryCatch(method, delegate.iterator, context.arg);
+
+ if (record.type === "throw") {
+ context.method = "throw";
+ context.arg = record.arg;
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ var info = record.arg;
+
+ if (! info) {
+ context.method = "throw";
+ context.arg = new TypeError("iterator result is not an object");
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ if (info.done) {
+ // Assign the result of the finished delegate to the temporary
+ // variable specified by delegate.resultName (see delegateYield).
+ context[delegate.resultName] = info.value;
+
+ // Resume execution at the desired location (see delegateYield).
+ context.next = delegate.nextLoc;
+
+ // If context.method was "throw" but the delegate handled the
+ // exception, let the outer generator proceed normally. If
+ // context.method was "next", forget context.arg since it has been
+ // "consumed" by the delegate iterator. If context.method was
+ // "return", allow the original .return call to continue in the
+ // outer generator.
+ if (context.method !== "return") {
+ context.method = "next";
+ context.arg = undefined;
+ }
+
+ } else {
+ // Re-yield the result returned by the delegate method.
+ return info;
+ }
+
+ // The delegate iterator is finished, so forget it and continue with
+ // the outer generator.
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+ defineIteratorMethods(Gp);
+
+ Gp[toStringTagSymbol] = "Generator";
+
+ // A Generator should always return itself as the iterator object when the
+ // @@iterator function is called on it. Some browsers' implementations of the
+ // iterator prototype chain incorrectly implement this, causing the Generator
+ // object to not be returned from this call. This ensures that doesn't happen.
+ // See https://github.com/facebook/regenerator/issues/274 for more details.
+ Gp[iteratorSymbol] = function() {
+ return this;
+ };
+
+ Gp.toString = function() {
+ return "[object Generator]";
+ };
+
+ function pushTryEntry(locs) {
+ var entry = { tryLoc: locs[0] };
+
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
+
+ this.tryEntries.push(entry);
+ }
+
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
+
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{ tryLoc: "root" }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+
+ exports.keys = function(object) {
+ var keys = [];
+ for (var key in object) {
+ keys.push(key);
+ }
+ keys.reverse();
+
+ // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ }
+
+ // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+ next.done = true;
+ return next;
+ };
+ };
+
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
+
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
+
+ if (!isNaN(iterable.length)) {
+ var i = -1, next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
+
+ next.value = undefined;
+ next.done = true;
+
+ return next;
+ };
+
+ return next.next = next;
+ }
+ }
+
+ // Return an iterator with no values.
+ return { next: doneResult };
+ }
+ exports.values = values;
+
+ function doneResult() {
+ return { value: undefined, done: true };
+ }
+
+ Context.prototype = {
+ constructor: Context,
+
+ reset: function(skipTempReset) {
+ this.prev = 0;
+ this.next = 0;
+ // Resetting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ this.sent = this._sent = undefined;
+ this.done = false;
+ this.delegate = null;
+
+ this.method = "next";
+ this.arg = undefined;
+
+ this.tryEntries.forEach(resetTryEntry);
+
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (name.charAt(0) === "t" &&
+ hasOwn.call(this, name) &&
+ !isNaN(+name.slice(1))) {
+ this[name] = undefined;
+ }
+ }
+ }
+ },
+
+ stop: function() {
+ this.done = true;
+
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
+
+ return this.rval;
+ },
+
+ dispatchException: function(exception) {
+ if (this.done) {
+ throw exception;
+ }
+
+ var context = this;
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
+
+ if (caught) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ context.method = "next";
+ context.arg = undefined;
+ }
+
+ return !! caught;
+ }
+
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
+ }
+
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
+
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else {
+ throw new Error("try statement without catch or finally");
+ }
+ }
+ }
+ },
+
+ abrupt: function(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc <= this.prev &&
+ hasOwn.call(entry, "finallyLoc") &&
+ this.prev < entry.finallyLoc) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
+
+ if (finallyEntry &&
+ (type === "break" ||
+ type === "continue") &&
+ finallyEntry.tryLoc <= arg &&
+ arg <= finallyEntry.finallyLoc) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
+
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
+
+ if (finallyEntry) {
+ this.method = "next";
+ this.next = finallyEntry.finallyLoc;
+ return ContinueSentinel;
+ }
+
+ return this.complete(record);
+ },
+
+ complete: function(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (record.type === "break" ||
+ record.type === "continue") {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = this.arg = record.arg;
+ this.method = "return";
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
+
+ return ContinueSentinel;
+ },
+
+ finish: function(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
+ }
+ }
+ },
+
+ "catch": function(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+ return thrown;
+ }
+ }
+
+ // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+ throw new Error("illegal catch attempt");
+ },
+
+ delegateYield: function(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ if (this.method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ this.arg = undefined;
+ }
+
+ return ContinueSentinel;
+ }
+ };
+
+ // Regardless of whether this script is executing as a CommonJS module
+ // or not, return the runtime object so that we can declare the variable
+ // regeneratorRuntime in the outer scope, which allows this module to be
+ // injected easily by `bin/regenerator --include-runtime script.js`.
+ return exports;
+
+}(
+ // If this script is executing as a CommonJS module, use module.exports
+ // as the regeneratorRuntime namespace. Otherwise create a new empty
+ // object. Either way, the resulting object will be used to initialize
+ // the regeneratorRuntime variable at the top of this file.
+ true ? module.exports : undefined
+));
+
+try {
+ regeneratorRuntime = runtime;
+} catch (accidentalStrictMode) {
+ // This module should not be running in strict mode, so the above
+ // assignment should always work unless something is misconfigured. Just
+ // in case runtime.js accidentally runs in strict mode, we can escape
+ // strict mode using a global Function call. This could conceivably fail
+ // if a Content Security Policy forbids using Function, but in that case
+ // the proper solution is to fix the accidental strict mode problem. If
+ // you've misconfigured your bundler to force strict mode and applied a
+ // CSP to forbid Function, and you're not willing to fix either of those
+ // problems, please detail your unique predicament in a GitHub issue.
+ Function("r", "regeneratorRuntime = r")(runtime);
+}
+
+
/***/ }),
/***/ "./node_modules/setimmediate/setImmediate.js":
@@ -36756,6 +37972,545 @@ process.umask = function() { return 0; };
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
+/***/ }),
+
+/***/ "./node_modules/style-loader/index.js!./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/GifSelectComponent.vue?vue&type=style&index=0&lang=css&":
+/*!****************************************************************************************************************************************************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/style-loader!./node_modules/css-loader??ref--6-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--6-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/GifSelectComponent.vue?vue&type=style&index=0&lang=css& ***!
+ \****************************************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--6-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src??ref--6-2!../../../node_modules/vue-loader/lib??vue-loader-options!./GifSelectComponent.vue?vue&type=style&index=0&lang=css& */ "./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/GifSelectComponent.vue?vue&type=style&index=0&lang=css&");
+
+if(typeof content === 'string') content = [[module.i, content, '']];
+
+var transform;
+var insertInto;
+
+
+
+var options = {"hmr":true}
+
+options.transform = transform
+options.insertInto = undefined;
+
+var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
+
+if(content.locals) module.exports = content.locals;
+
+if(false) {}
+
+/***/ }),
+
+/***/ "./node_modules/style-loader/lib/addStyles.js":
+/*!****************************************************!*\
+ !*** ./node_modules/style-loader/lib/addStyles.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+
+var stylesInDom = {};
+
+var memoize = function (fn) {
+ var memo;
+
+ return function () {
+ if (typeof memo === "undefined") memo = fn.apply(this, arguments);
+ return memo;
+ };
+};
+
+var isOldIE = memoize(function () {
+ // Test for IE <= 9 as proposed by Browserhacks
+ // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
+ // Tests for existence of standard globals is to allow style-loader
+ // to operate correctly into non-standard environments
+ // @see https://github.com/webpack-contrib/style-loader/issues/177
+ return window && document && document.all && !window.atob;
+});
+
+var getTarget = function (target, parent) {
+ if (parent){
+ return parent.querySelector(target);
+ }
+ return document.querySelector(target);
+};
+
+var getElement = (function (fn) {
+ var memo = {};
+
+ return function(target, parent) {
+ // If passing function in options, then use it for resolve "head" element.
+ // Useful for Shadow Root style i.e
+ // {
+ // insertInto: function () { return document.querySelector("#foo").shadowRoot }
+ // }
+ if (typeof target === 'function') {
+ return target();
+ }
+ if (typeof memo[target] === "undefined") {
+ var styleTarget = getTarget.call(this, target, parent);
+ // Special case to return head of iframe instead of iframe itself
+ if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
+ try {
+ // This will throw an exception if access to iframe is blocked
+ // due to cross-origin restrictions
+ styleTarget = styleTarget.contentDocument.head;
+ } catch(e) {
+ styleTarget = null;
+ }
+ }
+ memo[target] = styleTarget;
+ }
+ return memo[target]
+ };
+})();
+
+var singleton = null;
+var singletonCounter = 0;
+var stylesInsertedAtTop = [];
+
+var fixUrls = __webpack_require__(/*! ./urls */ "./node_modules/style-loader/lib/urls.js");
+
+module.exports = function(list, options) {
+ if (typeof DEBUG !== "undefined" && DEBUG) {
+ if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
+ }
+
+ options = options || {};
+
+ options.attrs = typeof options.attrs === "object" ? options.attrs : {};
+
+ // Force single-tag solution on IE6-9, which has a hard limit on the # of
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/components/TagSelectComponent.vue b/resources/js/components/TagSelectComponent.vue
new file mode 100644
index 0000000..e98a0c0
--- /dev/null
+++ b/resources/js/components/TagSelectComponent.vue
@@ -0,0 +1,35 @@
+
+
+
+
{{ tag.tag_text }}
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/components/ThreadComponent.vue b/resources/js/components/ThreadComponent.vue
index 06a3ff8..4050d13 100644
--- a/resources/js/components/ThreadComponent.vue
+++ b/resources/js/components/ThreadComponent.vue
@@ -1,26 +1,46 @@
\ No newline at end of file
diff --git a/resources/views/create_thread.blade.php b/resources/views/create_thread.blade.php
new file mode 100644
index 0000000..8dfc008
--- /dev/null
+++ b/resources/views/create_thread.blade.php
@@ -0,0 +1,9 @@
+@extends('layouts.app')
+
+@section('content')
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php
deleted file mode 100644
index 38c13ce..0000000
--- a/resources/views/dashboard.blade.php
+++ /dev/null
@@ -1,9 +0,0 @@
-@extends('layouts.app')
-
-@section('content')
-
-
-
-
-
-@endsection
\ No newline at end of file
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php
index 05dfca9..4a20066 100644
--- a/resources/views/home.blade.php
+++ b/resources/views/home.blade.php
@@ -14,7 +14,7 @@
@endif
- You are logged in!
+
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php
index ee7767c..5b371f7 100644
--- a/resources/views/layouts/app.blade.php
+++ b/resources/views/layouts/app.blade.php
@@ -39,6 +39,9 @@
+@endsection
\ No newline at end of file
diff --git a/resources/views/threads.blade.php b/resources/views/threads.blade.php
new file mode 100644
index 0000000..f022c28
--- /dev/null
+++ b/resources/views/threads.blade.php
@@ -0,0 +1,15 @@
+@extends('layouts.app')
+
+@section('content')
+
+
+ Symfony\Component\Debug\Exception\FatalThrowableError thrown with message "Call to undefined function App\Http\Controllers\ThreadsCollection()"
+
+Stacktrace:
+#0 Symfony\Component\Debug\Exception\FatalThrowableError in /home/bkains/Git/GamingForum/app/Http/Controllers/ThreadController.php:68
+
+
+