diff --git a/.gitignore b/.gitignore
index 87b83ff..527e7da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,3 @@
-dist
-vendor
node_modules
.DS_Store
diff --git a/dist/app.js b/dist/app.js
new file mode 100644
index 0000000..f582441
--- /dev/null
+++ b/dist/app.js
@@ -0,0 +1,80 @@
+'use strict';
+
+Array.prototype.random = function () {
+ return this[Math.floor(Math.random() * this.length)];
+};
+
+var wordThemes = ['candy', 'beer', 'coffee', 'car', 'liquor', 'mustache'];
+var suffixes = ['', 'JS', 'Script', '.js', '.io', 'DB'];
+var wordsToUse = 3;
+
+var stackPhrases = {
+ intros: ['My prefered tech stack is a', 'I feel the best way to build ambitious apps is with a', 'An ideal stack would be a', 'I start off with a'],
+ toolVarieties: ['', 'engine', 'generator', 'framework', 'setup', 'frontend', 'backend', 'library', 'plugin'],
+ toolConnections: ['powered by a', 'controlling a', 'alongside a', 'integrated with a', 'plugged into a', 'synced to a'],
+ outros: ['to build ambitious web apps.', 'to innovate to the best of my ability.', 'to inspire the Open Source community of makers.']
+};
+
+var app = new Vue({
+ el: '#app',
+ data: {
+ loading: true,
+ stack: ''
+ },
+ methods: {
+ newStack: function newStack() {
+ var _this = this;
+
+ this.loading = true;
+ this.stack = generateStack().then(function (stack) {
+ _this.loading = false;
+ _this.stack = stack;
+ }).catch(function (e) {
+ _this.loading = false;
+ _this.stack = 'Uhoh! There was a problem generating a silly tech stack. Most likely we have hit our API limit for the month. Hang in there!';
+ });
+ }
+ }
+});
+
+// Fire off a new stack request on load
+app.newStack();
+
+function generateStack() {
+ return Promise.all(wordThemes.map(function (w) {
+ return getWordsRelatedTo(w);
+ })).then(function (data) {
+ return data.reduce(function (prev, cur) {
+ return [].concat(prev.length ? prev : [], cur.hasTypes);
+ });
+ }).then(wordsToStack);
+}
+
+function getWordsRelatedTo(word) {
+ return fetch('https://wt-sharpshark28-gmail_com-0.run.webtask.io/oh-i-use-backend?word=' + word).then(function (r) {
+ return r.json();
+ });
+}
+
+function wordsToStack(allWords) {
+ var stack = stackPhrases.intros.random();
+
+ for (var i = 1; i <= wordsToUse; i++) {
+ var techWord = wordToTechTerm(allWords.random());
+ var variety = stackPhrases.toolVarieties.random();
+ var connection = stackPhrases.toolConnections.random();
+ var outro = stackPhrases.outros.random();
+ var end = i < wordsToUse ? connection : outro;
+ stack += ' ' + techWord + ' ' + variety + ' ' + end;
+ }
+
+ return stack;
+}
+
+function wordToTechTerm(word) {
+ word = word.split(' ').map(function (word) {
+ return word.charAt(0).toUpperCase() + word.slice(1);
+ }); // Capitalize each word
+ return word.join('') + suffixes.random();
+}
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHAuanMiXSwibmFtZXMiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJyYW5kb20iLCJNYXRoIiwiZmxvb3IiLCJsZW5ndGgiLCJ3b3JkVGhlbWVzIiwic3VmZml4ZXMiLCJ3b3Jkc1RvVXNlIiwic3RhY2tQaHJhc2VzIiwiaW50cm9zIiwidG9vbFZhcmlldGllcyIsInRvb2xDb25uZWN0aW9ucyIsIm91dHJvcyIsImFwcCIsIlZ1ZSIsImVsIiwiZGF0YSIsImxvYWRpbmciLCJzdGFjayIsIm1ldGhvZHMiLCJuZXdTdGFjayIsImdlbmVyYXRlU3RhY2siLCJ0aGVuIiwiY2F0Y2giLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZ2V0V29yZHNSZWxhdGVkVG8iLCJ3IiwicmVkdWNlIiwicHJldiIsImN1ciIsImNvbmNhdCIsImhhc1R5cGVzIiwid29yZHNUb1N0YWNrIiwid29yZCIsImZldGNoIiwiciIsImpzb24iLCJhbGxXb3JkcyIsImkiLCJ0ZWNoV29yZCIsIndvcmRUb1RlY2hUZXJtIiwidmFyaWV0eSIsImNvbm5lY3Rpb24iLCJvdXRybyIsImVuZCIsInNwbGl0IiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsImpvaW4iXSwibWFwcGluZ3MiOiI7O0FBQUFBLE1BQU1DLFNBQU4sQ0FBZ0JDLE1BQWhCLEdBQXlCLFlBQVc7QUFDbEMsU0FBTyxLQUFLQyxLQUFLQyxLQUFMLENBQVdELEtBQUtELE1BQUwsS0FBZ0IsS0FBS0csTUFBaEMsQ0FBTCxDQUFQO0FBQ0QsQ0FGRDs7QUFJQSxJQUFJQyxhQUFhLENBQUMsT0FBRCxFQUFVLE1BQVYsRUFBa0IsUUFBbEIsRUFBNEIsS0FBNUIsRUFBbUMsUUFBbkMsRUFBNkMsVUFBN0MsQ0FBakI7QUFDQSxJQUFJQyxXQUFXLENBQUMsRUFBRCxFQUFLLElBQUwsRUFBVyxRQUFYLEVBQXFCLEtBQXJCLEVBQTRCLEtBQTVCLEVBQW1DLElBQW5DLENBQWY7QUFDQSxJQUFJQyxhQUFhLENBQWpCOztBQUVB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QUFLZSxLQUFMLENBQVcsQ0FBWCxDQUF2QztBQUFBLEdBQXBCLENBQVAsQ0FENEIsQ0FDc0Q7QUFDbEYsU0FBT2YsS0FBS2dCLElBQUwsQ0FBVSxFQUFWLElBQWdCN0MsU0FBU0wsTUFBVCxFQUF2QjtBQUNEIiwiZmlsZSI6ImFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIkFycmF5LnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5sZW5ndGgpXTtcbn1cblxubGV0IHdvcmRUaGVtZXMgPSBbJ2NhbmR5JywgJ2JlZXInLCAnY29mZmVlJywgJ2NhcicsICdsaXF1b3InLCAnbXVzdGFjaGUnXTtcbmxldCBzdWZmaXhlcyA9IFsnJywgJ0pTJywgJ1NjcmlwdCcsICcuanMnLCAnLmlvJywgJ0RCJ107XG5sZXQgd29yZHNUb1VzZSA9IDM7XG5cbmxldCBzdGFja1BocmFzZXMgPSB7XG4gIGludHJvczogW1xuICAgICdNeSBwcmVmZXJlZCB0ZWNoIHN0YWNrIGlzIGEnLFxuICAgICdJIGZlZWwgdGhlIGJlc3Qgd2F5IHRvIGJ1aWxkIGFtYml0aW91cyBhcHBzIGlzIHdpdGggYScsXG4gICAgJ0FuIGlkZWFsIHN0YWNrIHdvdWxkIGJlIGEnLFxuICAgICdJIHN0YXJ0IG9mZiB3aXRoIGEnXG4gIF0sXG4gIHRvb2xWYXJpZXRpZXM6IFtcbiAgICAnJyxcbiAgICAnZW5naW5lJyxcbiAgICAnZ2VuZXJhdG9yJyxcbiAgICAnZnJhbWV3b3JrJyxcbiAgICAnc2V0dXAnLFxuICAgICdmcm9udGVuZCcsXG4gICAgJ2JhY2tlbmQnLFxuICAgICdsaWJyYXJ5JyxcbiAgICAncGx1Z2luJ1xuICBdLFxuICB0b29sQ29ubmVjdGlvbnM6IFtcbiAgICAncG93ZXJlZCBieSBhJyxcbiAgICAnY29udHJvbGxpbmcgYScsXG4gICAgJ2Fsb25nc2lkZSBhJyxcbiAgICAnaW50ZWdyYXRlZCB3aXRoIGEnLFxuICAgICdwbHVnZ2VkIGludG8gYScsXG4gICAgJ3N5bmNlZCB0byBhJ1xuICBdLFxuICBvdXRyb3M6IFtcbiAgICAndG8gYnVpbGQgYW1iaXRpb3VzIHdlYiBhcHBzLicsXG4gICAgJ3RvIGlubm92YXRlIHRvIHRoZSBiZXN0IG9mIG15IGFiaWxpdHkuJyxcbiAgICAndG8gaW5zcGlyZSB0aGUgT3BlbiBTb3VyY2UgY29tbXVuaXR5IG9mIG1ha2Vycy4nXG4gIF1cbn07XG5cbmxldCBhcHAgPSBuZXcgVnVlKHtcbiAgZWw6ICcjYXBwJyxcbiAgZGF0YToge1xuICAgIGxvYWRpbmc6IHRydWUsXG4gICAgc3RhY2s6ICcnXG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBuZXdTdGFjaygpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnN0YWNrID0gZ2VuZXJhdGVTdGFjaygpXG4gICAgICAgIC50aGVuKHN0YWNrID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnN0YWNrID0gJ1Vob2ghIFRoZXJlIHdhcyBhIHByb2JsZW0gZ2VuZXJhdGluZyBhIHNpbGx5IHRlY2ggc3RhY2suIE1vc3QgbGlrZWx5IHdlIGhhdmUgaGl0IG91ciBBUEkgbGltaXQgZm9yIHRoZSBtb250aC4gSGFuZyBpbiB0aGVyZSEnO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vLyBGaXJlIG9mZiBhIG5ldyBzdGFjayByZXF1ZXN0IG9uIGxvYWRcbmFwcC5uZXdTdGFjaygpO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVN0YWNrKCkge1xuICByZXR1cm4gUHJvbWlzZS5hbGwod29yZFRoZW1lcy5tYXAodyA9PiBnZXRXb3Jkc1JlbGF0ZWRUbyh3KSkpXG4gICAgLnRoZW4oZGF0YSA9PiBkYXRhLnJlZHVjZSgocHJldiwgY3VyKSA9PiBbXS5jb25jYXQocHJldi5sZW5ndGggPyBwcmV2IDogW10sIGN1ci5oYXNUeXBlcykpKVxuICAgIC50aGVuKHdvcmRzVG9TdGFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFdvcmRzUmVsYXRlZFRvKHdvcmQpIHtcbiAgcmV0dXJuIGZldGNoKCdodHRwczovL3d0LXNoYXJwc2hhcmsyOC1nbWFpbF9jb20tMC5ydW4ud2VidGFzay5pby9vaC1pLXVzZS1iYWNrZW5kP3dvcmQ9JyArIHdvcmQpXG4gICAgLnRoZW4ociA9PiByLmpzb24oKSk7XG59XG5cbmZ1bmN0aW9uIHdvcmRzVG9TdGFjayhhbGxXb3Jkcykge1xuICBsZXQgc3RhY2sgPSBzdGFja1BocmFzZXMuaW50cm9zLnJhbmRvbSgpO1xuXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IHdvcmRzVG9Vc2U7IGkrKykge1xuICAgIGxldCB0ZWNoV29yZCA9IHdvcmRUb1RlY2hUZXJtKGFsbFdvcmRzLnJhbmRvbSgpKTtcbiAgICBsZXQgdmFyaWV0eSA9IHN0YWNrUGhyYXNlcy50b29sVmFyaWV0aWVzLnJhbmRvbSgpO1xuICAgIGxldCBjb25uZWN0aW9uID0gc3RhY2tQaHJhc2VzLnRvb2xDb25uZWN0aW9ucy5yYW5kb20oKTtcbiAgICBsZXQgb3V0cm8gPSBzdGFja1BocmFzZXMub3V0cm9zLnJhbmRvbSgpO1xuICAgIGxldCBlbmQgPSBpIDwgd29yZHNUb1VzZSA/IGNvbm5lY3Rpb24gOiBvdXRybztcbiAgICBzdGFjayArPSBgICR7dGVjaFdvcmR9ICR7dmFyaWV0eX0gJHtlbmR9YDtcbiAgfVxuXG4gIHJldHVybiBzdGFjaztcbn1cblxuZnVuY3Rpb24gd29yZFRvVGVjaFRlcm0od29yZCkge1xuICB3b3JkID0gd29yZC5zcGxpdCgnICcpLm1hcCh3b3JkID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpKTsgLy8gQ2FwaXRhbGl6ZSBlYWNoIHdvcmRcbiAgcmV0dXJuIHdvcmQuam9pbignJykgKyBzdWZmaXhlcy5yYW5kb20oKTtcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/dist/favicon/android-icon-144x144.png b/dist/favicon/android-icon-144x144.png
new file mode 100644
index 0000000..c6c90cd
Binary files /dev/null and b/dist/favicon/android-icon-144x144.png differ
diff --git a/dist/favicon/android-icon-192x192.png b/dist/favicon/android-icon-192x192.png
new file mode 100644
index 0000000..c4be4b6
Binary files /dev/null and b/dist/favicon/android-icon-192x192.png differ
diff --git a/dist/favicon/android-icon-36x36.png b/dist/favicon/android-icon-36x36.png
new file mode 100644
index 0000000..9836289
Binary files /dev/null and b/dist/favicon/android-icon-36x36.png differ
diff --git a/dist/favicon/android-icon-48x48.png b/dist/favicon/android-icon-48x48.png
new file mode 100644
index 0000000..dae27c0
Binary files /dev/null and b/dist/favicon/android-icon-48x48.png differ
diff --git a/dist/favicon/android-icon-72x72.png b/dist/favicon/android-icon-72x72.png
new file mode 100644
index 0000000..962e839
Binary files /dev/null and b/dist/favicon/android-icon-72x72.png differ
diff --git a/dist/favicon/android-icon-96x96.png b/dist/favicon/android-icon-96x96.png
new file mode 100644
index 0000000..6de66d1
Binary files /dev/null and b/dist/favicon/android-icon-96x96.png differ
diff --git a/dist/favicon/apple-icon-114x114.png b/dist/favicon/apple-icon-114x114.png
new file mode 100644
index 0000000..fb497d2
Binary files /dev/null and b/dist/favicon/apple-icon-114x114.png differ
diff --git a/dist/favicon/apple-icon-120x120.png b/dist/favicon/apple-icon-120x120.png
new file mode 100644
index 0000000..39f0e06
Binary files /dev/null and b/dist/favicon/apple-icon-120x120.png differ
diff --git a/dist/favicon/apple-icon-144x144.png b/dist/favicon/apple-icon-144x144.png
new file mode 100644
index 0000000..c6c90cd
Binary files /dev/null and b/dist/favicon/apple-icon-144x144.png differ
diff --git a/dist/favicon/apple-icon-152x152.png b/dist/favicon/apple-icon-152x152.png
new file mode 100644
index 0000000..0f63340
Binary files /dev/null and b/dist/favicon/apple-icon-152x152.png differ
diff --git a/dist/favicon/apple-icon-180x180.png b/dist/favicon/apple-icon-180x180.png
new file mode 100644
index 0000000..2b94363
Binary files /dev/null and b/dist/favicon/apple-icon-180x180.png differ
diff --git a/dist/favicon/apple-icon-57x57.png b/dist/favicon/apple-icon-57x57.png
new file mode 100644
index 0000000..0aeb442
Binary files /dev/null and b/dist/favicon/apple-icon-57x57.png differ
diff --git a/dist/favicon/apple-icon-60x60.png b/dist/favicon/apple-icon-60x60.png
new file mode 100644
index 0000000..590903a
Binary files /dev/null and b/dist/favicon/apple-icon-60x60.png differ
diff --git a/dist/favicon/apple-icon-72x72.png b/dist/favicon/apple-icon-72x72.png
new file mode 100644
index 0000000..962e839
Binary files /dev/null and b/dist/favicon/apple-icon-72x72.png differ
diff --git a/dist/favicon/apple-icon-76x76.png b/dist/favicon/apple-icon-76x76.png
new file mode 100644
index 0000000..abdc6cf
Binary files /dev/null and b/dist/favicon/apple-icon-76x76.png differ
diff --git a/dist/favicon/apple-icon-precomposed.png b/dist/favicon/apple-icon-precomposed.png
new file mode 100644
index 0000000..df400d7
Binary files /dev/null and b/dist/favicon/apple-icon-precomposed.png differ
diff --git a/dist/favicon/apple-icon.png b/dist/favicon/apple-icon.png
new file mode 100644
index 0000000..df400d7
Binary files /dev/null and b/dist/favicon/apple-icon.png differ
diff --git a/dist/favicon/browserconfig.xml b/dist/favicon/browserconfig.xml
new file mode 100644
index 0000000..c554148
--- /dev/null
+++ b/dist/favicon/browserconfig.xml
@@ -0,0 +1,2 @@
+
+#ffffff
\ No newline at end of file
diff --git a/dist/favicon/favicon-16x16.png b/dist/favicon/favicon-16x16.png
new file mode 100644
index 0000000..a800f80
Binary files /dev/null and b/dist/favicon/favicon-16x16.png differ
diff --git a/dist/favicon/favicon-32x32.png b/dist/favicon/favicon-32x32.png
new file mode 100644
index 0000000..e9d9481
Binary files /dev/null and b/dist/favicon/favicon-32x32.png differ
diff --git a/dist/favicon/favicon-96x96.png b/dist/favicon/favicon-96x96.png
new file mode 100644
index 0000000..6de66d1
Binary files /dev/null and b/dist/favicon/favicon-96x96.png differ
diff --git a/dist/favicon/favicon.ico b/dist/favicon/favicon.ico
new file mode 100644
index 0000000..9fdf4da
Binary files /dev/null and b/dist/favicon/favicon.ico differ
diff --git a/dist/favicon/manifest.json b/dist/favicon/manifest.json
new file mode 100644
index 0000000..013d4a6
--- /dev/null
+++ b/dist/favicon/manifest.json
@@ -0,0 +1,41 @@
+{
+ "name": "App",
+ "icons": [
+ {
+ "src": "\/android-icon-36x36.png",
+ "sizes": "36x36",
+ "type": "image\/png",
+ "density": "0.75"
+ },
+ {
+ "src": "\/android-icon-48x48.png",
+ "sizes": "48x48",
+ "type": "image\/png",
+ "density": "1.0"
+ },
+ {
+ "src": "\/android-icon-72x72.png",
+ "sizes": "72x72",
+ "type": "image\/png",
+ "density": "1.5"
+ },
+ {
+ "src": "\/android-icon-96x96.png",
+ "sizes": "96x96",
+ "type": "image\/png",
+ "density": "2.0"
+ },
+ {
+ "src": "\/android-icon-144x144.png",
+ "sizes": "144x144",
+ "type": "image\/png",
+ "density": "3.0"
+ },
+ {
+ "src": "\/android-icon-192x192.png",
+ "sizes": "192x192",
+ "type": "image\/png",
+ "density": "4.0"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dist/favicon/ms-icon-144x144.png b/dist/favicon/ms-icon-144x144.png
new file mode 100644
index 0000000..c6c90cd
Binary files /dev/null and b/dist/favicon/ms-icon-144x144.png differ
diff --git a/dist/favicon/ms-icon-150x150.png b/dist/favicon/ms-icon-150x150.png
new file mode 100644
index 0000000..65c9526
Binary files /dev/null and b/dist/favicon/ms-icon-150x150.png differ
diff --git a/dist/favicon/ms-icon-310x310.png b/dist/favicon/ms-icon-310x310.png
new file mode 100644
index 0000000..a1c3511
Binary files /dev/null and b/dist/favicon/ms-icon-310x310.png differ
diff --git a/dist/favicon/ms-icon-70x70.png b/dist/favicon/ms-icon-70x70.png
new file mode 100644
index 0000000..4638978
Binary files /dev/null and b/dist/favicon/ms-icon-70x70.png differ
diff --git a/package.json b/package.json
index 52fb971..a3e8212 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,8 @@
"scripts": {
"build": "npm run vendor && babel src --out-dir dist",
"watch": "npm run vendor && babel src --watch --out-dir dist --source-maps inline",
- "vendor": "mkdir -p vendor vendor/css vendor/js && cp -R ./src/favicon ./dist/favicon && cp -R ./node_modules/skeleton-css/css/ ./vendor/css && cp ./node_modules/vue/dist/vue.min.js ./vendor/js/vue.min.js && cp ./node_modules/whatwg-fetch/fetch.js ./vendor/js/fetch.js"
+ "vendor": "mkdir -p vendor vendor/css vendor/js && cp -R ./src/favicon ./dist/favicon && cp -R ./node_modules/skeleton-css/css/ ./vendor/css && cp ./node_modules/vue/dist/vue.min.js ./vendor/js/vue.min.js && cp ./node_modules/whatwg-fetch/fetch.js ./vendor/js/fetch.js",
+ "clean": "rm -rf ./vendor ./dist"
},
"author": "Joe Wroten ",
"license": "ISC",
diff --git a/vendor/css/normalize.css b/vendor/css/normalize.css
new file mode 100644
index 0000000..81c6f31
--- /dev/null
+++ b/vendor/css/normalize.css
@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
\ No newline at end of file
diff --git a/vendor/css/skeleton.css b/vendor/css/skeleton.css
new file mode 100644
index 0000000..f28bf6c
--- /dev/null
+++ b/vendor/css/skeleton.css
@@ -0,0 +1,418 @@
+/*
+* Skeleton V2.0.4
+* Copyright 2014, Dave Gamache
+* www.getskeleton.com
+* Free to use under the MIT license.
+* http://www.opensource.org/licenses/mit-license.php
+* 12/29/2014
+*/
+
+
+/* Table of contents
+––––––––––––––––––––––––––––––––––––––––––––––––––
+- Grid
+- Base Styles
+- Typography
+- Links
+- Buttons
+- Forms
+- Lists
+- Code
+- Tables
+- Spacing
+- Utilities
+- Clearing
+- Media Queries
+*/
+
+
+/* Grid
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+.container {
+ position: relative;
+ width: 100%;
+ max-width: 960px;
+ margin: 0 auto;
+ padding: 0 20px;
+ box-sizing: border-box; }
+.column,
+.columns {
+ width: 100%;
+ float: left;
+ box-sizing: border-box; }
+
+/* For devices larger than 400px */
+@media (min-width: 400px) {
+ .container {
+ width: 85%;
+ padding: 0; }
+}
+
+/* For devices larger than 550px */
+@media (min-width: 550px) {
+ .container {
+ width: 80%; }
+ .column,
+ .columns {
+ margin-left: 4%; }
+ .column:first-child,
+ .columns:first-child {
+ margin-left: 0; }
+
+ .one.column,
+ .one.columns { width: 4.66666666667%; }
+ .two.columns { width: 13.3333333333%; }
+ .three.columns { width: 22%; }
+ .four.columns { width: 30.6666666667%; }
+ .five.columns { width: 39.3333333333%; }
+ .six.columns { width: 48%; }
+ .seven.columns { width: 56.6666666667%; }
+ .eight.columns { width: 65.3333333333%; }
+ .nine.columns { width: 74.0%; }
+ .ten.columns { width: 82.6666666667%; }
+ .eleven.columns { width: 91.3333333333%; }
+ .twelve.columns { width: 100%; margin-left: 0; }
+
+ .one-third.column { width: 30.6666666667%; }
+ .two-thirds.column { width: 65.3333333333%; }
+
+ .one-half.column { width: 48%; }
+
+ /* Offsets */
+ .offset-by-one.column,
+ .offset-by-one.columns { margin-left: 8.66666666667%; }
+ .offset-by-two.column,
+ .offset-by-two.columns { margin-left: 17.3333333333%; }
+ .offset-by-three.column,
+ .offset-by-three.columns { margin-left: 26%; }
+ .offset-by-four.column,
+ .offset-by-four.columns { margin-left: 34.6666666667%; }
+ .offset-by-five.column,
+ .offset-by-five.columns { margin-left: 43.3333333333%; }
+ .offset-by-six.column,
+ .offset-by-six.columns { margin-left: 52%; }
+ .offset-by-seven.column,
+ .offset-by-seven.columns { margin-left: 60.6666666667%; }
+ .offset-by-eight.column,
+ .offset-by-eight.columns { margin-left: 69.3333333333%; }
+ .offset-by-nine.column,
+ .offset-by-nine.columns { margin-left: 78.0%; }
+ .offset-by-ten.column,
+ .offset-by-ten.columns { margin-left: 86.6666666667%; }
+ .offset-by-eleven.column,
+ .offset-by-eleven.columns { margin-left: 95.3333333333%; }
+
+ .offset-by-one-third.column,
+ .offset-by-one-third.columns { margin-left: 34.6666666667%; }
+ .offset-by-two-thirds.column,
+ .offset-by-two-thirds.columns { margin-left: 69.3333333333%; }
+
+ .offset-by-one-half.column,
+ .offset-by-one-half.columns { margin-left: 52%; }
+
+}
+
+
+/* Base Styles
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+/* NOTE
+html is set to 62.5% so that all the REM measurements throughout Skeleton
+are based on 10px sizing. So basically 1.5rem = 15px :) */
+html {
+ font-size: 62.5%; }
+body {
+ font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
+ line-height: 1.6;
+ font-weight: 400;
+ font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ color: #222; }
+
+
+/* Typography
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: 2rem;
+ font-weight: 300; }
+h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;}
+h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }
+h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; }
+h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }
+h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; }
+h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; }
+
+/* Larger than phablet */
+@media (min-width: 550px) {
+ h1 { font-size: 5.0rem; }
+ h2 { font-size: 4.2rem; }
+ h3 { font-size: 3.6rem; }
+ h4 { font-size: 3.0rem; }
+ h5 { font-size: 2.4rem; }
+ h6 { font-size: 1.5rem; }
+}
+
+p {
+ margin-top: 0; }
+
+
+/* Links
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+a {
+ color: #1EAEDB; }
+a:hover {
+ color: #0FA0CE; }
+
+
+/* Buttons
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+.button,
+button,
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+ display: inline-block;
+ height: 38px;
+ padding: 0 30px;
+ color: #555;
+ text-align: center;
+ font-size: 11px;
+ font-weight: 600;
+ line-height: 38px;
+ letter-spacing: .1rem;
+ text-transform: uppercase;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border-radius: 4px;
+ border: 1px solid #bbb;
+ cursor: pointer;
+ box-sizing: border-box; }
+.button:hover,
+button:hover,
+input[type="submit"]:hover,
+input[type="reset"]:hover,
+input[type="button"]:hover,
+.button:focus,
+button:focus,
+input[type="submit"]:focus,
+input[type="reset"]:focus,
+input[type="button"]:focus {
+ color: #333;
+ border-color: #888;
+ outline: 0; }
+.button.button-primary,
+button.button-primary,
+input[type="submit"].button-primary,
+input[type="reset"].button-primary,
+input[type="button"].button-primary {
+ color: #FFF;
+ background-color: #33C3F0;
+ border-color: #33C3F0; }
+.button.button-primary:hover,
+button.button-primary:hover,
+input[type="submit"].button-primary:hover,
+input[type="reset"].button-primary:hover,
+input[type="button"].button-primary:hover,
+.button.button-primary:focus,
+button.button-primary:focus,
+input[type="submit"].button-primary:focus,
+input[type="reset"].button-primary:focus,
+input[type="button"].button-primary:focus {
+ color: #FFF;
+ background-color: #1EAEDB;
+ border-color: #1EAEDB; }
+
+
+/* Forms
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+textarea,
+select {
+ height: 38px;
+ padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
+ background-color: #fff;
+ border: 1px solid #D1D1D1;
+ border-radius: 4px;
+ box-shadow: none;
+ box-sizing: border-box; }
+/* Removes awkward default styles on some inputs for iOS */
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none; }
+textarea {
+ min-height: 65px;
+ padding-top: 6px;
+ padding-bottom: 6px; }
+input[type="email"]:focus,
+input[type="number"]:focus,
+input[type="search"]:focus,
+input[type="text"]:focus,
+input[type="tel"]:focus,
+input[type="url"]:focus,
+input[type="password"]:focus,
+textarea:focus,
+select:focus {
+ border: 1px solid #33C3F0;
+ outline: 0; }
+label,
+legend {
+ display: block;
+ margin-bottom: .5rem;
+ font-weight: 600; }
+fieldset {
+ padding: 0;
+ border-width: 0; }
+input[type="checkbox"],
+input[type="radio"] {
+ display: inline; }
+label > .label-body {
+ display: inline-block;
+ margin-left: .5rem;
+ font-weight: normal; }
+
+
+/* Lists
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+ul {
+ list-style: circle inside; }
+ol {
+ list-style: decimal inside; }
+ol, ul {
+ padding-left: 0;
+ margin-top: 0; }
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+ margin: 1.5rem 0 1.5rem 3rem;
+ font-size: 90%; }
+li {
+ margin-bottom: 1rem; }
+
+
+/* Code
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+code {
+ padding: .2rem .5rem;
+ margin: 0 .2rem;
+ font-size: 90%;
+ white-space: nowrap;
+ background: #F1F1F1;
+ border: 1px solid #E1E1E1;
+ border-radius: 4px; }
+pre > code {
+ display: block;
+ padding: 1rem 1.5rem;
+ white-space: pre; }
+
+
+/* Tables
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+th,
+td {
+ padding: 12px 15px;
+ text-align: left;
+ border-bottom: 1px solid #E1E1E1; }
+th:first-child,
+td:first-child {
+ padding-left: 0; }
+th:last-child,
+td:last-child {
+ padding-right: 0; }
+
+
+/* Spacing
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+button,
+.button {
+ margin-bottom: 1rem; }
+input,
+textarea,
+select,
+fieldset {
+ margin-bottom: 1.5rem; }
+pre,
+blockquote,
+dl,
+figure,
+table,
+p,
+ul,
+ol,
+form {
+ margin-bottom: 2.5rem; }
+
+
+/* Utilities
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+.u-full-width {
+ width: 100%;
+ box-sizing: border-box; }
+.u-max-full-width {
+ max-width: 100%;
+ box-sizing: border-box; }
+.u-pull-right {
+ float: right; }
+.u-pull-left {
+ float: left; }
+
+
+/* Misc
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+hr {
+ margin-top: 3rem;
+ margin-bottom: 3.5rem;
+ border-width: 0;
+ border-top: 1px solid #E1E1E1; }
+
+
+/* Clearing
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+/* Self Clearing Goodness */
+.container:after,
+.row:after,
+.u-cf {
+ content: "";
+ display: table;
+ clear: both; }
+
+
+/* Media Queries
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+/*
+Note: The best way to structure the use of media queries is to create the queries
+near the relevant code. For example, if you wanted to change the styles for buttons
+on small devices, paste the mobile query code up in the buttons section and style it
+there.
+*/
+
+
+/* Larger than mobile */
+@media (min-width: 400px) {}
+
+/* Larger than phablet (also point when grid becomes active) */
+@media (min-width: 550px) {}
+
+/* Larger than tablet */
+@media (min-width: 750px) {}
+
+/* Larger than desktop */
+@media (min-width: 1000px) {}
+
+/* Larger than Desktop HD */
+@media (min-width: 1200px) {}
diff --git a/vendor/js/fetch.js b/vendor/js/fetch.js
new file mode 100644
index 0000000..d0652de
--- /dev/null
+++ b/vendor/js/fetch.js
@@ -0,0 +1,433 @@
+(function(self) {
+ 'use strict';
+
+ if (self.fetch) {
+ return
+ }
+
+ var support = {
+ searchParams: 'URLSearchParams' in self,
+ iterable: 'Symbol' in self && 'iterator' in Symbol,
+ blob: 'FileReader' in self && 'Blob' in self && (function() {
+ try {
+ new Blob()
+ return true
+ } catch(e) {
+ return false
+ }
+ })(),
+ formData: 'FormData' in self,
+ arrayBuffer: 'ArrayBuffer' in self
+ }
+
+ function normalizeName(name) {
+ if (typeof name !== 'string') {
+ name = String(name)
+ }
+ if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+ throw new TypeError('Invalid character in header field name')
+ }
+ return name.toLowerCase()
+ }
+
+ function normalizeValue(value) {
+ if (typeof value !== 'string') {
+ value = String(value)
+ }
+ return value
+ }
+
+ // Build a destructive iterator for the value list
+ function iteratorFor(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift()
+ return {done: value === undefined, value: value}
+ }
+ }
+
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function() {
+ return iterator
+ }
+ }
+
+ return iterator
+ }
+
+ function Headers(headers) {
+ this.map = {}
+
+ if (headers instanceof Headers) {
+ headers.forEach(function(value, name) {
+ this.append(name, value)
+ }, this)
+
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
+ this.append(name, headers[name])
+ }, this)
+ }
+ }
+
+ Headers.prototype.append = function(name, value) {
+ name = normalizeName(name)
+ value = normalizeValue(value)
+ var list = this.map[name]
+ if (!list) {
+ list = []
+ this.map[name] = list
+ }
+ list.push(value)
+ }
+
+ Headers.prototype['delete'] = function(name) {
+ delete this.map[normalizeName(name)]
+ }
+
+ Headers.prototype.get = function(name) {
+ var values = this.map[normalizeName(name)]
+ return values ? values[0] : null
+ }
+
+ Headers.prototype.getAll = function(name) {
+ return this.map[normalizeName(name)] || []
+ }
+
+ Headers.prototype.has = function(name) {
+ return this.map.hasOwnProperty(normalizeName(name))
+ }
+
+ Headers.prototype.set = function(name, value) {
+ this.map[normalizeName(name)] = [normalizeValue(value)]
+ }
+
+ Headers.prototype.forEach = function(callback, thisArg) {
+ Object.getOwnPropertyNames(this.map).forEach(function(name) {
+ this.map[name].forEach(function(value) {
+ callback.call(thisArg, value, name, this)
+ }, this)
+ }, this)
+ }
+
+ Headers.prototype.keys = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push(name) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.values = function() {
+ var items = []
+ this.forEach(function(value) { items.push(value) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.entries = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push([name, value]) })
+ return iteratorFor(items)
+ }
+
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries
+ }
+
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError('Already read'))
+ }
+ body.bodyUsed = true
+ }
+
+ function fileReaderReady(reader) {
+ return new Promise(function(resolve, reject) {
+ reader.onload = function() {
+ resolve(reader.result)
+ }
+ reader.onerror = function() {
+ reject(reader.error)
+ }
+ })
+ }
+
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader()
+ reader.readAsArrayBuffer(blob)
+ return fileReaderReady(reader)
+ }
+
+ function readBlobAsText(blob) {
+ var reader = new FileReader()
+ reader.readAsText(blob)
+ return fileReaderReady(reader)
+ }
+
+ function Body() {
+ this.bodyUsed = false
+
+ this._initBody = function(body) {
+ this._bodyInit = body
+ if (typeof body === 'string') {
+ this._bodyText = body
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+ this._bodyFormData = body
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this._bodyText = body.toString()
+ } else if (!body) {
+ this._bodyText = ''
+ } else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) {
+ // Only support ArrayBuffers for POST method.
+ // Receiving ArrayBuffers happens via Blobs, instead.
+ } else {
+ throw new Error('unsupported BodyInit type')
+ }
+
+ if (!this.headers.get('content-type')) {
+ if (typeof body === 'string') {
+ this.headers.set('content-type', 'text/plain;charset=UTF-8')
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set('content-type', this._bodyBlob.type)
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
+ }
+ }
+ }
+
+ if (support.blob) {
+ this.blob = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob)
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as blob')
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]))
+ }
+ }
+
+ this.arrayBuffer = function() {
+ return this.blob().then(readBlobAsArrayBuffer)
+ }
+
+ this.text = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob)
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as text')
+ } else {
+ return Promise.resolve(this._bodyText)
+ }
+ }
+ } else {
+ this.text = function() {
+ var rejected = consumed(this)
+ return rejected ? rejected : Promise.resolve(this._bodyText)
+ }
+ }
+
+ if (support.formData) {
+ this.formData = function() {
+ return this.text().then(decode)
+ }
+ }
+
+ this.json = function() {
+ return this.text().then(JSON.parse)
+ }
+
+ return this
+ }
+
+ // HTTP methods whose capitalization should be normalized
+ var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
+
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase()
+ return (methods.indexOf(upcased) > -1) ? upcased : method
+ }
+
+ function Request(input, options) {
+ options = options || {}
+ var body = options.body
+ if (Request.prototype.isPrototypeOf(input)) {
+ if (input.bodyUsed) {
+ throw new TypeError('Already read')
+ }
+ this.url = input.url
+ this.credentials = input.credentials
+ if (!options.headers) {
+ this.headers = new Headers(input.headers)
+ }
+ this.method = input.method
+ this.mode = input.mode
+ if (!body) {
+ body = input._bodyInit
+ input.bodyUsed = true
+ }
+ } else {
+ this.url = input
+ }
+
+ this.credentials = options.credentials || this.credentials || 'omit'
+ if (options.headers || !this.headers) {
+ this.headers = new Headers(options.headers)
+ }
+ this.method = normalizeMethod(options.method || this.method || 'GET')
+ this.mode = options.mode || this.mode || null
+ this.referrer = null
+
+ if ((this.method === 'GET' || this.method === 'HEAD') && body) {
+ throw new TypeError('Body not allowed for GET or HEAD requests')
+ }
+ this._initBody(body)
+ }
+
+ Request.prototype.clone = function() {
+ return new Request(this)
+ }
+
+ function decode(body) {
+ var form = new FormData()
+ body.trim().split('&').forEach(function(bytes) {
+ if (bytes) {
+ var split = bytes.split('=')
+ var name = split.shift().replace(/\+/g, ' ')
+ var value = split.join('=').replace(/\+/g, ' ')
+ form.append(decodeURIComponent(name), decodeURIComponent(value))
+ }
+ })
+ return form
+ }
+
+ function headers(xhr) {
+ var head = new Headers()
+ var pairs = (xhr.getAllResponseHeaders() || '').trim().split('\n')
+ pairs.forEach(function(header) {
+ var split = header.trim().split(':')
+ var key = split.shift().trim()
+ var value = split.join(':').trim()
+ head.append(key, value)
+ })
+ return head
+ }
+
+ Body.call(Request.prototype)
+
+ function Response(bodyInit, options) {
+ if (!options) {
+ options = {}
+ }
+
+ this.type = 'default'
+ this.status = options.status
+ this.ok = this.status >= 200 && this.status < 300
+ this.statusText = options.statusText
+ this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)
+ this.url = options.url || ''
+ this._initBody(bodyInit)
+ }
+
+ Body.call(Response.prototype)
+
+ Response.prototype.clone = function() {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ })
+ }
+
+ Response.error = function() {
+ var response = new Response(null, {status: 0, statusText: ''})
+ response.type = 'error'
+ return response
+ }
+
+ var redirectStatuses = [301, 302, 303, 307, 308]
+
+ Response.redirect = function(url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError('Invalid status code')
+ }
+
+ return new Response(null, {status: status, headers: {location: url}})
+ }
+
+ self.Headers = Headers
+ self.Request = Request
+ self.Response = Response
+
+ self.fetch = function(input, init) {
+ return new Promise(function(resolve, reject) {
+ var request
+ if (Request.prototype.isPrototypeOf(input) && !init) {
+ request = input
+ } else {
+ request = new Request(input, init)
+ }
+
+ var xhr = new XMLHttpRequest()
+
+ function responseURL() {
+ if ('responseURL' in xhr) {
+ return xhr.responseURL
+ }
+
+ // Avoid security warnings on getResponseHeader when not allowed by CORS
+ if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {
+ return xhr.getResponseHeader('X-Request-URL')
+ }
+
+ return
+ }
+
+ xhr.onload = function() {
+ var options = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: headers(xhr),
+ url: responseURL()
+ }
+ var body = 'response' in xhr ? xhr.response : xhr.responseText
+ resolve(new Response(body, options))
+ }
+
+ xhr.onerror = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.ontimeout = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.open(request.method, request.url, true)
+
+ if (request.credentials === 'include') {
+ xhr.withCredentials = true
+ }
+
+ if ('responseType' in xhr && support.blob) {
+ xhr.responseType = 'blob'
+ }
+
+ request.headers.forEach(function(value, name) {
+ xhr.setRequestHeader(name, value)
+ })
+
+ xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
+ })
+ }
+ self.fetch.polyfill = true
+})(typeof self !== 'undefined' ? self : this);
diff --git a/vendor/js/vue.min.js b/vendor/js/vue.min.js
new file mode 100644
index 0000000..53f825c
--- /dev/null
+++ b/vendor/js/vue.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Vue.js v2.0.1
+ * (c) 2014-2016 Evan You
+ * Released under the MIT License.
+ */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Vue=t()}(this,function(){"use strict";function e(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function t(e){var t=parseFloat(e,10);return t||0===t?t:e}function n(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}function i(e,t){return hr.call(e,t)}function o(e){return"string"==typeof e||"number"==typeof e}function a(e){var t=Object.create(null);return function(n){var r=t[n];return r||(t[n]=e(n))}}function s(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function c(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function u(e,t){for(var n in t)e[n]=t[n];return e}function l(e){return null!==e&&"object"==typeof e}function f(e){return $r.call(e)===wr}function d(e){for(var t={},n=0;n=0&&Fr[n].id>e.id;)n--;Fr.splice(Math.max(n,zr)+1,0,e)}else Fr.push(e);Hr||(Hr=!0,Mr(x))}}function A(e,t){var n,r;t||(t=qr,t.clear());var i=Array.isArray(e),o=l(e);if((i||o)&&Object.isExtensible(e)){if(e.__ob__){var a=e.__ob__.dep.id;if(t.has(a))return;t.add(a)}if(i)for(n=e.length;n--;)A(e[n],t);else if(o)for(r=Object.keys(e),n=r.length;n--;)A(e[r[n]],t)}}function O(e,t){e.__proto__=t}function T(e,t,n){for(var r=0,i=n.length;r1?c(n):n;for(var r=c(arguments,1),i=0,o=n.length;i-1?Ti[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Ti[e]=/HTMLUnknownElement/.test(t.toString())}function qe(e){if("string"==typeof e){if(e=document.querySelector(e),!e)return document.createElement("div")}return e}function Ke(e){return document.createElement(e)}function We(e,t){return document.createElementNS(bi[e],t)}function Ze(e){return document.createTextNode(e)}function Ge(e){return document.createComment(e)}function Ye(e,t,n){e.insertBefore(t,n)}function Qe(e,t){e.removeChild(t)}function Xe(e,t){e.appendChild(t)}function et(e){return e.parentNode}function tt(e){return e.nextSibling}function nt(e){return e.tagName}function rt(e,t){e.textContent=t}function it(e){return e.childNodes}function ot(e,t,n){e.setAttribute(t,n)}function at(e,t){var n=e.data.ref;if(n){var i=e.context,o=e.child||e.elm,a=i.$refs;t?Array.isArray(a[n])?r(a[n],o):a[n]===o&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].push(o):a[n]=[o]:a[n]=o}}function st(e){return null==e}function ct(e){return null!=e}function ut(e,t){return e.key===t.key&&e.tag===t.tag&&e.isComment===t.isComment&&!e.data==!t.data}function lt(e,t,n){var r,i,o={};for(r=t;r<=n;++r)i=e[r].key,ct(i)&&(o[i]=r);return o}function ft(e){function t(e){return new Xr(C.tagName(e).toLowerCase(),{},[],void 0,e)}function n(e,t){function n(){0===--n.listeners&&r(e)}return n.listeners=t,n}function r(e){var t=C.parentNode(e);C.removeChild(t,e)}function i(e,t,n){var r,i=e.data;if(e.isRootInsert=!n,ct(i)&&(ct(r=i.hook)&&ct(r=r.init)&&r(e),ct(r=e.child)))return u(e,t),e.elm;var o=e.children,s=e.tag;return ct(s)?(e.elm=e.ns?C.createElementNS(e.ns,s):C.createElement(s),l(e),a(e,o,t),ct(i)&&c(e,t)):e.isComment?e.elm=C.createComment(e.text):e.elm=C.createTextNode(e.text),e.elm}function a(e,t,n){if(Array.isArray(t))for(var r=0;rv?(u=st(n[y+1])?null:n[y+1].elm,f(e,u,n,d,y,r)):d>y&&p(e,t,l,v)}function m(e,t,n,r){if(e!==t){if(t.isStatic&&e.isStatic&&t.key===e.key&&t.isCloned)return void(t.elm=e.elm);var i,o,a=ct(i=t.data);a&&ct(o=i.hook)&&ct(i=o.prepatch)&&i(e,t);var c=t.elm=e.elm,u=e.children,l=t.children;if(a&&s(t)){for(i=0;i<$.update.length;++i)$.update[i](e,t);ct(o)&&ct(i=o.update)&&i(e,t)}if(st(t.text)?ct(u)&&ct(l)?u!==l&&h(c,u,l,n,r):ct(l)?(ct(e.text)&&C.setTextContent(c,""),f(c,null,l,0,l.length-1,n)):ct(u)?p(c,u,0,u.length-1):ct(e.text)&&C.setTextContent(c,""):e.text!==t.text&&C.setTextContent(c,t.text),a){for(i=0;i<$.postpatch.length;++i)$.postpatch[i](e,t);ct(o)&&ct(i=o.postpatch)&&i(e,t)}}}function g(e,t,n){if(n&&e.parent)e.parent.data.pendingInsert=t;else for(var r=0;r-1?t.split(/\s+/).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+e.getAttribute("class")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function wt(e,t){if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t);else{for(var n=" "+e.getAttribute("class")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");e.setAttribute("class",n.trim())}}function Ct(e){Yi(function(){Yi(e)})}function xt(e,t){(e._transitionClasses||(e._transitionClasses=[])).push(t),$t(e,t)}function kt(e,t){e._transitionClasses&&r(e._transitionClasses,t),wt(e,t)}function At(e,t,n){var r=Ot(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ji?Wi:Gi,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ji,l=a,f=o.length):t===qi?u>0&&(n=qi,l=u,f=c.length):(l=Math.max(a,u),n=l>0?a>u?Ji:qi:null,f=n?n===Ji?o.length:c.length:0);var d=n===Ji&&Qi.test(r[Ki+"Property"]);return{type:n,timeout:l,propCount:f,hasTransform:d}}function Tt(e,t){return Math.max.apply(null,t.map(function(t,n){return St(t)+St(e[n])}))}function St(e){return 1e3*Number(e.slice(0,-1))}function Et(e){var t=e.elm;t._leaveCb&&(t._leaveCb.cancelled=!0,t._leaveCb());var n=Lt(e.data.transition);if(n&&!t._enterCb&&1===t.nodeType){var r=n.css,i=n.type,o=n.enterClass,a=n.enterActiveClass,s=n.appearClass,c=n.appearActiveClass,u=n.beforeEnter,l=n.enter,f=n.afterEnter,d=n.enterCancelled,p=n.beforeAppear,v=n.appear,h=n.afterAppear,m=n.appearCancelled,g=ti.$vnode,y=g&&g.parent?g.parent.context:ti,_=!y._isMounted||!e.isRootInsert;if(!_||v||""===v){var b=_?s:o,$=_?c:a,w=_?p||u:u,C=_&&"function"==typeof v?v:l,x=_?h||f:f,k=_?m||d:d,A=r!==!1&&!Er,O=C&&(C._length||C.length)>1,T=t._enterCb=Dt(function(){A&&kt(t,$),T.cancelled?(A&&kt(t,b),k&&k(t)):x&&x(t),t._enterCb=null});e.data.show||Z(e.data.hook||(e.data.hook={}),"insert",function(){var n=t.parentNode,r=n&&n._pending&&n._pending[e.key];r&&r.tag===e.tag&&r.elm._leaveCb&&r.elm._leaveCb(),C&&C(t,T)}),w&&w(t),A&&(xt(t,b),xt(t,$),Ct(function(){kt(t,b),T.cancelled||O||At(t,i,T)})),e.data.show&&C&&C(t,T),A||O||T()}}}function jt(e,t){function n(){m.cancelled||(e.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[e.key]=e),u&&u(r),v&&(xt(r,s),xt(r,c),Ct(function(){kt(r,s),m.cancelled||h||At(r,a,m)})),l&&l(r,m),v||h||m())}var r=e.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var i=Lt(e.data.transition);if(!i)return t();if(!r._leaveCb&&1===r.nodeType){var o=i.css,a=i.type,s=i.leaveClass,c=i.leaveActiveClass,u=i.beforeLeave,l=i.leave,f=i.afterLeave,d=i.leaveCancelled,p=i.delayLeave,v=o!==!1&&!Er,h=l&&(l._length||l.length)>1,m=r._leaveCb=Dt(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[e.key]=null),v&&kt(r,c),m.cancelled?(v&&kt(r,s),d&&d(r)):(t(),f&&f(r)),r._leaveCb=null});p?p(n):n()}}function Lt(e){if(e){if("object"==typeof e){var t={};return e.css!==!1&&u(t,Xi(e.name||"v")),u(t,e),t}return"string"==typeof e?Xi(e):void 0}}function Dt(e){var t=!1;return function(){t||(t=!0,e())}}function Nt(e,t,n){var r=t.value,i=e.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=e.options.length;s-1,a.selected!==o&&(a.selected=o);else if(h(Pt(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function Mt(e,t){for(var n=0,r=t.length;n',n.innerHTML.indexOf(t)>0}function Zt(e){return ho.innerHTML=e,ho.textContent}function Gt(e,t,n){return t&&(e=e.replace(qo,"<").replace(Ko,">")),n&&(e=e.replace(Wo,"\n")),e.replace(Zo,"&").replace(Go,'"')}function Yt(e,t){function n(t){d+=t,e=e.substring(t)}function r(){var t=e.match(wo);if(t){var r={tagName:t[1],attrs:[],start:d};n(t[0].length);for(var i,o;!(i=e.match(Co))&&(o=e.match(_o));)n(o[0].length),r.attrs.push(o);if(i)return r.unarySlash=i[1],n(i[0].length),r.end=d,r}}function i(e){var n=e.tagName,r=e.unarySlash;u&&("p"===s&&xi(n)&&o("",s),Ci(n)&&s===n&&o("",n));for(var i=l(n)||"html"===n&&"head"===s||!!r,a=e.attrs.length,d=new Array(a),p=0;p=0&&c[o].tag.toLowerCase()!==a;o--);}else o=0;if(o>=0){for(var u=c.length-1;u>=o;u--)t.end&&t.end(c[u].tag,r,i);c.length=o,s=o&&c[o-1].tag}else"br"===n.toLowerCase()?t.start&&t.start(n,[],!0,r,i):"p"===n.toLowerCase()&&(t.start&&t.start(n,[],!1,r,i),t.end&&t.end(n,r,i))}for(var a,s,c=[],u=t.expectHTML,l=t.isUnaryTag||Cr,f=t.isFromDOM,d=0;e;){if(a=e,s&&Vo(s)){var p=s.toLowerCase(),v=Jo[p]||(Jo[p]=new RegExp("([\\s\\S]*?)("+p+"[^>]*>)","i")),h=0,m=e.replace(v,function(e,n,r){return h=r.length,"script"!==p&&"style"!==p&&"noscript"!==p&&(n=n.replace(//g,"$1").replace(//g,"$1")),t.chars&&t.chars(n),""});d+=e.length-m.length,e=m,o(""+p+">",p,d-h,d)}else{var g=e.indexOf("<");if(0===g){if(/^");if(y>=0){n(y+3);continue}}if(/^");if(_>=0){n(_+2);continue}}var b=e.match(ko);if(b){n(b[0].length);continue}var $=e.match(xo);if($){var w=d;n($[0].length),o($[0],$[1],w,d);continue}var C=r();if(C){i(C);continue}}var x=void 0;g>=0?(x=e.substring(0,g),n(g)):(x=e,e=""),t.chars&&t.chars(x)}if(e===a)throw new Error("Error parsing template:\n\n"+e)}o()}function Qt(e){function t(){(a||(a=[])).push(e.slice(d,i).trim()),d=i+1}var n,r,i,o,a,s=!1,c=!1,u=0,l=0,f=0,d=0;for(i=0;ia&&o.push(JSON.stringify(e.slice(a,i)));var s=Qt(r[1].trim());o.push("_s("+s+")"),a=i+r[0].length}return a-1:_q("+t+","+r+")"),sn(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+r+"):("+i+");if(Array.isArray($$a)){var $$v="+n+",$$i=_i($$a,$$v);if($$c){$$i<0&&("+t+"=$$a.concat($$v))}else{$$i>-1&&("+t+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+t+"=$$c}",null,!0)}function ir(e,t){var n=cn(e,"value")||"null";rn(e,"checked","_q("+t+","+n+")"),sn(e,"change",t+"="+n,null,!0)}function or(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=o||Sr&&"range"===r?"change":"input",u=!o&&"range"!==r,l="input"===e.tag||"textarea"===e.tag,f=l?"$event.target.value"+(s?".trim()":""):"$event",d=a||"number"===r?t+"=_n("+f+")":t+"="+f;if(l&&u&&(d="if($event.target.composing)return;"+d),rn(e,"value",l?"_s("+t+")":"("+t+")"),sn(e,c,d,null,!0),u)return!0}function ar(e,t){var n=t+'=Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){return "_value" in o ? o._value : o.value})'+(null==e.attrsMap.multiple?"[0]":"");return sn(e,"change",n,null,!0),!0}function sr(e,t){t.value&&rn(e,"textContent","_s("+t.value+")")}function cr(e,t){t.value&&rn(e,"innerHTML","_s("+t.value+")")}function ur(e,t){return t=t?u(u({},ba),t):ba,Yn(e,t)}function lr(e,t,n){var r=(t&&t.warn||ai,t&&t.delimiters?String(t.delimiters)+e:e);if(_a[r])return _a[r];var i={},o=ur(e,t);i.render=fr(o.render);var a=o.staticRenderFns.length;i.staticRenderFns=new Array(a);for(var s=0;s0,jr=Tr&&Tr.indexOf("edge/")>0,Lr=Tr&&Tr.indexOf("android")>0,Dr=Tr&&/iphone|ipad|ipod|ios/.test(Tr),Nr=Or&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Mr=function(){function e(){r=!1;var e=n.slice(0);n.length=0;for(var t=0;t",">"),vo=!!Or&&Wt("\n","
"),ho=document.createElement("div"),mo=/([^\s"'<>\/=]+)/,go=/(?:=)/,yo=[/"([^"]*)"+/.source,/'([^']*)'+/.source,/([^\s"'=<>`]+)/.source],_o=new RegExp("^\\s*"+mo.source+"(?:\\s*("+go.source+")\\s*(?:"+yo.join("|")+"))?"),bo="[a-zA-Z_][\\w\\-\\.]*",$o="((?:"+bo+"\\:)?"+bo+")",wo=new RegExp("^<"+$o),Co=/^\s*(\/?)>/,xo=new RegExp("^<\\/"+$o+"[^>]*>"),ko=/^]+>/i,Ao=!1;"x".replace(/x(.)?/g,function(e,t){Ao=""===t});var Oo,To,So,Eo,jo,Lo,Do,No,Mo,Po,Ro,Io,Fo,Bo,Ho,Uo,zo,Vo=n("script,style",!0),Jo={},qo=/</g,Ko=/>/g,Wo=/
/g,Zo=/&/g,Go=/"/g,Yo=/\{\{((?:.|\n)+?)\}\}/g,Qo=/[-.*+?^${}()|[\]\/\\]/g,Xo=a(function(e){var t=e[0].replace(Qo,"\\$&"),n=e[1].replace(Qo,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}),ea=/^v-|^@|^:/,ta=/(.*)\s+(?:in|of)\s+(.*)/,na=/\(([^,]*),([^,]*)(?:,([^,]*))?\)/,ra=/^:|^v-bind:/,ia=/^@|^v-on:/,oa=/:(.*)$/,aa=/\.[^\.]+/g,sa=a(Zt),ca=/^xmlns:NS\d+/,ua=/^NS\d+:/,la=a(Sn),fa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?'\]|\[".*?"\]|\[\d+\]|\[[A-Za-z_$][\w$]*\])*$/,da={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},pa={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:"if($event.target !== $event.currentTarget)return;"},va={bind:Rn,cloak:p},ha=(new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),{staticKeys:["staticClass"],transformNode:Qn,genData:Xn}),ma={transformNode:er,genData:tr},ga=[ha,ma],ya={model:nr,text:sr,html:cr},_a=Object.create(null),ba={isIE:Sr,expectHTML:!0,modules:ga,staticKeys:v(ga),directives:ya,isReservedTag:Oi,isUnaryTag:wi,mustUseProp:pi,getTagNamespace:Ve,isPreTag:Ai},$a=a(function(e){var t=qe(e);return t&&t.innerHTML}),wa=we.prototype.$mount;return we.prototype.$mount=function(e,t){if(e=e&&qe(e),e===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template,i=!1;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(i=!0,r=$a(r));else{if(!r.nodeType)return this;i=!0,r=r.innerHTML}else e&&(i=!0,r=dr(e));if(r){var o=lr(r,{warn:ai,isFromDOM:i,shouldDecodeTags:po,shouldDecodeNewlines:vo,delimiters:n.delimiters},this),a=o.render,s=o.staticRenderFns;n.render=a,n.staticRenderFns=s}}return wa.call(this,e,t)},we.compile=lr,we});
\ No newline at end of file