packages feed

wai-feature-flags (empty) → 0.1.0.0

raw patch · 7 files changed

+11005/−0 lines, 7 filesdep +aesondep +basedep +bytestring

Dependencies added: aeson, base, bytestring, random, text, unordered-containers, wai, wai-feature-flags, warp

Files

+ CHANGELOG.md view
@@ -0,0 +1,3 @@+# 0.1.0.0++- Initial release.
+ LICENSE view
@@ -0,0 +1,29 @@+BSD 3-Clause License++Copyright (c) 2020, Jasper Woudenberg+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++1. Redistributions of source code must retain the above copyright notice, this+   list of conditions and the following disclaimer.++2. Redistributions in binary form must reproduce the above copyright notice,+   this list of conditions and the following disclaimer in the documentation+   and/or other materials provided with the distribution.++3. Neither the name of the copyright holder nor the names of its+   contributors may be used to endorse or promote products derived from+   this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,3 @@+# `wai-feature-flags`++Feature flag support for WAI applications.
+ example-app/Main.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE OverloadedStrings #-}++module Main+  ( main,+  )+where++import Data.Foldable (asum)+import GHC.Generics (Generic)+import qualified Network.FeatureFlags as FeatureFlags+import qualified Network.Wai as Wai+import qualified Network.Wai.Handler.Warp as Warp++main :: IO ()+main = do+  store <- FeatureFlags.memoryStore+  featureFlagsAdmin <- FeatureFlags.mkApplication store+  Warp.run 8080 (application store featureFlagsAdmin)++application :: FeatureFlags.Store Flags -> Wai.Application -> Wai.Application+application store featureFlagsAdmin req respond = do+  flags <- FeatureFlags.fetch store+  case (Wai.requestMethod req, Wai.pathInfo req) of+    -- Mount feature flags page at /admin/flags.+    (_, "admin" : "flags" : rest) ->+      featureFlagsAdmin+        req {Wai.pathInfo = rest}+        respond+    ("GET", ["window"]) ->+      respond $+        Wai.responseLBS+          (toEnum 200)+          []+          (if openWindow flags then "open" else "closed")+    ("GET", ["pigeons"]) ->+      respond $+        Wai.responseLBS+          (toEnum 200)+          []+          (if feedPigeons flags then "fed" else "hungry")+    _ -> respond (Wai.responseLBS (toEnum 404) [] "")++data Flags+  = Flags+      { openWindow :: Bool,+        feedPigeons :: Bool+      }+  deriving (Generic)++instance FeatureFlags.Flags Flags
+ frontend/index.html view
@@ -0,0 +1,10583 @@+<!DOCTYPE HTML>+<html>+<head>+  <meta charset="UTF-8">+  <title>Main</title>+  <style>body { padding: 0; margin: 0; }</style>+</head>++<body>++<pre id="elm"></pre>++<script>+try {+(function(scope){+'use strict';++function F(arity, fun, wrapper) {+  wrapper.a = arity;+  wrapper.f = fun;+  return wrapper;+}++function F2(fun) {+  return F(2, fun, function(a) { return function(b) { return fun(a,b); }; })+}+function F3(fun) {+  return F(3, fun, function(a) {+    return function(b) { return function(c) { return fun(a, b, c); }; };+  });+}+function F4(fun) {+  return F(4, fun, function(a) { return function(b) { return function(c) {+    return function(d) { return fun(a, b, c, d); }; }; };+  });+}+function F5(fun) {+  return F(5, fun, function(a) { return function(b) { return function(c) {+    return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; };+  });+}+function F6(fun) {+  return F(6, fun, function(a) { return function(b) { return function(c) {+    return function(d) { return function(e) { return function(f) {+    return fun(a, b, c, d, e, f); }; }; }; }; };+  });+}+function F7(fun) {+  return F(7, fun, function(a) { return function(b) { return function(c) {+    return function(d) { return function(e) { return function(f) {+    return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; };+  });+}+function F8(fun) {+  return F(8, fun, function(a) { return function(b) { return function(c) {+    return function(d) { return function(e) { return function(f) {+    return function(g) { return function(h) {+    return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; };+  });+}+function F9(fun) {+  return F(9, fun, function(a) { return function(b) { return function(c) {+    return function(d) { return function(e) { return function(f) {+    return function(g) { return function(h) { return function(i) {+    return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; };+  });+}++function A2(fun, a, b) {+  return fun.a === 2 ? fun.f(a, b) : fun(a)(b);+}+function A3(fun, a, b, c) {+  return fun.a === 3 ? fun.f(a, b, c) : fun(a)(b)(c);+}+function A4(fun, a, b, c, d) {+  return fun.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d);+}+function A5(fun, a, b, c, d, e) {+  return fun.a === 5 ? fun.f(a, b, c, d, e) : fun(a)(b)(c)(d)(e);+}+function A6(fun, a, b, c, d, e, f) {+  return fun.a === 6 ? fun.f(a, b, c, d, e, f) : fun(a)(b)(c)(d)(e)(f);+}+function A7(fun, a, b, c, d, e, f, g) {+  return fun.a === 7 ? fun.f(a, b, c, d, e, f, g) : fun(a)(b)(c)(d)(e)(f)(g);+}+function A8(fun, a, b, c, d, e, f, g, h) {+  return fun.a === 8 ? fun.f(a, b, c, d, e, f, g, h) : fun(a)(b)(c)(d)(e)(f)(g)(h);+}+function A9(fun, a, b, c, d, e, f, g, h, i) {+  return fun.a === 9 ? fun.f(a, b, c, d, e, f, g, h, i) : fun(a)(b)(c)(d)(e)(f)(g)(h)(i);+}++console.warn('Compiled in DEV mode. Follow the advice at https://elm-lang.org/0.19.1/optimize for better performance and smaller assets.');+++var _JsArray_empty = [];++function _JsArray_singleton(value)+{+    return [value];+}++function _JsArray_length(array)+{+    return array.length;+}++var _JsArray_initialize = F3(function(size, offset, func)+{+    var result = new Array(size);++    for (var i = 0; i < size; i++)+    {+        result[i] = func(offset + i);+    }++    return result;+});++var _JsArray_initializeFromList = F2(function (max, ls)+{+    var result = new Array(max);++    for (var i = 0; i < max && ls.b; i++)+    {+        result[i] = ls.a;+        ls = ls.b;+    }++    result.length = i;+    return _Utils_Tuple2(result, ls);+});++var _JsArray_unsafeGet = F2(function(index, array)+{+    return array[index];+});++var _JsArray_unsafeSet = F3(function(index, value, array)+{+    var length = array.length;+    var result = new Array(length);++    for (var i = 0; i < length; i++)+    {+        result[i] = array[i];+    }++    result[index] = value;+    return result;+});++var _JsArray_push = F2(function(value, array)+{+    var length = array.length;+    var result = new Array(length + 1);++    for (var i = 0; i < length; i++)+    {+        result[i] = array[i];+    }++    result[length] = value;+    return result;+});++var _JsArray_foldl = F3(function(func, acc, array)+{+    var length = array.length;++    for (var i = 0; i < length; i++)+    {+        acc = A2(func, array[i], acc);+    }++    return acc;+});++var _JsArray_foldr = F3(function(func, acc, array)+{+    for (var i = array.length - 1; i >= 0; i--)+    {+        acc = A2(func, array[i], acc);+    }++    return acc;+});++var _JsArray_map = F2(function(func, array)+{+    var length = array.length;+    var result = new Array(length);++    for (var i = 0; i < length; i++)+    {+        result[i] = func(array[i]);+    }++    return result;+});++var _JsArray_indexedMap = F3(function(func, offset, array)+{+    var length = array.length;+    var result = new Array(length);++    for (var i = 0; i < length; i++)+    {+        result[i] = A2(func, offset + i, array[i]);+    }++    return result;+});++var _JsArray_slice = F3(function(from, to, array)+{+    return array.slice(from, to);+});++var _JsArray_appendN = F3(function(n, dest, source)+{+    var destLen = dest.length;+    var itemsToCopy = n - destLen;++    if (itemsToCopy > source.length)+    {+        itemsToCopy = source.length;+    }++    var size = destLen + itemsToCopy;+    var result = new Array(size);++    for (var i = 0; i < destLen; i++)+    {+        result[i] = dest[i];+    }++    for (var i = 0; i < itemsToCopy; i++)+    {+        result[i + destLen] = source[i];+    }++    return result;+});++++// LOG++var _Debug_log_UNUSED = F2(function(tag, value)+{+	return value;+});++var _Debug_log = F2(function(tag, value)+{+	console.log(tag + ': ' + _Debug_toString(value));+	return value;+});+++// TODOS++function _Debug_todo(moduleName, region)+{+	return function(message) {+		_Debug_crash(8, moduleName, region, message);+	};+}++function _Debug_todoCase(moduleName, region, value)+{+	return function(message) {+		_Debug_crash(9, moduleName, region, value, message);+	};+}+++// TO STRING++function _Debug_toString_UNUSED(value)+{+	return '<internals>';+}++function _Debug_toString(value)+{+	return _Debug_toAnsiString(false, value);+}++function _Debug_toAnsiString(ansi, value)+{+	if (typeof value === 'function')+	{+		return _Debug_internalColor(ansi, '<function>');+	}++	if (typeof value === 'boolean')+	{+		return _Debug_ctorColor(ansi, value ? 'True' : 'False');+	}++	if (typeof value === 'number')+	{+		return _Debug_numberColor(ansi, value + '');+	}++	if (value instanceof String)+	{+		return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'");+	}++	if (typeof value === 'string')+	{+		return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"');+	}++	if (typeof value === 'object' && '$' in value)+	{+		var tag = value.$;++		if (typeof tag === 'number')+		{+			return _Debug_internalColor(ansi, '<internals>');+		}++		if (tag[0] === '#')+		{+			var output = [];+			for (var k in value)+			{+				if (k === '$') continue;+				output.push(_Debug_toAnsiString(ansi, value[k]));+			}+			return '(' + output.join(',') + ')';+		}++		if (tag === 'Set_elm_builtin')+		{+			return _Debug_ctorColor(ansi, 'Set')+				+ _Debug_fadeColor(ansi, '.fromList') + ' '+				+ _Debug_toAnsiString(ansi, $elm$core$Set$toList(value));+		}++		if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin')+		{+			return _Debug_ctorColor(ansi, 'Dict')+				+ _Debug_fadeColor(ansi, '.fromList') + ' '+				+ _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value));+		}++		if (tag === 'Array_elm_builtin')+		{+			return _Debug_ctorColor(ansi, 'Array')+				+ _Debug_fadeColor(ansi, '.fromList') + ' '+				+ _Debug_toAnsiString(ansi, $elm$core$Array$toList(value));+		}++		if (tag === '::' || tag === '[]')+		{+			var output = '[';++			value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b)++			for (; value.b; value = value.b) // WHILE_CONS+			{+				output += ',' + _Debug_toAnsiString(ansi, value.a);+			}+			return output + ']';+		}++		var output = '';+		for (var i in value)+		{+			if (i === '$') continue;+			var str = _Debug_toAnsiString(ansi, value[i]);+			var c0 = str[0];+			var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0;+			output += ' ' + (parenless ? str : '(' + str + ')');+		}+		return _Debug_ctorColor(ansi, tag) + output;+	}++	if (typeof DataView === 'function' && value instanceof DataView)+	{+		return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>');+	}++	if (typeof File !== 'undefined' && value instanceof File)+	{+		return _Debug_internalColor(ansi, '<' + value.name + '>');+	}++	if (typeof value === 'object')+	{+		var output = [];+		for (var key in value)+		{+			var field = key[0] === '_' ? key.slice(1) : key;+			output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key]));+		}+		if (output.length === 0)+		{+			return '{}';+		}+		return '{ ' + output.join(', ') + ' }';+	}++	return _Debug_internalColor(ansi, '<internals>');+}++function _Debug_addSlashes(str, isChar)+{+	var s = str+		.replace(/\\/g, '\\\\')+		.replace(/\n/g, '\\n')+		.replace(/\t/g, '\\t')+		.replace(/\r/g, '\\r')+		.replace(/\v/g, '\\v')+		.replace(/\0/g, '\\0');++	if (isChar)+	{+		return s.replace(/\'/g, '\\\'');+	}+	else+	{+		return s.replace(/\"/g, '\\"');+	}+}++function _Debug_ctorColor(ansi, string)+{+	return ansi ? '\x1b[96m' + string + '\x1b[0m' : string;+}++function _Debug_numberColor(ansi, string)+{+	return ansi ? '\x1b[95m' + string + '\x1b[0m' : string;+}++function _Debug_stringColor(ansi, string)+{+	return ansi ? '\x1b[93m' + string + '\x1b[0m' : string;+}++function _Debug_charColor(ansi, string)+{+	return ansi ? '\x1b[92m' + string + '\x1b[0m' : string;+}++function _Debug_fadeColor(ansi, string)+{+	return ansi ? '\x1b[37m' + string + '\x1b[0m' : string;+}++function _Debug_internalColor(ansi, string)+{+	return ansi ? '\x1b[36m' + string + '\x1b[0m' : string;+}++function _Debug_toHexDigit(n)+{+	return String.fromCharCode(n < 10 ? 48 + n : 55 + n);+}+++// CRASH+++function _Debug_crash_UNUSED(identifier)+{+	throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md');+}+++function _Debug_crash(identifier, fact1, fact2, fact3, fact4)+{+	switch(identifier)+	{+		case 0:+			throw new Error('What node should I take over? In JavaScript I need something like:\n\n    Elm.Main.init({\n        node: document.getElementById("elm-node")\n    })\n\nYou need to do this with any Browser.sandbox or Browser.element program.');++		case 1:+			throw new Error('Browser.application programs cannot handle URLs like this:\n\n    ' + document.location.href + '\n\nWhat is the root? The root of your file system? Try looking at this program with `elm reactor` or some other server.');++		case 2:+			var jsonErrorString = fact1;+			throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString);++		case 3:+			var portName = fact1;+			throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.');++		case 4:+			var portName = fact1;+			var problem = fact2;+			throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem);++		case 5:+			throw new Error('Trying to use `(==)` on functions.\nThere is no way to know if functions are "the same" in the Elm sense.\nRead more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.');++		case 6:+			var moduleName = fact1;+			throw new Error('Your page is loading multiple Elm scripts with a module named ' + moduleName + '. Maybe a duplicate script is getting loaded accidentally? If not, rename one of them so I know which is which!');++		case 8:+			var moduleName = fact1;+			var region = fact2;+			var message = fact3;+			throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message);++		case 9:+			var moduleName = fact1;+			var region = fact2;+			var value = fact3;+			var message = fact4;+			throw new Error(+				'TODO in module `' + moduleName + '` from the `case` expression '+				+ _Debug_regionToString(region) + '\n\nIt received the following value:\n\n    '+				+ _Debug_toString(value).replace('\n', '\n    ')+				+ '\n\nBut the branch that handles it says:\n\n    ' + message.replace('\n', '\n    ')+			);++		case 10:+			throw new Error('Bug in https://github.com/elm/virtual-dom/issues');++		case 11:+			throw new Error('Cannot perform mod 0. Division by zero error.');+	}+}++function _Debug_regionToString(region)+{+	if (region.start.line === region.end.line)+	{+		return 'on line ' + region.start.line;+	}+	return 'on lines ' + region.start.line + ' through ' + region.end.line;+}++++// EQUALITY++function _Utils_eq(x, y)+{+	for (+		var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack);+		isEqual && (pair = stack.pop());+		isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack)+		)+	{}++	return isEqual;+}++function _Utils_eqHelp(x, y, depth, stack)+{+	if (x === y)+	{+		return true;+	}++	if (typeof x !== 'object' || x === null || y === null)+	{+		typeof x === 'function' && _Debug_crash(5);+		return false;+	}++	if (depth > 100)+	{+		stack.push(_Utils_Tuple2(x,y));+		return true;+	}++	/**/+	if (x.$ === 'Set_elm_builtin')+	{+		x = $elm$core$Set$toList(x);+		y = $elm$core$Set$toList(y);+	}+	if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin')+	{+		x = $elm$core$Dict$toList(x);+		y = $elm$core$Dict$toList(y);+	}+	//*/++	/**_UNUSED/+	if (x.$ < 0)+	{+		x = $elm$core$Dict$toList(x);+		y = $elm$core$Dict$toList(y);+	}+	//*/++	for (var key in x)+	{+		if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack))+		{+			return false;+		}+	}+	return true;+}++var _Utils_equal = F2(_Utils_eq);+var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); });++++// COMPARISONS++// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on+// the particular integer values assigned to LT, EQ, and GT.++function _Utils_cmp(x, y, ord)+{+	if (typeof x !== 'object')+	{+		return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1;+	}++	/**/+	if (x instanceof String)+	{+		var a = x.valueOf();+		var b = y.valueOf();+		return a === b ? 0 : a < b ? -1 : 1;+	}+	//*/++	/**_UNUSED/+	if (typeof x.$ === 'undefined')+	//*/+	/**/+	if (x.$[0] === '#')+	//*/+	{+		return (ord = _Utils_cmp(x.a, y.a))+			? ord+			: (ord = _Utils_cmp(x.b, y.b))+				? ord+				: _Utils_cmp(x.c, y.c);+	}++	// traverse conses until end of a list or a mismatch+	for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES+	return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0);+}++var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; });+var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; });+var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; });+var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; });++var _Utils_compare = F2(function(x, y)+{+	var n = _Utils_cmp(x, y);+	return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ;+});+++// COMMON VALUES++var _Utils_Tuple0_UNUSED = 0;+var _Utils_Tuple0 = { $: '#0' };++function _Utils_Tuple2_UNUSED(a, b) { return { a: a, b: b }; }+function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; }++function _Utils_Tuple3_UNUSED(a, b, c) { return { a: a, b: b, c: c }; }+function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; }++function _Utils_chr_UNUSED(c) { return c; }+function _Utils_chr(c) { return new String(c); }+++// RECORDS++function _Utils_update(oldRecord, updatedFields)+{+	var newRecord = {};++	for (var key in oldRecord)+	{+		newRecord[key] = oldRecord[key];+	}++	for (var key in updatedFields)+	{+		newRecord[key] = updatedFields[key];+	}++	return newRecord;+}+++// APPEND++var _Utils_append = F2(_Utils_ap);++function _Utils_ap(xs, ys)+{+	// append Strings+	if (typeof xs === 'string')+	{+		return xs + ys;+	}++	// append Lists+	if (!xs.b)+	{+		return ys;+	}+	var root = _List_Cons(xs.a, ys);+	xs = xs.b+	for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS+	{+		curr = curr.b = _List_Cons(xs.a, ys);+	}+	return root;+}++++var _List_Nil_UNUSED = { $: 0 };+var _List_Nil = { $: '[]' };++function _List_Cons_UNUSED(hd, tl) { return { $: 1, a: hd, b: tl }; }+function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; }+++var _List_cons = F2(_List_Cons);++function _List_fromArray(arr)+{+	var out = _List_Nil;+	for (var i = arr.length; i--; )+	{+		out = _List_Cons(arr[i], out);+	}+	return out;+}++function _List_toArray(xs)+{+	for (var out = []; xs.b; xs = xs.b) // WHILE_CONS+	{+		out.push(xs.a);+	}+	return out;+}++var _List_map2 = F3(function(f, xs, ys)+{+	for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES+	{+		arr.push(A2(f, xs.a, ys.a));+	}+	return _List_fromArray(arr);+});++var _List_map3 = F4(function(f, xs, ys, zs)+{+	for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES+	{+		arr.push(A3(f, xs.a, ys.a, zs.a));+	}+	return _List_fromArray(arr);+});++var _List_map4 = F5(function(f, ws, xs, ys, zs)+{+	for (var arr = []; ws.b && xs.b && ys.b && zs.b; ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES+	{+		arr.push(A4(f, ws.a, xs.a, ys.a, zs.a));+	}+	return _List_fromArray(arr);+});++var _List_map5 = F6(function(f, vs, ws, xs, ys, zs)+{+	for (var arr = []; vs.b && ws.b && xs.b && ys.b && zs.b; vs = vs.b, ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES+	{+		arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a));+	}+	return _List_fromArray(arr);+});++var _List_sortBy = F2(function(f, xs)+{+	return _List_fromArray(_List_toArray(xs).sort(function(a, b) {+		return _Utils_cmp(f(a), f(b));+	}));+});++var _List_sortWith = F2(function(f, xs)+{+	return _List_fromArray(_List_toArray(xs).sort(function(a, b) {+		var ord = A2(f, a, b);+		return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1;+	}));+});++++// MATH++var _Basics_add = F2(function(a, b) { return a + b; });+var _Basics_sub = F2(function(a, b) { return a - b; });+var _Basics_mul = F2(function(a, b) { return a * b; });+var _Basics_fdiv = F2(function(a, b) { return a / b; });+var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; });+var _Basics_pow = F2(Math.pow);++var _Basics_remainderBy = F2(function(b, a) { return a % b; });++// https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf+var _Basics_modBy = F2(function(modulus, x)+{+	var answer = x % modulus;+	return modulus === 0+		? _Debug_crash(11)+		:+	((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0))+		? answer + modulus+		: answer;+});+++// TRIGONOMETRY++var _Basics_pi = Math.PI;+var _Basics_e = Math.E;+var _Basics_cos = Math.cos;+var _Basics_sin = Math.sin;+var _Basics_tan = Math.tan;+var _Basics_acos = Math.acos;+var _Basics_asin = Math.asin;+var _Basics_atan = Math.atan;+var _Basics_atan2 = F2(Math.atan2);+++// MORE MATH++function _Basics_toFloat(x) { return x; }+function _Basics_truncate(n) { return n | 0; }+function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; }++var _Basics_ceiling = Math.ceil;+var _Basics_floor = Math.floor;+var _Basics_round = Math.round;+var _Basics_sqrt = Math.sqrt;+var _Basics_log = Math.log;+var _Basics_isNaN = isNaN;+++// BOOLEANS++function _Basics_not(bool) { return !bool; }+var _Basics_and = F2(function(a, b) { return a && b; });+var _Basics_or  = F2(function(a, b) { return a || b; });+var _Basics_xor = F2(function(a, b) { return a !== b; });++++var _String_cons = F2(function(chr, str)+{+	return chr + str;+});++function _String_uncons(string)+{+	var word = string.charCodeAt(0);+	return !isNaN(word)+		? $elm$core$Maybe$Just(+			0xD800 <= word && word <= 0xDBFF+				? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2))+				: _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1))+		)+		: $elm$core$Maybe$Nothing;+}++var _String_append = F2(function(a, b)+{+	return a + b;+});++function _String_length(str)+{+	return str.length;+}++var _String_map = F2(function(func, string)+{+	var len = string.length;+	var array = new Array(len);+	var i = 0;+	while (i < len)+	{+		var word = string.charCodeAt(i);+		if (0xD800 <= word && word <= 0xDBFF)+		{+			array[i] = func(_Utils_chr(string[i] + string[i+1]));+			i += 2;+			continue;+		}+		array[i] = func(_Utils_chr(string[i]));+		i++;+	}+	return array.join('');+});++var _String_filter = F2(function(isGood, str)+{+	var arr = [];+	var len = str.length;+	var i = 0;+	while (i < len)+	{+		var char = str[i];+		var word = str.charCodeAt(i);+		i++;+		if (0xD800 <= word && word <= 0xDBFF)+		{+			char += str[i];+			i++;+		}++		if (isGood(_Utils_chr(char)))+		{+			arr.push(char);+		}+	}+	return arr.join('');+});++function _String_reverse(str)+{+	var len = str.length;+	var arr = new Array(len);+	var i = 0;+	while (i < len)+	{+		var word = str.charCodeAt(i);+		if (0xD800 <= word && word <= 0xDBFF)+		{+			arr[len - i] = str[i + 1];+			i++;+			arr[len - i] = str[i - 1];+			i++;+		}+		else+		{+			arr[len - i] = str[i];+			i++;+		}+	}+	return arr.join('');+}++var _String_foldl = F3(function(func, state, string)+{+	var len = string.length;+	var i = 0;+	while (i < len)+	{+		var char = string[i];+		var word = string.charCodeAt(i);+		i++;+		if (0xD800 <= word && word <= 0xDBFF)+		{+			char += string[i];+			i++;+		}+		state = A2(func, _Utils_chr(char), state);+	}+	return state;+});++var _String_foldr = F3(function(func, state, string)+{+	var i = string.length;+	while (i--)+	{+		var char = string[i];+		var word = string.charCodeAt(i);+		if (0xDC00 <= word && word <= 0xDFFF)+		{+			i--;+			char = string[i] + char;+		}+		state = A2(func, _Utils_chr(char), state);+	}+	return state;+});++var _String_split = F2(function(sep, str)+{+	return str.split(sep);+});++var _String_join = F2(function(sep, strs)+{+	return strs.join(sep);+});++var _String_slice = F3(function(start, end, str) {+	return str.slice(start, end);+});++function _String_trim(str)+{+	return str.trim();+}++function _String_trimLeft(str)+{+	return str.replace(/^\s+/, '');+}++function _String_trimRight(str)+{+	return str.replace(/\s+$/, '');+}++function _String_words(str)+{+	return _List_fromArray(str.trim().split(/\s+/g));+}++function _String_lines(str)+{+	return _List_fromArray(str.split(/\r\n|\r|\n/g));+}++function _String_toUpper(str)+{+	return str.toUpperCase();+}++function _String_toLower(str)+{+	return str.toLowerCase();+}++var _String_any = F2(function(isGood, string)+{+	var i = string.length;+	while (i--)+	{+		var char = string[i];+		var word = string.charCodeAt(i);+		if (0xDC00 <= word && word <= 0xDFFF)+		{+			i--;+			char = string[i] + char;+		}+		if (isGood(_Utils_chr(char)))+		{+			return true;+		}+	}+	return false;+});++var _String_all = F2(function(isGood, string)+{+	var i = string.length;+	while (i--)+	{+		var char = string[i];+		var word = string.charCodeAt(i);+		if (0xDC00 <= word && word <= 0xDFFF)+		{+			i--;+			char = string[i] + char;+		}+		if (!isGood(_Utils_chr(char)))+		{+			return false;+		}+	}+	return true;+});++var _String_contains = F2(function(sub, str)+{+	return str.indexOf(sub) > -1;+});++var _String_startsWith = F2(function(sub, str)+{+	return str.indexOf(sub) === 0;+});++var _String_endsWith = F2(function(sub, str)+{+	return str.length >= sub.length &&+		str.lastIndexOf(sub) === str.length - sub.length;+});++var _String_indexes = F2(function(sub, str)+{+	var subLen = sub.length;++	if (subLen < 1)+	{+		return _List_Nil;+	}++	var i = 0;+	var is = [];++	while ((i = str.indexOf(sub, i)) > -1)+	{+		is.push(i);+		i = i + subLen;+	}++	return _List_fromArray(is);+});+++// TO STRING++function _String_fromNumber(number)+{+	return number + '';+}+++// INT CONVERSIONS++function _String_toInt(str)+{+	var total = 0;+	var code0 = str.charCodeAt(0);+	var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0;++	for (var i = start; i < str.length; ++i)+	{+		var code = str.charCodeAt(i);+		if (code < 0x30 || 0x39 < code)+		{+			return $elm$core$Maybe$Nothing;+		}+		total = 10 * total + code - 0x30;+	}++	return i == start+		? $elm$core$Maybe$Nothing+		: $elm$core$Maybe$Just(code0 == 0x2D ? -total : total);+}+++// FLOAT CONVERSIONS++function _String_toFloat(s)+{+	// check if it is a hex, octal, or binary number+	if (s.length === 0 || /[\sxbo]/.test(s))+	{+		return $elm$core$Maybe$Nothing;+	}+	var n = +s;+	// faster isNaN check+	return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing;+}++function _String_fromList(chars)+{+	return _List_toArray(chars).join('');+}+++++function _Char_toCode(char)+{+	var code = char.charCodeAt(0);+	if (0xD800 <= code && code <= 0xDBFF)+	{+		return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000+	}+	return code;+}++function _Char_fromCode(code)+{+	return _Utils_chr(+		(code < 0 || 0x10FFFF < code)+			? '\uFFFD'+			:+		(code <= 0xFFFF)+			? String.fromCharCode(code)+			:+		(code -= 0x10000,+			String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00)+		)+	);+}++function _Char_toUpper(char)+{+	return _Utils_chr(char.toUpperCase());+}++function _Char_toLower(char)+{+	return _Utils_chr(char.toLowerCase());+}++function _Char_toLocaleUpper(char)+{+	return _Utils_chr(char.toLocaleUpperCase());+}++function _Char_toLocaleLower(char)+{+	return _Utils_chr(char.toLocaleLowerCase());+}++++/**/+function _Json_errorToString(error)+{+	return $elm$json$Json$Decode$errorToString(error);+}+//*/+++// CORE DECODERS++function _Json_succeed(msg)+{+	return {+		$: 0,+		a: msg+	};+}++function _Json_fail(msg)+{+	return {+		$: 1,+		a: msg+	};+}++function _Json_decodePrim(decoder)+{+	return { $: 2, b: decoder };+}++var _Json_decodeInt = _Json_decodePrim(function(value) {+	return (typeof value !== 'number')+		? _Json_expecting('an INT', value)+		:+	(-2147483647 < value && value < 2147483647 && (value | 0) === value)+		? $elm$core$Result$Ok(value)+		:+	(isFinite(value) && !(value % 1))+		? $elm$core$Result$Ok(value)+		: _Json_expecting('an INT', value);+});++var _Json_decodeBool = _Json_decodePrim(function(value) {+	return (typeof value === 'boolean')+		? $elm$core$Result$Ok(value)+		: _Json_expecting('a BOOL', value);+});++var _Json_decodeFloat = _Json_decodePrim(function(value) {+	return (typeof value === 'number')+		? $elm$core$Result$Ok(value)+		: _Json_expecting('a FLOAT', value);+});++var _Json_decodeValue = _Json_decodePrim(function(value) {+	return $elm$core$Result$Ok(_Json_wrap(value));+});++var _Json_decodeString = _Json_decodePrim(function(value) {+	return (typeof value === 'string')+		? $elm$core$Result$Ok(value)+		: (value instanceof String)+			? $elm$core$Result$Ok(value + '')+			: _Json_expecting('a STRING', value);+});++function _Json_decodeList(decoder) { return { $: 3, b: decoder }; }+function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; }++function _Json_decodeNull(value) { return { $: 5, c: value }; }++var _Json_decodeField = F2(function(field, decoder)+{+	return {+		$: 6,+		d: field,+		b: decoder+	};+});++var _Json_decodeIndex = F2(function(index, decoder)+{+	return {+		$: 7,+		e: index,+		b: decoder+	};+});++function _Json_decodeKeyValuePairs(decoder)+{+	return {+		$: 8,+		b: decoder+	};+}++function _Json_mapMany(f, decoders)+{+	return {+		$: 9,+		f: f,+		g: decoders+	};+}++var _Json_andThen = F2(function(callback, decoder)+{+	return {+		$: 10,+		b: decoder,+		h: callback+	};+});++function _Json_oneOf(decoders)+{+	return {+		$: 11,+		g: decoders+	};+}+++// DECODING OBJECTS++var _Json_map1 = F2(function(f, d1)+{+	return _Json_mapMany(f, [d1]);+});++var _Json_map2 = F3(function(f, d1, d2)+{+	return _Json_mapMany(f, [d1, d2]);+});++var _Json_map3 = F4(function(f, d1, d2, d3)+{+	return _Json_mapMany(f, [d1, d2, d3]);+});++var _Json_map4 = F5(function(f, d1, d2, d3, d4)+{+	return _Json_mapMany(f, [d1, d2, d3, d4]);+});++var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5)+{+	return _Json_mapMany(f, [d1, d2, d3, d4, d5]);+});++var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6)+{+	return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]);+});++var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7)+{+	return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]);+});++var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8)+{+	return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]);+});+++// DECODE++var _Json_runOnString = F2(function(decoder, string)+{+	try+	{+		var value = JSON.parse(string);+		return _Json_runHelp(decoder, value);+	}+	catch (e)+	{+		return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string)));+	}+});++var _Json_run = F2(function(decoder, value)+{+	return _Json_runHelp(decoder, _Json_unwrap(value));+});++function _Json_runHelp(decoder, value)+{+	switch (decoder.$)+	{+		case 2:+			return decoder.b(value);++		case 5:+			return (value === null)+				? $elm$core$Result$Ok(decoder.c)+				: _Json_expecting('null', value);++		case 3:+			if (!_Json_isArray(value))+			{+				return _Json_expecting('a LIST', value);+			}+			return _Json_runArrayDecoder(decoder.b, value, _List_fromArray);++		case 4:+			if (!_Json_isArray(value))+			{+				return _Json_expecting('an ARRAY', value);+			}+			return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray);++		case 6:+			var field = decoder.d;+			if (typeof value !== 'object' || value === null || !(field in value))+			{+				return _Json_expecting('an OBJECT with a field named `' + field + '`', value);+			}+			var result = _Json_runHelp(decoder.b, value[field]);+			return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a));++		case 7:+			var index = decoder.e;+			if (!_Json_isArray(value))+			{+				return _Json_expecting('an ARRAY', value);+			}+			if (index >= value.length)+			{+				return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value);+			}+			var result = _Json_runHelp(decoder.b, value[index]);+			return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a));++		case 8:+			if (typeof value !== 'object' || value === null || _Json_isArray(value))+			{+				return _Json_expecting('an OBJECT', value);+			}++			var keyValuePairs = _List_Nil;+			// TODO test perf of Object.keys and switch when support is good enough+			for (var key in value)+			{+				if (value.hasOwnProperty(key))+				{+					var result = _Json_runHelp(decoder.b, value[key]);+					if (!$elm$core$Result$isOk(result))+					{+						return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a));+					}+					keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs);+				}+			}+			return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs));++		case 9:+			var answer = decoder.f;+			var decoders = decoder.g;+			for (var i = 0; i < decoders.length; i++)+			{+				var result = _Json_runHelp(decoders[i], value);+				if (!$elm$core$Result$isOk(result))+				{+					return result;+				}+				answer = answer(result.a);+			}+			return $elm$core$Result$Ok(answer);++		case 10:+			var result = _Json_runHelp(decoder.b, value);+			return (!$elm$core$Result$isOk(result))+				? result+				: _Json_runHelp(decoder.h(result.a), value);++		case 11:+			var errors = _List_Nil;+			for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS+			{+				var result = _Json_runHelp(temp.a, value);+				if ($elm$core$Result$isOk(result))+				{+					return result;+				}+				errors = _List_Cons(result.a, errors);+			}+			return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors)));++		case 1:+			return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value)));++		case 0:+			return $elm$core$Result$Ok(decoder.a);+	}+}++function _Json_runArrayDecoder(decoder, value, toElmValue)+{+	var len = value.length;+	var array = new Array(len);+	for (var i = 0; i < len; i++)+	{+		var result = _Json_runHelp(decoder, value[i]);+		if (!$elm$core$Result$isOk(result))+		{+			return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a));+		}+		array[i] = result.a;+	}+	return $elm$core$Result$Ok(toElmValue(array));+}++function _Json_isArray(value)+{+	return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList);+}++function _Json_toElmArray(array)+{+	return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; });+}++function _Json_expecting(type, value)+{+	return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value)));+}+++// EQUALITY++function _Json_equality(x, y)+{+	if (x === y)+	{+		return true;+	}++	if (x.$ !== y.$)+	{+		return false;+	}++	switch (x.$)+	{+		case 0:+		case 1:+			return x.a === y.a;++		case 2:+			return x.b === y.b;++		case 5:+			return x.c === y.c;++		case 3:+		case 4:+		case 8:+			return _Json_equality(x.b, y.b);++		case 6:+			return x.d === y.d && _Json_equality(x.b, y.b);++		case 7:+			return x.e === y.e && _Json_equality(x.b, y.b);++		case 9:+			return x.f === y.f && _Json_listEquality(x.g, y.g);++		case 10:+			return x.h === y.h && _Json_equality(x.b, y.b);++		case 11:+			return _Json_listEquality(x.g, y.g);+	}+}++function _Json_listEquality(aDecoders, bDecoders)+{+	var len = aDecoders.length;+	if (len !== bDecoders.length)+	{+		return false;+	}+	for (var i = 0; i < len; i++)+	{+		if (!_Json_equality(aDecoders[i], bDecoders[i]))+		{+			return false;+		}+	}+	return true;+}+++// ENCODE++var _Json_encode = F2(function(indentLevel, value)+{+	return JSON.stringify(_Json_unwrap(value), null, indentLevel) + '';+});++function _Json_wrap(value) { return { $: 0, a: value }; }+function _Json_unwrap(value) { return value.a; }++function _Json_wrap_UNUSED(value) { return value; }+function _Json_unwrap_UNUSED(value) { return value; }++function _Json_emptyArray() { return []; }+function _Json_emptyObject() { return {}; }++var _Json_addField = F3(function(key, value, object)+{+	object[key] = _Json_unwrap(value);+	return object;+});++function _Json_addEntry(func)+{+	return F2(function(entry, array)+	{+		array.push(_Json_unwrap(func(entry)));+		return array;+	});+}++var _Json_encodeNull = _Json_wrap(null);++++// TASKS++function _Scheduler_succeed(value)+{+	return {+		$: 0,+		a: value+	};+}++function _Scheduler_fail(error)+{+	return {+		$: 1,+		a: error+	};+}++function _Scheduler_binding(callback)+{+	return {+		$: 2,+		b: callback,+		c: null+	};+}++var _Scheduler_andThen = F2(function(callback, task)+{+	return {+		$: 3,+		b: callback,+		d: task+	};+});++var _Scheduler_onError = F2(function(callback, task)+{+	return {+		$: 4,+		b: callback,+		d: task+	};+});++function _Scheduler_receive(callback)+{+	return {+		$: 5,+		b: callback+	};+}+++// PROCESSES++var _Scheduler_guid = 0;++function _Scheduler_rawSpawn(task)+{+	var proc = {+		$: 0,+		e: _Scheduler_guid++,+		f: task,+		g: null,+		h: []+	};++	_Scheduler_enqueue(proc);++	return proc;+}++function _Scheduler_spawn(task)+{+	return _Scheduler_binding(function(callback) {+		callback(_Scheduler_succeed(_Scheduler_rawSpawn(task)));+	});+}++function _Scheduler_rawSend(proc, msg)+{+	proc.h.push(msg);+	_Scheduler_enqueue(proc);+}++var _Scheduler_send = F2(function(proc, msg)+{+	return _Scheduler_binding(function(callback) {+		_Scheduler_rawSend(proc, msg);+		callback(_Scheduler_succeed(_Utils_Tuple0));+	});+});++function _Scheduler_kill(proc)+{+	return _Scheduler_binding(function(callback) {+		var task = proc.f;+		if (task.$ === 2 && task.c)+		{+			task.c();+		}++		proc.f = null;++		callback(_Scheduler_succeed(_Utils_Tuple0));+	});+}+++/* STEP PROCESSES++type alias Process =+  { $ : tag+  , id : unique_id+  , root : Task+  , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack }+  , mailbox : [msg]+  }++*/+++var _Scheduler_working = false;+var _Scheduler_queue = [];+++function _Scheduler_enqueue(proc)+{+	_Scheduler_queue.push(proc);+	if (_Scheduler_working)+	{+		return;+	}+	_Scheduler_working = true;+	while (proc = _Scheduler_queue.shift())+	{+		_Scheduler_step(proc);+	}+	_Scheduler_working = false;+}+++function _Scheduler_step(proc)+{+	while (proc.f)+	{+		var rootTag = proc.f.$;+		if (rootTag === 0 || rootTag === 1)+		{+			while (proc.g && proc.g.$ !== rootTag)+			{+				proc.g = proc.g.i;+			}+			if (!proc.g)+			{+				return;+			}+			proc.f = proc.g.b(proc.f.a);+			proc.g = proc.g.i;+		}+		else if (rootTag === 2)+		{+			proc.f.c = proc.f.b(function(newRoot) {+				proc.f = newRoot;+				_Scheduler_enqueue(proc);+			});+			return;+		}+		else if (rootTag === 5)+		{+			if (proc.h.length === 0)+			{+				return;+			}+			proc.f = proc.f.b(proc.h.shift());+		}+		else // if (rootTag === 3 || rootTag === 4)+		{+			proc.g = {+				$: rootTag === 3 ? 0 : 1,+				b: proc.f.b,+				i: proc.g+			};+			proc.f = proc.f.d;+		}+	}+}++++function _Process_sleep(time)+{+	return _Scheduler_binding(function(callback) {+		var id = setTimeout(function() {+			callback(_Scheduler_succeed(_Utils_Tuple0));+		}, time);++		return function() { clearTimeout(id); };+	});+}+++++// PROGRAMS+++var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args)+{+	return _Platform_initialize(+		flagDecoder,+		args,+		impl.init,+		impl.update,+		impl.subscriptions,+		function() { return function() {} }+	);+});++++// INITIALIZE A PROGRAM+++function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder)+{+	var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined));+	$elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/);+	var managers = {};+	var initPair = init(result.a);+	var model = initPair.a;+	var stepper = stepperBuilder(sendToApp, model);+	var ports = _Platform_setupEffects(managers, sendToApp);++	function sendToApp(msg, viewMetadata)+	{+		var pair = A2(update, msg, model);+		stepper(model = pair.a, viewMetadata);+		_Platform_enqueueEffects(managers, pair.b, subscriptions(model));+	}++	_Platform_enqueueEffects(managers, initPair.b, subscriptions(model));++	return ports ? { ports: ports } : {};+}++++// TRACK PRELOADS+//+// This is used by code in elm/browser and elm/http+// to register any HTTP requests that are triggered by init.+//+++var _Platform_preload;+++function _Platform_registerPreload(url)+{+	_Platform_preload.add(url);+}++++// EFFECT MANAGERS+++var _Platform_effectManagers = {};+++function _Platform_setupEffects(managers, sendToApp)+{+	var ports;++	// setup all necessary effect managers+	for (var key in _Platform_effectManagers)+	{+		var manager = _Platform_effectManagers[key];++		if (manager.a)+		{+			ports = ports || {};+			ports[key] = manager.a(key, sendToApp);+		}++		managers[key] = _Platform_instantiateManager(manager, sendToApp);+	}++	return ports;+}+++function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap)+{+	return {+		b: init,+		c: onEffects,+		d: onSelfMsg,+		e: cmdMap,+		f: subMap+	};+}+++function _Platform_instantiateManager(info, sendToApp)+{+	var router = {+		g: sendToApp,+		h: undefined+	};++	var onEffects = info.c;+	var onSelfMsg = info.d;+	var cmdMap = info.e;+	var subMap = info.f;++	function loop(state)+	{+		return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg)+		{+			var value = msg.a;++			if (msg.$ === 0)+			{+				return A3(onSelfMsg, router, value, state);+			}++			return cmdMap && subMap+				? A4(onEffects, router, value.i, value.j, state)+				: A3(onEffects, router, cmdMap ? value.i : value.j, state);+		}));+	}++	return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b));+}++++// ROUTING+++var _Platform_sendToApp = F2(function(router, msg)+{+	return _Scheduler_binding(function(callback)+	{+		router.g(msg);+		callback(_Scheduler_succeed(_Utils_Tuple0));+	});+});+++var _Platform_sendToSelf = F2(function(router, msg)+{+	return A2(_Scheduler_send, router.h, {+		$: 0,+		a: msg+	});+});++++// BAGS+++function _Platform_leaf(home)+{+	return function(value)+	{+		return {+			$: 1,+			k: home,+			l: value+		};+	};+}+++function _Platform_batch(list)+{+	return {+		$: 2,+		m: list+	};+}+++var _Platform_map = F2(function(tagger, bag)+{+	return {+		$: 3,+		n: tagger,+		o: bag+	}+});++++// PIPE BAGS INTO EFFECT MANAGERS+//+// Effects must be queued!+//+// Say your init contains a synchronous command, like Time.now or Time.here+//+//   - This will produce a batch of effects (FX_1)+//   - The synchronous task triggers the subsequent `update` call+//   - This will produce a batch of effects (FX_2)+//+// If we just start dispatching FX_2, subscriptions from FX_2 can be processed+// before subscriptions from FX_1. No good! Earlier versions of this code had+// this problem, leading to these reports:+//+//   https://github.com/elm/core/issues/980+//   https://github.com/elm/core/pull/981+//   https://github.com/elm/compiler/issues/1776+//+// The queue is necessary to avoid ordering issues for synchronous commands.+++// Why use true/false here? Why not just check the length of the queue?+// The goal is to detect "are we currently dispatching effects?" If we+// are, we need to bail and let the ongoing while loop handle things.+//+// Now say the queue has 1 element. When we dequeue the final element,+// the queue will be empty, but we are still actively dispatching effects.+// So you could get queue jumping in a really tricky category of cases.+//+var _Platform_effectsQueue = [];+var _Platform_effectsActive = false;+++function _Platform_enqueueEffects(managers, cmdBag, subBag)+{+	_Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag });++	if (_Platform_effectsActive) return;++	_Platform_effectsActive = true;+	for (var fx; fx = _Platform_effectsQueue.shift(); )+	{+		_Platform_dispatchEffects(fx.p, fx.q, fx.r);+	}+	_Platform_effectsActive = false;+}+++function _Platform_dispatchEffects(managers, cmdBag, subBag)+{+	var effectsDict = {};+	_Platform_gatherEffects(true, cmdBag, effectsDict, null);+	_Platform_gatherEffects(false, subBag, effectsDict, null);++	for (var home in managers)+	{+		_Scheduler_rawSend(managers[home], {+			$: 'fx',+			a: effectsDict[home] || { i: _List_Nil, j: _List_Nil }+		});+	}+}+++function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers)+{+	switch (bag.$)+	{+		case 1:+			var home = bag.k;+			var effect = _Platform_toEffect(isCmd, home, taggers, bag.l);+			effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]);+			return;++		case 2:+			for (var list = bag.m; list.b; list = list.b) // WHILE_CONS+			{+				_Platform_gatherEffects(isCmd, list.a, effectsDict, taggers);+			}+			return;++		case 3:+			_Platform_gatherEffects(isCmd, bag.o, effectsDict, {+				s: bag.n,+				t: taggers+			});+			return;+	}+}+++function _Platform_toEffect(isCmd, home, taggers, value)+{+	function applyTaggers(x)+	{+		for (var temp = taggers; temp; temp = temp.t)+		{+			x = temp.s(x);+		}+		return x;+	}++	var map = isCmd+		? _Platform_effectManagers[home].e+		: _Platform_effectManagers[home].f;++	return A2(map, applyTaggers, value)+}+++function _Platform_insert(isCmd, newEffect, effects)+{+	effects = effects || { i: _List_Nil, j: _List_Nil };++	isCmd+		? (effects.i = _List_Cons(newEffect, effects.i))+		: (effects.j = _List_Cons(newEffect, effects.j));++	return effects;+}++++// PORTS+++function _Platform_checkPortName(name)+{+	if (_Platform_effectManagers[name])+	{+		_Debug_crash(3, name)+	}+}++++// OUTGOING PORTS+++function _Platform_outgoingPort(name, converter)+{+	_Platform_checkPortName(name);+	_Platform_effectManagers[name] = {+		e: _Platform_outgoingPortMap,+		u: converter,+		a: _Platform_setupOutgoingPort+	};+	return _Platform_leaf(name);+}+++var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; });+++function _Platform_setupOutgoingPort(name)+{+	var subs = [];+	var converter = _Platform_effectManagers[name].u;++	// CREATE MANAGER++	var init = _Process_sleep(0);++	_Platform_effectManagers[name].b = init;+	_Platform_effectManagers[name].c = F3(function(router, cmdList, state)+	{+		for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS+		{+			// grab a separate reference to subs in case unsubscribe is called+			var currentSubs = subs;+			var value = _Json_unwrap(converter(cmdList.a));+			for (var i = 0; i < currentSubs.length; i++)+			{+				currentSubs[i](value);+			}+		}+		return init;+	});++	// PUBLIC API++	function subscribe(callback)+	{+		subs.push(callback);+	}++	function unsubscribe(callback)+	{+		// copy subs into a new array in case unsubscribe is called within a+		// subscribed callback+		subs = subs.slice();+		var index = subs.indexOf(callback);+		if (index >= 0)+		{+			subs.splice(index, 1);+		}+	}++	return {+		subscribe: subscribe,+		unsubscribe: unsubscribe+	};+}++++// INCOMING PORTS+++function _Platform_incomingPort(name, converter)+{+	_Platform_checkPortName(name);+	_Platform_effectManagers[name] = {+		f: _Platform_incomingPortMap,+		u: converter,+		a: _Platform_setupIncomingPort+	};+	return _Platform_leaf(name);+}+++var _Platform_incomingPortMap = F2(function(tagger, finalTagger)+{+	return function(value)+	{+		return tagger(finalTagger(value));+	};+});+++function _Platform_setupIncomingPort(name, sendToApp)+{+	var subs = _List_Nil;+	var converter = _Platform_effectManagers[name].u;++	// CREATE MANAGER++	var init = _Scheduler_succeed(null);++	_Platform_effectManagers[name].b = init;+	_Platform_effectManagers[name].c = F3(function(router, subList, state)+	{+		subs = subList;+		return init;+	});++	// PUBLIC API++	function send(incomingValue)+	{+		var result = A2(_Json_run, converter, _Json_wrap(incomingValue));++		$elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a);++		var value = result.a;+		for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS+		{+			sendToApp(temp.a(value));+		}+	}++	return { send: send };+}++++// EXPORT ELM MODULES+//+// Have DEBUG and PROD versions so that we can (1) give nicer errors in+// debug mode and (2) not pay for the bits needed for that in prod mode.+//+++function _Platform_export_UNUSED(exports)+{+	scope['Elm']+		? _Platform_mergeExportsProd(scope['Elm'], exports)+		: scope['Elm'] = exports;+}+++function _Platform_mergeExportsProd(obj, exports)+{+	for (var name in exports)+	{+		(name in obj)+			? (name == 'init')+				? _Debug_crash(6)+				: _Platform_mergeExportsProd(obj[name], exports[name])+			: (obj[name] = exports[name]);+	}+}+++function _Platform_export(exports)+{+	scope['Elm']+		? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports)+		: scope['Elm'] = exports;+}+++function _Platform_mergeExportsDebug(moduleName, obj, exports)+{+	for (var name in exports)+	{+		(name in obj)+			? (name == 'init')+				? _Debug_crash(6, moduleName)+				: _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name])+			: (obj[name] = exports[name]);+	}+}+++++// HELPERS+++var _VirtualDom_divertHrefToApp;++var _VirtualDom_doc = typeof document !== 'undefined' ? document : {};+++function _VirtualDom_appendChild(parent, child)+{+	parent.appendChild(child);+}++var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args)+{+	// NOTE: this function needs _Platform_export available to work++	/**_UNUSED/+	var node = args['node'];+	//*/+	/**/+	var node = args && args['node'] ? args['node'] : _Debug_crash(0);+	//*/++	node.parentNode.replaceChild(+		_VirtualDom_render(virtualNode, function() {}),+		node+	);++	return {};+});++++// TEXT+++function _VirtualDom_text(string)+{+	return {+		$: 0,+		a: string+	};+}++++// NODE+++var _VirtualDom_nodeNS = F2(function(namespace, tag)+{+	return F2(function(factList, kidList)+	{+		for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS+		{+			var kid = kidList.a;+			descendantsCount += (kid.b || 0);+			kids.push(kid);+		}+		descendantsCount += kids.length;++		return {+			$: 1,+			c: tag,+			d: _VirtualDom_organizeFacts(factList),+			e: kids,+			f: namespace,+			b: descendantsCount+		};+	});+});+++var _VirtualDom_node = _VirtualDom_nodeNS(undefined);++++// KEYED NODE+++var _VirtualDom_keyedNodeNS = F2(function(namespace, tag)+{+	return F2(function(factList, kidList)+	{+		for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS+		{+			var kid = kidList.a;+			descendantsCount += (kid.b.b || 0);+			kids.push(kid);+		}+		descendantsCount += kids.length;++		return {+			$: 2,+			c: tag,+			d: _VirtualDom_organizeFacts(factList),+			e: kids,+			f: namespace,+			b: descendantsCount+		};+	});+});+++var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined);++++// CUSTOM+++function _VirtualDom_custom(factList, model, render, diff)+{+	return {+		$: 3,+		d: _VirtualDom_organizeFacts(factList),+		g: model,+		h: render,+		i: diff+	};+}++++// MAP+++var _VirtualDom_map = F2(function(tagger, node)+{+	return {+		$: 4,+		j: tagger,+		k: node,+		b: 1 + (node.b || 0)+	};+});++++// LAZY+++function _VirtualDom_thunk(refs, thunk)+{+	return {+		$: 5,+		l: refs,+		m: thunk,+		k: undefined+	};+}++var _VirtualDom_lazy = F2(function(func, a)+{+	return _VirtualDom_thunk([func, a], function() {+		return func(a);+	});+});++var _VirtualDom_lazy2 = F3(function(func, a, b)+{+	return _VirtualDom_thunk([func, a, b], function() {+		return A2(func, a, b);+	});+});++var _VirtualDom_lazy3 = F4(function(func, a, b, c)+{+	return _VirtualDom_thunk([func, a, b, c], function() {+		return A3(func, a, b, c);+	});+});++var _VirtualDom_lazy4 = F5(function(func, a, b, c, d)+{+	return _VirtualDom_thunk([func, a, b, c, d], function() {+		return A4(func, a, b, c, d);+	});+});++var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e)+{+	return _VirtualDom_thunk([func, a, b, c, d, e], function() {+		return A5(func, a, b, c, d, e);+	});+});++var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f)+{+	return _VirtualDom_thunk([func, a, b, c, d, e, f], function() {+		return A6(func, a, b, c, d, e, f);+	});+});++var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g)+{+	return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() {+		return A7(func, a, b, c, d, e, f, g);+	});+});++var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h)+{+	return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() {+		return A8(func, a, b, c, d, e, f, g, h);+	});+});++++// FACTS+++var _VirtualDom_on = F2(function(key, handler)+{+	return {+		$: 'a0',+		n: key,+		o: handler+	};+});+var _VirtualDom_style = F2(function(key, value)+{+	return {+		$: 'a1',+		n: key,+		o: value+	};+});+var _VirtualDom_property = F2(function(key, value)+{+	return {+		$: 'a2',+		n: key,+		o: value+	};+});+var _VirtualDom_attribute = F2(function(key, value)+{+	return {+		$: 'a3',+		n: key,+		o: value+	};+});+var _VirtualDom_attributeNS = F3(function(namespace, key, value)+{+	return {+		$: 'a4',+		n: key,+		o: { f: namespace, o: value }+	};+});++++// XSS ATTACK VECTOR CHECKS+++function _VirtualDom_noScript(tag)+{+	return tag == 'script' ? 'p' : tag;+}++function _VirtualDom_noOnOrFormAction(key)+{+	return /^(on|formAction$)/i.test(key) ? 'data-' + key : key;+}++function _VirtualDom_noInnerHtmlOrFormAction(key)+{+	return key == 'innerHTML' || key == 'formAction' ? 'data-' + key : key;+}++function _VirtualDom_noJavaScriptUri_UNUSED(value)+{+	return /^javascript:/i.test(value.replace(/\s/g,'')) ? '' : value;+}++function _VirtualDom_noJavaScriptUri(value)+{+	return /^javascript:/i.test(value.replace(/\s/g,''))+		? 'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'+		: value;+}++function _VirtualDom_noJavaScriptOrHtmlUri_UNUSED(value)+{+	return /^\s*(javascript:|data:text\/html)/i.test(value) ? '' : value;+}++function _VirtualDom_noJavaScriptOrHtmlUri(value)+{+	return /^\s*(javascript:|data:text\/html)/i.test(value)+		? 'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'+		: value;+}++++// MAP FACTS+++var _VirtualDom_mapAttribute = F2(function(func, attr)+{+	return (attr.$ === 'a0')+		? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o))+		: attr;+});++function _VirtualDom_mapHandler(func, handler)+{+	var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler);++	// 0 = Normal+	// 1 = MayStopPropagation+	// 2 = MayPreventDefault+	// 3 = Custom++	return {+		$: handler.$,+		a:+			!tag+				? A2($elm$json$Json$Decode$map, func, handler.a)+				:+			A3($elm$json$Json$Decode$map2,+				tag < 3+					? _VirtualDom_mapEventTuple+					: _VirtualDom_mapEventRecord,+				$elm$json$Json$Decode$succeed(func),+				handler.a+			)+	};+}++var _VirtualDom_mapEventTuple = F2(function(func, tuple)+{+	return _Utils_Tuple2(func(tuple.a), tuple.b);+});++var _VirtualDom_mapEventRecord = F2(function(func, record)+{+	return {+		message: func(record.message),+		stopPropagation: record.stopPropagation,+		preventDefault: record.preventDefault+	}+});++++// ORGANIZE FACTS+++function _VirtualDom_organizeFacts(factList)+{+	for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS+	{+		var entry = factList.a;++		var tag = entry.$;+		var key = entry.n;+		var value = entry.o;++		if (tag === 'a2')+		{+			(key === 'className')+				? _VirtualDom_addClass(facts, key, _Json_unwrap(value))+				: facts[key] = _Json_unwrap(value);++			continue;+		}++		var subFacts = facts[tag] || (facts[tag] = {});+		(tag === 'a3' && key === 'class')+			? _VirtualDom_addClass(subFacts, key, value)+			: subFacts[key] = value;+	}++	return facts;+}++function _VirtualDom_addClass(object, key, newClass)+{+	var classes = object[key];+	object[key] = classes ? classes + ' ' + newClass : newClass;+}++++// RENDER+++function _VirtualDom_render(vNode, eventNode)+{+	var tag = vNode.$;++	if (tag === 5)+	{+		return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode);+	}++	if (tag === 0)+	{+		return _VirtualDom_doc.createTextNode(vNode.a);+	}++	if (tag === 4)+	{+		var subNode = vNode.k;+		var tagger = vNode.j;++		while (subNode.$ === 4)+		{+			typeof tagger !== 'object'+				? tagger = [tagger, subNode.j]+				: tagger.push(subNode.j);++			subNode = subNode.k;+		}++		var subEventRoot = { j: tagger, p: eventNode };+		var domNode = _VirtualDom_render(subNode, subEventRoot);+		domNode.elm_event_node_ref = subEventRoot;+		return domNode;+	}++	if (tag === 3)+	{+		var domNode = vNode.h(vNode.g);+		_VirtualDom_applyFacts(domNode, eventNode, vNode.d);+		return domNode;+	}++	// at this point `tag` must be 1 or 2++	var domNode = vNode.f+		? _VirtualDom_doc.createElementNS(vNode.f, vNode.c)+		: _VirtualDom_doc.createElement(vNode.c);++	if (_VirtualDom_divertHrefToApp && vNode.c == 'a')+	{+		domNode.addEventListener('click', _VirtualDom_divertHrefToApp(domNode));+	}++	_VirtualDom_applyFacts(domNode, eventNode, vNode.d);++	for (var kids = vNode.e, i = 0; i < kids.length; i++)+	{+		_VirtualDom_appendChild(domNode, _VirtualDom_render(tag === 1 ? kids[i] : kids[i].b, eventNode));+	}++	return domNode;+}++++// APPLY FACTS+++function _VirtualDom_applyFacts(domNode, eventNode, facts)+{+	for (var key in facts)+	{+		var value = facts[key];++		key === 'a1'+			? _VirtualDom_applyStyles(domNode, value)+			:+		key === 'a0'+			? _VirtualDom_applyEvents(domNode, eventNode, value)+			:+		key === 'a3'+			? _VirtualDom_applyAttrs(domNode, value)+			:+		key === 'a4'+			? _VirtualDom_applyAttrsNS(domNode, value)+			:+		((key !== 'value' && key !== 'checked') || domNode[key] !== value) && (domNode[key] = value);+	}+}++++// APPLY STYLES+++function _VirtualDom_applyStyles(domNode, styles)+{+	var domNodeStyle = domNode.style;++	for (var key in styles)+	{+		domNodeStyle[key] = styles[key];+	}+}++++// APPLY ATTRS+++function _VirtualDom_applyAttrs(domNode, attrs)+{+	for (var key in attrs)+	{+		var value = attrs[key];+		typeof value !== 'undefined'+			? domNode.setAttribute(key, value)+			: domNode.removeAttribute(key);+	}+}++++// APPLY NAMESPACED ATTRS+++function _VirtualDom_applyAttrsNS(domNode, nsAttrs)+{+	for (var key in nsAttrs)+	{+		var pair = nsAttrs[key];+		var namespace = pair.f;+		var value = pair.o;++		typeof value !== 'undefined'+			? domNode.setAttributeNS(namespace, key, value)+			: domNode.removeAttributeNS(namespace, key);+	}+}++++// APPLY EVENTS+++function _VirtualDom_applyEvents(domNode, eventNode, events)+{+	var allCallbacks = domNode.elmFs || (domNode.elmFs = {});++	for (var key in events)+	{+		var newHandler = events[key];+		var oldCallback = allCallbacks[key];++		if (!newHandler)+		{+			domNode.removeEventListener(key, oldCallback);+			allCallbacks[key] = undefined;+			continue;+		}++		if (oldCallback)+		{+			var oldHandler = oldCallback.q;+			if (oldHandler.$ === newHandler.$)+			{+				oldCallback.q = newHandler;+				continue;+			}+			domNode.removeEventListener(key, oldCallback);+		}++		oldCallback = _VirtualDom_makeCallback(eventNode, newHandler);+		domNode.addEventListener(key, oldCallback,+			_VirtualDom_passiveSupported+			&& { passive: $elm$virtual_dom$VirtualDom$toHandlerInt(newHandler) < 2 }+		);+		allCallbacks[key] = oldCallback;+	}+}++++// PASSIVE EVENTS+++var _VirtualDom_passiveSupported;++try+{+	window.addEventListener('t', null, Object.defineProperty({}, 'passive', {+		get: function() { _VirtualDom_passiveSupported = true; }+	}));+}+catch(e) {}++++// EVENT HANDLERS+++function _VirtualDom_makeCallback(eventNode, initialHandler)+{+	function callback(event)+	{+		var handler = callback.q;+		var result = _Json_runHelp(handler.a, event);++		if (!$elm$core$Result$isOk(result))+		{+			return;+		}++		var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler);++		// 0 = Normal+		// 1 = MayStopPropagation+		// 2 = MayPreventDefault+		// 3 = Custom++		var value = result.a;+		var message = !tag ? value : tag < 3 ? value.a : value.message;+		var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation;+		var currentEventNode = (+			stopPropagation && event.stopPropagation(),+			(tag == 2 ? value.b : tag == 3 && value.preventDefault) && event.preventDefault(),+			eventNode+		);+		var tagger;+		var i;+		while (tagger = currentEventNode.j)+		{+			if (typeof tagger == 'function')+			{+				message = tagger(message);+			}+			else+			{+				for (var i = tagger.length; i--; )+				{+					message = tagger[i](message);+				}+			}+			currentEventNode = currentEventNode.p;+		}+		currentEventNode(message, stopPropagation); // stopPropagation implies isSync+	}++	callback.q = initialHandler;++	return callback;+}++function _VirtualDom_equalEvents(x, y)+{+	return x.$ == y.$ && _Json_equality(x.a, y.a);+}++++// DIFF+++// TODO: Should we do patches like in iOS?+//+// type Patch+//   = At Int Patch+//   | Batch (List Patch)+//   | Change ...+//+// How could it not be better?+//+function _VirtualDom_diff(x, y)+{+	var patches = [];+	_VirtualDom_diffHelp(x, y, patches, 0);+	return patches;+}+++function _VirtualDom_pushPatch(patches, type, index, data)+{+	var patch = {+		$: type,+		r: index,+		s: data,+		t: undefined,+		u: undefined+	};+	patches.push(patch);+	return patch;+}+++function _VirtualDom_diffHelp(x, y, patches, index)+{+	if (x === y)+	{+		return;+	}++	var xType = x.$;+	var yType = y.$;++	// Bail if you run into different types of nodes. Implies that the+	// structure has changed significantly and it's not worth a diff.+	if (xType !== yType)+	{+		if (xType === 1 && yType === 2)+		{+			y = _VirtualDom_dekey(y);+			yType = 1;+		}+		else+		{+			_VirtualDom_pushPatch(patches, 0, index, y);+			return;+		}+	}++	// Now we know that both nodes are the same $.+	switch (yType)+	{+		case 5:+			var xRefs = x.l;+			var yRefs = y.l;+			var i = xRefs.length;+			var same = i === yRefs.length;+			while (same && i--)+			{+				same = xRefs[i] === yRefs[i];+			}+			if (same)+			{+				y.k = x.k;+				return;+			}+			y.k = y.m();+			var subPatches = [];+			_VirtualDom_diffHelp(x.k, y.k, subPatches, 0);+			subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches);+			return;++		case 4:+			// gather nested taggers+			var xTaggers = x.j;+			var yTaggers = y.j;+			var nesting = false;++			var xSubNode = x.k;+			while (xSubNode.$ === 4)+			{+				nesting = true;++				typeof xTaggers !== 'object'+					? xTaggers = [xTaggers, xSubNode.j]+					: xTaggers.push(xSubNode.j);++				xSubNode = xSubNode.k;+			}++			var ySubNode = y.k;+			while (ySubNode.$ === 4)+			{+				nesting = true;++				typeof yTaggers !== 'object'+					? yTaggers = [yTaggers, ySubNode.j]+					: yTaggers.push(ySubNode.j);++				ySubNode = ySubNode.k;+			}++			// Just bail if different numbers of taggers. This implies the+			// structure of the virtual DOM has changed.+			if (nesting && xTaggers.length !== yTaggers.length)+			{+				_VirtualDom_pushPatch(patches, 0, index, y);+				return;+			}++			// check if taggers are "the same"+			if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers)+			{+				_VirtualDom_pushPatch(patches, 2, index, yTaggers);+			}++			// diff everything below the taggers+			_VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1);+			return;++		case 0:+			if (x.a !== y.a)+			{+				_VirtualDom_pushPatch(patches, 3, index, y.a);+			}+			return;++		case 1:+			_VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids);+			return;++		case 2:+			_VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids);+			return;++		case 3:+			if (x.h !== y.h)+			{+				_VirtualDom_pushPatch(patches, 0, index, y);+				return;+			}++			var factsDiff = _VirtualDom_diffFacts(x.d, y.d);+			factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff);++			var patch = y.i(x.g, y.g);+			patch && _VirtualDom_pushPatch(patches, 5, index, patch);++			return;+	}+}++// assumes the incoming arrays are the same length+function _VirtualDom_pairwiseRefEqual(as, bs)+{+	for (var i = 0; i < as.length; i++)+	{+		if (as[i] !== bs[i])+		{+			return false;+		}+	}++	return true;+}++function _VirtualDom_diffNodes(x, y, patches, index, diffKids)+{+	// Bail if obvious indicators have changed. Implies more serious+	// structural changes such that it's not worth it to diff.+	if (x.c !== y.c || x.f !== y.f)+	{+		_VirtualDom_pushPatch(patches, 0, index, y);+		return;+	}++	var factsDiff = _VirtualDom_diffFacts(x.d, y.d);+	factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff);++	diffKids(x, y, patches, index);+}++++// DIFF FACTS+++// TODO Instead of creating a new diff object, it's possible to just test if+// there *is* a diff. During the actual patch, do the diff again and make the+// modifications directly. This way, there's no new allocations. Worth it?+function _VirtualDom_diffFacts(x, y, category)+{+	var diff;++	// look for changes and removals+	for (var xKey in x)+	{+		if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4')+		{+			var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey);+			if (subDiff)+			{+				diff = diff || {};+				diff[xKey] = subDiff;+			}+			continue;+		}++		// remove if not in the new facts+		if (!(xKey in y))+		{+			diff = diff || {};+			diff[xKey] =+				!category+					? (typeof x[xKey] === 'string' ? '' : null)+					:+				(category === 'a1')+					? ''+					:+				(category === 'a0' || category === 'a3')+					? undefined+					:+				{ f: x[xKey].f, o: undefined };++			continue;+		}++		var xValue = x[xKey];+		var yValue = y[xKey];++		// reference equal, so don't worry about it+		if (xValue === yValue && xKey !== 'value' && xKey !== 'checked'+			|| category === 'a0' && _VirtualDom_equalEvents(xValue, yValue))+		{+			continue;+		}++		diff = diff || {};+		diff[xKey] = yValue;+	}++	// add new stuff+	for (var yKey in y)+	{+		if (!(yKey in x))+		{+			diff = diff || {};+			diff[yKey] = y[yKey];+		}+	}++	return diff;+}++++// DIFF KIDS+++function _VirtualDom_diffKids(xParent, yParent, patches, index)+{+	var xKids = xParent.e;+	var yKids = yParent.e;++	var xLen = xKids.length;+	var yLen = yKids.length;++	// FIGURE OUT IF THERE ARE INSERTS OR REMOVALS++	if (xLen > yLen)+	{+		_VirtualDom_pushPatch(patches, 6, index, {+			v: yLen,+			i: xLen - yLen+		});+	}+	else if (xLen < yLen)+	{+		_VirtualDom_pushPatch(patches, 7, index, {+			v: xLen,+			e: yKids+		});+	}++	// PAIRWISE DIFF EVERYTHING ELSE++	for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++)+	{+		var xKid = xKids[i];+		_VirtualDom_diffHelp(xKid, yKids[i], patches, ++index);+		index += xKid.b || 0;+	}+}++++// KEYED DIFF+++function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex)+{+	var localPatches = [];++	var changes = {}; // Dict String Entry+	var inserts = []; // Array { index : Int, entry : Entry }+	// type Entry = { tag : String, vnode : VNode, index : Int, data : _ }++	var xKids = xParent.e;+	var yKids = yParent.e;+	var xLen = xKids.length;+	var yLen = yKids.length;+	var xIndex = 0;+	var yIndex = 0;++	var index = rootIndex;++	while (xIndex < xLen && yIndex < yLen)+	{+		var x = xKids[xIndex];+		var y = yKids[yIndex];++		var xKey = x.a;+		var yKey = y.a;+		var xNode = x.b;+		var yNode = y.b;++		var newMatch = undefined;+		var oldMatch = undefined;++		// check if keys match++		if (xKey === yKey)+		{+			index++;+			_VirtualDom_diffHelp(xNode, yNode, localPatches, index);+			index += xNode.b || 0;++			xIndex++;+			yIndex++;+			continue;+		}++		// look ahead 1 to detect insertions and removals.++		var xNext = xKids[xIndex + 1];+		var yNext = yKids[yIndex + 1];++		if (xNext)+		{+			var xNextKey = xNext.a;+			var xNextNode = xNext.b;+			oldMatch = yKey === xNextKey;+		}++		if (yNext)+		{+			var yNextKey = yNext.a;+			var yNextNode = yNext.b;+			newMatch = xKey === yNextKey;+		}+++		// swap x and y+		if (newMatch && oldMatch)+		{+			index++;+			_VirtualDom_diffHelp(xNode, yNextNode, localPatches, index);+			_VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts);+			index += xNode.b || 0;++			index++;+			_VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index);+			index += xNextNode.b || 0;++			xIndex += 2;+			yIndex += 2;+			continue;+		}++		// insert y+		if (newMatch)+		{+			index++;+			_VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts);+			_VirtualDom_diffHelp(xNode, yNextNode, localPatches, index);+			index += xNode.b || 0;++			xIndex += 1;+			yIndex += 2;+			continue;+		}++		// remove x+		if (oldMatch)+		{+			index++;+			_VirtualDom_removeNode(changes, localPatches, xKey, xNode, index);+			index += xNode.b || 0;++			index++;+			_VirtualDom_diffHelp(xNextNode, yNode, localPatches, index);+			index += xNextNode.b || 0;++			xIndex += 2;+			yIndex += 1;+			continue;+		}++		// remove x, insert y+		if (xNext && xNextKey === yNextKey)+		{+			index++;+			_VirtualDom_removeNode(changes, localPatches, xKey, xNode, index);+			_VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts);+			index += xNode.b || 0;++			index++;+			_VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index);+			index += xNextNode.b || 0;++			xIndex += 2;+			yIndex += 2;+			continue;+		}++		break;+	}++	// eat up any remaining nodes with removeNode and insertNode++	while (xIndex < xLen)+	{+		index++;+		var x = xKids[xIndex];+		var xNode = x.b;+		_VirtualDom_removeNode(changes, localPatches, x.a, xNode, index);+		index += xNode.b || 0;+		xIndex++;+	}++	while (yIndex < yLen)+	{+		var endInserts = endInserts || [];+		var y = yKids[yIndex];+		_VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts);+		yIndex++;+	}++	if (localPatches.length > 0 || inserts.length > 0 || endInserts)+	{+		_VirtualDom_pushPatch(patches, 8, rootIndex, {+			w: localPatches,+			x: inserts,+			y: endInserts+		});+	}+}++++// CHANGES FROM KEYED DIFF+++var _VirtualDom_POSTFIX = '_elmW6BL';+++function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts)+{+	var entry = changes[key];++	// never seen this key before+	if (!entry)+	{+		entry = {+			c: 0,+			z: vnode,+			r: yIndex,+			s: undefined+		};++		inserts.push({ r: yIndex, A: entry });+		changes[key] = entry;++		return;+	}++	// this key was removed earlier, a match!+	if (entry.c === 1)+	{+		inserts.push({ r: yIndex, A: entry });++		entry.c = 2;+		var subPatches = [];+		_VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r);+		entry.r = yIndex;+		entry.s.s = {+			w: subPatches,+			A: entry+		};++		return;+	}++	// this key has already been inserted or moved, a duplicate!+	_VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts);+}+++function _VirtualDom_removeNode(changes, localPatches, key, vnode, index)+{+	var entry = changes[key];++	// never seen this key before+	if (!entry)+	{+		var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined);++		changes[key] = {+			c: 1,+			z: vnode,+			r: index,+			s: patch+		};++		return;+	}++	// this key was inserted earlier, a match!+	if (entry.c === 0)+	{+		entry.c = 2;+		var subPatches = [];+		_VirtualDom_diffHelp(vnode, entry.z, subPatches, index);++		_VirtualDom_pushPatch(localPatches, 9, index, {+			w: subPatches,+			A: entry+		});++		return;+	}++	// this key has already been removed or moved, a duplicate!+	_VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index);+}++++// ADD DOM NODES+//+// Each DOM node has an "index" assigned in order of traversal. It is important+// to minimize our crawl over the actual DOM, so these indexes (along with the+// descendantsCount of virtual nodes) let us skip touching entire subtrees of+// the DOM if we know there are no patches there.+++function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode)+{+	_VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode);+}+++// assumes `patches` is non-empty and indexes increase monotonically.+function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode)+{+	var patch = patches[i];+	var index = patch.r;++	while (index === low)+	{+		var patchType = patch.$;++		if (patchType === 1)+		{+			_VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode);+		}+		else if (patchType === 8)+		{+			patch.t = domNode;+			patch.u = eventNode;++			var subPatches = patch.s.w;+			if (subPatches.length > 0)+			{+				_VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);+			}+		}+		else if (patchType === 9)+		{+			patch.t = domNode;+			patch.u = eventNode;++			var data = patch.s;+			if (data)+			{+				data.A.s = domNode;+				var subPatches = data.w;+				if (subPatches.length > 0)+				{+					_VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);+				}+			}+		}+		else+		{+			patch.t = domNode;+			patch.u = eventNode;+		}++		i++;++		if (!(patch = patches[i]) || (index = patch.r) > high)+		{+			return i;+		}+	}++	var tag = vNode.$;++	if (tag === 4)+	{+		var subNode = vNode.k;++		while (subNode.$ === 4)+		{+			subNode = subNode.k;+		}++		return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref);+	}++	// tag must be 1 or 2 at this point++	var vKids = vNode.e;+	var childNodes = domNode.childNodes;+	for (var j = 0; j < vKids.length; j++)+	{+		low++;+		var vKid = tag === 1 ? vKids[j] : vKids[j].b;+		var nextLow = low + (vKid.b || 0);+		if (low <= index && index <= nextLow)+		{+			i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode);+			if (!(patch = patches[i]) || (index = patch.r) > high)+			{+				return i;+			}+		}+		low = nextLow;+	}+	return i;+}++++// APPLY PATCHES+++function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode)+{+	if (patches.length === 0)+	{+		return rootDomNode;+	}++	_VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode);+	return _VirtualDom_applyPatchesHelp(rootDomNode, patches);+}++function _VirtualDom_applyPatchesHelp(rootDomNode, patches)+{+	for (var i = 0; i < patches.length; i++)+	{+		var patch = patches[i];+		var localDomNode = patch.t+		var newNode = _VirtualDom_applyPatch(localDomNode, patch);+		if (localDomNode === rootDomNode)+		{+			rootDomNode = newNode;+		}+	}+	return rootDomNode;+}++function _VirtualDom_applyPatch(domNode, patch)+{+	switch (patch.$)+	{+		case 0:+			return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u);++		case 4:+			_VirtualDom_applyFacts(domNode, patch.u, patch.s);+			return domNode;++		case 3:+			domNode.replaceData(0, domNode.length, patch.s);+			return domNode;++		case 1:+			return _VirtualDom_applyPatchesHelp(domNode, patch.s);++		case 2:+			if (domNode.elm_event_node_ref)+			{+				domNode.elm_event_node_ref.j = patch.s;+			}+			else+			{+				domNode.elm_event_node_ref = { j: patch.s, p: patch.u };+			}+			return domNode;++		case 6:+			var data = patch.s;+			for (var i = 0; i < data.i; i++)+			{+				domNode.removeChild(domNode.childNodes[data.v]);+			}+			return domNode;++		case 7:+			var data = patch.s;+			var kids = data.e;+			var i = data.v;+			var theEnd = domNode.childNodes[i];+			for (; i < kids.length; i++)+			{+				domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd);+			}+			return domNode;++		case 9:+			var data = patch.s;+			if (!data)+			{+				domNode.parentNode.removeChild(domNode);+				return domNode;+			}+			var entry = data.A;+			if (typeof entry.r !== 'undefined')+			{+				domNode.parentNode.removeChild(domNode);+			}+			entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w);+			return domNode;++		case 8:+			return _VirtualDom_applyPatchReorder(domNode, patch);++		case 5:+			return patch.s(domNode);++		default:+			_Debug_crash(10); // 'Ran into an unknown patch!'+	}+}+++function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode)+{+	var parentNode = domNode.parentNode;+	var newNode = _VirtualDom_render(vNode, eventNode);++	if (!newNode.elm_event_node_ref)+	{+		newNode.elm_event_node_ref = domNode.elm_event_node_ref;+	}++	if (parentNode && newNode !== domNode)+	{+		parentNode.replaceChild(newNode, domNode);+	}+	return newNode;+}+++function _VirtualDom_applyPatchReorder(domNode, patch)+{+	var data = patch.s;++	// remove end inserts+	var frag = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch);++	// removals+	domNode = _VirtualDom_applyPatchesHelp(domNode, data.w);++	// inserts+	var inserts = data.x;+	for (var i = 0; i < inserts.length; i++)+	{+		var insert = inserts[i];+		var entry = insert.A;+		var node = entry.c === 2+			? entry.s+			: _VirtualDom_render(entry.z, patch.u);+		domNode.insertBefore(node, domNode.childNodes[insert.r]);+	}++	// add end inserts+	if (frag)+	{+		_VirtualDom_appendChild(domNode, frag);+	}++	return domNode;+}+++function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch)+{+	if (!endInserts)+	{+		return;+	}++	var frag = _VirtualDom_doc.createDocumentFragment();+	for (var i = 0; i < endInserts.length; i++)+	{+		var insert = endInserts[i];+		var entry = insert.A;+		_VirtualDom_appendChild(frag, entry.c === 2+			? entry.s+			: _VirtualDom_render(entry.z, patch.u)+		);+	}+	return frag;+}+++function _VirtualDom_virtualize(node)+{+	// TEXT NODES++	if (node.nodeType === 3)+	{+		return _VirtualDom_text(node.textContent);+	}+++	// WEIRD NODES++	if (node.nodeType !== 1)+	{+		return _VirtualDom_text('');+	}+++	// ELEMENT NODES++	var attrList = _List_Nil;+	var attrs = node.attributes;+	for (var i = attrs.length; i--; )+	{+		var attr = attrs[i];+		var name = attr.name;+		var value = attr.value;+		attrList = _List_Cons( A2(_VirtualDom_attribute, name, value), attrList );+	}++	var tag = node.tagName.toLowerCase();+	var kidList = _List_Nil;+	var kids = node.childNodes;++	for (var i = kids.length; i--; )+	{+		kidList = _List_Cons(_VirtualDom_virtualize(kids[i]), kidList);+	}+	return A3(_VirtualDom_node, tag, attrList, kidList);+}++function _VirtualDom_dekey(keyedNode)+{+	var keyedKids = keyedNode.e;+	var len = keyedKids.length;+	var kids = new Array(len);+	for (var i = 0; i < len; i++)+	{+		kids[i] = keyedKids[i].b;+	}++	return {+		$: 1,+		c: keyedNode.c,+		d: keyedNode.d,+		e: kids,+		f: keyedNode.f,+		b: keyedNode.b+	};+}+++++// ELEMENT+++var _Debugger_element;++var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args)+{+	return _Platform_initialize(+		flagDecoder,+		args,+		impl.init,+		impl.update,+		impl.subscriptions,+		function(sendToApp, initialModel) {+			var view = impl.view;+			/**_UNUSED/+			var domNode = args['node'];+			//*/+			/**/+			var domNode = args && args['node'] ? args['node'] : _Debug_crash(0);+			//*/+			var currNode = _VirtualDom_virtualize(domNode);++			return _Browser_makeAnimator(initialModel, function(model)+			{+				var nextNode = view(model);+				var patches = _VirtualDom_diff(currNode, nextNode);+				domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp);+				currNode = nextNode;+			});+		}+	);+});++++// DOCUMENT+++var _Debugger_document;++var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args)+{+	return _Platform_initialize(+		flagDecoder,+		args,+		impl.init,+		impl.update,+		impl.subscriptions,+		function(sendToApp, initialModel) {+			var divertHrefToApp = impl.setup && impl.setup(sendToApp)+			var view = impl.view;+			var title = _VirtualDom_doc.title;+			var bodyNode = _VirtualDom_doc.body;+			var currNode = _VirtualDom_virtualize(bodyNode);+			return _Browser_makeAnimator(initialModel, function(model)+			{+				_VirtualDom_divertHrefToApp = divertHrefToApp;+				var doc = view(model);+				var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.body);+				var patches = _VirtualDom_diff(currNode, nextNode);+				bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp);+				currNode = nextNode;+				_VirtualDom_divertHrefToApp = 0;+				(title !== doc.title) && (_VirtualDom_doc.title = title = doc.title);+			});+		}+	);+});++++// ANIMATION+++var _Browser_cancelAnimationFrame =+	typeof cancelAnimationFrame !== 'undefined'+		? cancelAnimationFrame+		: function(id) { clearTimeout(id); };++var _Browser_requestAnimationFrame =+	typeof requestAnimationFrame !== 'undefined'+		? requestAnimationFrame+		: function(callback) { return setTimeout(callback, 1000 / 60); };+++function _Browser_makeAnimator(model, draw)+{+	draw(model);++	var state = 0;++	function updateIfNeeded()+	{+		state = state === 1+			? 0+			: ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 );+	}++	return function(nextModel, isSync)+	{+		model = nextModel;++		isSync+			? ( draw(model),+				state === 2 && (state = 1)+				)+			: ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded),+				state = 2+				);+	};+}++++// APPLICATION+++function _Browser_application(impl)+{+	var onUrlChange = impl.onUrlChange;+	var onUrlRequest = impl.onUrlRequest;+	var key = function() { key.a(onUrlChange(_Browser_getUrl())); };++	return _Browser_document({+		setup: function(sendToApp)+		{+			key.a = sendToApp;+			_Browser_window.addEventListener('popstate', key);+			_Browser_window.navigator.userAgent.indexOf('Trident') < 0 || _Browser_window.addEventListener('hashchange', key);++			return F2(function(domNode, event)+			{+				if (!event.ctrlKey && !event.metaKey && !event.shiftKey && event.button < 1 && !domNode.target && !domNode.hasAttribute('download'))+				{+					event.preventDefault();+					var href = domNode.href;+					var curr = _Browser_getUrl();+					var next = $elm$url$Url$fromString(href).a;+					sendToApp(onUrlRequest(+						(next+							&& curr.protocol === next.protocol+							&& curr.host === next.host+							&& curr.port_.a === next.port_.a+						)+							? $elm$browser$Browser$Internal(next)+							: $elm$browser$Browser$External(href)+					));+				}+			});+		},+		init: function(flags)+		{+			return A3(impl.init, flags, _Browser_getUrl(), key);+		},+		view: impl.view,+		update: impl.update,+		subscriptions: impl.subscriptions+	});+}++function _Browser_getUrl()+{+	return $elm$url$Url$fromString(_VirtualDom_doc.location.href).a || _Debug_crash(1);+}++var _Browser_go = F2(function(key, n)+{+	return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {+		n && history.go(n);+		key();+	}));+});++var _Browser_pushUrl = F2(function(key, url)+{+	return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {+		history.pushState({}, '', url);+		key();+	}));+});++var _Browser_replaceUrl = F2(function(key, url)+{+	return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {+		history.replaceState({}, '', url);+		key();+	}));+});++++// GLOBAL EVENTS+++var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} };+var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode;+var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode;++var _Browser_on = F3(function(node, eventName, sendToSelf)+{+	return _Scheduler_spawn(_Scheduler_binding(function(callback)+	{+		function handler(event)	{ _Scheduler_rawSpawn(sendToSelf(event)); }+		node.addEventListener(eventName, handler, _VirtualDom_passiveSupported && { passive: true });+		return function() { node.removeEventListener(eventName, handler); };+	}));+});++var _Browser_decodeEvent = F2(function(decoder, event)+{+	var result = _Json_runHelp(decoder, event);+	return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing;+});++++// PAGE VISIBILITY+++function _Browser_visibilityInfo()+{+	return (typeof _VirtualDom_doc.hidden !== 'undefined')+		? { hidden: 'hidden', change: 'visibilitychange' }+		:+	(typeof _VirtualDom_doc.mozHidden !== 'undefined')+		? { hidden: 'mozHidden', change: 'mozvisibilitychange' }+		:+	(typeof _VirtualDom_doc.msHidden !== 'undefined')+		? { hidden: 'msHidden', change: 'msvisibilitychange' }+		:+	(typeof _VirtualDom_doc.webkitHidden !== 'undefined')+		? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' }+		: { hidden: 'hidden', change: 'visibilitychange' };+}++++// ANIMATION FRAMES+++function _Browser_rAF()+{+	return _Scheduler_binding(function(callback)+	{+		var id = _Browser_requestAnimationFrame(function() {+			callback(_Scheduler_succeed(Date.now()));+		});++		return function() {+			_Browser_cancelAnimationFrame(id);+		};+	});+}+++function _Browser_now()+{+	return _Scheduler_binding(function(callback)+	{+		callback(_Scheduler_succeed(Date.now()));+	});+}++++// DOM STUFF+++function _Browser_withNode(id, doStuff)+{+	return _Scheduler_binding(function(callback)+	{+		_Browser_requestAnimationFrame(function() {+			var node = document.getElementById(id);+			callback(node+				? _Scheduler_succeed(doStuff(node))+				: _Scheduler_fail($elm$browser$Browser$Dom$NotFound(id))+			);+		});+	});+}+++function _Browser_withWindow(doStuff)+{+	return _Scheduler_binding(function(callback)+	{+		_Browser_requestAnimationFrame(function() {+			callback(_Scheduler_succeed(doStuff()));+		});+	});+}+++// FOCUS and BLUR+++var _Browser_call = F2(function(functionName, id)+{+	return _Browser_withNode(id, function(node) {+		node[functionName]();+		return _Utils_Tuple0;+	});+});++++// WINDOW VIEWPORT+++function _Browser_getViewport()+{+	return {+		scene: _Browser_getScene(),+		viewport: {+			x: _Browser_window.pageXOffset,+			y: _Browser_window.pageYOffset,+			width: _Browser_doc.documentElement.clientWidth,+			height: _Browser_doc.documentElement.clientHeight+		}+	};+}++function _Browser_getScene()+{+	var body = _Browser_doc.body;+	var elem = _Browser_doc.documentElement;+	return {+		width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth),+		height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight)+	};+}++var _Browser_setViewport = F2(function(x, y)+{+	return _Browser_withWindow(function()+	{+		_Browser_window.scroll(x, y);+		return _Utils_Tuple0;+	});+});++++// ELEMENT VIEWPORT+++function _Browser_getViewportOf(id)+{+	return _Browser_withNode(id, function(node)+	{+		return {+			scene: {+				width: node.scrollWidth,+				height: node.scrollHeight+			},+			viewport: {+				x: node.scrollLeft,+				y: node.scrollTop,+				width: node.clientWidth,+				height: node.clientHeight+			}+		};+	});+}+++var _Browser_setViewportOf = F3(function(id, x, y)+{+	return _Browser_withNode(id, function(node)+	{+		node.scrollLeft = x;+		node.scrollTop = y;+		return _Utils_Tuple0;+	});+});++++// ELEMENT+++function _Browser_getElement(id)+{+	return _Browser_withNode(id, function(node)+	{+		var rect = node.getBoundingClientRect();+		var x = _Browser_window.pageXOffset;+		var y = _Browser_window.pageYOffset;+		return {+			scene: _Browser_getScene(),+			viewport: {+				x: x,+				y: y,+				width: _Browser_doc.documentElement.clientWidth,+				height: _Browser_doc.documentElement.clientHeight+			},+			element: {+				x: x + rect.left,+				y: y + rect.top,+				width: rect.width,+				height: rect.height+			}+		};+	});+}++++// LOAD and RELOAD+++function _Browser_reload(skipCache)+{+	return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback)+	{+		_VirtualDom_doc.location.reload(skipCache);+	}));+}++function _Browser_load(url)+{+	return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback)+	{+		try+		{+			_Browser_window.location = url;+		}+		catch(err)+		{+			// Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here.+			// Other browsers reload the page, so let's be consistent about that.+			_VirtualDom_doc.location.reload(false);+		}+	}));+}++++function _Time_now(millisToPosix)+{+	return _Scheduler_binding(function(callback)+	{+		callback(_Scheduler_succeed(millisToPosix(Date.now())));+	});+}++var _Time_setInterval = F2(function(interval, task)+{+	return _Scheduler_binding(function(callback)+	{+		var id = setInterval(function() { _Scheduler_rawSpawn(task); }, interval);+		return function() { clearInterval(id); };+	});+});++function _Time_here()+{+	return _Scheduler_binding(function(callback)+	{+		callback(_Scheduler_succeed(+			A2($elm$time$Time$customZone, -(new Date().getTimezoneOffset()), _List_Nil)+		));+	});+}+++function _Time_getZoneName()+{+	return _Scheduler_binding(function(callback)+	{+		try+		{+			var name = $elm$time$Time$Name(Intl.DateTimeFormat().resolvedOptions().timeZone);+		}+		catch (e)+		{+			var name = $elm$time$Time$Offset(new Date().getTimezoneOffset());+		}+		callback(_Scheduler_succeed(name));+	});+}++++// SEND REQUEST++var _Http_toTask = F3(function(router, toTask, request)+{+	return _Scheduler_binding(function(callback)+	{+		function done(response) {+			callback(toTask(request.expect.a(response)));+		}++		var xhr = new XMLHttpRequest();+		xhr.addEventListener('error', function() { done($elm$http$Http$NetworkError_); });+		xhr.addEventListener('timeout', function() { done($elm$http$Http$Timeout_); });+		xhr.addEventListener('load', function() { done(_Http_toResponse(request.expect.b, xhr)); });+		$elm$core$Maybe$isJust(request.tracker) && _Http_track(router, xhr, request.tracker.a);++		try {+			xhr.open(request.method, request.url, true);+		} catch (e) {+			return done($elm$http$Http$BadUrl_(request.url));+		}++		_Http_configureRequest(xhr, request);++		request.body.a && xhr.setRequestHeader('Content-Type', request.body.a);+		xhr.send(request.body.b);++		return function() { xhr.c = true; xhr.abort(); };+	});+});+++// CONFIGURE++function _Http_configureRequest(xhr, request)+{+	for (var headers = request.headers; headers.b; headers = headers.b) // WHILE_CONS+	{+		xhr.setRequestHeader(headers.a.a, headers.a.b);+	}+	xhr.timeout = request.timeout.a || 0;+	xhr.responseType = request.expect.d;+	xhr.withCredentials = request.allowCookiesFromOtherDomains;+}+++// RESPONSES++function _Http_toResponse(toBody, xhr)+{+	return A2(+		200 <= xhr.status && xhr.status < 300 ? $elm$http$Http$GoodStatus_ : $elm$http$Http$BadStatus_,+		_Http_toMetadata(xhr),+		toBody(xhr.response)+	);+}+++// METADATA++function _Http_toMetadata(xhr)+{+	return {+		url: xhr.responseURL,+		statusCode: xhr.status,+		statusText: xhr.statusText,+		headers: _Http_parseHeaders(xhr.getAllResponseHeaders())+	};+}+++// HEADERS++function _Http_parseHeaders(rawHeaders)+{+	if (!rawHeaders)+	{+		return $elm$core$Dict$empty;+	}++	var headers = $elm$core$Dict$empty;+	var headerPairs = rawHeaders.split('\r\n');+	for (var i = headerPairs.length; i--; )+	{+		var headerPair = headerPairs[i];+		var index = headerPair.indexOf(': ');+		if (index > 0)+		{+			var key = headerPair.substring(0, index);+			var value = headerPair.substring(index + 2);++			headers = A3($elm$core$Dict$update, key, function(oldValue) {+				return $elm$core$Maybe$Just($elm$core$Maybe$isJust(oldValue)+					? value + ', ' + oldValue.a+					: value+				);+			}, headers);+		}+	}+	return headers;+}+++// EXPECT++var _Http_expect = F3(function(type, toBody, toValue)+{+	return {+		$: 0,+		d: type,+		b: toBody,+		a: toValue+	};+});++var _Http_mapExpect = F2(function(func, expect)+{+	return {+		$: 0,+		d: expect.d,+		b: expect.b,+		a: function(x) { return func(expect.a(x)); }+	};+});++function _Http_toDataView(arrayBuffer)+{+	return new DataView(arrayBuffer);+}+++// BODY and PARTS++var _Http_emptyBody = { $: 0 };+var _Http_pair = F2(function(a, b) { return { $: 0, a: a, b: b }; });++function _Http_toFormData(parts)+{+	for (var formData = new FormData(); parts.b; parts = parts.b) // WHILE_CONS+	{+		var part = parts.a;+		formData.append(part.a, part.b);+	}+	return formData;+}++var _Http_bytesToBlob = F2(function(mime, bytes)+{+	return new Blob([bytes], { type: mime });+});+++// PROGRESS++function _Http_track(router, xhr, tracker)+{+	// TODO check out lengthComputable on loadstart event++	xhr.upload.addEventListener('progress', function(event) {+		if (xhr.c) { return; }+		_Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Sending({+			sent: event.loaded,+			size: event.total+		}))));+	});+	xhr.addEventListener('progress', function(event) {+		if (xhr.c) { return; }+		_Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Receiving({+			received: event.loaded,+			size: event.lengthComputable ? $elm$core$Maybe$Just(event.total) : $elm$core$Maybe$Nothing+		}))));+	});+}+++var _Bitwise_and = F2(function(a, b)+{+	return a & b;+});++var _Bitwise_or = F2(function(a, b)+{+	return a | b;+});++var _Bitwise_xor = F2(function(a, b)+{+	return a ^ b;+});++function _Bitwise_complement(a)+{+	return ~a;+};++var _Bitwise_shiftLeftBy = F2(function(offset, a)+{+	return a << offset;+});++var _Bitwise_shiftRightBy = F2(function(offset, a)+{+	return a >> offset;+});++var _Bitwise_shiftRightZfBy = F2(function(offset, a)+{+	return a >>> offset;+});+++++// STRINGS+++var _Parser_isSubString = F5(function(smallString, offset, row, col, bigString)+{+	var smallLength = smallString.length;+	var isGood = offset + smallLength <= bigString.length;++	for (var i = 0; isGood && i < smallLength; )+	{+		var code = bigString.charCodeAt(offset);+		isGood =+			smallString[i++] === bigString[offset++]+			&& (+				code === 0x000A /* \n */+					? ( row++, col=1 )+					: ( col++, (code & 0xF800) === 0xD800 ? smallString[i++] === bigString[offset++] : 1 )+			)+	}++	return _Utils_Tuple3(isGood ? offset : -1, row, col);+});++++// CHARS+++var _Parser_isSubChar = F3(function(predicate, offset, string)+{+	return (+		string.length <= offset+			? -1+			:+		(string.charCodeAt(offset) & 0xF800) === 0xD800+			? (predicate(_Utils_chr(string.substr(offset, 2))) ? offset + 2 : -1)+			:+		(predicate(_Utils_chr(string[offset]))+			? ((string[offset] === '\n') ? -2 : (offset + 1))+			: -1+		)+	);+});+++var _Parser_isAsciiCode = F3(function(code, offset, string)+{+	return string.charCodeAt(offset) === code;+});++++// NUMBERS+++var _Parser_chompBase10 = F2(function(offset, string)+{+	for (; offset < string.length; offset++)+	{+		var code = string.charCodeAt(offset);+		if (code < 0x30 || 0x39 < code)+		{+			return offset;+		}+	}+	return offset;+});+++var _Parser_consumeBase = F3(function(base, offset, string)+{+	for (var total = 0; offset < string.length; offset++)+	{+		var digit = string.charCodeAt(offset) - 0x30;+		if (digit < 0 || base <= digit) break;+		total = base * total + digit;+	}+	return _Utils_Tuple2(offset, total);+});+++var _Parser_consumeBase16 = F2(function(offset, string)+{+	for (var total = 0; offset < string.length; offset++)+	{+		var code = string.charCodeAt(offset);+		if (0x30 <= code && code <= 0x39)+		{+			total = 16 * total + code - 0x30;+		}+		else if (0x41 <= code && code <= 0x46)+		{+			total = 16 * total + code - 55;+		}+		else if (0x61 <= code && code <= 0x66)+		{+			total = 16 * total + code - 87;+		}+		else+		{+			break;+		}+	}+	return _Utils_Tuple2(offset, total);+});++++// FIND STRING+++var _Parser_findSubString = F5(function(smallString, offset, row, col, bigString)+{+	var newOffset = bigString.indexOf(smallString, offset);+	var target = newOffset < 0 ? bigString.length : newOffset + smallString.length;++	while (offset < target)+	{+		var code = bigString.charCodeAt(offset++);+		code === 0x000A /* \n */+			? ( col=1, row++ )+			: ( col++, (code & 0xF800) === 0xD800 && offset++ )+	}++	return _Utils_Tuple3(newOffset, row, col);+});+var $elm$core$List$cons = _List_cons;+var $elm$core$Elm$JsArray$foldr = _JsArray_foldr;+var $elm$core$Array$foldr = F3(+	function (func, baseCase, _v0) {+		var tree = _v0.c;+		var tail = _v0.d;+		var helper = F2(+			function (node, acc) {+				if (node.$ === 'SubTree') {+					var subTree = node.a;+					return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree);+				} else {+					var values = node.a;+					return A3($elm$core$Elm$JsArray$foldr, func, acc, values);+				}+			});+		return A3(+			$elm$core$Elm$JsArray$foldr,+			helper,+			A3($elm$core$Elm$JsArray$foldr, func, baseCase, tail),+			tree);+	});+var $elm$core$Array$toList = function (array) {+	return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array);+};+var $elm$core$Dict$foldr = F3(+	function (func, acc, t) {+		foldr:+		while (true) {+			if (t.$ === 'RBEmpty_elm_builtin') {+				return acc;+			} else {+				var key = t.b;+				var value = t.c;+				var left = t.d;+				var right = t.e;+				var $temp$func = func,+					$temp$acc = A3(+					func,+					key,+					value,+					A3($elm$core$Dict$foldr, func, acc, right)),+					$temp$t = left;+				func = $temp$func;+				acc = $temp$acc;+				t = $temp$t;+				continue foldr;+			}+		}+	});+var $elm$core$Dict$toList = function (dict) {+	return A3(+		$elm$core$Dict$foldr,+		F3(+			function (key, value, list) {+				return A2(+					$elm$core$List$cons,+					_Utils_Tuple2(key, value),+					list);+			}),+		_List_Nil,+		dict);+};+var $elm$core$Dict$keys = function (dict) {+	return A3(+		$elm$core$Dict$foldr,+		F3(+			function (key, value, keyList) {+				return A2($elm$core$List$cons, key, keyList);+			}),+		_List_Nil,+		dict);+};+var $elm$core$Set$toList = function (_v0) {+	var dict = _v0.a;+	return $elm$core$Dict$keys(dict);+};+var $elm$core$Basics$EQ = {$: 'EQ'};+var $elm$core$Basics$GT = {$: 'GT'};+var $elm$core$Basics$LT = {$: 'LT'};+var $author$project$Main$LoadFlags = {$: 'LoadFlags'};+var $author$project$Main$Loading = {$: 'Loading'};+var $author$project$Main$NoOp = {$: 'NoOp'};+var $elm$core$Result$Err = function (a) {+	return {$: 'Err', a: a};+};+var $elm$json$Json$Decode$Failure = F2(+	function (a, b) {+		return {$: 'Failure', a: a, b: b};+	});+var $elm$json$Json$Decode$Field = F2(+	function (a, b) {+		return {$: 'Field', a: a, b: b};+	});+var $elm$json$Json$Decode$Index = F2(+	function (a, b) {+		return {$: 'Index', a: a, b: b};+	});+var $elm$core$Result$Ok = function (a) {+	return {$: 'Ok', a: a};+};+var $elm$json$Json$Decode$OneOf = function (a) {+	return {$: 'OneOf', a: a};+};+var $elm$core$Basics$False = {$: 'False'};+var $elm$core$Basics$add = _Basics_add;+var $elm$core$Maybe$Just = function (a) {+	return {$: 'Just', a: a};+};+var $elm$core$Maybe$Nothing = {$: 'Nothing'};+var $elm$core$String$all = _String_all;+var $elm$core$Basics$and = _Basics_and;+var $elm$core$Basics$append = _Utils_append;+var $elm$json$Json$Encode$encode = _Json_encode;+var $elm$core$String$fromInt = _String_fromNumber;+var $elm$core$String$join = F2(+	function (sep, chunks) {+		return A2(+			_String_join,+			sep,+			_List_toArray(chunks));+	});+var $elm$core$String$split = F2(+	function (sep, string) {+		return _List_fromArray(+			A2(_String_split, sep, string));+	});+var $elm$json$Json$Decode$indent = function (str) {+	return A2(+		$elm$core$String$join,+		'\n    ',+		A2($elm$core$String$split, '\n', str));+};+var $elm$core$List$foldl = F3(+	function (func, acc, list) {+		foldl:+		while (true) {+			if (!list.b) {+				return acc;+			} else {+				var x = list.a;+				var xs = list.b;+				var $temp$func = func,+					$temp$acc = A2(func, x, acc),+					$temp$list = xs;+				func = $temp$func;+				acc = $temp$acc;+				list = $temp$list;+				continue foldl;+			}+		}+	});+var $elm$core$List$length = function (xs) {+	return A3(+		$elm$core$List$foldl,+		F2(+			function (_v0, i) {+				return i + 1;+			}),+		0,+		xs);+};+var $elm$core$List$map2 = _List_map2;+var $elm$core$Basics$le = _Utils_le;+var $elm$core$Basics$sub = _Basics_sub;+var $elm$core$List$rangeHelp = F3(+	function (lo, hi, list) {+		rangeHelp:+		while (true) {+			if (_Utils_cmp(lo, hi) < 1) {+				var $temp$lo = lo,+					$temp$hi = hi - 1,+					$temp$list = A2($elm$core$List$cons, hi, list);+				lo = $temp$lo;+				hi = $temp$hi;+				list = $temp$list;+				continue rangeHelp;+			} else {+				return list;+			}+		}+	});+var $elm$core$List$range = F2(+	function (lo, hi) {+		return A3($elm$core$List$rangeHelp, lo, hi, _List_Nil);+	});+var $elm$core$List$indexedMap = F2(+	function (f, xs) {+		return A3(+			$elm$core$List$map2,+			f,+			A2(+				$elm$core$List$range,+				0,+				$elm$core$List$length(xs) - 1),+			xs);+	});+var $elm$core$Char$toCode = _Char_toCode;+var $elm$core$Char$isLower = function (_char) {+	var code = $elm$core$Char$toCode(_char);+	return (97 <= code) && (code <= 122);+};+var $elm$core$Char$isUpper = function (_char) {+	var code = $elm$core$Char$toCode(_char);+	return (code <= 90) && (65 <= code);+};+var $elm$core$Basics$or = _Basics_or;+var $elm$core$Char$isAlpha = function (_char) {+	return $elm$core$Char$isLower(_char) || $elm$core$Char$isUpper(_char);+};+var $elm$core$Char$isDigit = function (_char) {+	var code = $elm$core$Char$toCode(_char);+	return (code <= 57) && (48 <= code);+};+var $elm$core$Char$isAlphaNum = function (_char) {+	return $elm$core$Char$isLower(_char) || ($elm$core$Char$isUpper(_char) || $elm$core$Char$isDigit(_char));+};+var $elm$core$List$reverse = function (list) {+	return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, list);+};+var $elm$core$String$uncons = _String_uncons;+var $elm$json$Json$Decode$errorOneOf = F2(+	function (i, error) {+		return '\n\n(' + ($elm$core$String$fromInt(i + 1) + (') ' + $elm$json$Json$Decode$indent(+			$elm$json$Json$Decode$errorToString(error))));+	});+var $elm$json$Json$Decode$errorToString = function (error) {+	return A2($elm$json$Json$Decode$errorToStringHelp, error, _List_Nil);+};+var $elm$json$Json$Decode$errorToStringHelp = F2(+	function (error, context) {+		errorToStringHelp:+		while (true) {+			switch (error.$) {+				case 'Field':+					var f = error.a;+					var err = error.b;+					var isSimple = function () {+						var _v1 = $elm$core$String$uncons(f);+						if (_v1.$ === 'Nothing') {+							return false;+						} else {+							var _v2 = _v1.a;+							var _char = _v2.a;+							var rest = _v2.b;+							return $elm$core$Char$isAlpha(_char) && A2($elm$core$String$all, $elm$core$Char$isAlphaNum, rest);+						}+					}();+					var fieldName = isSimple ? ('.' + f) : ('[\'' + (f + '\']'));+					var $temp$error = err,+						$temp$context = A2($elm$core$List$cons, fieldName, context);+					error = $temp$error;+					context = $temp$context;+					continue errorToStringHelp;+				case 'Index':+					var i = error.a;+					var err = error.b;+					var indexName = '[' + ($elm$core$String$fromInt(i) + ']');+					var $temp$error = err,+						$temp$context = A2($elm$core$List$cons, indexName, context);+					error = $temp$error;+					context = $temp$context;+					continue errorToStringHelp;+				case 'OneOf':+					var errors = error.a;+					if (!errors.b) {+						return 'Ran into a Json.Decode.oneOf with no possibilities' + function () {+							if (!context.b) {+								return '!';+							} else {+								return ' at json' + A2(+									$elm$core$String$join,+									'',+									$elm$core$List$reverse(context));+							}+						}();+					} else {+						if (!errors.b.b) {+							var err = errors.a;+							var $temp$error = err,+								$temp$context = context;+							error = $temp$error;+							context = $temp$context;+							continue errorToStringHelp;+						} else {+							var starter = function () {+								if (!context.b) {+									return 'Json.Decode.oneOf';+								} else {+									return 'The Json.Decode.oneOf at json' + A2(+										$elm$core$String$join,+										'',+										$elm$core$List$reverse(context));+								}+							}();+							var introduction = starter + (' failed in the following ' + ($elm$core$String$fromInt(+								$elm$core$List$length(errors)) + ' ways:'));+							return A2(+								$elm$core$String$join,+								'\n\n',+								A2(+									$elm$core$List$cons,+									introduction,+									A2($elm$core$List$indexedMap, $elm$json$Json$Decode$errorOneOf, errors)));+						}+					}+				default:+					var msg = error.a;+					var json = error.b;+					var introduction = function () {+						if (!context.b) {+							return 'Problem with the given value:\n\n';+						} else {+							return 'Problem with the value at json' + (A2(+								$elm$core$String$join,+								'',+								$elm$core$List$reverse(context)) + ':\n\n    ');+						}+					}();+					return introduction + ($elm$json$Json$Decode$indent(+						A2($elm$json$Json$Encode$encode, 4, json)) + ('\n\n' + msg));+			}+		}+	});+var $elm$core$Array$branchFactor = 32;+var $elm$core$Array$Array_elm_builtin = F4(+	function (a, b, c, d) {+		return {$: 'Array_elm_builtin', a: a, b: b, c: c, d: d};+	});+var $elm$core$Elm$JsArray$empty = _JsArray_empty;+var $elm$core$Basics$ceiling = _Basics_ceiling;+var $elm$core$Basics$fdiv = _Basics_fdiv;+var $elm$core$Basics$logBase = F2(+	function (base, number) {+		return _Basics_log(number) / _Basics_log(base);+	});+var $elm$core$Basics$toFloat = _Basics_toFloat;+var $elm$core$Array$shiftStep = $elm$core$Basics$ceiling(+	A2($elm$core$Basics$logBase, 2, $elm$core$Array$branchFactor));+var $elm$core$Array$empty = A4($elm$core$Array$Array_elm_builtin, 0, $elm$core$Array$shiftStep, $elm$core$Elm$JsArray$empty, $elm$core$Elm$JsArray$empty);+var $elm$core$Elm$JsArray$initialize = _JsArray_initialize;+var $elm$core$Array$Leaf = function (a) {+	return {$: 'Leaf', a: a};+};+var $elm$core$Basics$apL = F2(+	function (f, x) {+		return f(x);+	});+var $elm$core$Basics$apR = F2(+	function (x, f) {+		return f(x);+	});+var $elm$core$Basics$eq = _Utils_equal;+var $elm$core$Basics$floor = _Basics_floor;+var $elm$core$Elm$JsArray$length = _JsArray_length;+var $elm$core$Basics$gt = _Utils_gt;+var $elm$core$Basics$max = F2(+	function (x, y) {+		return (_Utils_cmp(x, y) > 0) ? x : y;+	});+var $elm$core$Basics$mul = _Basics_mul;+var $elm$core$Array$SubTree = function (a) {+	return {$: 'SubTree', a: a};+};+var $elm$core$Elm$JsArray$initializeFromList = _JsArray_initializeFromList;+var $elm$core$Array$compressNodes = F2(+	function (nodes, acc) {+		compressNodes:+		while (true) {+			var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodes);+			var node = _v0.a;+			var remainingNodes = _v0.b;+			var newAcc = A2(+				$elm$core$List$cons,+				$elm$core$Array$SubTree(node),+				acc);+			if (!remainingNodes.b) {+				return $elm$core$List$reverse(newAcc);+			} else {+				var $temp$nodes = remainingNodes,+					$temp$acc = newAcc;+				nodes = $temp$nodes;+				acc = $temp$acc;+				continue compressNodes;+			}+		}+	});+var $elm$core$Tuple$first = function (_v0) {+	var x = _v0.a;+	return x;+};+var $elm$core$Array$treeFromBuilder = F2(+	function (nodeList, nodeListSize) {+		treeFromBuilder:+		while (true) {+			var newNodeSize = $elm$core$Basics$ceiling(nodeListSize / $elm$core$Array$branchFactor);+			if (newNodeSize === 1) {+				return A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodeList).a;+			} else {+				var $temp$nodeList = A2($elm$core$Array$compressNodes, nodeList, _List_Nil),+					$temp$nodeListSize = newNodeSize;+				nodeList = $temp$nodeList;+				nodeListSize = $temp$nodeListSize;+				continue treeFromBuilder;+			}+		}+	});+var $elm$core$Array$builderToArray = F2(+	function (reverseNodeList, builder) {+		if (!builder.nodeListSize) {+			return A4(+				$elm$core$Array$Array_elm_builtin,+				$elm$core$Elm$JsArray$length(builder.tail),+				$elm$core$Array$shiftStep,+				$elm$core$Elm$JsArray$empty,+				builder.tail);+		} else {+			var treeLen = builder.nodeListSize * $elm$core$Array$branchFactor;+			var depth = $elm$core$Basics$floor(+				A2($elm$core$Basics$logBase, $elm$core$Array$branchFactor, treeLen - 1));+			var correctNodeList = reverseNodeList ? $elm$core$List$reverse(builder.nodeList) : builder.nodeList;+			var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.nodeListSize);+			return A4(+				$elm$core$Array$Array_elm_builtin,+				$elm$core$Elm$JsArray$length(builder.tail) + treeLen,+				A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep),+				tree,+				builder.tail);+		}+	});+var $elm$core$Basics$idiv = _Basics_idiv;+var $elm$core$Basics$lt = _Utils_lt;+var $elm$core$Array$initializeHelp = F5(+	function (fn, fromIndex, len, nodeList, tail) {+		initializeHelp:+		while (true) {+			if (fromIndex < 0) {+				return A2(+					$elm$core$Array$builderToArray,+					false,+					{nodeList: nodeList, nodeListSize: (len / $elm$core$Array$branchFactor) | 0, tail: tail});+			} else {+				var leaf = $elm$core$Array$Leaf(+					A3($elm$core$Elm$JsArray$initialize, $elm$core$Array$branchFactor, fromIndex, fn));+				var $temp$fn = fn,+					$temp$fromIndex = fromIndex - $elm$core$Array$branchFactor,+					$temp$len = len,+					$temp$nodeList = A2($elm$core$List$cons, leaf, nodeList),+					$temp$tail = tail;+				fn = $temp$fn;+				fromIndex = $temp$fromIndex;+				len = $temp$len;+				nodeList = $temp$nodeList;+				tail = $temp$tail;+				continue initializeHelp;+			}+		}+	});+var $elm$core$Basics$remainderBy = _Basics_remainderBy;+var $elm$core$Array$initialize = F2(+	function (len, fn) {+		if (len <= 0) {+			return $elm$core$Array$empty;+		} else {+			var tailLen = len % $elm$core$Array$branchFactor;+			var tail = A3($elm$core$Elm$JsArray$initialize, tailLen, len - tailLen, fn);+			var initialFromIndex = (len - tailLen) - $elm$core$Array$branchFactor;+			return A5($elm$core$Array$initializeHelp, fn, initialFromIndex, len, _List_Nil, tail);+		}+	});+var $elm$core$Basics$True = {$: 'True'};+var $elm$core$Result$isOk = function (result) {+	if (result.$ === 'Ok') {+		return true;+	} else {+		return false;+	}+};+var $elm$json$Json$Decode$map = _Json_map1;+var $elm$json$Json$Decode$map2 = _Json_map2;+var $elm$json$Json$Decode$succeed = _Json_succeed;+var $elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) {+	switch (handler.$) {+		case 'Normal':+			return 0;+		case 'MayStopPropagation':+			return 1;+		case 'MayPreventDefault':+			return 2;+		default:+			return 3;+	}+};+var $elm$browser$Browser$External = function (a) {+	return {$: 'External', a: a};+};+var $elm$browser$Browser$Internal = function (a) {+	return {$: 'Internal', a: a};+};+var $elm$core$Basics$identity = function (x) {+	return x;+};+var $elm$browser$Browser$Dom$NotFound = function (a) {+	return {$: 'NotFound', a: a};+};+var $elm$url$Url$Http = {$: 'Http'};+var $elm$url$Url$Https = {$: 'Https'};+var $elm$url$Url$Url = F6(+	function (protocol, host, port_, path, query, fragment) {+		return {fragment: fragment, host: host, path: path, port_: port_, protocol: protocol, query: query};+	});+var $elm$core$String$contains = _String_contains;+var $elm$core$String$length = _String_length;+var $elm$core$String$slice = _String_slice;+var $elm$core$String$dropLeft = F2(+	function (n, string) {+		return (n < 1) ? string : A3(+			$elm$core$String$slice,+			n,+			$elm$core$String$length(string),+			string);+	});+var $elm$core$String$indexes = _String_indexes;+var $elm$core$String$isEmpty = function (string) {+	return string === '';+};+var $elm$core$String$left = F2(+	function (n, string) {+		return (n < 1) ? '' : A3($elm$core$String$slice, 0, n, string);+	});+var $elm$core$String$toInt = _String_toInt;+var $elm$url$Url$chompBeforePath = F5(+	function (protocol, path, params, frag, str) {+		if ($elm$core$String$isEmpty(str) || A2($elm$core$String$contains, '@', str)) {+			return $elm$core$Maybe$Nothing;+		} else {+			var _v0 = A2($elm$core$String$indexes, ':', str);+			if (!_v0.b) {+				return $elm$core$Maybe$Just(+					A6($elm$url$Url$Url, protocol, str, $elm$core$Maybe$Nothing, path, params, frag));+			} else {+				if (!_v0.b.b) {+					var i = _v0.a;+					var _v1 = $elm$core$String$toInt(+						A2($elm$core$String$dropLeft, i + 1, str));+					if (_v1.$ === 'Nothing') {+						return $elm$core$Maybe$Nothing;+					} else {+						var port_ = _v1;+						return $elm$core$Maybe$Just(+							A6(+								$elm$url$Url$Url,+								protocol,+								A2($elm$core$String$left, i, str),+								port_,+								path,+								params,+								frag));+					}+				} else {+					return $elm$core$Maybe$Nothing;+				}+			}+		}+	});+var $elm$url$Url$chompBeforeQuery = F4(+	function (protocol, params, frag, str) {+		if ($elm$core$String$isEmpty(str)) {+			return $elm$core$Maybe$Nothing;+		} else {+			var _v0 = A2($elm$core$String$indexes, '/', str);+			if (!_v0.b) {+				return A5($elm$url$Url$chompBeforePath, protocol, '/', params, frag, str);+			} else {+				var i = _v0.a;+				return A5(+					$elm$url$Url$chompBeforePath,+					protocol,+					A2($elm$core$String$dropLeft, i, str),+					params,+					frag,+					A2($elm$core$String$left, i, str));+			}+		}+	});+var $elm$url$Url$chompBeforeFragment = F3(+	function (protocol, frag, str) {+		if ($elm$core$String$isEmpty(str)) {+			return $elm$core$Maybe$Nothing;+		} else {+			var _v0 = A2($elm$core$String$indexes, '?', str);+			if (!_v0.b) {+				return A4($elm$url$Url$chompBeforeQuery, protocol, $elm$core$Maybe$Nothing, frag, str);+			} else {+				var i = _v0.a;+				return A4(+					$elm$url$Url$chompBeforeQuery,+					protocol,+					$elm$core$Maybe$Just(+						A2($elm$core$String$dropLeft, i + 1, str)),+					frag,+					A2($elm$core$String$left, i, str));+			}+		}+	});+var $elm$url$Url$chompAfterProtocol = F2(+	function (protocol, str) {+		if ($elm$core$String$isEmpty(str)) {+			return $elm$core$Maybe$Nothing;+		} else {+			var _v0 = A2($elm$core$String$indexes, '#', str);+			if (!_v0.b) {+				return A3($elm$url$Url$chompBeforeFragment, protocol, $elm$core$Maybe$Nothing, str);+			} else {+				var i = _v0.a;+				return A3(+					$elm$url$Url$chompBeforeFragment,+					protocol,+					$elm$core$Maybe$Just(+						A2($elm$core$String$dropLeft, i + 1, str)),+					A2($elm$core$String$left, i, str));+			}+		}+	});+var $elm$core$String$startsWith = _String_startsWith;+var $elm$url$Url$fromString = function (str) {+	return A2($elm$core$String$startsWith, 'http://', str) ? A2(+		$elm$url$Url$chompAfterProtocol,+		$elm$url$Url$Http,+		A2($elm$core$String$dropLeft, 7, str)) : (A2($elm$core$String$startsWith, 'https://', str) ? A2(+		$elm$url$Url$chompAfterProtocol,+		$elm$url$Url$Https,+		A2($elm$core$String$dropLeft, 8, str)) : $elm$core$Maybe$Nothing);+};+var $elm$core$Basics$never = function (_v0) {+	never:+	while (true) {+		var nvr = _v0.a;+		var $temp$_v0 = nvr;+		_v0 = $temp$_v0;+		continue never;+	}+};+var $elm$core$Task$Perform = function (a) {+	return {$: 'Perform', a: a};+};+var $elm$core$Task$succeed = _Scheduler_succeed;+var $elm$core$Task$init = $elm$core$Task$succeed(_Utils_Tuple0);+var $elm$core$List$foldrHelper = F4(+	function (fn, acc, ctr, ls) {+		if (!ls.b) {+			return acc;+		} else {+			var a = ls.a;+			var r1 = ls.b;+			if (!r1.b) {+				return A2(fn, a, acc);+			} else {+				var b = r1.a;+				var r2 = r1.b;+				if (!r2.b) {+					return A2(+						fn,+						a,+						A2(fn, b, acc));+				} else {+					var c = r2.a;+					var r3 = r2.b;+					if (!r3.b) {+						return A2(+							fn,+							a,+							A2(+								fn,+								b,+								A2(fn, c, acc)));+					} else {+						var d = r3.a;+						var r4 = r3.b;+						var res = (ctr > 500) ? A3(+							$elm$core$List$foldl,+							fn,+							acc,+							$elm$core$List$reverse(r4)) : A4($elm$core$List$foldrHelper, fn, acc, ctr + 1, r4);+						return A2(+							fn,+							a,+							A2(+								fn,+								b,+								A2(+									fn,+									c,+									A2(fn, d, res))));+					}+				}+			}+		}+	});+var $elm$core$List$foldr = F3(+	function (fn, acc, ls) {+		return A4($elm$core$List$foldrHelper, fn, acc, 0, ls);+	});+var $elm$core$List$map = F2(+	function (f, xs) {+		return A3(+			$elm$core$List$foldr,+			F2(+				function (x, acc) {+					return A2(+						$elm$core$List$cons,+						f(x),+						acc);+				}),+			_List_Nil,+			xs);+	});+var $elm$core$Task$andThen = _Scheduler_andThen;+var $elm$core$Task$map = F2(+	function (func, taskA) {+		return A2(+			$elm$core$Task$andThen,+			function (a) {+				return $elm$core$Task$succeed(+					func(a));+			},+			taskA);+	});+var $elm$core$Task$map2 = F3(+	function (func, taskA, taskB) {+		return A2(+			$elm$core$Task$andThen,+			function (a) {+				return A2(+					$elm$core$Task$andThen,+					function (b) {+						return $elm$core$Task$succeed(+							A2(func, a, b));+					},+					taskB);+			},+			taskA);+	});+var $elm$core$Task$sequence = function (tasks) {+	return A3(+		$elm$core$List$foldr,+		$elm$core$Task$map2($elm$core$List$cons),+		$elm$core$Task$succeed(_List_Nil),+		tasks);+};+var $elm$core$Platform$sendToApp = _Platform_sendToApp;+var $elm$core$Task$spawnCmd = F2(+	function (router, _v0) {+		var task = _v0.a;+		return _Scheduler_spawn(+			A2(+				$elm$core$Task$andThen,+				$elm$core$Platform$sendToApp(router),+				task));+	});+var $elm$core$Task$onEffects = F3(+	function (router, commands, state) {+		return A2(+			$elm$core$Task$map,+			function (_v0) {+				return _Utils_Tuple0;+			},+			$elm$core$Task$sequence(+				A2(+					$elm$core$List$map,+					$elm$core$Task$spawnCmd(router),+					commands)));+	});+var $elm$core$Task$onSelfMsg = F3(+	function (_v0, _v1, _v2) {+		return $elm$core$Task$succeed(_Utils_Tuple0);+	});+var $elm$core$Task$cmdMap = F2(+	function (tagger, _v0) {+		var task = _v0.a;+		return $elm$core$Task$Perform(+			A2($elm$core$Task$map, tagger, task));+	});+_Platform_effectManagers['Task'] = _Platform_createManager($elm$core$Task$init, $elm$core$Task$onEffects, $elm$core$Task$onSelfMsg, $elm$core$Task$cmdMap);+var $elm$core$Task$command = _Platform_leaf('Task');+var $elm$core$Task$perform = F2(+	function (toMessage, task) {+		return $elm$core$Task$command(+			$elm$core$Task$Perform(+				A2($elm$core$Task$map, toMessage, task)));+	});+var $elm$browser$Browser$application = _Browser_application;+var $elm$time$Time$Every = F2(+	function (a, b) {+		return {$: 'Every', a: a, b: b};+	});+var $elm$time$Time$State = F2(+	function (taggers, processes) {+		return {processes: processes, taggers: taggers};+	});+var $elm$core$Dict$RBEmpty_elm_builtin = {$: 'RBEmpty_elm_builtin'};+var $elm$core$Dict$empty = $elm$core$Dict$RBEmpty_elm_builtin;+var $elm$time$Time$init = $elm$core$Task$succeed(+	A2($elm$time$Time$State, $elm$core$Dict$empty, $elm$core$Dict$empty));+var $elm$core$Basics$compare = _Utils_compare;+var $elm$core$Dict$get = F2(+	function (targetKey, dict) {+		get:+		while (true) {+			if (dict.$ === 'RBEmpty_elm_builtin') {+				return $elm$core$Maybe$Nothing;+			} else {+				var key = dict.b;+				var value = dict.c;+				var left = dict.d;+				var right = dict.e;+				var _v1 = A2($elm$core$Basics$compare, targetKey, key);+				switch (_v1.$) {+					case 'LT':+						var $temp$targetKey = targetKey,+							$temp$dict = left;+						targetKey = $temp$targetKey;+						dict = $temp$dict;+						continue get;+					case 'EQ':+						return $elm$core$Maybe$Just(value);+					default:+						var $temp$targetKey = targetKey,+							$temp$dict = right;+						targetKey = $temp$targetKey;+						dict = $temp$dict;+						continue get;+				}+			}+		}+	});+var $elm$core$Dict$Black = {$: 'Black'};+var $elm$core$Dict$RBNode_elm_builtin = F5(+	function (a, b, c, d, e) {+		return {$: 'RBNode_elm_builtin', a: a, b: b, c: c, d: d, e: e};+	});+var $elm$core$Dict$Red = {$: 'Red'};+var $elm$core$Dict$balance = F5(+	function (color, key, value, left, right) {+		if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Red')) {+			var _v1 = right.a;+			var rK = right.b;+			var rV = right.c;+			var rLeft = right.d;+			var rRight = right.e;+			if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) {+				var _v3 = left.a;+				var lK = left.b;+				var lV = left.c;+				var lLeft = left.d;+				var lRight = left.e;+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Red,+					key,+					value,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, lK, lV, lLeft, lRight),+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rLeft, rRight));+			} else {+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					color,+					rK,+					rV,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, left, rLeft),+					rRight);+			}+		} else {+			if ((((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) && (left.d.$ === 'RBNode_elm_builtin')) && (left.d.a.$ === 'Red')) {+				var _v5 = left.a;+				var lK = left.b;+				var lV = left.c;+				var _v6 = left.d;+				var _v7 = _v6.a;+				var llK = _v6.b;+				var llV = _v6.c;+				var llLeft = _v6.d;+				var llRight = _v6.e;+				var lRight = left.e;+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Red,+					lK,+					lV,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight),+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, key, value, lRight, right));+			} else {+				return A5($elm$core$Dict$RBNode_elm_builtin, color, key, value, left, right);+			}+		}+	});+var $elm$core$Dict$insertHelp = F3(+	function (key, value, dict) {+		if (dict.$ === 'RBEmpty_elm_builtin') {+			return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, $elm$core$Dict$RBEmpty_elm_builtin, $elm$core$Dict$RBEmpty_elm_builtin);+		} else {+			var nColor = dict.a;+			var nKey = dict.b;+			var nValue = dict.c;+			var nLeft = dict.d;+			var nRight = dict.e;+			var _v1 = A2($elm$core$Basics$compare, key, nKey);+			switch (_v1.$) {+				case 'LT':+					return A5(+						$elm$core$Dict$balance,+						nColor,+						nKey,+						nValue,+						A3($elm$core$Dict$insertHelp, key, value, nLeft),+						nRight);+				case 'EQ':+					return A5($elm$core$Dict$RBNode_elm_builtin, nColor, nKey, value, nLeft, nRight);+				default:+					return A5(+						$elm$core$Dict$balance,+						nColor,+						nKey,+						nValue,+						nLeft,+						A3($elm$core$Dict$insertHelp, key, value, nRight));+			}+		}+	});+var $elm$core$Dict$insert = F3(+	function (key, value, dict) {+		var _v0 = A3($elm$core$Dict$insertHelp, key, value, dict);+		if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) {+			var _v1 = _v0.a;+			var k = _v0.b;+			var v = _v0.c;+			var l = _v0.d;+			var r = _v0.e;+			return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r);+		} else {+			var x = _v0;+			return x;+		}+	});+var $elm$time$Time$addMySub = F2(+	function (_v0, state) {+		var interval = _v0.a;+		var tagger = _v0.b;+		var _v1 = A2($elm$core$Dict$get, interval, state);+		if (_v1.$ === 'Nothing') {+			return A3(+				$elm$core$Dict$insert,+				interval,+				_List_fromArray(+					[tagger]),+				state);+		} else {+			var taggers = _v1.a;+			return A3(+				$elm$core$Dict$insert,+				interval,+				A2($elm$core$List$cons, tagger, taggers),+				state);+		}+	});+var $elm$core$Process$kill = _Scheduler_kill;+var $elm$core$Dict$foldl = F3(+	function (func, acc, dict) {+		foldl:+		while (true) {+			if (dict.$ === 'RBEmpty_elm_builtin') {+				return acc;+			} else {+				var key = dict.b;+				var value = dict.c;+				var left = dict.d;+				var right = dict.e;+				var $temp$func = func,+					$temp$acc = A3(+					func,+					key,+					value,+					A3($elm$core$Dict$foldl, func, acc, left)),+					$temp$dict = right;+				func = $temp$func;+				acc = $temp$acc;+				dict = $temp$dict;+				continue foldl;+			}+		}+	});+var $elm$core$Dict$merge = F6(+	function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) {+		var stepState = F3(+			function (rKey, rValue, _v0) {+				stepState:+				while (true) {+					var list = _v0.a;+					var result = _v0.b;+					if (!list.b) {+						return _Utils_Tuple2(+							list,+							A3(rightStep, rKey, rValue, result));+					} else {+						var _v2 = list.a;+						var lKey = _v2.a;+						var lValue = _v2.b;+						var rest = list.b;+						if (_Utils_cmp(lKey, rKey) < 0) {+							var $temp$rKey = rKey,+								$temp$rValue = rValue,+								$temp$_v0 = _Utils_Tuple2(+								rest,+								A3(leftStep, lKey, lValue, result));+							rKey = $temp$rKey;+							rValue = $temp$rValue;+							_v0 = $temp$_v0;+							continue stepState;+						} else {+							if (_Utils_cmp(lKey, rKey) > 0) {+								return _Utils_Tuple2(+									list,+									A3(rightStep, rKey, rValue, result));+							} else {+								return _Utils_Tuple2(+									rest,+									A4(bothStep, lKey, lValue, rValue, result));+							}+						}+					}+				}+			});+		var _v3 = A3(+			$elm$core$Dict$foldl,+			stepState,+			_Utils_Tuple2(+				$elm$core$Dict$toList(leftDict),+				initialResult),+			rightDict);+		var leftovers = _v3.a;+		var intermediateResult = _v3.b;+		return A3(+			$elm$core$List$foldl,+			F2(+				function (_v4, result) {+					var k = _v4.a;+					var v = _v4.b;+					return A3(leftStep, k, v, result);+				}),+			intermediateResult,+			leftovers);+	});+var $elm$core$Platform$sendToSelf = _Platform_sendToSelf;+var $elm$time$Time$Name = function (a) {+	return {$: 'Name', a: a};+};+var $elm$time$Time$Offset = function (a) {+	return {$: 'Offset', a: a};+};+var $elm$time$Time$Zone = F2(+	function (a, b) {+		return {$: 'Zone', a: a, b: b};+	});+var $elm$time$Time$customZone = $elm$time$Time$Zone;+var $elm$time$Time$setInterval = _Time_setInterval;+var $elm$core$Process$spawn = _Scheduler_spawn;+var $elm$time$Time$spawnHelp = F3(+	function (router, intervals, processes) {+		if (!intervals.b) {+			return $elm$core$Task$succeed(processes);+		} else {+			var interval = intervals.a;+			var rest = intervals.b;+			var spawnTimer = $elm$core$Process$spawn(+				A2(+					$elm$time$Time$setInterval,+					interval,+					A2($elm$core$Platform$sendToSelf, router, interval)));+			var spawnRest = function (id) {+				return A3(+					$elm$time$Time$spawnHelp,+					router,+					rest,+					A3($elm$core$Dict$insert, interval, id, processes));+			};+			return A2($elm$core$Task$andThen, spawnRest, spawnTimer);+		}+	});+var $elm$time$Time$onEffects = F3(+	function (router, subs, _v0) {+		var processes = _v0.processes;+		var rightStep = F3(+			function (_v6, id, _v7) {+				var spawns = _v7.a;+				var existing = _v7.b;+				var kills = _v7.c;+				return _Utils_Tuple3(+					spawns,+					existing,+					A2(+						$elm$core$Task$andThen,+						function (_v5) {+							return kills;+						},+						$elm$core$Process$kill(id)));+			});+		var newTaggers = A3($elm$core$List$foldl, $elm$time$Time$addMySub, $elm$core$Dict$empty, subs);+		var leftStep = F3(+			function (interval, taggers, _v4) {+				var spawns = _v4.a;+				var existing = _v4.b;+				var kills = _v4.c;+				return _Utils_Tuple3(+					A2($elm$core$List$cons, interval, spawns),+					existing,+					kills);+			});+		var bothStep = F4(+			function (interval, taggers, id, _v3) {+				var spawns = _v3.a;+				var existing = _v3.b;+				var kills = _v3.c;+				return _Utils_Tuple3(+					spawns,+					A3($elm$core$Dict$insert, interval, id, existing),+					kills);+			});+		var _v1 = A6(+			$elm$core$Dict$merge,+			leftStep,+			bothStep,+			rightStep,+			newTaggers,+			processes,+			_Utils_Tuple3(+				_List_Nil,+				$elm$core$Dict$empty,+				$elm$core$Task$succeed(_Utils_Tuple0)));+		var spawnList = _v1.a;+		var existingDict = _v1.b;+		var killTask = _v1.c;+		return A2(+			$elm$core$Task$andThen,+			function (newProcesses) {+				return $elm$core$Task$succeed(+					A2($elm$time$Time$State, newTaggers, newProcesses));+			},+			A2(+				$elm$core$Task$andThen,+				function (_v2) {+					return A3($elm$time$Time$spawnHelp, router, spawnList, existingDict);+				},+				killTask));+	});+var $elm$time$Time$Posix = function (a) {+	return {$: 'Posix', a: a};+};+var $elm$time$Time$millisToPosix = $elm$time$Time$Posix;+var $elm$time$Time$now = _Time_now($elm$time$Time$millisToPosix);+var $elm$time$Time$onSelfMsg = F3(+	function (router, interval, state) {+		var _v0 = A2($elm$core$Dict$get, interval, state.taggers);+		if (_v0.$ === 'Nothing') {+			return $elm$core$Task$succeed(state);+		} else {+			var taggers = _v0.a;+			var tellTaggers = function (time) {+				return $elm$core$Task$sequence(+					A2(+						$elm$core$List$map,+						function (tagger) {+							return A2(+								$elm$core$Platform$sendToApp,+								router,+								tagger(time));+						},+						taggers));+			};+			return A2(+				$elm$core$Task$andThen,+				function (_v1) {+					return $elm$core$Task$succeed(state);+				},+				A2($elm$core$Task$andThen, tellTaggers, $elm$time$Time$now));+		}+	});+var $elm$core$Basics$composeL = F3(+	function (g, f, x) {+		return g(+			f(x));+	});+var $elm$time$Time$subMap = F2(+	function (f, _v0) {+		var interval = _v0.a;+		var tagger = _v0.b;+		return A2(+			$elm$time$Time$Every,+			interval,+			A2($elm$core$Basics$composeL, f, tagger));+	});+_Platform_effectManagers['Time'] = _Platform_createManager($elm$time$Time$init, $elm$time$Time$onEffects, $elm$time$Time$onSelfMsg, 0, $elm$time$Time$subMap);+var $elm$time$Time$subscription = _Platform_leaf('Time');+var $elm$time$Time$every = F2(+	function (interval, tagger) {+		return $elm$time$Time$subscription(+			A2($elm$time$Time$Every, interval, tagger));+	});+var $author$project$Main$LoadedFlags = function (a) {+	return {$: 'LoadedFlags', a: a};+};+var $elm$json$Json$Decode$decodeString = _Json_runOnString;+var $elm$http$Http$BadStatus_ = F2(+	function (a, b) {+		return {$: 'BadStatus_', a: a, b: b};+	});+var $elm$http$Http$BadUrl_ = function (a) {+	return {$: 'BadUrl_', a: a};+};+var $elm$http$Http$GoodStatus_ = F2(+	function (a, b) {+		return {$: 'GoodStatus_', a: a, b: b};+	});+var $elm$http$Http$NetworkError_ = {$: 'NetworkError_'};+var $elm$http$Http$Receiving = function (a) {+	return {$: 'Receiving', a: a};+};+var $elm$http$Http$Sending = function (a) {+	return {$: 'Sending', a: a};+};+var $elm$http$Http$Timeout_ = {$: 'Timeout_'};+var $elm$core$Maybe$isJust = function (maybe) {+	if (maybe.$ === 'Just') {+		return true;+	} else {+		return false;+	}+};+var $elm$core$Dict$getMin = function (dict) {+	getMin:+	while (true) {+		if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) {+			var left = dict.d;+			var $temp$dict = left;+			dict = $temp$dict;+			continue getMin;+		} else {+			return dict;+		}+	}+};+var $elm$core$Dict$moveRedLeft = function (dict) {+	if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) {+		if ((dict.e.d.$ === 'RBNode_elm_builtin') && (dict.e.d.a.$ === 'Red')) {+			var clr = dict.a;+			var k = dict.b;+			var v = dict.c;+			var _v1 = dict.d;+			var lClr = _v1.a;+			var lK = _v1.b;+			var lV = _v1.c;+			var lLeft = _v1.d;+			var lRight = _v1.e;+			var _v2 = dict.e;+			var rClr = _v2.a;+			var rK = _v2.b;+			var rV = _v2.c;+			var rLeft = _v2.d;+			var _v3 = rLeft.a;+			var rlK = rLeft.b;+			var rlV = rLeft.c;+			var rlL = rLeft.d;+			var rlR = rLeft.e;+			var rRight = _v2.e;+			return A5(+				$elm$core$Dict$RBNode_elm_builtin,+				$elm$core$Dict$Red,+				rlK,+				rlV,+				A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Black,+					k,+					v,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight),+					rlL),+				A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rlR, rRight));+		} else {+			var clr = dict.a;+			var k = dict.b;+			var v = dict.c;+			var _v4 = dict.d;+			var lClr = _v4.a;+			var lK = _v4.b;+			var lV = _v4.c;+			var lLeft = _v4.d;+			var lRight = _v4.e;+			var _v5 = dict.e;+			var rClr = _v5.a;+			var rK = _v5.b;+			var rV = _v5.c;+			var rLeft = _v5.d;+			var rRight = _v5.e;+			if (clr.$ === 'Black') {+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Black,+					k,+					v,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight),+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight));+			} else {+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Black,+					k,+					v,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight),+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight));+			}+		}+	} else {+		return dict;+	}+};+var $elm$core$Dict$moveRedRight = function (dict) {+	if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) {+		if ((dict.d.d.$ === 'RBNode_elm_builtin') && (dict.d.d.a.$ === 'Red')) {+			var clr = dict.a;+			var k = dict.b;+			var v = dict.c;+			var _v1 = dict.d;+			var lClr = _v1.a;+			var lK = _v1.b;+			var lV = _v1.c;+			var _v2 = _v1.d;+			var _v3 = _v2.a;+			var llK = _v2.b;+			var llV = _v2.c;+			var llLeft = _v2.d;+			var llRight = _v2.e;+			var lRight = _v1.e;+			var _v4 = dict.e;+			var rClr = _v4.a;+			var rK = _v4.b;+			var rV = _v4.c;+			var rLeft = _v4.d;+			var rRight = _v4.e;+			return A5(+				$elm$core$Dict$RBNode_elm_builtin,+				$elm$core$Dict$Red,+				lK,+				lV,+				A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight),+				A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Black,+					k,+					v,+					lRight,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)));+		} else {+			var clr = dict.a;+			var k = dict.b;+			var v = dict.c;+			var _v5 = dict.d;+			var lClr = _v5.a;+			var lK = _v5.b;+			var lV = _v5.c;+			var lLeft = _v5.d;+			var lRight = _v5.e;+			var _v6 = dict.e;+			var rClr = _v6.a;+			var rK = _v6.b;+			var rV = _v6.c;+			var rLeft = _v6.d;+			var rRight = _v6.e;+			if (clr.$ === 'Black') {+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Black,+					k,+					v,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight),+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight));+			} else {+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					$elm$core$Dict$Black,+					k,+					v,+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight),+					A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight));+			}+		}+	} else {+		return dict;+	}+};+var $elm$core$Dict$removeHelpPrepEQGT = F7(+	function (targetKey, dict, color, key, value, left, right) {+		if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) {+			var _v1 = left.a;+			var lK = left.b;+			var lV = left.c;+			var lLeft = left.d;+			var lRight = left.e;+			return A5(+				$elm$core$Dict$RBNode_elm_builtin,+				color,+				lK,+				lV,+				lLeft,+				A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, lRight, right));+		} else {+			_v2$2:+			while (true) {+				if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Black')) {+					if (right.d.$ === 'RBNode_elm_builtin') {+						if (right.d.a.$ === 'Black') {+							var _v3 = right.a;+							var _v4 = right.d;+							var _v5 = _v4.a;+							return $elm$core$Dict$moveRedRight(dict);+						} else {+							break _v2$2;+						}+					} else {+						var _v6 = right.a;+						var _v7 = right.d;+						return $elm$core$Dict$moveRedRight(dict);+					}+				} else {+					break _v2$2;+				}+			}+			return dict;+		}+	});+var $elm$core$Dict$removeMin = function (dict) {+	if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) {+		var color = dict.a;+		var key = dict.b;+		var value = dict.c;+		var left = dict.d;+		var lColor = left.a;+		var lLeft = left.d;+		var right = dict.e;+		if (lColor.$ === 'Black') {+			if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) {+				var _v3 = lLeft.a;+				return A5(+					$elm$core$Dict$RBNode_elm_builtin,+					color,+					key,+					value,+					$elm$core$Dict$removeMin(left),+					right);+			} else {+				var _v4 = $elm$core$Dict$moveRedLeft(dict);+				if (_v4.$ === 'RBNode_elm_builtin') {+					var nColor = _v4.a;+					var nKey = _v4.b;+					var nValue = _v4.c;+					var nLeft = _v4.d;+					var nRight = _v4.e;+					return A5(+						$elm$core$Dict$balance,+						nColor,+						nKey,+						nValue,+						$elm$core$Dict$removeMin(nLeft),+						nRight);+				} else {+					return $elm$core$Dict$RBEmpty_elm_builtin;+				}+			}+		} else {+			return A5(+				$elm$core$Dict$RBNode_elm_builtin,+				color,+				key,+				value,+				$elm$core$Dict$removeMin(left),+				right);+		}+	} else {+		return $elm$core$Dict$RBEmpty_elm_builtin;+	}+};+var $elm$core$Dict$removeHelp = F2(+	function (targetKey, dict) {+		if (dict.$ === 'RBEmpty_elm_builtin') {+			return $elm$core$Dict$RBEmpty_elm_builtin;+		} else {+			var color = dict.a;+			var key = dict.b;+			var value = dict.c;+			var left = dict.d;+			var right = dict.e;+			if (_Utils_cmp(targetKey, key) < 0) {+				if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Black')) {+					var _v4 = left.a;+					var lLeft = left.d;+					if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) {+						var _v6 = lLeft.a;+						return A5(+							$elm$core$Dict$RBNode_elm_builtin,+							color,+							key,+							value,+							A2($elm$core$Dict$removeHelp, targetKey, left),+							right);+					} else {+						var _v7 = $elm$core$Dict$moveRedLeft(dict);+						if (_v7.$ === 'RBNode_elm_builtin') {+							var nColor = _v7.a;+							var nKey = _v7.b;+							var nValue = _v7.c;+							var nLeft = _v7.d;+							var nRight = _v7.e;+							return A5(+								$elm$core$Dict$balance,+								nColor,+								nKey,+								nValue,+								A2($elm$core$Dict$removeHelp, targetKey, nLeft),+								nRight);+						} else {+							return $elm$core$Dict$RBEmpty_elm_builtin;+						}+					}+				} else {+					return A5(+						$elm$core$Dict$RBNode_elm_builtin,+						color,+						key,+						value,+						A2($elm$core$Dict$removeHelp, targetKey, left),+						right);+				}+			} else {+				return A2(+					$elm$core$Dict$removeHelpEQGT,+					targetKey,+					A7($elm$core$Dict$removeHelpPrepEQGT, targetKey, dict, color, key, value, left, right));+			}+		}+	});+var $elm$core$Dict$removeHelpEQGT = F2(+	function (targetKey, dict) {+		if (dict.$ === 'RBNode_elm_builtin') {+			var color = dict.a;+			var key = dict.b;+			var value = dict.c;+			var left = dict.d;+			var right = dict.e;+			if (_Utils_eq(targetKey, key)) {+				var _v1 = $elm$core$Dict$getMin(right);+				if (_v1.$ === 'RBNode_elm_builtin') {+					var minKey = _v1.b;+					var minValue = _v1.c;+					return A5(+						$elm$core$Dict$balance,+						color,+						minKey,+						minValue,+						left,+						$elm$core$Dict$removeMin(right));+				} else {+					return $elm$core$Dict$RBEmpty_elm_builtin;+				}+			} else {+				return A5(+					$elm$core$Dict$balance,+					color,+					key,+					value,+					left,+					A2($elm$core$Dict$removeHelp, targetKey, right));+			}+		} else {+			return $elm$core$Dict$RBEmpty_elm_builtin;+		}+	});+var $elm$core$Dict$remove = F2(+	function (key, dict) {+		var _v0 = A2($elm$core$Dict$removeHelp, key, dict);+		if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) {+			var _v1 = _v0.a;+			var k = _v0.b;+			var v = _v0.c;+			var l = _v0.d;+			var r = _v0.e;+			return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r);+		} else {+			var x = _v0;+			return x;+		}+	});+var $elm$core$Dict$update = F3(+	function (targetKey, alter, dictionary) {+		var _v0 = alter(+			A2($elm$core$Dict$get, targetKey, dictionary));+		if (_v0.$ === 'Just') {+			var value = _v0.a;+			return A3($elm$core$Dict$insert, targetKey, value, dictionary);+		} else {+			return A2($elm$core$Dict$remove, targetKey, dictionary);+		}+	});+var $elm$core$Basics$composeR = F3(+	function (f, g, x) {+		return g(+			f(x));+	});+var $elm$http$Http$expectStringResponse = F2(+	function (toMsg, toResult) {+		return A3(+			_Http_expect,+			'',+			$elm$core$Basics$identity,+			A2($elm$core$Basics$composeR, toResult, toMsg));+	});+var $elm$core$Result$mapError = F2(+	function (f, result) {+		if (result.$ === 'Ok') {+			var v = result.a;+			return $elm$core$Result$Ok(v);+		} else {+			var e = result.a;+			return $elm$core$Result$Err(+				f(e));+		}+	});+var $elm$http$Http$BadBody = function (a) {+	return {$: 'BadBody', a: a};+};+var $elm$http$Http$BadStatus = function (a) {+	return {$: 'BadStatus', a: a};+};+var $elm$http$Http$BadUrl = function (a) {+	return {$: 'BadUrl', a: a};+};+var $elm$http$Http$NetworkError = {$: 'NetworkError'};+var $elm$http$Http$Timeout = {$: 'Timeout'};+var $elm$http$Http$resolve = F2(+	function (toResult, response) {+		switch (response.$) {+			case 'BadUrl_':+				var url = response.a;+				return $elm$core$Result$Err(+					$elm$http$Http$BadUrl(url));+			case 'Timeout_':+				return $elm$core$Result$Err($elm$http$Http$Timeout);+			case 'NetworkError_':+				return $elm$core$Result$Err($elm$http$Http$NetworkError);+			case 'BadStatus_':+				var metadata = response.a;+				return $elm$core$Result$Err(+					$elm$http$Http$BadStatus(metadata.statusCode));+			default:+				var body = response.b;+				return A2(+					$elm$core$Result$mapError,+					$elm$http$Http$BadBody,+					toResult(body));+		}+	});+var $elm$http$Http$expectJson = F2(+	function (toMsg, decoder) {+		return A2(+			$elm$http$Http$expectStringResponse,+			toMsg,+			$elm$http$Http$resolve(+				function (string) {+					return A2(+						$elm$core$Result$mapError,+						$elm$json$Json$Decode$errorToString,+						A2($elm$json$Json$Decode$decodeString, decoder, string));+				}));+	});+var $author$project$Main$Percentage = function (a) {+	return {$: 'Percentage', a: a};+};+var $elm$core$Dict$fromList = function (assocs) {+	return A3(+		$elm$core$List$foldl,+		F2(+			function (_v0, dict) {+				var key = _v0.a;+				var value = _v0.b;+				return A3($elm$core$Dict$insert, key, value, dict);+			}),+		$elm$core$Dict$empty,+		assocs);+};+var $elm$json$Json$Decode$keyValuePairs = _Json_decodeKeyValuePairs;+var $elm$json$Json$Decode$dict = function (decoder) {+	return A2(+		$elm$json$Json$Decode$map,+		$elm$core$Dict$fromList,+		$elm$json$Json$Decode$keyValuePairs(decoder));+};+var $elm$json$Json$Decode$int = _Json_decodeInt;+var $author$project$Main$flagsDecoder = $elm$json$Json$Decode$dict(+	A2($elm$json$Json$Decode$map, $author$project$Main$Percentage, $elm$json$Json$Decode$int));+var $elm$http$Http$emptyBody = _Http_emptyBody;+var $elm$http$Http$Request = function (a) {+	return {$: 'Request', a: a};+};+var $elm$http$Http$State = F2(+	function (reqs, subs) {+		return {reqs: reqs, subs: subs};+	});+var $elm$http$Http$init = $elm$core$Task$succeed(+	A2($elm$http$Http$State, $elm$core$Dict$empty, _List_Nil));+var $elm$http$Http$updateReqs = F3(+	function (router, cmds, reqs) {+		updateReqs:+		while (true) {+			if (!cmds.b) {+				return $elm$core$Task$succeed(reqs);+			} else {+				var cmd = cmds.a;+				var otherCmds = cmds.b;+				if (cmd.$ === 'Cancel') {+					var tracker = cmd.a;+					var _v2 = A2($elm$core$Dict$get, tracker, reqs);+					if (_v2.$ === 'Nothing') {+						var $temp$router = router,+							$temp$cmds = otherCmds,+							$temp$reqs = reqs;+						router = $temp$router;+						cmds = $temp$cmds;+						reqs = $temp$reqs;+						continue updateReqs;+					} else {+						var pid = _v2.a;+						return A2(+							$elm$core$Task$andThen,+							function (_v3) {+								return A3(+									$elm$http$Http$updateReqs,+									router,+									otherCmds,+									A2($elm$core$Dict$remove, tracker, reqs));+							},+							$elm$core$Process$kill(pid));+					}+				} else {+					var req = cmd.a;+					return A2(+						$elm$core$Task$andThen,+						function (pid) {+							var _v4 = req.tracker;+							if (_v4.$ === 'Nothing') {+								return A3($elm$http$Http$updateReqs, router, otherCmds, reqs);+							} else {+								var tracker = _v4.a;+								return A3(+									$elm$http$Http$updateReqs,+									router,+									otherCmds,+									A3($elm$core$Dict$insert, tracker, pid, reqs));+							}+						},+						$elm$core$Process$spawn(+							A3(+								_Http_toTask,+								router,+								$elm$core$Platform$sendToApp(router),+								req)));+				}+			}+		}+	});+var $elm$http$Http$onEffects = F4(+	function (router, cmds, subs, state) {+		return A2(+			$elm$core$Task$andThen,+			function (reqs) {+				return $elm$core$Task$succeed(+					A2($elm$http$Http$State, reqs, subs));+			},+			A3($elm$http$Http$updateReqs, router, cmds, state.reqs));+	});+var $elm$core$List$maybeCons = F3(+	function (f, mx, xs) {+		var _v0 = f(mx);+		if (_v0.$ === 'Just') {+			var x = _v0.a;+			return A2($elm$core$List$cons, x, xs);+		} else {+			return xs;+		}+	});+var $elm$core$List$filterMap = F2(+	function (f, xs) {+		return A3(+			$elm$core$List$foldr,+			$elm$core$List$maybeCons(f),+			_List_Nil,+			xs);+	});+var $elm$http$Http$maybeSend = F4(+	function (router, desiredTracker, progress, _v0) {+		var actualTracker = _v0.a;+		var toMsg = _v0.b;+		return _Utils_eq(desiredTracker, actualTracker) ? $elm$core$Maybe$Just(+			A2(+				$elm$core$Platform$sendToApp,+				router,+				toMsg(progress))) : $elm$core$Maybe$Nothing;+	});+var $elm$http$Http$onSelfMsg = F3(+	function (router, _v0, state) {+		var tracker = _v0.a;+		var progress = _v0.b;+		return A2(+			$elm$core$Task$andThen,+			function (_v1) {+				return $elm$core$Task$succeed(state);+			},+			$elm$core$Task$sequence(+				A2(+					$elm$core$List$filterMap,+					A3($elm$http$Http$maybeSend, router, tracker, progress),+					state.subs)));+	});+var $elm$http$Http$Cancel = function (a) {+	return {$: 'Cancel', a: a};+};+var $elm$http$Http$cmdMap = F2(+	function (func, cmd) {+		if (cmd.$ === 'Cancel') {+			var tracker = cmd.a;+			return $elm$http$Http$Cancel(tracker);+		} else {+			var r = cmd.a;+			return $elm$http$Http$Request(+				{+					allowCookiesFromOtherDomains: r.allowCookiesFromOtherDomains,+					body: r.body,+					expect: A2(_Http_mapExpect, func, r.expect),+					headers: r.headers,+					method: r.method,+					timeout: r.timeout,+					tracker: r.tracker,+					url: r.url+				});+		}+	});+var $elm$http$Http$MySub = F2(+	function (a, b) {+		return {$: 'MySub', a: a, b: b};+	});+var $elm$http$Http$subMap = F2(+	function (func, _v0) {+		var tracker = _v0.a;+		var toMsg = _v0.b;+		return A2(+			$elm$http$Http$MySub,+			tracker,+			A2($elm$core$Basics$composeR, toMsg, func));+	});+_Platform_effectManagers['Http'] = _Platform_createManager($elm$http$Http$init, $elm$http$Http$onEffects, $elm$http$Http$onSelfMsg, $elm$http$Http$cmdMap, $elm$http$Http$subMap);+var $elm$http$Http$command = _Platform_leaf('Http');+var $elm$http$Http$subscription = _Platform_leaf('Http');+var $elm$http$Http$request = function (r) {+	return $elm$http$Http$command(+		$elm$http$Http$Request(+			{allowCookiesFromOtherDomains: false, body: r.body, expect: r.expect, headers: r.headers, method: r.method, timeout: r.timeout, tracker: r.tracker, url: r.url}));+};+var $elm$http$Http$get = function (r) {+	return $elm$http$Http$request(+		{body: $elm$http$Http$emptyBody, expect: r.expect, headers: _List_Nil, method: 'GET', timeout: $elm$core$Maybe$Nothing, tracker: $elm$core$Maybe$Nothing, url: r.url});+};+var $elm$url$Url$Builder$toQueryPair = function (_v0) {+	var key = _v0.a;+	var value = _v0.b;+	return key + ('=' + value);+};+var $elm$url$Url$Builder$toQuery = function (parameters) {+	if (!parameters.b) {+		return '';+	} else {+		return '?' + A2(+			$elm$core$String$join,+			'&',+			A2($elm$core$List$map, $elm$url$Url$Builder$toQueryPair, parameters));+	}+};+var $elm$url$Url$Builder$relative = F2(+	function (pathSegments, parameters) {+		return _Utils_ap(+			A2($elm$core$String$join, '/', pathSegments),+			$elm$url$Url$Builder$toQuery(parameters));+	});+var $author$project$Main$sendLoadFlagsRequest = function (rootPath) {+	return $elm$http$Http$get(+		{+			expect: A2(+				$elm$http$Http$expectJson,+				function (res) {+					if (res.$ === 'Ok') {+						var x = res.a;+						return $author$project$Main$LoadedFlags(x);+					} else {+						return $author$project$Main$LoadedFlags($elm$core$Dict$empty);+					}+				},+				$author$project$Main$flagsDecoder),+			url: A2(+				$elm$url$Url$Builder$relative,+				_Utils_ap(+					rootPath,+					_List_fromArray(+						['flags'])),+				_List_Nil)+		});+};+var $elm$core$List$isEmpty = function (xs) {+	if (!xs.b) {+		return true;+	} else {+		return false;+	}+};+var $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles = F2(+	function (_v0, styles) {+		var newStyles = _v0.b;+		var classname = _v0.c;+		return $elm$core$List$isEmpty(newStyles) ? styles : A3($elm$core$Dict$insert, classname, newStyles, styles);+	});+var $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute = function (_v0) {+	var val = _v0.a;+	return val;+};+var $elm$virtual_dom$VirtualDom$keyedNode = function (tag) {+	return _VirtualDom_keyedNode(+		_VirtualDom_noScript(tag));+};+var $elm$virtual_dom$VirtualDom$keyedNodeNS = F2(+	function (namespace, tag) {+		return A2(+			_VirtualDom_keyedNodeNS,+			namespace,+			_VirtualDom_noScript(tag));+	});+var $elm$virtual_dom$VirtualDom$node = function (tag) {+	return _VirtualDom_node(+		_VirtualDom_noScript(tag));+};+var $elm$virtual_dom$VirtualDom$nodeNS = function (tag) {+	return _VirtualDom_nodeNS(+		_VirtualDom_noScript(tag));+};+var $rtfeldman$elm_css$VirtualDom$Styled$accumulateKeyedStyledHtml = F2(+	function (_v6, _v7) {+		var key = _v6.a;+		var html = _v6.b;+		var pairs = _v7.a;+		var styles = _v7.b;+		switch (html.$) {+			case 'Unstyled':+				var vdom = html.a;+				return _Utils_Tuple2(+					A2(+						$elm$core$List$cons,+						_Utils_Tuple2(key, vdom),+						pairs),+					styles);+			case 'Node':+				var elemType = html.a;+				var properties = html.b;+				var children = html.c;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v9 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v9.a;+				var finalStyles = _v9.b;+				var vdom = A3(+					$elm$virtual_dom$VirtualDom$node,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2(+						$elm$core$List$cons,+						_Utils_Tuple2(key, vdom),+						pairs),+					finalStyles);+			case 'NodeNS':+				var ns = html.a;+				var elemType = html.b;+				var properties = html.c;+				var children = html.d;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v10 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v10.a;+				var finalStyles = _v10.b;+				var vdom = A4(+					$elm$virtual_dom$VirtualDom$nodeNS,+					ns,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2(+						$elm$core$List$cons,+						_Utils_Tuple2(key, vdom),+						pairs),+					finalStyles);+			case 'KeyedNode':+				var elemType = html.a;+				var properties = html.b;+				var children = html.c;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v11 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateKeyedStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v11.a;+				var finalStyles = _v11.b;+				var vdom = A3(+					$elm$virtual_dom$VirtualDom$keyedNode,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2(+						$elm$core$List$cons,+						_Utils_Tuple2(key, vdom),+						pairs),+					finalStyles);+			default:+				var ns = html.a;+				var elemType = html.b;+				var properties = html.c;+				var children = html.d;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v12 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateKeyedStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v12.a;+				var finalStyles = _v12.b;+				var vdom = A4(+					$elm$virtual_dom$VirtualDom$keyedNodeNS,+					ns,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2(+						$elm$core$List$cons,+						_Utils_Tuple2(key, vdom),+						pairs),+					finalStyles);+		}+	});+var $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyledHtml = F2(+	function (html, _v0) {+		var nodes = _v0.a;+		var styles = _v0.b;+		switch (html.$) {+			case 'Unstyled':+				var vdomNode = html.a;+				return _Utils_Tuple2(+					A2($elm$core$List$cons, vdomNode, nodes),+					styles);+			case 'Node':+				var elemType = html.a;+				var properties = html.b;+				var children = html.c;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v2 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v2.a;+				var finalStyles = _v2.b;+				var vdomNode = A3(+					$elm$virtual_dom$VirtualDom$node,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2($elm$core$List$cons, vdomNode, nodes),+					finalStyles);+			case 'NodeNS':+				var ns = html.a;+				var elemType = html.b;+				var properties = html.c;+				var children = html.d;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v3 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v3.a;+				var finalStyles = _v3.b;+				var vdomNode = A4(+					$elm$virtual_dom$VirtualDom$nodeNS,+					ns,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2($elm$core$List$cons, vdomNode, nodes),+					finalStyles);+			case 'KeyedNode':+				var elemType = html.a;+				var properties = html.b;+				var children = html.c;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v4 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateKeyedStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v4.a;+				var finalStyles = _v4.b;+				var vdomNode = A3(+					$elm$virtual_dom$VirtualDom$keyedNode,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2($elm$core$List$cons, vdomNode, nodes),+					finalStyles);+			default:+				var ns = html.a;+				var elemType = html.b;+				var properties = html.c;+				var children = html.d;+				var combinedStyles = A3($elm$core$List$foldl, $rtfeldman$elm_css$VirtualDom$Styled$accumulateStyles, styles, properties);+				var _v5 = A3(+					$elm$core$List$foldl,+					$rtfeldman$elm_css$VirtualDom$Styled$accumulateKeyedStyledHtml,+					_Utils_Tuple2(_List_Nil, combinedStyles),+					children);+				var childNodes = _v5.a;+				var finalStyles = _v5.b;+				var vdomNode = A4(+					$elm$virtual_dom$VirtualDom$keyedNodeNS,+					ns,+					elemType,+					A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties),+					$elm$core$List$reverse(childNodes));+				return _Utils_Tuple2(+					A2($elm$core$List$cons, vdomNode, nodes),+					finalStyles);+		}+	});+var $elm$core$Dict$singleton = F2(+	function (key, value) {+		return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, key, value, $elm$core$Dict$RBEmpty_elm_builtin, $elm$core$Dict$RBEmpty_elm_builtin);+	});+var $rtfeldman$elm_css$VirtualDom$Styled$stylesFromPropertiesHelp = F2(+	function (candidate, properties) {+		stylesFromPropertiesHelp:+		while (true) {+			if (!properties.b) {+				return candidate;+			} else {+				var _v1 = properties.a;+				var styles = _v1.b;+				var classname = _v1.c;+				var rest = properties.b;+				if ($elm$core$String$isEmpty(classname)) {+					var $temp$candidate = candidate,+						$temp$properties = rest;+					candidate = $temp$candidate;+					properties = $temp$properties;+					continue stylesFromPropertiesHelp;+				} else {+					var $temp$candidate = $elm$core$Maybe$Just(+						_Utils_Tuple2(classname, styles)),+						$temp$properties = rest;+					candidate = $temp$candidate;+					properties = $temp$properties;+					continue stylesFromPropertiesHelp;+				}+			}+		}+	});+var $rtfeldman$elm_css$VirtualDom$Styled$stylesFromProperties = function (properties) {+	var _v0 = A2($rtfeldman$elm_css$VirtualDom$Styled$stylesFromPropertiesHelp, $elm$core$Maybe$Nothing, properties);+	if (_v0.$ === 'Nothing') {+		return $elm$core$Dict$empty;+	} else {+		var _v1 = _v0.a;+		var classname = _v1.a;+		var styles = _v1.b;+		return A2($elm$core$Dict$singleton, classname, styles);+	}+};+var $elm$core$List$singleton = function (value) {+	return _List_fromArray(+		[value]);+};+var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text;+var $elm$core$List$any = F2(+	function (isOkay, list) {+		any:+		while (true) {+			if (!list.b) {+				return false;+			} else {+				var x = list.a;+				var xs = list.b;+				if (isOkay(x)) {+					return true;+				} else {+					var $temp$isOkay = isOkay,+						$temp$list = xs;+					isOkay = $temp$isOkay;+					list = $temp$list;+					continue any;+				}+			}+		}+	});+var $elm$core$Basics$not = _Basics_not;+var $elm$core$List$all = F2(+	function (isOkay, list) {+		return !A2(+			$elm$core$List$any,+			A2($elm$core$Basics$composeL, $elm$core$Basics$not, isOkay),+			list);+	});+var $rtfeldman$elm_css$Css$Structure$compactHelp = F2(+	function (declaration, _v0) {+		var keyframesByName = _v0.a;+		var declarations = _v0.b;+		switch (declaration.$) {+			case 'StyleBlockDeclaration':+				var _v2 = declaration.a;+				var properties = _v2.c;+				return $elm$core$List$isEmpty(properties) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			case 'MediaRule':+				var styleBlocks = declaration.b;+				return A2(+					$elm$core$List$all,+					function (_v3) {+						var properties = _v3.c;+						return $elm$core$List$isEmpty(properties);+					},+					styleBlocks) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			case 'SupportsRule':+				var otherDeclarations = declaration.b;+				return $elm$core$List$isEmpty(otherDeclarations) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			case 'DocumentRule':+				return _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			case 'PageRule':+				var properties = declaration.b;+				return $elm$core$List$isEmpty(properties) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			case 'FontFace':+				var properties = declaration.a;+				return $elm$core$List$isEmpty(properties) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			case 'Keyframes':+				var record = declaration.a;+				return $elm$core$String$isEmpty(record.declaration) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					A3($elm$core$Dict$insert, record.name, record.declaration, keyframesByName),+					declarations);+			case 'Viewport':+				var properties = declaration.a;+				return $elm$core$List$isEmpty(properties) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			case 'CounterStyle':+				var properties = declaration.a;+				return $elm$core$List$isEmpty(properties) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+			default:+				var tuples = declaration.a;+				return A2(+					$elm$core$List$all,+					function (_v4) {+						var properties = _v4.b;+						return $elm$core$List$isEmpty(properties);+					},+					tuples) ? _Utils_Tuple2(keyframesByName, declarations) : _Utils_Tuple2(+					keyframesByName,+					A2($elm$core$List$cons, declaration, declarations));+		}+	});+var $rtfeldman$elm_css$Css$Structure$Keyframes = function (a) {+	return {$: 'Keyframes', a: a};+};+var $elm$core$List$append = F2(+	function (xs, ys) {+		if (!ys.b) {+			return xs;+		} else {+			return A3($elm$core$List$foldr, $elm$core$List$cons, ys, xs);+		}+	});+var $rtfeldman$elm_css$Css$Structure$withKeyframeDeclarations = F2(+	function (keyframesByName, compactedDeclarations) {+		return A2(+			$elm$core$List$append,+			A2(+				$elm$core$List$map,+				function (_v0) {+					var name = _v0.a;+					var decl = _v0.b;+					return $rtfeldman$elm_css$Css$Structure$Keyframes(+						{declaration: decl, name: name});+				},+				$elm$core$Dict$toList(keyframesByName)),+			compactedDeclarations);+	});+var $rtfeldman$elm_css$Css$Structure$compactStylesheet = function (_v0) {+	var charset = _v0.charset;+	var imports = _v0.imports;+	var namespaces = _v0.namespaces;+	var declarations = _v0.declarations;+	var _v1 = A3(+		$elm$core$List$foldr,+		$rtfeldman$elm_css$Css$Structure$compactHelp,+		_Utils_Tuple2($elm$core$Dict$empty, _List_Nil),+		declarations);+	var keyframesByName = _v1.a;+	var compactedDeclarations = _v1.b;+	var finalDeclarations = A2($rtfeldman$elm_css$Css$Structure$withKeyframeDeclarations, keyframesByName, compactedDeclarations);+	return {charset: charset, declarations: finalDeclarations, imports: imports, namespaces: namespaces};+};+var $elm$core$Maybe$map = F2(+	function (f, maybe) {+		if (maybe.$ === 'Just') {+			var value = maybe.a;+			return $elm$core$Maybe$Just(+				f(value));+		} else {+			return $elm$core$Maybe$Nothing;+		}+	});+var $elm$core$Maybe$withDefault = F2(+	function (_default, maybe) {+		if (maybe.$ === 'Just') {+			var value = maybe.a;+			return value;+		} else {+			return _default;+		}+	});+var $rtfeldman$elm_css$Css$Structure$Output$charsetToString = function (charset) {+	return A2(+		$elm$core$Maybe$withDefault,+		'',+		A2(+			$elm$core$Maybe$map,+			function (str) {+				return '@charset \"' + (str + '\"');+			},+			charset));+};+var $elm$core$List$filter = F2(+	function (isGood, list) {+		return A3(+			$elm$core$List$foldr,+			F2(+				function (x, xs) {+					return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs;+				}),+			_List_Nil,+			list);+	});+var $rtfeldman$elm_css$Css$Structure$Output$mediaExpressionToString = function (expression) {+	return '(' + (expression.feature + (A2(+		$elm$core$Maybe$withDefault,+		'',+		A2(+			$elm$core$Maybe$map,+			$elm$core$Basics$append(': '),+			expression.value)) + ')'));+};+var $rtfeldman$elm_css$Css$Structure$Output$mediaTypeToString = function (mediaType) {+	switch (mediaType.$) {+		case 'Print':+			return 'print';+		case 'Screen':+			return 'screen';+		default:+			return 'speech';+	}+};+var $rtfeldman$elm_css$Css$Structure$Output$mediaQueryToString = function (mediaQuery) {+	var prefixWith = F3(+		function (str, mediaType, expressions) {+			return str + (' ' + A2(+				$elm$core$String$join,+				' and ',+				A2(+					$elm$core$List$cons,+					$rtfeldman$elm_css$Css$Structure$Output$mediaTypeToString(mediaType),+					A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$mediaExpressionToString, expressions))));+		});+	switch (mediaQuery.$) {+		case 'AllQuery':+			var expressions = mediaQuery.a;+			return A2(+				$elm$core$String$join,+				' and ',+				A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$mediaExpressionToString, expressions));+		case 'OnlyQuery':+			var mediaType = mediaQuery.a;+			var expressions = mediaQuery.b;+			return A3(prefixWith, 'only', mediaType, expressions);+		case 'NotQuery':+			var mediaType = mediaQuery.a;+			var expressions = mediaQuery.b;+			return A3(prefixWith, 'not', mediaType, expressions);+		default:+			var str = mediaQuery.a;+			return str;+	}+};+var $rtfeldman$elm_css$Css$Structure$Output$importMediaQueryToString = F2(+	function (name, mediaQuery) {+		return '@import \"' + (name + ($rtfeldman$elm_css$Css$Structure$Output$mediaQueryToString(mediaQuery) + '\"'));+	});+var $rtfeldman$elm_css$Css$Structure$Output$importToString = function (_v0) {+	var name = _v0.a;+	var mediaQueries = _v0.b;+	return A2(+		$elm$core$String$join,+		'\n',+		A2(+			$elm$core$List$map,+			$rtfeldman$elm_css$Css$Structure$Output$importMediaQueryToString(name),+			mediaQueries));+};+var $rtfeldman$elm_css$Css$Structure$Output$namespaceToString = function (_v0) {+	var prefix = _v0.a;+	var str = _v0.b;+	return '@namespace ' + (prefix + ('\"' + (str + '\"')));+};+var $rtfeldman$elm_css$Css$Structure$Output$spaceIndent = '    ';+var $rtfeldman$elm_css$Css$Structure$Output$indent = function (str) {+	return _Utils_ap($rtfeldman$elm_css$Css$Structure$Output$spaceIndent, str);+};+var $rtfeldman$elm_css$Css$Structure$Output$noIndent = '';+var $rtfeldman$elm_css$Css$Structure$Output$emitProperty = function (str) {+	return str + ';';+};+var $rtfeldman$elm_css$Css$Structure$Output$emitProperties = function (properties) {+	return A2(+		$elm$core$String$join,+		'\n',+		A2(+			$elm$core$List$map,+			A2($elm$core$Basics$composeL, $rtfeldman$elm_css$Css$Structure$Output$indent, $rtfeldman$elm_css$Css$Structure$Output$emitProperty),+			properties));+};+var $elm$core$String$append = _String_append;+var $rtfeldman$elm_css$Css$Structure$Output$pseudoElementToString = function (_v0) {+	var str = _v0.a;+	return '::' + str;+};+var $rtfeldman$elm_css$Css$Structure$Output$combinatorToString = function (combinator) {+	switch (combinator.$) {+		case 'AdjacentSibling':+			return '+';+		case 'GeneralSibling':+			return '~';+		case 'Child':+			return '>';+		default:+			return '';+	}+};+var $rtfeldman$elm_css$Css$Structure$Output$repeatableSimpleSelectorToString = function (repeatableSimpleSelector) {+	switch (repeatableSimpleSelector.$) {+		case 'ClassSelector':+			var str = repeatableSimpleSelector.a;+			return '.' + str;+		case 'IdSelector':+			var str = repeatableSimpleSelector.a;+			return '#' + str;+		case 'PseudoClassSelector':+			var str = repeatableSimpleSelector.a;+			return ':' + str;+		default:+			var str = repeatableSimpleSelector.a;+			return '[' + (str + ']');+	}+};+var $rtfeldman$elm_css$Css$Structure$Output$simpleSelectorSequenceToString = function (simpleSelectorSequence) {+	switch (simpleSelectorSequence.$) {+		case 'TypeSelectorSequence':+			var str = simpleSelectorSequence.a.a;+			var repeatableSimpleSelectors = simpleSelectorSequence.b;+			return A2(+				$elm$core$String$join,+				'',+				A2(+					$elm$core$List$cons,+					str,+					A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$repeatableSimpleSelectorToString, repeatableSimpleSelectors)));+		case 'UniversalSelectorSequence':+			var repeatableSimpleSelectors = simpleSelectorSequence.a;+			return $elm$core$List$isEmpty(repeatableSimpleSelectors) ? '*' : A2(+				$elm$core$String$join,+				'',+				A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$repeatableSimpleSelectorToString, repeatableSimpleSelectors));+		default:+			var str = simpleSelectorSequence.a;+			var repeatableSimpleSelectors = simpleSelectorSequence.b;+			return A2(+				$elm$core$String$join,+				'',+				A2(+					$elm$core$List$cons,+					str,+					A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$repeatableSimpleSelectorToString, repeatableSimpleSelectors)));+	}+};+var $rtfeldman$elm_css$Css$Structure$Output$selectorChainToString = function (_v0) {+	var combinator = _v0.a;+	var sequence = _v0.b;+	return A2(+		$elm$core$String$join,+		' ',+		_List_fromArray(+			[+				$rtfeldman$elm_css$Css$Structure$Output$combinatorToString(combinator),+				$rtfeldman$elm_css$Css$Structure$Output$simpleSelectorSequenceToString(sequence)+			]));+};+var $rtfeldman$elm_css$Css$Structure$Output$selectorToString = function (_v0) {+	var simpleSelectorSequence = _v0.a;+	var chain = _v0.b;+	var pseudoElement = _v0.c;+	var segments = A2(+		$elm$core$List$cons,+		$rtfeldman$elm_css$Css$Structure$Output$simpleSelectorSequenceToString(simpleSelectorSequence),+		A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$selectorChainToString, chain));+	var pseudoElementsString = A2(+		$elm$core$String$join,+		'',+		_List_fromArray(+			[+				A2(+				$elm$core$Maybe$withDefault,+				'',+				A2($elm$core$Maybe$map, $rtfeldman$elm_css$Css$Structure$Output$pseudoElementToString, pseudoElement))+			]));+	return A2(+		$elm$core$String$append,+		A2(+			$elm$core$String$join,+			' ',+			A2(+				$elm$core$List$filter,+				A2($elm$core$Basics$composeL, $elm$core$Basics$not, $elm$core$String$isEmpty),+				segments)),+		pseudoElementsString);+};+var $rtfeldman$elm_css$Css$Structure$Output$prettyPrintStyleBlock = F2(+	function (indentLevel, _v0) {+		var firstSelector = _v0.a;+		var otherSelectors = _v0.b;+		var properties = _v0.c;+		var selectorStr = A2(+			$elm$core$String$join,+			', ',+			A2(+				$elm$core$List$map,+				$rtfeldman$elm_css$Css$Structure$Output$selectorToString,+				A2($elm$core$List$cons, firstSelector, otherSelectors)));+		return A2(+			$elm$core$String$join,+			'',+			_List_fromArray(+				[+					selectorStr,+					' {\n',+					indentLevel,+					$rtfeldman$elm_css$Css$Structure$Output$emitProperties(properties),+					'\n',+					indentLevel,+					'}'+				]));+	});+var $rtfeldman$elm_css$Css$Structure$Output$prettyPrintDeclaration = function (decl) {+	switch (decl.$) {+		case 'StyleBlockDeclaration':+			var styleBlock = decl.a;+			return A2($rtfeldman$elm_css$Css$Structure$Output$prettyPrintStyleBlock, $rtfeldman$elm_css$Css$Structure$Output$noIndent, styleBlock);+		case 'MediaRule':+			var mediaQueries = decl.a;+			var styleBlocks = decl.b;+			var query = A2(+				$elm$core$String$join,+				',\n',+				A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$mediaQueryToString, mediaQueries));+			var blocks = A2(+				$elm$core$String$join,+				'\n\n',+				A2(+					$elm$core$List$map,+					A2(+						$elm$core$Basics$composeL,+						$rtfeldman$elm_css$Css$Structure$Output$indent,+						$rtfeldman$elm_css$Css$Structure$Output$prettyPrintStyleBlock($rtfeldman$elm_css$Css$Structure$Output$spaceIndent)),+					styleBlocks));+			return '@media ' + (query + (' {\n' + (blocks + '\n}')));+		case 'SupportsRule':+			return 'TODO';+		case 'DocumentRule':+			return 'TODO';+		case 'PageRule':+			return 'TODO';+		case 'FontFace':+			return 'TODO';+		case 'Keyframes':+			var name = decl.a.name;+			var declaration = decl.a.declaration;+			return '@keyframes ' + (name + (' {\n' + (declaration + '\n}')));+		case 'Viewport':+			return 'TODO';+		case 'CounterStyle':+			return 'TODO';+		default:+			return 'TODO';+	}+};+var $rtfeldman$elm_css$Css$Structure$Output$prettyPrint = function (_v0) {+	var charset = _v0.charset;+	var imports = _v0.imports;+	var namespaces = _v0.namespaces;+	var declarations = _v0.declarations;+	return A2(+		$elm$core$String$join,+		'\n\n',+		A2(+			$elm$core$List$filter,+			A2($elm$core$Basics$composeL, $elm$core$Basics$not, $elm$core$String$isEmpty),+			_List_fromArray(+				[+					$rtfeldman$elm_css$Css$Structure$Output$charsetToString(charset),+					A2(+					$elm$core$String$join,+					'\n',+					A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$importToString, imports)),+					A2(+					$elm$core$String$join,+					'\n',+					A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$namespaceToString, namespaces)),+					A2(+					$elm$core$String$join,+					'\n\n',+					A2($elm$core$List$map, $rtfeldman$elm_css$Css$Structure$Output$prettyPrintDeclaration, declarations))+				])));+};+var $elm$core$List$concat = function (lists) {+	return A3($elm$core$List$foldr, $elm$core$List$append, _List_Nil, lists);+};+var $elm$core$List$concatMap = F2(+	function (f, list) {+		return $elm$core$List$concat(+			A2($elm$core$List$map, f, list));+	});+var $rtfeldman$elm_css$Css$Structure$CounterStyle = function (a) {+	return {$: 'CounterStyle', a: a};+};+var $rtfeldman$elm_css$Css$Structure$FontFace = function (a) {+	return {$: 'FontFace', a: a};+};+var $rtfeldman$elm_css$Css$Structure$PageRule = F2(+	function (a, b) {+		return {$: 'PageRule', a: a, b: b};+	});+var $rtfeldman$elm_css$Css$Structure$Selector = F3(+	function (a, b, c) {+		return {$: 'Selector', a: a, b: b, c: c};+	});+var $rtfeldman$elm_css$Css$Structure$StyleBlock = F3(+	function (a, b, c) {+		return {$: 'StyleBlock', a: a, b: b, c: c};+	});+var $rtfeldman$elm_css$Css$Structure$StyleBlockDeclaration = function (a) {+	return {$: 'StyleBlockDeclaration', a: a};+};+var $rtfeldman$elm_css$Css$Structure$SupportsRule = F2(+	function (a, b) {+		return {$: 'SupportsRule', a: a, b: b};+	});+var $rtfeldman$elm_css$Css$Structure$Viewport = function (a) {+	return {$: 'Viewport', a: a};+};+var $rtfeldman$elm_css$Css$Structure$MediaRule = F2(+	function (a, b) {+		return {$: 'MediaRule', a: a, b: b};+	});+var $rtfeldman$elm_css$Css$Structure$mapLast = F2(+	function (update, list) {+		if (!list.b) {+			return list;+		} else {+			if (!list.b.b) {+				var only = list.a;+				return _List_fromArray(+					[+						update(only)+					]);+			} else {+				var first = list.a;+				var rest = list.b;+				return A2(+					$elm$core$List$cons,+					first,+					A2($rtfeldman$elm_css$Css$Structure$mapLast, update, rest));+			}+		}+	});+var $rtfeldman$elm_css$Css$Structure$withPropertyAppended = F2(+	function (property, _v0) {+		var firstSelector = _v0.a;+		var otherSelectors = _v0.b;+		var properties = _v0.c;+		return A3(+			$rtfeldman$elm_css$Css$Structure$StyleBlock,+			firstSelector,+			otherSelectors,+			_Utils_ap(+				properties,+				_List_fromArray(+					[property])));+	});+var $rtfeldman$elm_css$Css$Structure$appendProperty = F2(+	function (property, declarations) {+		if (!declarations.b) {+			return declarations;+		} else {+			if (!declarations.b.b) {+				switch (declarations.a.$) {+					case 'StyleBlockDeclaration':+						var styleBlock = declarations.a.a;+						return _List_fromArray(+							[+								$rtfeldman$elm_css$Css$Structure$StyleBlockDeclaration(+								A2($rtfeldman$elm_css$Css$Structure$withPropertyAppended, property, styleBlock))+							]);+					case 'MediaRule':+						var _v1 = declarations.a;+						var mediaQueries = _v1.a;+						var styleBlocks = _v1.b;+						return _List_fromArray(+							[+								A2(+								$rtfeldman$elm_css$Css$Structure$MediaRule,+								mediaQueries,+								A2(+									$rtfeldman$elm_css$Css$Structure$mapLast,+									$rtfeldman$elm_css$Css$Structure$withPropertyAppended(property),+									styleBlocks))+							]);+					default:+						return declarations;+				}+			} else {+				var first = declarations.a;+				var rest = declarations.b;+				return A2(+					$elm$core$List$cons,+					first,+					A2($rtfeldman$elm_css$Css$Structure$appendProperty, property, rest));+			}+		}+	});+var $rtfeldman$elm_css$Css$Structure$appendToLastSelector = F2(+	function (f, styleBlock) {+		if (!styleBlock.b.b) {+			var only = styleBlock.a;+			var properties = styleBlock.c;+			return _List_fromArray(+				[+					A3($rtfeldman$elm_css$Css$Structure$StyleBlock, only, _List_Nil, properties),+					A3(+					$rtfeldman$elm_css$Css$Structure$StyleBlock,+					f(only),+					_List_Nil,+					_List_Nil)+				]);+		} else {+			var first = styleBlock.a;+			var rest = styleBlock.b;+			var properties = styleBlock.c;+			var newRest = A2($elm$core$List$map, f, rest);+			var newFirst = f(first);+			return _List_fromArray(+				[+					A3($rtfeldman$elm_css$Css$Structure$StyleBlock, first, rest, properties),+					A3($rtfeldman$elm_css$Css$Structure$StyleBlock, newFirst, newRest, _List_Nil)+				]);+		}+	});+var $rtfeldman$elm_css$Css$Structure$applyPseudoElement = F2(+	function (pseudo, _v0) {+		var sequence = _v0.a;+		var selectors = _v0.b;+		return A3(+			$rtfeldman$elm_css$Css$Structure$Selector,+			sequence,+			selectors,+			$elm$core$Maybe$Just(pseudo));+	});+var $rtfeldman$elm_css$Css$Structure$appendPseudoElementToLastSelector = F2(+	function (pseudo, styleBlock) {+		return A2(+			$rtfeldman$elm_css$Css$Structure$appendToLastSelector,+			$rtfeldman$elm_css$Css$Structure$applyPseudoElement(pseudo),+			styleBlock);+	});+var $rtfeldman$elm_css$Css$Structure$CustomSelector = F2(+	function (a, b) {+		return {$: 'CustomSelector', a: a, b: b};+	});+var $rtfeldman$elm_css$Css$Structure$TypeSelectorSequence = F2(+	function (a, b) {+		return {$: 'TypeSelectorSequence', a: a, b: b};+	});+var $rtfeldman$elm_css$Css$Structure$UniversalSelectorSequence = function (a) {+	return {$: 'UniversalSelectorSequence', a: a};+};+var $rtfeldman$elm_css$Css$Structure$appendRepeatable = F2(+	function (selector, sequence) {+		switch (sequence.$) {+			case 'TypeSelectorSequence':+				var typeSelector = sequence.a;+				var list = sequence.b;+				return A2(+					$rtfeldman$elm_css$Css$Structure$TypeSelectorSequence,+					typeSelector,+					_Utils_ap(+						list,+						_List_fromArray(+							[selector])));+			case 'UniversalSelectorSequence':+				var list = sequence.a;+				return $rtfeldman$elm_css$Css$Structure$UniversalSelectorSequence(+					_Utils_ap(+						list,+						_List_fromArray(+							[selector])));+			default:+				var str = sequence.a;+				var list = sequence.b;+				return A2(+					$rtfeldman$elm_css$Css$Structure$CustomSelector,+					str,+					_Utils_ap(+						list,+						_List_fromArray(+							[selector])));+		}+	});+var $rtfeldman$elm_css$Css$Structure$appendRepeatableWithCombinator = F2(+	function (selector, list) {+		if (!list.b) {+			return _List_Nil;+		} else {+			if (!list.b.b) {+				var _v1 = list.a;+				var combinator = _v1.a;+				var sequence = _v1.b;+				return _List_fromArray(+					[+						_Utils_Tuple2(+						combinator,+						A2($rtfeldman$elm_css$Css$Structure$appendRepeatable, selector, sequence))+					]);+			} else {+				var first = list.a;+				var rest = list.b;+				return A2(+					$elm$core$List$cons,+					first,+					A2($rtfeldman$elm_css$Css$Structure$appendRepeatableWithCombinator, selector, rest));+			}+		}+	});+var $rtfeldman$elm_css$Css$Structure$appendRepeatableSelector = F2(+	function (repeatableSimpleSelector, selector) {+		if (!selector.b.b) {+			var sequence = selector.a;+			var pseudoElement = selector.c;+			return A3(+				$rtfeldman$elm_css$Css$Structure$Selector,+				A2($rtfeldman$elm_css$Css$Structure$appendRepeatable, repeatableSimpleSelector, sequence),+				_List_Nil,+				pseudoElement);+		} else {+			var firstSelector = selector.a;+			var tuples = selector.b;+			var pseudoElement = selector.c;+			return A3(+				$rtfeldman$elm_css$Css$Structure$Selector,+				firstSelector,+				A2($rtfeldman$elm_css$Css$Structure$appendRepeatableWithCombinator, repeatableSimpleSelector, tuples),+				pseudoElement);+		}+	});+var $rtfeldman$elm_css$Css$Structure$appendRepeatableToLastSelector = F2(+	function (selector, styleBlock) {+		return A2(+			$rtfeldman$elm_css$Css$Structure$appendToLastSelector,+			$rtfeldman$elm_css$Css$Structure$appendRepeatableSelector(selector),+			styleBlock);+	});+var $rtfeldman$elm_css$Css$Preprocess$Resolve$collectSelectors = function (declarations) {+	collectSelectors:+	while (true) {+		if (!declarations.b) {+			return _List_Nil;+		} else {+			if (declarations.a.$ === 'StyleBlockDeclaration') {+				var _v1 = declarations.a.a;+				var firstSelector = _v1.a;+				var otherSelectors = _v1.b;+				var rest = declarations.b;+				return _Utils_ap(+					A2($elm$core$List$cons, firstSelector, otherSelectors),+					$rtfeldman$elm_css$Css$Preprocess$Resolve$collectSelectors(rest));+			} else {+				var rest = declarations.b;+				var $temp$declarations = rest;+				declarations = $temp$declarations;+				continue collectSelectors;+			}+		}+	}+};+var $rtfeldman$elm_css$Css$Structure$DocumentRule = F5(+	function (a, b, c, d, e) {+		return {$: 'DocumentRule', a: a, b: b, c: c, d: d, e: e};+	});+var $rtfeldman$elm_css$Css$Structure$concatMapLastStyleBlock = F2(+	function (update, declarations) {+		_v0$12:+		while (true) {+			if (!declarations.b) {+				return declarations;+			} else {+				if (!declarations.b.b) {+					switch (declarations.a.$) {+						case 'StyleBlockDeclaration':+							var styleBlock = declarations.a.a;+							return A2(+								$elm$core$List$map,+								$rtfeldman$elm_css$Css$Structure$StyleBlockDeclaration,+								update(styleBlock));+						case 'MediaRule':+							if (declarations.a.b.b) {+								if (!declarations.a.b.b.b) {+									var _v1 = declarations.a;+									var mediaQueries = _v1.a;+									var _v2 = _v1.b;+									var styleBlock = _v2.a;+									return _List_fromArray(+										[+											A2(+											$rtfeldman$elm_css$Css$Structure$MediaRule,+											mediaQueries,+											update(styleBlock))+										]);+								} else {+									var _v3 = declarations.a;+									var mediaQueries = _v3.a;+									var _v4 = _v3.b;+									var first = _v4.a;+									var rest = _v4.b;+									var _v5 = A2(+										$rtfeldman$elm_css$Css$Structure$concatMapLastStyleBlock,+										update,+										_List_fromArray(+											[+												A2($rtfeldman$elm_css$Css$Structure$MediaRule, mediaQueries, rest)+											]));+									if ((_v5.b && (_v5.a.$ === 'MediaRule')) && (!_v5.b.b)) {+										var _v6 = _v5.a;+										var newMediaQueries = _v6.a;+										var newStyleBlocks = _v6.b;+										return _List_fromArray(+											[+												A2(+												$rtfeldman$elm_css$Css$Structure$MediaRule,+												newMediaQueries,+												A2($elm$core$List$cons, first, newStyleBlocks))+											]);+									} else {+										var newDeclarations = _v5;+										return newDeclarations;+									}+								}+							} else {+								break _v0$12;+							}+						case 'SupportsRule':+							var _v7 = declarations.a;+							var str = _v7.a;+							var nestedDeclarations = _v7.b;+							return _List_fromArray(+								[+									A2(+									$rtfeldman$elm_css$Css$Structure$SupportsRule,+									str,+									A2($rtfeldman$elm_css$Css$Structure$concatMapLastStyleBlock, update, nestedDeclarations))+								]);+						case 'DocumentRule':+							var _v8 = declarations.a;+							var str1 = _v8.a;+							var str2 = _v8.b;+							var str3 = _v8.c;+							var str4 = _v8.d;+							var styleBlock = _v8.e;+							return A2(+								$elm$core$List$map,+								A4($rtfeldman$elm_css$Css$Structure$DocumentRule, str1, str2, str3, str4),+								update(styleBlock));+						case 'PageRule':+							var _v9 = declarations.a;+							return declarations;+						case 'FontFace':+							return declarations;+						case 'Keyframes':+							return declarations;+						case 'Viewport':+							return declarations;+						case 'CounterStyle':+							return declarations;+						default:+							return declarations;+					}+				} else {+					break _v0$12;+				}+			}+		}+		var first = declarations.a;+		var rest = declarations.b;+		return A2(+			$elm$core$List$cons,+			first,+			A2($rtfeldman$elm_css$Css$Structure$concatMapLastStyleBlock, update, rest));+	});+var $elm$core$String$cons = _String_cons;+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$HashData = F4(+	function (shift, seed, hash, charsProcessed) {+		return {charsProcessed: charsProcessed, hash: hash, seed: seed, shift: shift};+	});+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$c1 = 3432918353;+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$c2 = 461845907;+var $elm$core$Bitwise$and = _Bitwise_and;+var $elm$core$Bitwise$shiftLeftBy = _Bitwise_shiftLeftBy;+var $elm$core$Bitwise$shiftRightZfBy = _Bitwise_shiftRightZfBy;+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy = F2(+	function (b, a) {+		return ((a & 65535) * b) + ((((a >>> 16) * b) & 65535) << 16);+	});+var $elm$core$Basics$neq = _Utils_notEqual;+var $elm$core$Bitwise$or = _Bitwise_or;+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$rotlBy = F2(+	function (b, a) {+		return (a << b) | (a >>> (32 - b));+	});+var $elm$core$Bitwise$xor = _Bitwise_xor;+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$finalize = function (data) {+	var acc = (!(!data.hash)) ? (data.seed ^ A2(+		$rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy,+		$rtfeldman$elm_css$ElmCssVendor$Murmur3$c2,+		A2(+			$rtfeldman$elm_css$ElmCssVendor$Murmur3$rotlBy,+			15,+			A2($rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy, $rtfeldman$elm_css$ElmCssVendor$Murmur3$c1, data.hash)))) : data.seed;+	var h0 = acc ^ data.charsProcessed;+	var h1 = A2($rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy, 2246822507, h0 ^ (h0 >>> 16));+	var h2 = A2($rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy, 3266489909, h1 ^ (h1 >>> 13));+	return (h2 ^ (h2 >>> 16)) >>> 0;+};+var $elm$core$String$foldl = _String_foldl;+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$mix = F2(+	function (h1, k1) {+		return A2(+			$rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy,+			5,+			A2(+				$rtfeldman$elm_css$ElmCssVendor$Murmur3$rotlBy,+				13,+				h1 ^ A2(+					$rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy,+					$rtfeldman$elm_css$ElmCssVendor$Murmur3$c2,+					A2(+						$rtfeldman$elm_css$ElmCssVendor$Murmur3$rotlBy,+						15,+						A2($rtfeldman$elm_css$ElmCssVendor$Murmur3$multiplyBy, $rtfeldman$elm_css$ElmCssVendor$Murmur3$c1, k1))))) + 3864292196;+	});+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$hashFold = F2(+	function (c, data) {+		var res = data.hash | ((255 & $elm$core$Char$toCode(c)) << data.shift);+		var _v0 = data.shift;+		if (_v0 === 24) {+			return {+				charsProcessed: data.charsProcessed + 1,+				hash: 0,+				seed: A2($rtfeldman$elm_css$ElmCssVendor$Murmur3$mix, data.seed, res),+				shift: 0+			};+		} else {+			return {charsProcessed: data.charsProcessed + 1, hash: res, seed: data.seed, shift: data.shift + 8};+		}+	});+var $rtfeldman$elm_css$ElmCssVendor$Murmur3$hashString = F2(+	function (seed, str) {+		return $rtfeldman$elm_css$ElmCssVendor$Murmur3$finalize(+			A3(+				$elm$core$String$foldl,+				$rtfeldman$elm_css$ElmCssVendor$Murmur3$hashFold,+				A4($rtfeldman$elm_css$ElmCssVendor$Murmur3$HashData, 0, seed, 0, 0),+				str));+	});+var $rtfeldman$elm_css$Hash$murmurSeed = 15739;+var $elm$core$String$fromList = _String_fromList;+var $elm$core$Basics$negate = function (n) {+	return -n;+};+var $elm$core$Basics$modBy = _Basics_modBy;+var $rtfeldman$elm_hex$Hex$unsafeToDigit = function (num) {+	unsafeToDigit:+	while (true) {+		switch (num) {+			case 0:+				return _Utils_chr('0');+			case 1:+				return _Utils_chr('1');+			case 2:+				return _Utils_chr('2');+			case 3:+				return _Utils_chr('3');+			case 4:+				return _Utils_chr('4');+			case 5:+				return _Utils_chr('5');+			case 6:+				return _Utils_chr('6');+			case 7:+				return _Utils_chr('7');+			case 8:+				return _Utils_chr('8');+			case 9:+				return _Utils_chr('9');+			case 10:+				return _Utils_chr('a');+			case 11:+				return _Utils_chr('b');+			case 12:+				return _Utils_chr('c');+			case 13:+				return _Utils_chr('d');+			case 14:+				return _Utils_chr('e');+			case 15:+				return _Utils_chr('f');+			default:+				var $temp$num = num;+				num = $temp$num;+				continue unsafeToDigit;+		}+	}+};+var $rtfeldman$elm_hex$Hex$unsafePositiveToDigits = F2(+	function (digits, num) {+		unsafePositiveToDigits:+		while (true) {+			if (num < 16) {+				return A2(+					$elm$core$List$cons,+					$rtfeldman$elm_hex$Hex$unsafeToDigit(num),+					digits);+			} else {+				var $temp$digits = A2(+					$elm$core$List$cons,+					$rtfeldman$elm_hex$Hex$unsafeToDigit(+						A2($elm$core$Basics$modBy, 16, num)),+					digits),+					$temp$num = (num / 16) | 0;+				digits = $temp$digits;+				num = $temp$num;+				continue unsafePositiveToDigits;+			}+		}+	});+var $rtfeldman$elm_hex$Hex$toString = function (num) {+	return $elm$core$String$fromList(+		(num < 0) ? A2(+			$elm$core$List$cons,+			_Utils_chr('-'),+			A2($rtfeldman$elm_hex$Hex$unsafePositiveToDigits, _List_Nil, -num)) : A2($rtfeldman$elm_hex$Hex$unsafePositiveToDigits, _List_Nil, num));+};+var $rtfeldman$elm_css$Hash$fromString = function (str) {+	return A2(+		$elm$core$String$cons,+		_Utils_chr('_'),+		$rtfeldman$elm_hex$Hex$toString(+			A2($rtfeldman$elm_css$ElmCssVendor$Murmur3$hashString, $rtfeldman$elm_css$Hash$murmurSeed, str)));+};+var $elm$core$List$head = function (list) {+	if (list.b) {+		var x = list.a;+		var xs = list.b;+		return $elm$core$Maybe$Just(x);+	} else {+		return $elm$core$Maybe$Nothing;+	}+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$last = function (list) {+	last:+	while (true) {+		if (!list.b) {+			return $elm$core$Maybe$Nothing;+		} else {+			if (!list.b.b) {+				var singleton = list.a;+				return $elm$core$Maybe$Just(singleton);+			} else {+				var rest = list.b;+				var $temp$list = rest;+				list = $temp$list;+				continue last;+			}+		}+	}+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$lastDeclaration = function (declarations) {+	lastDeclaration:+	while (true) {+		if (!declarations.b) {+			return $elm$core$Maybe$Nothing;+		} else {+			if (!declarations.b.b) {+				var x = declarations.a;+				return $elm$core$Maybe$Just(+					_List_fromArray(+						[x]));+			} else {+				var xs = declarations.b;+				var $temp$declarations = xs;+				declarations = $temp$declarations;+				continue lastDeclaration;+			}+		}+	}+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$oneOf = function (maybes) {+	oneOf:+	while (true) {+		if (!maybes.b) {+			return $elm$core$Maybe$Nothing;+		} else {+			var maybe = maybes.a;+			var rest = maybes.b;+			if (maybe.$ === 'Nothing') {+				var $temp$maybes = rest;+				maybes = $temp$maybes;+				continue oneOf;+			} else {+				return maybe;+			}+		}+	}+};+var $rtfeldman$elm_css$Css$Structure$FontFeatureValues = function (a) {+	return {$: 'FontFeatureValues', a: a};+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$resolveFontFeatureValues = function (tuples) {+	var expandTuples = function (tuplesToExpand) {+		if (!tuplesToExpand.b) {+			return _List_Nil;+		} else {+			var properties = tuplesToExpand.a;+			var rest = tuplesToExpand.b;+			return A2(+				$elm$core$List$cons,+				properties,+				expandTuples(rest));+		}+	};+	var newTuples = expandTuples(tuples);+	return _List_fromArray(+		[+			$rtfeldman$elm_css$Css$Structure$FontFeatureValues(newTuples)+		]);+};+var $rtfeldman$elm_css$Css$Structure$styleBlockToMediaRule = F2(+	function (mediaQueries, declaration) {+		if (declaration.$ === 'StyleBlockDeclaration') {+			var styleBlock = declaration.a;+			return A2(+				$rtfeldman$elm_css$Css$Structure$MediaRule,+				mediaQueries,+				_List_fromArray(+					[styleBlock]));+		} else {+			return declaration;+		}+	});+var $elm$core$List$tail = function (list) {+	if (list.b) {+		var x = list.a;+		var xs = list.b;+		return $elm$core$Maybe$Just(xs);+	} else {+		return $elm$core$Maybe$Nothing;+	}+};+var $elm$core$List$takeReverse = F3(+	function (n, list, kept) {+		takeReverse:+		while (true) {+			if (n <= 0) {+				return kept;+			} else {+				if (!list.b) {+					return kept;+				} else {+					var x = list.a;+					var xs = list.b;+					var $temp$n = n - 1,+						$temp$list = xs,+						$temp$kept = A2($elm$core$List$cons, x, kept);+					n = $temp$n;+					list = $temp$list;+					kept = $temp$kept;+					continue takeReverse;+				}+			}+		}+	});+var $elm$core$List$takeTailRec = F2(+	function (n, list) {+		return $elm$core$List$reverse(+			A3($elm$core$List$takeReverse, n, list, _List_Nil));+	});+var $elm$core$List$takeFast = F3(+	function (ctr, n, list) {+		if (n <= 0) {+			return _List_Nil;+		} else {+			var _v0 = _Utils_Tuple2(n, list);+			_v0$1:+			while (true) {+				_v0$5:+				while (true) {+					if (!_v0.b.b) {+						return list;+					} else {+						if (_v0.b.b.b) {+							switch (_v0.a) {+								case 1:+									break _v0$1;+								case 2:+									var _v2 = _v0.b;+									var x = _v2.a;+									var _v3 = _v2.b;+									var y = _v3.a;+									return _List_fromArray(+										[x, y]);+								case 3:+									if (_v0.b.b.b.b) {+										var _v4 = _v0.b;+										var x = _v4.a;+										var _v5 = _v4.b;+										var y = _v5.a;+										var _v6 = _v5.b;+										var z = _v6.a;+										return _List_fromArray(+											[x, y, z]);+									} else {+										break _v0$5;+									}+								default:+									if (_v0.b.b.b.b && _v0.b.b.b.b.b) {+										var _v7 = _v0.b;+										var x = _v7.a;+										var _v8 = _v7.b;+										var y = _v8.a;+										var _v9 = _v8.b;+										var z = _v9.a;+										var _v10 = _v9.b;+										var w = _v10.a;+										var tl = _v10.b;+										return (ctr > 1000) ? A2(+											$elm$core$List$cons,+											x,+											A2(+												$elm$core$List$cons,+												y,+												A2(+													$elm$core$List$cons,+													z,+													A2(+														$elm$core$List$cons,+														w,+														A2($elm$core$List$takeTailRec, n - 4, tl))))) : A2(+											$elm$core$List$cons,+											x,+											A2(+												$elm$core$List$cons,+												y,+												A2(+													$elm$core$List$cons,+													z,+													A2(+														$elm$core$List$cons,+														w,+														A3($elm$core$List$takeFast, ctr + 1, n - 4, tl)))));+									} else {+										break _v0$5;+									}+							}+						} else {+							if (_v0.a === 1) {+								break _v0$1;+							} else {+								break _v0$5;+							}+						}+					}+				}+				return list;+			}+			var _v1 = _v0.b;+			var x = _v1.a;+			return _List_fromArray(+				[x]);+		}+	});+var $elm$core$List$take = F2(+	function (n, list) {+		return A3($elm$core$List$takeFast, 0, n, list);+	});+var $rtfeldman$elm_css$Css$Preprocess$Resolve$toDocumentRule = F5(+	function (str1, str2, str3, str4, declaration) {+		if (declaration.$ === 'StyleBlockDeclaration') {+			var structureStyleBlock = declaration.a;+			return A5($rtfeldman$elm_css$Css$Structure$DocumentRule, str1, str2, str3, str4, structureStyleBlock);+		} else {+			return declaration;+		}+	});+var $rtfeldman$elm_css$Css$Preprocess$Resolve$toMediaRule = F2(+	function (mediaQueries, declaration) {+		switch (declaration.$) {+			case 'StyleBlockDeclaration':+				var structureStyleBlock = declaration.a;+				return A2(+					$rtfeldman$elm_css$Css$Structure$MediaRule,+					mediaQueries,+					_List_fromArray(+						[structureStyleBlock]));+			case 'MediaRule':+				var newMediaQueries = declaration.a;+				var structureStyleBlocks = declaration.b;+				return A2(+					$rtfeldman$elm_css$Css$Structure$MediaRule,+					_Utils_ap(mediaQueries, newMediaQueries),+					structureStyleBlocks);+			case 'SupportsRule':+				var str = declaration.a;+				var declarations = declaration.b;+				return A2(+					$rtfeldman$elm_css$Css$Structure$SupportsRule,+					str,+					A2(+						$elm$core$List$map,+						$rtfeldman$elm_css$Css$Preprocess$Resolve$toMediaRule(mediaQueries),+						declarations));+			case 'DocumentRule':+				var str1 = declaration.a;+				var str2 = declaration.b;+				var str3 = declaration.c;+				var str4 = declaration.d;+				var structureStyleBlock = declaration.e;+				return A5($rtfeldman$elm_css$Css$Structure$DocumentRule, str1, str2, str3, str4, structureStyleBlock);+			case 'PageRule':+				return declaration;+			case 'FontFace':+				return declaration;+			case 'Keyframes':+				return declaration;+			case 'Viewport':+				return declaration;+			case 'CounterStyle':+				return declaration;+			default:+				return declaration;+		}+	});+var $rtfeldman$elm_css$Css$Preprocess$unwrapSnippet = function (_v0) {+	var declarations = _v0.a;+	return declarations;+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$applyNestedStylesToLast = F4(+	function (nestedStyles, rest, f, declarations) {+		var withoutParent = function (decls) {+			return A2(+				$elm$core$Maybe$withDefault,+				_List_Nil,+				$elm$core$List$tail(decls));+		};+		var nextResult = A2(+			$rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles,+			rest,+			A2(+				$elm$core$Maybe$withDefault,+				_List_Nil,+				$rtfeldman$elm_css$Css$Preprocess$Resolve$lastDeclaration(declarations)));+		var newDeclarations = function () {+			var _v14 = _Utils_Tuple2(+				$elm$core$List$head(nextResult),+				$rtfeldman$elm_css$Css$Preprocess$Resolve$last(declarations));+			if ((_v14.a.$ === 'Just') && (_v14.b.$ === 'Just')) {+				var nextResultParent = _v14.a.a;+				var originalParent = _v14.b.a;+				return _Utils_ap(+					A2(+						$elm$core$List$take,+						$elm$core$List$length(declarations) - 1,+						declarations),+					_List_fromArray(+						[+							(!_Utils_eq(originalParent, nextResultParent)) ? nextResultParent : originalParent+						]));+			} else {+				return declarations;+			}+		}();+		var insertStylesToNestedDecl = function (lastDecl) {+			return $elm$core$List$concat(+				A2(+					$rtfeldman$elm_css$Css$Structure$mapLast,+					$rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles(nestedStyles),+					A2(+						$elm$core$List$map,+						$elm$core$List$singleton,+						A2($rtfeldman$elm_css$Css$Structure$concatMapLastStyleBlock, f, lastDecl))));+		};+		var initialResult = A2(+			$elm$core$Maybe$withDefault,+			_List_Nil,+			A2(+				$elm$core$Maybe$map,+				insertStylesToNestedDecl,+				$rtfeldman$elm_css$Css$Preprocess$Resolve$lastDeclaration(declarations)));+		return _Utils_ap(+			newDeclarations,+			_Utils_ap(+				withoutParent(initialResult),+				withoutParent(nextResult)));+	});+var $rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles = F2(+	function (styles, declarations) {+		if (!styles.b) {+			return declarations;+		} else {+			switch (styles.a.$) {+				case 'AppendProperty':+					var property = styles.a.a;+					var rest = styles.b;+					return A2(+						$rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles,+						rest,+						A2($rtfeldman$elm_css$Css$Structure$appendProperty, property, declarations));+				case 'ExtendSelector':+					var _v4 = styles.a;+					var selector = _v4.a;+					var nestedStyles = _v4.b;+					var rest = styles.b;+					return A4(+						$rtfeldman$elm_css$Css$Preprocess$Resolve$applyNestedStylesToLast,+						nestedStyles,+						rest,+						$rtfeldman$elm_css$Css$Structure$appendRepeatableToLastSelector(selector),+						declarations);+				case 'NestSnippet':+					var _v5 = styles.a;+					var selectorCombinator = _v5.a;+					var snippets = _v5.b;+					var rest = styles.b;+					var chain = F2(+						function (_v9, _v10) {+							var originalSequence = _v9.a;+							var originalTuples = _v9.b;+							var originalPseudoElement = _v9.c;+							var newSequence = _v10.a;+							var newTuples = _v10.b;+							var newPseudoElement = _v10.c;+							return A3(+								$rtfeldman$elm_css$Css$Structure$Selector,+								originalSequence,+								_Utils_ap(+									originalTuples,+									A2(+										$elm$core$List$cons,+										_Utils_Tuple2(selectorCombinator, newSequence),+										newTuples)),+								$rtfeldman$elm_css$Css$Preprocess$Resolve$oneOf(+									_List_fromArray(+										[newPseudoElement, originalPseudoElement])));+						});+					var expandDeclaration = function (declaration) {+						switch (declaration.$) {+							case 'StyleBlockDeclaration':+								var _v7 = declaration.a;+								var firstSelector = _v7.a;+								var otherSelectors = _v7.b;+								var nestedStyles = _v7.c;+								var newSelectors = A2(+									$elm$core$List$concatMap,+									function (originalSelector) {+										return A2(+											$elm$core$List$map,+											chain(originalSelector),+											A2($elm$core$List$cons, firstSelector, otherSelectors));+									},+									$rtfeldman$elm_css$Css$Preprocess$Resolve$collectSelectors(declarations));+								var newDeclarations = function () {+									if (!newSelectors.b) {+										return _List_Nil;+									} else {+										var first = newSelectors.a;+										var remainder = newSelectors.b;+										return _List_fromArray(+											[+												$rtfeldman$elm_css$Css$Structure$StyleBlockDeclaration(+												A3($rtfeldman$elm_css$Css$Structure$StyleBlock, first, remainder, _List_Nil))+											]);+									}+								}();+								return A2($rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles, nestedStyles, newDeclarations);+							case 'MediaRule':+								var mediaQueries = declaration.a;+								var styleBlocks = declaration.b;+								return A2($rtfeldman$elm_css$Css$Preprocess$Resolve$resolveMediaRule, mediaQueries, styleBlocks);+							case 'SupportsRule':+								var str = declaration.a;+								var otherSnippets = declaration.b;+								return A2($rtfeldman$elm_css$Css$Preprocess$Resolve$resolveSupportsRule, str, otherSnippets);+							case 'DocumentRule':+								var str1 = declaration.a;+								var str2 = declaration.b;+								var str3 = declaration.c;+								var str4 = declaration.d;+								var styleBlock = declaration.e;+								return A2(+									$elm$core$List$map,+									A4($rtfeldman$elm_css$Css$Preprocess$Resolve$toDocumentRule, str1, str2, str3, str4),+									$rtfeldman$elm_css$Css$Preprocess$Resolve$expandStyleBlock(styleBlock));+							case 'PageRule':+								var str = declaration.a;+								var properties = declaration.b;+								return _List_fromArray(+									[+										A2($rtfeldman$elm_css$Css$Structure$PageRule, str, properties)+									]);+							case 'FontFace':+								var properties = declaration.a;+								return _List_fromArray(+									[+										$rtfeldman$elm_css$Css$Structure$FontFace(properties)+									]);+							case 'Viewport':+								var properties = declaration.a;+								return _List_fromArray(+									[+										$rtfeldman$elm_css$Css$Structure$Viewport(properties)+									]);+							case 'CounterStyle':+								var properties = declaration.a;+								return _List_fromArray(+									[+										$rtfeldman$elm_css$Css$Structure$CounterStyle(properties)+									]);+							default:+								var tuples = declaration.a;+								return $rtfeldman$elm_css$Css$Preprocess$Resolve$resolveFontFeatureValues(tuples);+						}+					};+					return $elm$core$List$concat(+						_Utils_ap(+							_List_fromArray(+								[+									A2($rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles, rest, declarations)+								]),+							A2(+								$elm$core$List$map,+								expandDeclaration,+								A2($elm$core$List$concatMap, $rtfeldman$elm_css$Css$Preprocess$unwrapSnippet, snippets))));+				case 'WithPseudoElement':+					var _v11 = styles.a;+					var pseudoElement = _v11.a;+					var nestedStyles = _v11.b;+					var rest = styles.b;+					return A4(+						$rtfeldman$elm_css$Css$Preprocess$Resolve$applyNestedStylesToLast,+						nestedStyles,+						rest,+						$rtfeldman$elm_css$Css$Structure$appendPseudoElementToLastSelector(pseudoElement),+						declarations);+				case 'WithKeyframes':+					var str = styles.a.a;+					var rest = styles.b;+					var name = $rtfeldman$elm_css$Hash$fromString(str);+					var newProperty = 'animation-name:' + name;+					var newDeclarations = A2(+						$rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles,+						rest,+						A2($rtfeldman$elm_css$Css$Structure$appendProperty, newProperty, declarations));+					return A2(+						$elm$core$List$append,+						newDeclarations,+						_List_fromArray(+							[+								$rtfeldman$elm_css$Css$Structure$Keyframes(+								{declaration: str, name: name})+							]));+				case 'WithMedia':+					var _v12 = styles.a;+					var mediaQueries = _v12.a;+					var nestedStyles = _v12.b;+					var rest = styles.b;+					var extraDeclarations = function () {+						var _v13 = $rtfeldman$elm_css$Css$Preprocess$Resolve$collectSelectors(declarations);+						if (!_v13.b) {+							return _List_Nil;+						} else {+							var firstSelector = _v13.a;+							var otherSelectors = _v13.b;+							return A2(+								$elm$core$List$map,+								$rtfeldman$elm_css$Css$Structure$styleBlockToMediaRule(mediaQueries),+								A2(+									$rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles,+									nestedStyles,+									$elm$core$List$singleton(+										$rtfeldman$elm_css$Css$Structure$StyleBlockDeclaration(+											A3($rtfeldman$elm_css$Css$Structure$StyleBlock, firstSelector, otherSelectors, _List_Nil)))));+						}+					}();+					return _Utils_ap(+						A2($rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles, rest, declarations),+						extraDeclarations);+				default:+					var otherStyles = styles.a.a;+					var rest = styles.b;+					return A2(+						$rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles,+						_Utils_ap(otherStyles, rest),+						declarations);+			}+		}+	});+var $rtfeldman$elm_css$Css$Preprocess$Resolve$expandStyleBlock = function (_v2) {+	var firstSelector = _v2.a;+	var otherSelectors = _v2.b;+	var styles = _v2.c;+	return A2(+		$rtfeldman$elm_css$Css$Preprocess$Resolve$applyStyles,+		styles,+		_List_fromArray(+			[+				$rtfeldman$elm_css$Css$Structure$StyleBlockDeclaration(+				A3($rtfeldman$elm_css$Css$Structure$StyleBlock, firstSelector, otherSelectors, _List_Nil))+			]));+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$extract = function (snippetDeclarations) {+	if (!snippetDeclarations.b) {+		return _List_Nil;+	} else {+		var first = snippetDeclarations.a;+		var rest = snippetDeclarations.b;+		return _Utils_ap(+			$rtfeldman$elm_css$Css$Preprocess$Resolve$toDeclarations(first),+			$rtfeldman$elm_css$Css$Preprocess$Resolve$extract(rest));+	}+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$resolveMediaRule = F2(+	function (mediaQueries, styleBlocks) {+		var handleStyleBlock = function (styleBlock) {+			return A2(+				$elm$core$List$map,+				$rtfeldman$elm_css$Css$Preprocess$Resolve$toMediaRule(mediaQueries),+				$rtfeldman$elm_css$Css$Preprocess$Resolve$expandStyleBlock(styleBlock));+		};+		return A2($elm$core$List$concatMap, handleStyleBlock, styleBlocks);+	});+var $rtfeldman$elm_css$Css$Preprocess$Resolve$resolveSupportsRule = F2(+	function (str, snippets) {+		var declarations = $rtfeldman$elm_css$Css$Preprocess$Resolve$extract(+			A2($elm$core$List$concatMap, $rtfeldman$elm_css$Css$Preprocess$unwrapSnippet, snippets));+		return _List_fromArray(+			[+				A2($rtfeldman$elm_css$Css$Structure$SupportsRule, str, declarations)+			]);+	});+var $rtfeldman$elm_css$Css$Preprocess$Resolve$toDeclarations = function (snippetDeclaration) {+	switch (snippetDeclaration.$) {+		case 'StyleBlockDeclaration':+			var styleBlock = snippetDeclaration.a;+			return $rtfeldman$elm_css$Css$Preprocess$Resolve$expandStyleBlock(styleBlock);+		case 'MediaRule':+			var mediaQueries = snippetDeclaration.a;+			var styleBlocks = snippetDeclaration.b;+			return A2($rtfeldman$elm_css$Css$Preprocess$Resolve$resolveMediaRule, mediaQueries, styleBlocks);+		case 'SupportsRule':+			var str = snippetDeclaration.a;+			var snippets = snippetDeclaration.b;+			return A2($rtfeldman$elm_css$Css$Preprocess$Resolve$resolveSupportsRule, str, snippets);+		case 'DocumentRule':+			var str1 = snippetDeclaration.a;+			var str2 = snippetDeclaration.b;+			var str3 = snippetDeclaration.c;+			var str4 = snippetDeclaration.d;+			var styleBlock = snippetDeclaration.e;+			return A2(+				$elm$core$List$map,+				A4($rtfeldman$elm_css$Css$Preprocess$Resolve$toDocumentRule, str1, str2, str3, str4),+				$rtfeldman$elm_css$Css$Preprocess$Resolve$expandStyleBlock(styleBlock));+		case 'PageRule':+			var str = snippetDeclaration.a;+			var properties = snippetDeclaration.b;+			return _List_fromArray(+				[+					A2($rtfeldman$elm_css$Css$Structure$PageRule, str, properties)+				]);+		case 'FontFace':+			var properties = snippetDeclaration.a;+			return _List_fromArray(+				[+					$rtfeldman$elm_css$Css$Structure$FontFace(properties)+				]);+		case 'Viewport':+			var properties = snippetDeclaration.a;+			return _List_fromArray(+				[+					$rtfeldman$elm_css$Css$Structure$Viewport(properties)+				]);+		case 'CounterStyle':+			var properties = snippetDeclaration.a;+			return _List_fromArray(+				[+					$rtfeldman$elm_css$Css$Structure$CounterStyle(properties)+				]);+		default:+			var tuples = snippetDeclaration.a;+			return $rtfeldman$elm_css$Css$Preprocess$Resolve$resolveFontFeatureValues(tuples);+	}+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$toStructure = function (_v0) {+	var charset = _v0.charset;+	var imports = _v0.imports;+	var namespaces = _v0.namespaces;+	var snippets = _v0.snippets;+	var declarations = $rtfeldman$elm_css$Css$Preprocess$Resolve$extract(+		A2($elm$core$List$concatMap, $rtfeldman$elm_css$Css$Preprocess$unwrapSnippet, snippets));+	return {charset: charset, declarations: declarations, imports: imports, namespaces: namespaces};+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$compileHelp = function (sheet) {+	return $rtfeldman$elm_css$Css$Structure$Output$prettyPrint(+		$rtfeldman$elm_css$Css$Structure$compactStylesheet(+			$rtfeldman$elm_css$Css$Preprocess$Resolve$toStructure(sheet)));+};+var $rtfeldman$elm_css$Css$Preprocess$Resolve$compile = function (styles) {+	return A2(+		$elm$core$String$join,+		'\n\n',+		A2($elm$core$List$map, $rtfeldman$elm_css$Css$Preprocess$Resolve$compileHelp, styles));+};+var $rtfeldman$elm_css$Css$Structure$ClassSelector = function (a) {+	return {$: 'ClassSelector', a: a};+};+var $rtfeldman$elm_css$Css$Preprocess$Snippet = function (a) {+	return {$: 'Snippet', a: a};+};+var $rtfeldman$elm_css$Css$Preprocess$StyleBlock = F3(+	function (a, b, c) {+		return {$: 'StyleBlock', a: a, b: b, c: c};+	});+var $rtfeldman$elm_css$Css$Preprocess$StyleBlockDeclaration = function (a) {+	return {$: 'StyleBlockDeclaration', a: a};+};+var $rtfeldman$elm_css$VirtualDom$Styled$makeSnippet = F2(+	function (styles, sequence) {+		var selector = A3($rtfeldman$elm_css$Css$Structure$Selector, sequence, _List_Nil, $elm$core$Maybe$Nothing);+		return $rtfeldman$elm_css$Css$Preprocess$Snippet(+			_List_fromArray(+				[+					$rtfeldman$elm_css$Css$Preprocess$StyleBlockDeclaration(+					A3($rtfeldman$elm_css$Css$Preprocess$StyleBlock, selector, _List_Nil, styles))+				]));+	});+var $rtfeldman$elm_css$VirtualDom$Styled$snippetFromPair = function (_v0) {+	var classname = _v0.a;+	var styles = _v0.b;+	return A2(+		$rtfeldman$elm_css$VirtualDom$Styled$makeSnippet,+		styles,+		$rtfeldman$elm_css$Css$Structure$UniversalSelectorSequence(+			_List_fromArray(+				[+					$rtfeldman$elm_css$Css$Structure$ClassSelector(classname)+				])));+};+var $rtfeldman$elm_css$Css$Preprocess$stylesheet = function (snippets) {+	return {charset: $elm$core$Maybe$Nothing, imports: _List_Nil, namespaces: _List_Nil, snippets: snippets};+};+var $rtfeldman$elm_css$VirtualDom$Styled$toDeclaration = function (dict) {+	return $rtfeldman$elm_css$Css$Preprocess$Resolve$compile(+		$elm$core$List$singleton(+			$rtfeldman$elm_css$Css$Preprocess$stylesheet(+				A2(+					$elm$core$List$map,+					$rtfeldman$elm_css$VirtualDom$Styled$snippetFromPair,+					$elm$core$Dict$toList(dict)))));+};+var $rtfeldman$elm_css$VirtualDom$Styled$toStyleNode = function (styles) {+	return A3(+		$elm$virtual_dom$VirtualDom$node,+		'style',+		_List_Nil,+		$elm$core$List$singleton(+			$elm$virtual_dom$VirtualDom$text(+				$rtfeldman$elm_css$VirtualDom$Styled$toDeclaration(styles))));+};+var $rtfeldman$elm_css$VirtualDom$Styled$unstyle = F3(+	function (elemType, properties, children) {+		var unstyledProperties = A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties);+		var initialStyles = $rtfeldman$elm_css$VirtualDom$Styled$stylesFromProperties(properties);+		var _v0 = A3(+			$elm$core$List$foldl,+			$rtfeldman$elm_css$VirtualDom$Styled$accumulateStyledHtml,+			_Utils_Tuple2(_List_Nil, initialStyles),+			children);+		var childNodes = _v0.a;+		var styles = _v0.b;+		var styleNode = $rtfeldman$elm_css$VirtualDom$Styled$toStyleNode(styles);+		return A3(+			$elm$virtual_dom$VirtualDom$node,+			elemType,+			unstyledProperties,+			A2(+				$elm$core$List$cons,+				styleNode,+				$elm$core$List$reverse(childNodes)));+	});+var $rtfeldman$elm_css$VirtualDom$Styled$containsKey = F2(+	function (key, pairs) {+		containsKey:+		while (true) {+			if (!pairs.b) {+				return false;+			} else {+				var _v1 = pairs.a;+				var str = _v1.a;+				var rest = pairs.b;+				if (_Utils_eq(key, str)) {+					return true;+				} else {+					var $temp$key = key,+						$temp$pairs = rest;+					key = $temp$key;+					pairs = $temp$pairs;+					continue containsKey;+				}+			}+		}+	});+var $rtfeldman$elm_css$VirtualDom$Styled$getUnusedKey = F2(+	function (_default, pairs) {+		getUnusedKey:+		while (true) {+			if (!pairs.b) {+				return _default;+			} else {+				var _v1 = pairs.a;+				var firstKey = _v1.a;+				var rest = pairs.b;+				var newKey = '_' + firstKey;+				if (A2($rtfeldman$elm_css$VirtualDom$Styled$containsKey, newKey, rest)) {+					var $temp$default = newKey,+						$temp$pairs = rest;+					_default = $temp$default;+					pairs = $temp$pairs;+					continue getUnusedKey;+				} else {+					return newKey;+				}+			}+		}+	});+var $rtfeldman$elm_css$VirtualDom$Styled$toKeyedStyleNode = F2(+	function (allStyles, keyedChildNodes) {+		var styleNodeKey = A2($rtfeldman$elm_css$VirtualDom$Styled$getUnusedKey, '_', keyedChildNodes);+		var finalNode = $rtfeldman$elm_css$VirtualDom$Styled$toStyleNode(allStyles);+		return _Utils_Tuple2(styleNodeKey, finalNode);+	});+var $rtfeldman$elm_css$VirtualDom$Styled$unstyleKeyed = F3(+	function (elemType, properties, keyedChildren) {+		var unstyledProperties = A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties);+		var initialStyles = $rtfeldman$elm_css$VirtualDom$Styled$stylesFromProperties(properties);+		var _v0 = A3(+			$elm$core$List$foldl,+			$rtfeldman$elm_css$VirtualDom$Styled$accumulateKeyedStyledHtml,+			_Utils_Tuple2(_List_Nil, initialStyles),+			keyedChildren);+		var keyedChildNodes = _v0.a;+		var styles = _v0.b;+		var keyedStyleNode = A2($rtfeldman$elm_css$VirtualDom$Styled$toKeyedStyleNode, styles, keyedChildNodes);+		return A3(+			$elm$virtual_dom$VirtualDom$keyedNode,+			elemType,+			unstyledProperties,+			A2(+				$elm$core$List$cons,+				keyedStyleNode,+				$elm$core$List$reverse(keyedChildNodes)));+	});+var $rtfeldman$elm_css$VirtualDom$Styled$unstyleKeyedNS = F4(+	function (ns, elemType, properties, keyedChildren) {+		var unstyledProperties = A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties);+		var initialStyles = $rtfeldman$elm_css$VirtualDom$Styled$stylesFromProperties(properties);+		var _v0 = A3(+			$elm$core$List$foldl,+			$rtfeldman$elm_css$VirtualDom$Styled$accumulateKeyedStyledHtml,+			_Utils_Tuple2(_List_Nil, initialStyles),+			keyedChildren);+		var keyedChildNodes = _v0.a;+		var styles = _v0.b;+		var keyedStyleNode = A2($rtfeldman$elm_css$VirtualDom$Styled$toKeyedStyleNode, styles, keyedChildNodes);+		return A4(+			$elm$virtual_dom$VirtualDom$keyedNodeNS,+			ns,+			elemType,+			unstyledProperties,+			A2(+				$elm$core$List$cons,+				keyedStyleNode,+				$elm$core$List$reverse(keyedChildNodes)));+	});+var $rtfeldman$elm_css$VirtualDom$Styled$unstyleNS = F4(+	function (ns, elemType, properties, children) {+		var unstyledProperties = A2($elm$core$List$map, $rtfeldman$elm_css$VirtualDom$Styled$extractUnstyledAttribute, properties);+		var initialStyles = $rtfeldman$elm_css$VirtualDom$Styled$stylesFromProperties(properties);+		var _v0 = A3(+			$elm$core$List$foldl,+			$rtfeldman$elm_css$VirtualDom$Styled$accumulateStyledHtml,+			_Utils_Tuple2(_List_Nil, initialStyles),+			children);+		var childNodes = _v0.a;+		var styles = _v0.b;+		var styleNode = $rtfeldman$elm_css$VirtualDom$Styled$toStyleNode(styles);+		return A4(+			$elm$virtual_dom$VirtualDom$nodeNS,+			ns,+			elemType,+			unstyledProperties,+			A2(+				$elm$core$List$cons,+				styleNode,+				$elm$core$List$reverse(childNodes)));+	});+var $rtfeldman$elm_css$VirtualDom$Styled$toUnstyled = function (vdom) {+	switch (vdom.$) {+		case 'Unstyled':+			var plainNode = vdom.a;+			return plainNode;+		case 'Node':+			var elemType = vdom.a;+			var properties = vdom.b;+			var children = vdom.c;+			return A3($rtfeldman$elm_css$VirtualDom$Styled$unstyle, elemType, properties, children);+		case 'NodeNS':+			var ns = vdom.a;+			var elemType = vdom.b;+			var properties = vdom.c;+			var children = vdom.d;+			return A4($rtfeldman$elm_css$VirtualDom$Styled$unstyleNS, ns, elemType, properties, children);+		case 'KeyedNode':+			var elemType = vdom.a;+			var properties = vdom.b;+			var children = vdom.c;+			return A3($rtfeldman$elm_css$VirtualDom$Styled$unstyleKeyed, elemType, properties, children);+		default:+			var ns = vdom.a;+			var elemType = vdom.b;+			var properties = vdom.c;+			var children = vdom.d;+			return A4($rtfeldman$elm_css$VirtualDom$Styled$unstyleKeyedNS, ns, elemType, properties, children);+	}+};+var $rtfeldman$elm_css$Html$Styled$toUnstyled = $rtfeldman$elm_css$VirtualDom$Styled$toUnstyled;+var $author$project$Main$Loaded = function (a) {+	return {$: 'Loaded', a: a};+};+var $author$project$Persisted$Persisted = function (a) {+	return {$: 'Persisted', a: a};+};+var $author$project$Persisted$init = function (x) {+	return $author$project$Persisted$Persisted(+		{local: x, persisted: x});+};+var $elm$core$Dict$map = F2(+	function (func, dict) {+		if (dict.$ === 'RBEmpty_elm_builtin') {+			return $elm$core$Dict$RBEmpty_elm_builtin;+		} else {+			var color = dict.a;+			var key = dict.b;+			var value = dict.c;+			var left = dict.d;+			var right = dict.e;+			return A5(+				$elm$core$Dict$RBNode_elm_builtin,+				color,+				key,+				A2(func, key, value),+				A2($elm$core$Dict$map, func, left),+				A2($elm$core$Dict$map, func, right));+		}+	});+var $elm$core$Platform$Cmd$batch = _Platform_batch;+var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil);+var $author$project$Persisted$changed = function (_v0) {+	var persisted = _v0.a.persisted;+	var local = _v0.a.local;+	return !_Utils_eq(local, persisted);+};+var $author$project$Persisted$persist = F2(+	function (x, _v0) {+		var old = _v0.a;+		return $author$project$Persisted$changed(+			$author$project$Persisted$Persisted(old)) ? $author$project$Persisted$Persisted(+			_Utils_update(+				old,+				{persisted: x})) : $author$project$Persisted$init(x);+	});+var $elm$http$Http$expectBytesResponse = F2(+	function (toMsg, toResult) {+		return A3(+			_Http_expect,+			'arraybuffer',+			_Http_toDataView,+			A2($elm$core$Basics$composeR, toResult, toMsg));+	});+var $elm$http$Http$expectWhatever = function (toMsg) {+	return A2(+		$elm$http$Http$expectBytesResponse,+		toMsg,+		$elm$http$Http$resolve(+			function (_v0) {+				return $elm$core$Result$Ok(_Utils_Tuple0);+			}));+};+var $elm$json$Json$Encode$int = _Json_wrap;+var $elm$http$Http$jsonBody = function (value) {+	return A2(+		_Http_pair,+		'application/json',+		A2($elm$json$Json$Encode$encode, 0, value));+};+var $author$project$Main$sendSaveFlagRequest = F3(+	function (rootPath, flagName, _v0) {+		var percentage = _v0.a;+		return $elm$http$Http$request(+			{+				body: $elm$http$Http$jsonBody(+					$elm$json$Json$Encode$int(percentage)),+				expect: $elm$http$Http$expectWhatever(+					function (_v1) {+						return $author$project$Main$LoadFlags;+					}),+				headers: _List_Nil,+				method: 'PUT',+				timeout: $elm$core$Maybe$Nothing,+				tracker: $elm$core$Maybe$Nothing,+				url: A2(+					$elm$url$Url$Builder$relative,+					_Utils_ap(+						rootPath,+						_List_fromArray(+							['flags', flagName])),+					_List_Nil)+			});+	});+var $author$project$Persisted$value = function (_v0) {+	var local = _v0.a.local;+	return local;+};+var $author$project$Main$saveFlag = F2(+	function (flagName, model) {+		var _v0 = model.data;+		if (_v0.$ === 'Loading') {+			return $elm$core$Platform$Cmd$none;+		} else {+			var flags = _v0.a;+			var _v1 = A2($elm$core$Dict$get, flagName, flags);+			if (_v1.$ === 'Nothing') {+				return $elm$core$Platform$Cmd$none;+			} else {+				var percentage = _v1.a;+				return $author$project$Persisted$changed(percentage) ? A3(+					$author$project$Main$sendSaveFlagRequest,+					model.rootPath,+					flagName,+					$author$project$Persisted$value(percentage)) : $elm$core$Platform$Cmd$none;+			}+		}+	});+var $author$project$Persisted$change = F2(+	function (x, _v0) {+		var persisted = _v0.a.persisted;+		return $author$project$Persisted$Persisted(+			{local: x, persisted: persisted});+	});+var $author$project$Main$setFlag = F3(+	function (flagName, newPercentage, data) {+		if (data.$ === 'Loading') {+			return $author$project$Main$Loading;+		} else {+			var flags = data.a;+			return $author$project$Main$Loaded(+				A3(+					$elm$core$Dict$update,+					flagName,+					$elm$core$Maybe$map(+						function (oldPercentage) {+							return A2($author$project$Persisted$change, newPercentage, oldPercentage);+						}),+					flags));+		}+	});+var $author$project$Main$updateData = F2(+	function (msg, model) {+		switch (msg.$) {+			case 'NoOp':+				return _Utils_Tuple2(model.data, $elm$core$Platform$Cmd$none);+			case 'LoadFlags':+				return _Utils_Tuple2(+					model.data,+					$author$project$Main$sendLoadFlagsRequest(model.rootPath));+			case 'LoadedFlags':+				var updatedFlags = msg.a;+				var _v1 = model.data;+				if (_v1.$ === 'Loading') {+					return _Utils_Tuple2(+						$author$project$Main$Loaded(+							A2(+								$elm$core$Dict$map,+								function (_v2) {+									return $author$project$Persisted$init;+								},+								updatedFlags)),+						$elm$core$Platform$Cmd$none);+				} else {+					var oldFlags = _v1.a;+					return _Utils_Tuple2(+						$author$project$Main$Loaded(+							A6(+								$elm$core$Dict$merge,+								F3(+									function (flag, oldValue, newFlags) {+										return A3($elm$core$Dict$insert, flag, oldValue, newFlags);+									}),+								F4(+									function (flag, oldValue, newValue, newFlags) {+										return A3(+											$elm$core$Dict$insert,+											flag,+											A2($author$project$Persisted$persist, newValue, oldValue),+											newFlags);+									}),+								F3(+									function (flag, firstValue, newFlags) {+										return A3(+											$elm$core$Dict$insert,+											flag,+											$author$project$Persisted$init(firstValue),+											newFlags);+									}),+								oldFlags,+								updatedFlags,+								$elm$core$Dict$empty)),+						$elm$core$Platform$Cmd$none);+				}+			default:+				var flagName = msg.a;+				var newPercentage = msg.b;+				var newData = A3($author$project$Main$setFlag, flagName, newPercentage, model.data);+				return _Utils_Tuple2(+					newData,+					A2(+						$author$project$Main$saveFlag,+						flagName,+						_Utils_update(+							model,+							{data: newData})));+		}+	});+var $author$project$Main$update = F2(+	function (msg, model) {+		var _v0 = A2($author$project$Main$updateData, msg, model);+		var newData = _v0.a;+		var cmd = _v0.b;+		return _Utils_Tuple2(+			_Utils_update(+				model,+				{data: newData}),+			cmd);+	});+var $rtfeldman$elm_css$Css$Structure$Compatible = {$: 'Compatible'};+var $rtfeldman$elm_css$Css$absolute = {position: $rtfeldman$elm_css$Css$Structure$Compatible, value: 'absolute'};+var $rtfeldman$elm_css$Css$Preprocess$AppendProperty = function (a) {+	return {$: 'AppendProperty', a: a};+};+var $rtfeldman$elm_css$Css$property = F2(+	function (key, value) {+		return $rtfeldman$elm_css$Css$Preprocess$AppendProperty(key + (':' + value));+	});+var $rtfeldman$elm_css$Css$backgroundColor = function (c) {+	return A2($rtfeldman$elm_css$Css$property, 'background-color', c.value);+};+var $rtfeldman$elm_css$Css$prop1 = F2(+	function (key, arg) {+		return A2($rtfeldman$elm_css$Css$property, key, arg.value);+	});+var $rtfeldman$elm_css$Css$center = $rtfeldman$elm_css$Css$prop1('center');+var $rtfeldman$elm_css$Css$color = function (c) {+	return A2($rtfeldman$elm_css$Css$property, 'color', c.value);+};+var $rtfeldman$elm_css$VirtualDom$Styled$Attribute = F3(+	function (a, b, c) {+		return {$: 'Attribute', a: a, b: b, c: c};+	});+var $rtfeldman$elm_css$VirtualDom$Styled$murmurSeed = 15739;+var $rtfeldman$elm_css$VirtualDom$Styled$getClassname = function (styles) {+	return $elm$core$List$isEmpty(styles) ? 'unstyled' : A2(+		$elm$core$String$cons,+		_Utils_chr('_'),+		$rtfeldman$elm_hex$Hex$toString(+			A2(+				$rtfeldman$elm_css$ElmCssVendor$Murmur3$hashString,+				$rtfeldman$elm_css$VirtualDom$Styled$murmurSeed,+				$rtfeldman$elm_css$Css$Preprocess$Resolve$compile(+					$elm$core$List$singleton(+						$rtfeldman$elm_css$Css$Preprocess$stylesheet(+							$elm$core$List$singleton(+								A2(+									$rtfeldman$elm_css$VirtualDom$Styled$makeSnippet,+									styles,+									$rtfeldman$elm_css$Css$Structure$UniversalSelectorSequence(_List_Nil)))))))));+};+var $elm$virtual_dom$VirtualDom$property = F2(+	function (key, value) {+		return A2(+			_VirtualDom_property,+			_VirtualDom_noInnerHtmlOrFormAction(key),+			_VirtualDom_noJavaScriptOrHtmlUri(value));+	});+var $elm$json$Json$Encode$string = _Json_wrap;+var $rtfeldman$elm_css$Html$Styled$Internal$css = function (styles) {+	var classname = $rtfeldman$elm_css$VirtualDom$Styled$getClassname(styles);+	var classProperty = A2(+		$elm$virtual_dom$VirtualDom$property,+		'className',+		$elm$json$Json$Encode$string(classname));+	return A3($rtfeldman$elm_css$VirtualDom$Styled$Attribute, classProperty, styles, classname);+};+var $rtfeldman$elm_css$Html$Styled$Attributes$css = $rtfeldman$elm_css$Html$Styled$Internal$css;+var $rtfeldman$elm_css$VirtualDom$Styled$Node = F3(+	function (a, b, c) {+		return {$: 'Node', a: a, b: b, c: c};+	});+var $rtfeldman$elm_css$VirtualDom$Styled$node = $rtfeldman$elm_css$VirtualDom$Styled$Node;+var $rtfeldman$elm_css$Html$Styled$node = $rtfeldman$elm_css$VirtualDom$Styled$node;+var $rtfeldman$elm_css$Html$Styled$div = $rtfeldman$elm_css$Html$Styled$node('div');+var $rtfeldman$elm_css$Css$stringsToValue = function (list) {+	return $elm$core$List$isEmpty(list) ? {value: 'none'} : {+		value: A2(+			$elm$core$String$join,+			', ',+			A2(+				$elm$core$List$map,+				function (s) {+					return s;+				},+				list))+	};+};+var $rtfeldman$elm_css$Css$fontFamilies = A2(+	$elm$core$Basics$composeL,+	$rtfeldman$elm_css$Css$prop1('font-family'),+	$rtfeldman$elm_css$Css$stringsToValue);+var $rtfeldman$elm_css$Html$Styled$h1 = $rtfeldman$elm_css$Html$Styled$node('h1');+var $rtfeldman$elm_css$Css$withPrecedingHash = function (str) {+	return A2($elm$core$String$startsWith, '#', str) ? str : A2(+		$elm$core$String$cons,+		_Utils_chr('#'),+		str);+};+var $rtfeldman$elm_css$Css$erroneousHex = function (str) {+	return {+		alpha: 1,+		blue: 0,+		color: $rtfeldman$elm_css$Css$Structure$Compatible,+		green: 0,+		red: 0,+		value: $rtfeldman$elm_css$Css$withPrecedingHash(str)+	};+};+var $elm$core$String$foldr = _String_foldr;+var $elm$core$String$toList = function (string) {+	return A3($elm$core$String$foldr, $elm$core$List$cons, _List_Nil, string);+};+var $elm$core$String$fromChar = function (_char) {+	return A2($elm$core$String$cons, _char, '');+};+var $elm$core$Basics$pow = _Basics_pow;+var $rtfeldman$elm_hex$Hex$fromStringHelp = F3(+	function (position, chars, accumulated) {+		fromStringHelp:+		while (true) {+			if (!chars.b) {+				return $elm$core$Result$Ok(accumulated);+			} else {+				var _char = chars.a;+				var rest = chars.b;+				switch (_char.valueOf()) {+					case '0':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated;+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '1':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + A2($elm$core$Basics$pow, 16, position);+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '2':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (2 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '3':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (3 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '4':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (4 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '5':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (5 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '6':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (6 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '7':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (7 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '8':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (8 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case '9':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (9 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case 'a':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (10 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case 'b':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (11 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case 'c':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (12 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case 'd':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (13 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case 'e':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (14 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					case 'f':+						var $temp$position = position - 1,+							$temp$chars = rest,+							$temp$accumulated = accumulated + (15 * A2($elm$core$Basics$pow, 16, position));+						position = $temp$position;+						chars = $temp$chars;+						accumulated = $temp$accumulated;+						continue fromStringHelp;+					default:+						var nonHex = _char;+						return $elm$core$Result$Err(+							$elm$core$String$fromChar(nonHex) + ' is not a valid hexadecimal character.');+				}+			}+		}+	});+var $elm$core$Result$map = F2(+	function (func, ra) {+		if (ra.$ === 'Ok') {+			var a = ra.a;+			return $elm$core$Result$Ok(+				func(a));+		} else {+			var e = ra.a;+			return $elm$core$Result$Err(e);+		}+	});+var $rtfeldman$elm_hex$Hex$fromString = function (str) {+	if ($elm$core$String$isEmpty(str)) {+		return $elm$core$Result$Err('Empty strings are not valid hexadecimal strings.');+	} else {+		var result = function () {+			if (A2($elm$core$String$startsWith, '-', str)) {+				var list = A2(+					$elm$core$Maybe$withDefault,+					_List_Nil,+					$elm$core$List$tail(+						$elm$core$String$toList(str)));+				return A2(+					$elm$core$Result$map,+					$elm$core$Basics$negate,+					A3(+						$rtfeldman$elm_hex$Hex$fromStringHelp,+						$elm$core$List$length(list) - 1,+						list,+						0));+			} else {+				return A3(+					$rtfeldman$elm_hex$Hex$fromStringHelp,+					$elm$core$String$length(str) - 1,+					$elm$core$String$toList(str),+					0);+			}+		}();+		var formatError = function (err) {+			return A2(+				$elm$core$String$join,+				' ',+				_List_fromArray(+					['\"' + (str + '\"'), 'is not a valid hexadecimal string because', err]));+		};+		return A2($elm$core$Result$mapError, formatError, result);+	}+};+var $elm$core$String$toLower = _String_toLower;+var $rtfeldman$elm_css$Css$validHex = F5(+	function (str, _v0, _v1, _v2, _v3) {+		var r1 = _v0.a;+		var r2 = _v0.b;+		var g1 = _v1.a;+		var g2 = _v1.b;+		var b1 = _v2.a;+		var b2 = _v2.b;+		var a1 = _v3.a;+		var a2 = _v3.b;+		var toResult = A2(+			$elm$core$Basics$composeR,+			$elm$core$String$fromList,+			A2($elm$core$Basics$composeR, $elm$core$String$toLower, $rtfeldman$elm_hex$Hex$fromString));+		var results = _Utils_Tuple2(+			_Utils_Tuple2(+				toResult(+					_List_fromArray(+						[r1, r2])),+				toResult(+					_List_fromArray(+						[g1, g2]))),+			_Utils_Tuple2(+				toResult(+					_List_fromArray(+						[b1, b2])),+				toResult(+					_List_fromArray(+						[a1, a2]))));+		if ((((results.a.a.$ === 'Ok') && (results.a.b.$ === 'Ok')) && (results.b.a.$ === 'Ok')) && (results.b.b.$ === 'Ok')) {+			var _v5 = results.a;+			var red = _v5.a.a;+			var green = _v5.b.a;+			var _v6 = results.b;+			var blue = _v6.a.a;+			var alpha = _v6.b.a;+			return {+				alpha: alpha / 255,+				blue: blue,+				color: $rtfeldman$elm_css$Css$Structure$Compatible,+				green: green,+				red: red,+				value: $rtfeldman$elm_css$Css$withPrecedingHash(str)+			};+		} else {+			return $rtfeldman$elm_css$Css$erroneousHex(str);+		}+	});+var $rtfeldman$elm_css$Css$hex = function (str) {+	var withoutHash = A2($elm$core$String$startsWith, '#', str) ? A2($elm$core$String$dropLeft, 1, str) : str;+	var _v0 = $elm$core$String$toList(withoutHash);+	_v0$4:+	while (true) {+		if ((_v0.b && _v0.b.b) && _v0.b.b.b) {+			if (!_v0.b.b.b.b) {+				var r = _v0.a;+				var _v1 = _v0.b;+				var g = _v1.a;+				var _v2 = _v1.b;+				var b = _v2.a;+				return A5(+					$rtfeldman$elm_css$Css$validHex,+					str,+					_Utils_Tuple2(r, r),+					_Utils_Tuple2(g, g),+					_Utils_Tuple2(b, b),+					_Utils_Tuple2(+						_Utils_chr('f'),+						_Utils_chr('f')));+			} else {+				if (!_v0.b.b.b.b.b) {+					var r = _v0.a;+					var _v3 = _v0.b;+					var g = _v3.a;+					var _v4 = _v3.b;+					var b = _v4.a;+					var _v5 = _v4.b;+					var a = _v5.a;+					return A5(+						$rtfeldman$elm_css$Css$validHex,+						str,+						_Utils_Tuple2(r, r),+						_Utils_Tuple2(g, g),+						_Utils_Tuple2(b, b),+						_Utils_Tuple2(a, a));+				} else {+					if (_v0.b.b.b.b.b.b) {+						if (!_v0.b.b.b.b.b.b.b) {+							var r1 = _v0.a;+							var _v6 = _v0.b;+							var r2 = _v6.a;+							var _v7 = _v6.b;+							var g1 = _v7.a;+							var _v8 = _v7.b;+							var g2 = _v8.a;+							var _v9 = _v8.b;+							var b1 = _v9.a;+							var _v10 = _v9.b;+							var b2 = _v10.a;+							return A5(+								$rtfeldman$elm_css$Css$validHex,+								str,+								_Utils_Tuple2(r1, r2),+								_Utils_Tuple2(g1, g2),+								_Utils_Tuple2(b1, b2),+								_Utils_Tuple2(+									_Utils_chr('f'),+									_Utils_chr('f')));+						} else {+							if (_v0.b.b.b.b.b.b.b.b && (!_v0.b.b.b.b.b.b.b.b.b)) {+								var r1 = _v0.a;+								var _v11 = _v0.b;+								var r2 = _v11.a;+								var _v12 = _v11.b;+								var g1 = _v12.a;+								var _v13 = _v12.b;+								var g2 = _v13.a;+								var _v14 = _v13.b;+								var b1 = _v14.a;+								var _v15 = _v14.b;+								var b2 = _v15.a;+								var _v16 = _v15.b;+								var a1 = _v16.a;+								var _v17 = _v16.b;+								var a2 = _v17.a;+								return A5(+									$rtfeldman$elm_css$Css$validHex,+									str,+									_Utils_Tuple2(r1, r2),+									_Utils_Tuple2(g1, g2),+									_Utils_Tuple2(b1, b2),+									_Utils_Tuple2(a1, a2));+							} else {+								break _v0$4;+							}+						}+					} else {+						break _v0$4;+					}+				}+			}+		} else {+			break _v0$4;+		}+	}+	return $rtfeldman$elm_css$Css$erroneousHex(str);+};+var $rtfeldman$elm_css$Css$minHeight = $rtfeldman$elm_css$Css$prop1('min-height');+var $rtfeldman$elm_css$Html$Styled$p = $rtfeldman$elm_css$Html$Styled$node('p');+var $rtfeldman$elm_css$Css$position = $rtfeldman$elm_css$Css$prop1('position');+var $rtfeldman$elm_css$VirtualDom$Styled$Unstyled = function (a) {+	return {$: 'Unstyled', a: a};+};+var $rtfeldman$elm_css$VirtualDom$Styled$text = function (str) {+	return $rtfeldman$elm_css$VirtualDom$Styled$Unstyled(+		$elm$virtual_dom$VirtualDom$text(str));+};+var $rtfeldman$elm_css$Html$Styled$text = $rtfeldman$elm_css$VirtualDom$Styled$text;+var $rtfeldman$elm_css$Css$Preprocess$ApplyStyles = function (a) {+	return {$: 'ApplyStyles', a: a};+};+var $rtfeldman$elm_css$Css$Internal$property = F2(+	function (key, value) {+		return $rtfeldman$elm_css$Css$Preprocess$AppendProperty(key + (':' + value));+	});+var $rtfeldman$elm_css$Css$Internal$getOverloadedProperty = F3(+	function (functionName, desiredKey, style) {+		getOverloadedProperty:+		while (true) {+			switch (style.$) {+				case 'AppendProperty':+					var str = style.a;+					var key = A2(+						$elm$core$Maybe$withDefault,+						'',+						$elm$core$List$head(+							A2($elm$core$String$split, ':', str)));+					return A2($rtfeldman$elm_css$Css$Internal$property, desiredKey, key);+				case 'ExtendSelector':+					var selector = style.a;+					return A2($rtfeldman$elm_css$Css$Internal$property, desiredKey, 'elm-css-error-cannot-apply-' + (functionName + '-with-inapplicable-Style-for-selector'));+				case 'NestSnippet':+					var combinator = style.a;+					return A2($rtfeldman$elm_css$Css$Internal$property, desiredKey, 'elm-css-error-cannot-apply-' + (functionName + '-with-inapplicable-Style-for-combinator'));+				case 'WithPseudoElement':+					var pseudoElement = style.a;+					return A2($rtfeldman$elm_css$Css$Internal$property, desiredKey, 'elm-css-error-cannot-apply-' + (functionName + '-with-inapplicable-Style-for-pseudo-element setter'));+				case 'WithMedia':+					return A2($rtfeldman$elm_css$Css$Internal$property, desiredKey, 'elm-css-error-cannot-apply-' + (functionName + '-with-inapplicable-Style-for-media-query'));+				case 'WithKeyframes':+					return A2($rtfeldman$elm_css$Css$Internal$property, desiredKey, 'elm-css-error-cannot-apply-' + (functionName + '-with-inapplicable-Style-for-keyframes'));+				default:+					if (!style.a.b) {+						return A2($rtfeldman$elm_css$Css$Internal$property, desiredKey, 'elm-css-error-cannot-apply-' + (functionName + '-with-empty-Style'));+					} else {+						if (!style.a.b.b) {+							var _v1 = style.a;+							var only = _v1.a;+							var $temp$functionName = functionName,+								$temp$desiredKey = desiredKey,+								$temp$style = only;+							functionName = $temp$functionName;+							desiredKey = $temp$desiredKey;+							style = $temp$style;+							continue getOverloadedProperty;+						} else {+							var _v2 = style.a;+							var first = _v2.a;+							var rest = _v2.b;+							var $temp$functionName = functionName,+								$temp$desiredKey = desiredKey,+								$temp$style = $rtfeldman$elm_css$Css$Preprocess$ApplyStyles(rest);+							functionName = $temp$functionName;+							desiredKey = $temp$desiredKey;+							style = $temp$style;+							continue getOverloadedProperty;+						}+					}+			}+		}+	});+var $rtfeldman$elm_css$Css$Internal$IncompatibleUnits = {$: 'IncompatibleUnits'};+var $elm$core$String$fromFloat = _String_fromNumber;+var $rtfeldman$elm_css$Css$Internal$lengthConverter = F3(+	function (units, unitLabel, numericValue) {+		return {+			absoluteLength: $rtfeldman$elm_css$Css$Structure$Compatible,+			calc: $rtfeldman$elm_css$Css$Structure$Compatible,+			flexBasis: $rtfeldman$elm_css$Css$Structure$Compatible,+			fontSize: $rtfeldman$elm_css$Css$Structure$Compatible,+			length: $rtfeldman$elm_css$Css$Structure$Compatible,+			lengthOrAuto: $rtfeldman$elm_css$Css$Structure$Compatible,+			lengthOrAutoOrCoverOrContain: $rtfeldman$elm_css$Css$Structure$Compatible,+			lengthOrMinMaxDimension: $rtfeldman$elm_css$Css$Structure$Compatible,+			lengthOrNone: $rtfeldman$elm_css$Css$Structure$Compatible,+			lengthOrNoneOrMinMaxDimension: $rtfeldman$elm_css$Css$Structure$Compatible,+			lengthOrNumber: $rtfeldman$elm_css$Css$Structure$Compatible,+			lengthOrNumberOrAutoOrNoneOrContent: $rtfeldman$elm_css$Css$Structure$Compatible,+			numericValue: numericValue,+			textIndent: $rtfeldman$elm_css$Css$Structure$Compatible,+			unitLabel: unitLabel,+			units: units,+			value: _Utils_ap(+				$elm$core$String$fromFloat(numericValue),+				unitLabel)+		};+	});+var $rtfeldman$elm_css$Css$Internal$lengthForOverloadedProperty = A3($rtfeldman$elm_css$Css$Internal$lengthConverter, $rtfeldman$elm_css$Css$Internal$IncompatibleUnits, '', 0);+var $rtfeldman$elm_css$Css$textAlign = function (fn) {+	return A3(+		$rtfeldman$elm_css$Css$Internal$getOverloadedProperty,+		'textAlign',+		'text-align',+		fn($rtfeldman$elm_css$Css$Internal$lengthForOverloadedProperty));+};+var $elm$core$Dict$values = function (dict) {+	return A3(+		$elm$core$Dict$foldr,+		F3(+			function (key, value, valueList) {+				return A2($elm$core$List$cons, value, valueList);+			}),+		_List_Nil,+		dict);+};+var $rtfeldman$elm_css$Css$VhUnits = {$: 'VhUnits'};+var $rtfeldman$elm_css$Css$vh = A2($rtfeldman$elm_css$Css$Internal$lengthConverter, $rtfeldman$elm_css$Css$VhUnits, 'vh');+var $author$project$Main$SetFlag = F2(+	function (a, b) {+		return {$: 'SetFlag', a: a, b: b};+	});+var $rtfeldman$elm_css$Css$Structure$PseudoElement = function (a) {+	return {$: 'PseudoElement', a: a};+};+var $rtfeldman$elm_css$Css$Preprocess$WithPseudoElement = F2(+	function (a, b) {+		return {$: 'WithPseudoElement', a: a, b: b};+	});+var $rtfeldman$elm_css$Css$pseudoElement = function (element) {+	return $rtfeldman$elm_css$Css$Preprocess$WithPseudoElement(+		$rtfeldman$elm_css$Css$Structure$PseudoElement(element));+};+var $rtfeldman$elm_css$Css$after = $rtfeldman$elm_css$Css$pseudoElement('after');+var $rtfeldman$elm_css$Css$batch = $rtfeldman$elm_css$Css$Preprocess$ApplyStyles;+var $rtfeldman$elm_css$Html$Styled$button = $rtfeldman$elm_css$Html$Styled$node('button');+var $rtfeldman$elm_css$Css$EmUnits = {$: 'EmUnits'};+var $rtfeldman$elm_css$Css$em = A2($rtfeldman$elm_css$Css$Internal$lengthConverter, $rtfeldman$elm_css$Css$EmUnits, 'em');+var $rtfeldman$elm_css$Css$fontSize = $rtfeldman$elm_css$Css$prop1('font-size');+var $rtfeldman$elm_css$Css$fontWeight = function (_v0) {+	var value = _v0.value;+	return A2($rtfeldman$elm_css$Css$property, 'font-weight', value);+};+var $rtfeldman$elm_css$Html$Styled$h2 = $rtfeldman$elm_css$Html$Styled$node('h2');+var $elm$core$Basics$clamp = F3(+	function (low, high, number) {+		return (_Utils_cmp(number, low) < 0) ? low : ((_Utils_cmp(number, high) > 0) ? high : number);+	});+var $elm$core$Basics$round = _Basics_round;+var $author$project$Main$handleFlagValue = F2(+	function (flagName, newValue) {+		return A2(+			$author$project$Main$SetFlag,+			flagName,+			$author$project$Main$Percentage(+				A3(+					$elm$core$Basics$clamp,+					0,+					100,+					$elm$core$Basics$round(newValue))));+	});+var $rtfeldman$elm_css$Html$Styled$input = $rtfeldman$elm_css$Html$Styled$node('input');+var $rtfeldman$elm_css$Css$prop3 = F4(+	function (key, argA, argB, argC) {+		return A2(+			$rtfeldman$elm_css$Css$property,+			key,+			A2(+				$elm$core$String$join,+				' ',+				_List_fromArray(+					[argA.value, argB.value, argC.value])));+	});+var $rtfeldman$elm_css$Css$border3 = $rtfeldman$elm_css$Css$prop3('border');+var $rtfeldman$elm_css$Css$borderBox = {backgroundClip: $rtfeldman$elm_css$Css$Structure$Compatible, boxSizing: $rtfeldman$elm_css$Css$Structure$Compatible, value: 'border-box'};+var $rtfeldman$elm_css$Css$borderRadius = $rtfeldman$elm_css$Css$prop1('border-radius');+var $rtfeldman$elm_css$Css$boxSizing = $rtfeldman$elm_css$Css$prop1('box-sizing');+var $rtfeldman$elm_css$Css$height = $rtfeldman$elm_css$Css$prop1('height');+var $rtfeldman$elm_css$Css$PxUnits = {$: 'PxUnits'};+var $rtfeldman$elm_css$Css$px = A2($rtfeldman$elm_css$Css$Internal$lengthConverter, $rtfeldman$elm_css$Css$PxUnits, 'px');+var $rtfeldman$elm_css$Css$solid = {borderStyle: $rtfeldman$elm_css$Css$Structure$Compatible, textDecorationStyle: $rtfeldman$elm_css$Css$Structure$Compatible, value: 'solid'};+var $author$project$Main$inputStyle = $rtfeldman$elm_css$Css$batch(+	_List_fromArray(+		[+			$rtfeldman$elm_css$Css$fontSize(+			$rtfeldman$elm_css$Css$em(1.1)),+			$rtfeldman$elm_css$Css$height(+			$rtfeldman$elm_css$Css$em(1.6)),+			A3(+			$rtfeldman$elm_css$Css$border3,+			$rtfeldman$elm_css$Css$px(1),+			$rtfeldman$elm_css$Css$solid,+			$rtfeldman$elm_css$Css$hex('#ccc')),+			$rtfeldman$elm_css$Css$borderRadius(+			$rtfeldman$elm_css$Css$px(2)),+			$rtfeldman$elm_css$Css$textAlign($rtfeldman$elm_css$Css$center),+			$rtfeldman$elm_css$Css$boxSizing($rtfeldman$elm_css$Css$borderBox),+			$rtfeldman$elm_css$Css$backgroundColor(+			$rtfeldman$elm_css$Css$hex('#fefefe'))+		]));+var $elm$virtual_dom$VirtualDom$lazy2 = _VirtualDom_lazy2;+var $rtfeldman$elm_css$VirtualDom$Styled$lazyHelp = F2(+	function (fn, arg) {+		return $rtfeldman$elm_css$VirtualDom$Styled$toUnstyled(+			fn(arg));+	});+var $rtfeldman$elm_css$VirtualDom$Styled$lazy = F2(+	function (fn, arg) {+		return $rtfeldman$elm_css$VirtualDom$Styled$Unstyled(+			A3($elm$virtual_dom$VirtualDom$lazy2, $rtfeldman$elm_css$VirtualDom$Styled$lazyHelp, fn, arg));+	});+var $rtfeldman$elm_css$Html$Styled$Lazy$lazy = $rtfeldman$elm_css$VirtualDom$Styled$lazy;+var $rtfeldman$elm_css$Css$prop2 = F3(+	function (key, argA, argB) {+		return A2(+			$rtfeldman$elm_css$Css$property,+			key,+			A2(+				$elm$core$String$join,+				' ',+				_List_fromArray(+					[argA.value, argB.value])));+	});+var $rtfeldman$elm_css$Css$margin2 = $rtfeldman$elm_css$Css$prop2('margin');+var $rtfeldman$elm_css$Css$prop4 = F5(+	function (key, argA, argB, argC, argD) {+		return A2(+			$rtfeldman$elm_css$Css$property,+			key,+			A2(+				$elm$core$String$join,+				' ',+				_List_fromArray(+					[argA.value, argB.value, argC.value, argD.value])));+	});+var $rtfeldman$elm_css$Css$margin4 = $rtfeldman$elm_css$Css$prop4('margin');+var $rtfeldman$elm_css$VirtualDom$Styled$property = F2(+	function (key, value) {+		return A3(+			$rtfeldman$elm_css$VirtualDom$Styled$Attribute,+			A2($elm$virtual_dom$VirtualDom$property, key, value),+			_List_Nil,+			'');+	});+var $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty = F2(+	function (key, string) {+		return A2(+			$rtfeldman$elm_css$VirtualDom$Styled$property,+			key,+			$elm$json$Json$Encode$string(string));+	});+var $rtfeldman$elm_css$Html$Styled$Attributes$max = $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty('max');+var $rtfeldman$elm_css$Html$Styled$Attributes$min = $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty('min');+var $rtfeldman$elm_css$Css$normal = {featureTagValue: $rtfeldman$elm_css$Css$Structure$Compatible, fontStyle: $rtfeldman$elm_css$Css$Structure$Compatible, fontWeight: $rtfeldman$elm_css$Css$Structure$Compatible, overflowWrap: $rtfeldman$elm_css$Css$Structure$Compatible, value: 'normal', whiteSpace: $rtfeldman$elm_css$Css$Structure$Compatible};+var $elm$virtual_dom$VirtualDom$Normal = function (a) {+	return {$: 'Normal', a: a};+};+var $elm$virtual_dom$VirtualDom$on = _VirtualDom_on;+var $rtfeldman$elm_css$VirtualDom$Styled$on = F2(+	function (eventName, handler) {+		return A3(+			$rtfeldman$elm_css$VirtualDom$Styled$Attribute,+			A2($elm$virtual_dom$VirtualDom$on, eventName, handler),+			_List_Nil,+			'');+	});+var $rtfeldman$elm_css$Html$Styled$Events$on = F2(+	function (event, decoder) {+		return A2(+			$rtfeldman$elm_css$VirtualDom$Styled$on,+			event,+			$elm$virtual_dom$VirtualDom$Normal(decoder));+	});+var $rtfeldman$elm_css$Html$Styled$Events$onClick = function (msg) {+	return A2(+		$rtfeldman$elm_css$Html$Styled$Events$on,+		'click',+		$elm$json$Json$Decode$succeed(msg));+};+var $rtfeldman$elm_css$Css$padding = $rtfeldman$elm_css$Css$prop1('padding');+var $rtfeldman$elm_css$Html$Styled$section = $rtfeldman$elm_css$Html$Styled$node('section');+var $rtfeldman$elm_css$Html$Styled$Attributes$step = function (n) {+	return A2($rtfeldman$elm_css$Html$Styled$Attributes$stringProperty, 'step', n);+};+var $elm$json$Json$Decode$andThen = _Json_andThen;+var $elm$json$Json$Decode$fail = _Json_fail;+var $elm$json$Json$Decode$field = _Json_decodeField;+var $elm$json$Json$Decode$at = F2(+	function (fields, decoder) {+		return A3($elm$core$List$foldr, $elm$json$Json$Decode$field, decoder, fields);+	});+var $elm$json$Json$Decode$string = _Json_decodeString;+var $rtfeldman$elm_css$Html$Styled$Events$targetValue = A2(+	$elm$json$Json$Decode$at,+	_List_fromArray(+		['target', 'value']),+	$elm$json$Json$Decode$string);+var $elm$core$String$toFloat = _String_toFloat;+var $author$project$Main$targetValueNumber = A2(+	$elm$json$Json$Decode$andThen,+	function (str) {+		var _v0 = $elm$core$String$toFloat(str);+		if (_v0.$ === 'Nothing') {+			return $elm$json$Json$Decode$fail('Expected a number');+		} else {+			var _float = _v0.a;+			return $elm$json$Json$Decode$succeed(_float);+		}+	},+	$rtfeldman$elm_css$Html$Styled$Events$targetValue);+var $elm$core$Char$toUpper = _Char_toUpper;+var $author$project$CaseConversion$capitalize = function (original) {+	var _v0 = $elm$core$String$uncons(original);+	if (_v0.$ === 'Nothing') {+		return original;+	} else {+		var _v1 = _v0.a;+		var first = _v1.a;+		var rest = _v1.b;+		return A2(+			$elm$core$String$cons,+			$elm$core$Char$toUpper(first),+			rest);+	}+};+var $elm$parser$Parser$Done = function (a) {+	return {$: 'Done', a: a};+};+var $elm$parser$Parser$Loop = function (a) {+	return {$: 'Loop', a: a};+};+var $elm$parser$Parser$Advanced$Parser = function (a) {+	return {$: 'Parser', a: a};+};+var $elm$parser$Parser$Advanced$Bad = F2(+	function (a, b) {+		return {$: 'Bad', a: a, b: b};+	});+var $elm$parser$Parser$Advanced$Good = F3(+	function (a, b, c) {+		return {$: 'Good', a: a, b: b, c: c};+	});+var $elm$parser$Parser$Advanced$loopHelp = F4(+	function (p, state, callback, s0) {+		loopHelp:+		while (true) {+			var _v0 = callback(state);+			var parse = _v0.a;+			var _v1 = parse(s0);+			if (_v1.$ === 'Good') {+				var p1 = _v1.a;+				var step = _v1.b;+				var s1 = _v1.c;+				if (step.$ === 'Loop') {+					var newState = step.a;+					var $temp$p = p || p1,+						$temp$state = newState,+						$temp$callback = callback,+						$temp$s0 = s1;+					p = $temp$p;+					state = $temp$state;+					callback = $temp$callback;+					s0 = $temp$s0;+					continue loopHelp;+				} else {+					var result = step.a;+					return A3($elm$parser$Parser$Advanced$Good, p || p1, result, s1);+				}+			} else {+				var p1 = _v1.a;+				var x = _v1.b;+				return A2($elm$parser$Parser$Advanced$Bad, p || p1, x);+			}+		}+	});+var $elm$parser$Parser$Advanced$loop = F2(+	function (state, callback) {+		return $elm$parser$Parser$Advanced$Parser(+			function (s) {+				return A4($elm$parser$Parser$Advanced$loopHelp, false, state, callback, s);+			});+	});+var $elm$parser$Parser$Advanced$map = F2(+	function (func, _v0) {+		var parse = _v0.a;+		return $elm$parser$Parser$Advanced$Parser(+			function (s0) {+				var _v1 = parse(s0);+				if (_v1.$ === 'Good') {+					var p = _v1.a;+					var a = _v1.b;+					var s1 = _v1.c;+					return A3(+						$elm$parser$Parser$Advanced$Good,+						p,+						func(a),+						s1);+				} else {+					var p = _v1.a;+					var x = _v1.b;+					return A2($elm$parser$Parser$Advanced$Bad, p, x);+				}+			});+	});+var $elm$parser$Parser$map = $elm$parser$Parser$Advanced$map;+var $elm$parser$Parser$Advanced$Done = function (a) {+	return {$: 'Done', a: a};+};+var $elm$parser$Parser$Advanced$Loop = function (a) {+	return {$: 'Loop', a: a};+};+var $elm$parser$Parser$toAdvancedStep = function (step) {+	if (step.$ === 'Loop') {+		var s = step.a;+		return $elm$parser$Parser$Advanced$Loop(s);+	} else {+		var a = step.a;+		return $elm$parser$Parser$Advanced$Done(a);+	}+};+var $elm$parser$Parser$loop = F2(+	function (state, callback) {+		return A2(+			$elm$parser$Parser$Advanced$loop,+			state,+			function (s) {+				return A2(+					$elm$parser$Parser$map,+					$elm$parser$Parser$toAdvancedStep,+					callback(s));+			});+	});+var $elm$parser$Parser$Advanced$Empty = {$: 'Empty'};+var $elm$parser$Parser$Advanced$Append = F2(+	function (a, b) {+		return {$: 'Append', a: a, b: b};+	});+var $elm$parser$Parser$Advanced$oneOfHelp = F3(+	function (s0, bag, parsers) {+		oneOfHelp:+		while (true) {+			if (!parsers.b) {+				return A2($elm$parser$Parser$Advanced$Bad, false, bag);+			} else {+				var parse = parsers.a.a;+				var remainingParsers = parsers.b;+				var _v1 = parse(s0);+				if (_v1.$ === 'Good') {+					var step = _v1;+					return step;+				} else {+					var step = _v1;+					var p = step.a;+					var x = step.b;+					if (p) {+						return step;+					} else {+						var $temp$s0 = s0,+							$temp$bag = A2($elm$parser$Parser$Advanced$Append, bag, x),+							$temp$parsers = remainingParsers;+						s0 = $temp$s0;+						bag = $temp$bag;+						parsers = $temp$parsers;+						continue oneOfHelp;+					}+				}+			}+		}+	});+var $elm$parser$Parser$Advanced$oneOf = function (parsers) {+	return $elm$parser$Parser$Advanced$Parser(+		function (s) {+			return A3($elm$parser$Parser$Advanced$oneOfHelp, s, $elm$parser$Parser$Advanced$Empty, parsers);+		});+};+var $elm$parser$Parser$oneOf = $elm$parser$Parser$Advanced$oneOf;+var $elm$parser$Parser$DeadEnd = F3(+	function (row, col, problem) {+		return {col: col, problem: problem, row: row};+	});+var $elm$parser$Parser$problemToDeadEnd = function (p) {+	return A3($elm$parser$Parser$DeadEnd, p.row, p.col, p.problem);+};+var $elm$parser$Parser$Advanced$bagToList = F2(+	function (bag, list) {+		bagToList:+		while (true) {+			switch (bag.$) {+				case 'Empty':+					return list;+				case 'AddRight':+					var bag1 = bag.a;+					var x = bag.b;+					var $temp$bag = bag1,+						$temp$list = A2($elm$core$List$cons, x, list);+					bag = $temp$bag;+					list = $temp$list;+					continue bagToList;+				default:+					var bag1 = bag.a;+					var bag2 = bag.b;+					var $temp$bag = bag1,+						$temp$list = A2($elm$parser$Parser$Advanced$bagToList, bag2, list);+					bag = $temp$bag;+					list = $temp$list;+					continue bagToList;+			}+		}+	});+var $elm$parser$Parser$Advanced$run = F2(+	function (_v0, src) {+		var parse = _v0.a;+		var _v1 = parse(+			{col: 1, context: _List_Nil, indent: 1, offset: 0, row: 1, src: src});+		if (_v1.$ === 'Good') {+			var value = _v1.b;+			return $elm$core$Result$Ok(value);+		} else {+			var bag = _v1.b;+			return $elm$core$Result$Err(+				A2($elm$parser$Parser$Advanced$bagToList, bag, _List_Nil));+		}+	});+var $elm$parser$Parser$run = F2(+	function (parser, source) {+		var _v0 = A2($elm$parser$Parser$Advanced$run, parser, source);+		if (_v0.$ === 'Ok') {+			var a = _v0.a;+			return $elm$core$Result$Ok(a);+		} else {+			var problems = _v0.a;+			return $elm$core$Result$Err(+				A2($elm$core$List$map, $elm$parser$Parser$problemToDeadEnd, problems));+		}+	});+var $elm$parser$Parser$Advanced$succeed = function (a) {+	return $elm$parser$Parser$Advanced$Parser(+		function (s) {+			return A3($elm$parser$Parser$Advanced$Good, false, a, s);+		});+};+var $elm$parser$Parser$succeed = $elm$parser$Parser$Advanced$succeed;+var $elm$parser$Parser$UnexpectedChar = {$: 'UnexpectedChar'};+var $elm$parser$Parser$Advanced$AddRight = F2(+	function (a, b) {+		return {$: 'AddRight', a: a, b: b};+	});+var $elm$parser$Parser$Advanced$DeadEnd = F4(+	function (row, col, problem, contextStack) {+		return {col: col, contextStack: contextStack, problem: problem, row: row};+	});+var $elm$parser$Parser$Advanced$fromState = F2(+	function (s, x) {+		return A2(+			$elm$parser$Parser$Advanced$AddRight,+			$elm$parser$Parser$Advanced$Empty,+			A4($elm$parser$Parser$Advanced$DeadEnd, s.row, s.col, x, s.context));+	});+var $elm$parser$Parser$Advanced$isSubChar = _Parser_isSubChar;+var $elm$parser$Parser$Advanced$chompIf = F2(+	function (isGood, expecting) {+		return $elm$parser$Parser$Advanced$Parser(+			function (s) {+				var newOffset = A3($elm$parser$Parser$Advanced$isSubChar, isGood, s.offset, s.src);+				return _Utils_eq(newOffset, -1) ? A2(+					$elm$parser$Parser$Advanced$Bad,+					false,+					A2($elm$parser$Parser$Advanced$fromState, s, expecting)) : (_Utils_eq(newOffset, -2) ? A3(+					$elm$parser$Parser$Advanced$Good,+					true,+					_Utils_Tuple0,+					{col: 1, context: s.context, indent: s.indent, offset: s.offset + 1, row: s.row + 1, src: s.src}) : A3(+					$elm$parser$Parser$Advanced$Good,+					true,+					_Utils_Tuple0,+					{col: s.col + 1, context: s.context, indent: s.indent, offset: newOffset, row: s.row, src: s.src}));+			});+	});+var $elm$parser$Parser$chompIf = function (isGood) {+	return A2($elm$parser$Parser$Advanced$chompIf, isGood, $elm$parser$Parser$UnexpectedChar);+};+var $elm$parser$Parser$Advanced$chompWhileHelp = F5(+	function (isGood, offset, row, col, s0) {+		chompWhileHelp:+		while (true) {+			var newOffset = A3($elm$parser$Parser$Advanced$isSubChar, isGood, offset, s0.src);+			if (_Utils_eq(newOffset, -1)) {+				return A3(+					$elm$parser$Parser$Advanced$Good,+					_Utils_cmp(s0.offset, offset) < 0,+					_Utils_Tuple0,+					{col: col, context: s0.context, indent: s0.indent, offset: offset, row: row, src: s0.src});+			} else {+				if (_Utils_eq(newOffset, -2)) {+					var $temp$isGood = isGood,+						$temp$offset = offset + 1,+						$temp$row = row + 1,+						$temp$col = 1,+						$temp$s0 = s0;+					isGood = $temp$isGood;+					offset = $temp$offset;+					row = $temp$row;+					col = $temp$col;+					s0 = $temp$s0;+					continue chompWhileHelp;+				} else {+					var $temp$isGood = isGood,+						$temp$offset = newOffset,+						$temp$row = row,+						$temp$col = col + 1,+						$temp$s0 = s0;+					isGood = $temp$isGood;+					offset = $temp$offset;+					row = $temp$row;+					col = $temp$col;+					s0 = $temp$s0;+					continue chompWhileHelp;+				}+			}+		}+	});+var $elm$parser$Parser$Advanced$chompWhile = function (isGood) {+	return $elm$parser$Parser$Advanced$Parser(+		function (s) {+			return A5($elm$parser$Parser$Advanced$chompWhileHelp, isGood, s.offset, s.row, s.col, s);+		});+};+var $elm$parser$Parser$chompWhile = $elm$parser$Parser$Advanced$chompWhile;+var $elm$core$Basics$always = F2(+	function (a, _v0) {+		return a;+	});+var $elm$parser$Parser$Advanced$mapChompedString = F2(+	function (func, _v0) {+		var parse = _v0.a;+		return $elm$parser$Parser$Advanced$Parser(+			function (s0) {+				var _v1 = parse(s0);+				if (_v1.$ === 'Bad') {+					var p = _v1.a;+					var x = _v1.b;+					return A2($elm$parser$Parser$Advanced$Bad, p, x);+				} else {+					var p = _v1.a;+					var a = _v1.b;+					var s1 = _v1.c;+					return A3(+						$elm$parser$Parser$Advanced$Good,+						p,+						A2(+							func,+							A3($elm$core$String$slice, s0.offset, s1.offset, s0.src),+							a),+						s1);+				}+			});+	});+var $elm$parser$Parser$Advanced$getChompedString = function (parser) {+	return A2($elm$parser$Parser$Advanced$mapChompedString, $elm$core$Basics$always, parser);+};+var $elm$parser$Parser$getChompedString = $elm$parser$Parser$Advanced$getChompedString;+var $elm$parser$Parser$Advanced$map2 = F3(+	function (func, _v0, _v1) {+		var parseA = _v0.a;+		var parseB = _v1.a;+		return $elm$parser$Parser$Advanced$Parser(+			function (s0) {+				var _v2 = parseA(s0);+				if (_v2.$ === 'Bad') {+					var p = _v2.a;+					var x = _v2.b;+					return A2($elm$parser$Parser$Advanced$Bad, p, x);+				} else {+					var p1 = _v2.a;+					var a = _v2.b;+					var s1 = _v2.c;+					var _v3 = parseB(s1);+					if (_v3.$ === 'Bad') {+						var p2 = _v3.a;+						var x = _v3.b;+						return A2($elm$parser$Parser$Advanced$Bad, p1 || p2, x);+					} else {+						var p2 = _v3.a;+						var b = _v3.b;+						var s2 = _v3.c;+						return A3(+							$elm$parser$Parser$Advanced$Good,+							p1 || p2,+							A2(func, a, b),+							s2);+					}+				}+			});+	});+var $elm$parser$Parser$Advanced$ignorer = F2(+	function (keepParser, ignoreParser) {+		return A3($elm$parser$Parser$Advanced$map2, $elm$core$Basics$always, keepParser, ignoreParser);+	});+var $elm$parser$Parser$ignorer = $elm$parser$Parser$Advanced$ignorer;+var $author$project$CaseConversion$isWhitespace = function (c) {+	return _Utils_eq(+		c,+		_Utils_chr(' ')) || (_Utils_eq(+		c,+		_Utils_chr('\n')) || (_Utils_eq(+		c,+		_Utils_chr('\u000D')) || _Utils_eq(+		c,+		_Utils_chr('_'))));+};+var $elm$parser$Parser$Advanced$keeper = F2(+	function (parseFunc, parseArg) {+		return A3($elm$parser$Parser$Advanced$map2, $elm$core$Basics$apL, parseFunc, parseArg);+	});+var $elm$parser$Parser$keeper = $elm$parser$Parser$Advanced$keeper;+var $author$project$CaseConversion$startsWord = function (c) {+	return !($author$project$CaseConversion$isWhitespace(c) || ($elm$core$Char$isUpper(c) || $elm$core$Char$isDigit(c)));+};+var $author$project$CaseConversion$word = A2(+	$elm$parser$Parser$keeper,+	A2(+		$elm$parser$Parser$ignorer,+		$elm$parser$Parser$succeed($elm$core$Basics$identity),+		$elm$parser$Parser$chompWhile($author$project$CaseConversion$isWhitespace)),+	A2(+		$elm$parser$Parser$ignorer,+		$elm$parser$Parser$getChompedString(+			A2(+				$elm$parser$Parser$ignorer,+				A2(+					$elm$parser$Parser$ignorer,+					$elm$parser$Parser$succeed(_Utils_Tuple0),+					$elm$parser$Parser$chompIf(+						A2($elm$core$Basics$composeL, $elm$core$Basics$not, $author$project$CaseConversion$isWhitespace))),+				$elm$parser$Parser$chompWhile($author$project$CaseConversion$startsWord))),+		$elm$parser$Parser$chompWhile($author$project$CaseConversion$isWhitespace)));+var $author$project$CaseConversion$words = function (string) {+	var parser = A2(+		$elm$parser$Parser$loop,+		_List_Nil,+		function (words_) {+			return $elm$parser$Parser$oneOf(+				_List_fromArray(+					[+						A2(+						$elm$parser$Parser$map,+						function (word_) {+							return $elm$parser$Parser$Loop(+								A2($elm$core$List$cons, word_, words_));+						},+						$author$project$CaseConversion$word),+						$elm$parser$Parser$succeed(+						$elm$parser$Parser$Done(words_))+					]));+		});+	var _v0 = A2($elm$parser$Parser$run, parser, string);+	if (_v0.$ === 'Err') {+		return _List_fromArray(+			[string]);+	} else {+		var words_ = _v0.a;+		return words_;+	}+};+var $author$project$CaseConversion$toSpaceCase = function (original) {+	return A2(+		$elm$core$String$join,+		' ',+		A2(+			$elm$core$List$map,+			$author$project$CaseConversion$capitalize,+			$elm$core$List$reverse(+				$author$project$CaseConversion$words(original))));+};+var $rtfeldman$elm_css$Html$Styled$Attributes$type_ = $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty('type');+var $rtfeldman$elm_css$Html$Styled$Attributes$value = $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty('value');+var $rtfeldman$elm_css$Css$width = $rtfeldman$elm_css$Css$prop1('width');+var $rtfeldman$elm_css$Css$UnitlessInteger = {$: 'UnitlessInteger'};+var $rtfeldman$elm_css$Css$zero = {length: $rtfeldman$elm_css$Css$Structure$Compatible, lengthOrAuto: $rtfeldman$elm_css$Css$Structure$Compatible, lengthOrAutoOrCoverOrContain: $rtfeldman$elm_css$Css$Structure$Compatible, lengthOrMinMaxDimension: $rtfeldman$elm_css$Css$Structure$Compatible, lengthOrNone: $rtfeldman$elm_css$Css$Structure$Compatible, lengthOrNoneOrMinMaxDimension: $rtfeldman$elm_css$Css$Structure$Compatible, lengthOrNumber: $rtfeldman$elm_css$Css$Structure$Compatible, number: $rtfeldman$elm_css$Css$Structure$Compatible, numericValue: 0, outline: $rtfeldman$elm_css$Css$Structure$Compatible, unitLabel: '', units: $rtfeldman$elm_css$Css$UnitlessInteger, value: '0'};+var $author$project$Main$viewFlag = F2(+	function (name, percentage) {+		var _v0 = $author$project$Persisted$value(percentage);+		var current = _v0.a;+		return A2(+			$rtfeldman$elm_css$Html$Styled$section,+			_List_fromArray(+				[+					$rtfeldman$elm_css$Html$Styled$Attributes$css(+					_List_fromArray(+						[+							function () {+							var _v1 = $author$project$Persisted$value(percentage);+							switch (_v1.a) {+								case 0:+									return $rtfeldman$elm_css$Css$batch(_List_Nil);+								case 100:+									return $rtfeldman$elm_css$Css$batch(+										_List_fromArray(+											[+												$rtfeldman$elm_css$Css$backgroundColor(+												$rtfeldman$elm_css$Css$hex('#C1F0C1'))+											]));+								default:+									return $rtfeldman$elm_css$Css$batch(+										_List_fromArray(+											[+												$rtfeldman$elm_css$Css$backgroundColor(+												$rtfeldman$elm_css$Css$hex('#F0EEC1'))+											]));+							}+						}(),+							$rtfeldman$elm_css$Css$padding(+							$rtfeldman$elm_css$Css$px(10))+						]))+				]),+			_List_fromArray(+				[+					A2(+					$rtfeldman$elm_css$Html$Styled$h2,+					_List_fromArray(+						[+							$rtfeldman$elm_css$Html$Styled$Attributes$css(+							_List_fromArray(+								[+									$rtfeldman$elm_css$Css$fontWeight($rtfeldman$elm_css$Css$normal),+									$rtfeldman$elm_css$Css$fontSize(+									$rtfeldman$elm_css$Css$em(1.4)),+									A4(+									$rtfeldman$elm_css$Css$margin4,+									$rtfeldman$elm_css$Css$zero,+									$rtfeldman$elm_css$Css$zero,+									$rtfeldman$elm_css$Css$em(0.5),+									$rtfeldman$elm_css$Css$zero)+								]))+						]),+					_List_fromArray(+						[+							A2(+							$rtfeldman$elm_css$Html$Styled$Lazy$lazy,+							A2($elm$core$Basics$composeL, $rtfeldman$elm_css$Html$Styled$text, $author$project$CaseConversion$toSpaceCase),+							name)+						])),+					A2(+					$rtfeldman$elm_css$Html$Styled$button,+					_List_fromArray(+						[+							$rtfeldman$elm_css$Html$Styled$Attributes$css(+							_List_fromArray(+								[$author$project$Main$inputStyle])),+							$rtfeldman$elm_css$Html$Styled$Events$onClick(+							A2(+								$author$project$Main$SetFlag,+								name,+								$author$project$Main$Percentage(0)))+						]),+					_List_fromArray(+						[+							$rtfeldman$elm_css$Html$Styled$text('❌')+						])),+					A2(+					$rtfeldman$elm_css$Html$Styled$input,+					_List_fromArray(+						[+							$rtfeldman$elm_css$Html$Styled$Attributes$value(+							$elm$core$String$fromInt(current)),+							$rtfeldman$elm_css$Html$Styled$Attributes$type_('number'),+							$rtfeldman$elm_css$Html$Styled$Attributes$min('0'),+							$rtfeldman$elm_css$Html$Styled$Attributes$max('100'),+							$rtfeldman$elm_css$Html$Styled$Attributes$step('1'),+							$rtfeldman$elm_css$Html$Styled$Attributes$css(+							_List_fromArray(+								[+									$author$project$Main$inputStyle,+									$rtfeldman$elm_css$Css$width(+									$rtfeldman$elm_css$Css$px(60)),+									A2(+									$rtfeldman$elm_css$Css$margin2,+									$rtfeldman$elm_css$Css$zero,+									$rtfeldman$elm_css$Css$px(10)),+									$rtfeldman$elm_css$Css$after(+									_List_fromArray(+										[+											A2($rtfeldman$elm_css$Css$property, 'content', '%')+										]))+								])),+							A2(+							$rtfeldman$elm_css$Html$Styled$Events$on,+							'input',+							A2(+								$elm$json$Json$Decode$map,+								$author$project$Main$handleFlagValue(name),+								$author$project$Main$targetValueNumber))+						]),+					_List_Nil),+					A2(+					$rtfeldman$elm_css$Html$Styled$button,+					_List_fromArray(+						[+							$rtfeldman$elm_css$Html$Styled$Attributes$css(+							_List_fromArray(+								[$author$project$Main$inputStyle])),+							$rtfeldman$elm_css$Html$Styled$Events$onClick(+							A2(+								$author$project$Main$SetFlag,+								name,+								$author$project$Main$Percentage(100)))+						]),+					_List_fromArray(+						[+							$rtfeldman$elm_css$Html$Styled$text('✅')+						]))+				]));+	});+var $rtfeldman$elm_css$Css$VwUnits = {$: 'VwUnits'};+var $rtfeldman$elm_css$Css$vw = A2($rtfeldman$elm_css$Css$Internal$lengthConverter, $rtfeldman$elm_css$Css$VwUnits, 'vw');+var $author$project$Main$view = function (model) {+	return A2(+		$rtfeldman$elm_css$Html$Styled$div,+		_List_fromArray(+			[+				$rtfeldman$elm_css$Html$Styled$Attributes$css(+				_List_fromArray(+					[+						$rtfeldman$elm_css$Css$textAlign($rtfeldman$elm_css$Css$center),+						$rtfeldman$elm_css$Css$fontFamilies(+						_List_fromArray(+							['Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif'])),+						$rtfeldman$elm_css$Css$color(+						$rtfeldman$elm_css$Css$hex('#333')),+						$rtfeldman$elm_css$Css$backgroundColor(+						$rtfeldman$elm_css$Css$hex('#fefefe')),+						$rtfeldman$elm_css$Css$position($rtfeldman$elm_css$Css$absolute),+						$rtfeldman$elm_css$Css$minHeight(+						$rtfeldman$elm_css$Css$vh(100)),+						$rtfeldman$elm_css$Css$width(+						$rtfeldman$elm_css$Css$vw(100))+					]))+			]),+		A2(+			$elm$core$List$cons,+			A2(+				$rtfeldman$elm_css$Html$Styled$h1,+				_List_Nil,+				_List_fromArray(+					[+						$rtfeldman$elm_css$Html$Styled$text('Feature Flags')+					])),+			function () {+				var _v0 = model.data;+				if (_v0.$ === 'Loading') {+					return _List_fromArray(+						[+							$rtfeldman$elm_css$Html$Styled$text('Loading...')+						]);+				} else {+					var flags = _v0.a;+					return A2(+						$elm$core$List$cons,+						A2(+							$rtfeldman$elm_css$Html$Styled$p,+							_List_Nil,+							_List_fromArray(+								[+									$rtfeldman$elm_css$Html$Styled$text('Every feature flag can be completely enabled, completely disabled, or enabled for a percentage of traffic.')+								])),+						$elm$core$Dict$values(+							A2($elm$core$Dict$map, $author$project$Main$viewFlag, flags)));+				}+			}()));+};+var $author$project$Main$main = $elm$browser$Browser$application(+	{+		init: F3(+			function (_v0, url, _v1) {+				var rootPath = A2($elm$core$String$split, '/', url.path);+				return _Utils_Tuple2(+					{data: $author$project$Main$Loading, rootPath: rootPath},+					$author$project$Main$sendLoadFlagsRequest(rootPath));+			}),+		onUrlChange: function (_v2) {+			return $author$project$Main$NoOp;+		},+		onUrlRequest: function (_v3) {+			return $author$project$Main$NoOp;+		},+		subscriptions: function (_v4) {+			return A2(+				$elm$time$Time$every,+				5 * 1000,+				function (_v5) {+					return $author$project$Main$LoadFlags;+				});+		},+		update: $author$project$Main$update,+		view: function (model) {+			return {+				body: _List_fromArray(+					[+						$rtfeldman$elm_css$Html$Styled$toUnstyled(+						$author$project$Main$view(model))+					]),+				title: 'Feature Flags'+			};+		}+	});+_Platform_export({'Main':{'init':$author$project$Main$main(+	$elm$json$Json$Decode$succeed(_Utils_Tuple0))(0)}});}(this));++  var app = Elm.Main.init({ node: document.getElementById("elm") });+}+catch (e)+{+  // display initialization errors (e.g. bad flags, infinite recursion)+  var header = document.createElement("h1");+  header.style.fontFamily = "monospace";+  header.innerText = "Initialization Error";+  var pre = document.getElementById("elm");+  document.body.insertBefore(header, pre);+  pre.innerText = e;+  throw e;+}+</script>++</body>+</html>
+ src/Network/FeatureFlags.hs view
@@ -0,0 +1,276 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE UndecidableInstances #-}++-- | Use feature flags in WAI applications.+--+-- A feature flag is a way to toggle functionality on or off without having to+-- redeploy the application. Feature flags have many possible uses, one is+-- making it safer to release new functionality by providing a way to turn it+-- off immediately if it misbehaves.+--+-- An application using this library first needs to define which feature flags+-- is supports. This is done by creating a record type containing only boolean+-- fields and adding a 'Flags' instance to it.+--+-- > data Features+-- >   = Features+-- >       { openWindow :: Bool,+-- >         feedPigeons :: Bool+-- >       }+-- >   deriving (Generic)+-- >+-- > instance Flags Features+--+-- Then we need a place to persist flag data. This library provides a+-- 'memoryStore' but it doesn't remember flag states across restarts. For+-- production applications it's probably best to implement a 'Store' that reads+-- and writes flag data to the database or key,value store backing your project.+--+-- 'mkApplication' provides a frontend from which each feature flag can be+-- fully enabled, fully disabled, or enabled for a specific percentage of+-- traffic. It is compatible with @Wai@-based web frameworks like @spock@,+-- @scotty@, and @servant@. Setup instructions will be different for each. If+-- you're having trouble integrating this in your choice of web framework please+-- feel free to [open an issue](https://github.com/jwoudenberg/wai-feature-flags/issues).+--+-- Now you're all set up. You can use 'fetch' to read your feature flags from+-- your store and can use their values in conditionals. For a full example check+-- out this [sample application](https://github.com/jwoudenberg/wai-feature-flags/blob/trunk/example-app/Main.hs).+module Network.FeatureFlags+  ( -- * Flags+    Flags,+    fetch,++    -- * Store+    Store (..),+    memoryStore,++    -- * Feature flag frontend+    mkApplication,+  )+where++import qualified Data.Aeson as Aeson+import Data.Bifunctor (first)+import qualified Data.ByteString as B+import qualified Data.HashMap.Strict as Map+import qualified Data.IORef as IORef+import Data.Kind (Type)+import qualified Data.Maybe as Maybe+import Data.Proxy (Proxy (Proxy))+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE+import qualified Data.Text.Read as Read+import qualified Data.Word as Word+import qualified Debug.Trace as Debug+import GHC.Generics+import GHC.TypeLits (ErrorMessage (..), KnownSymbol, TypeError, symbolVal)+import qualified Network.Wai as Wai+import qualified Paths_wai_feature_flags as Paths+import System.Random (StdGen, getStdRandom, randomR)++-- FRONTEND++-- | Create a WAI application that serves a frontend for modifying feature flag+-- states. How you embed this into your real application depends on the web+-- framework you're using.+mkApplication :: Flags flags => Store flags -> IO Wai.Application+mkApplication store =+  application store <$> Paths.getDataFileName "frontend/index.html"++application :: Flags flags => Store flags -> FilePath -> Wai.Application+application store frontend req respond = do+  case (Wai.requestMethod req, Wai.pathInfo req) of+    ("GET", []) ->+      respond $+        Wai.responseFile+          (toEnum 200)+          [("Content-Type", "text/html; charset=UTF-8")]+          frontend+          Nothing+    ("GET", ["flags"]) -> do+      configs <- readFlagConfigs (flags store) store+      respond $+        Wai.responseLBS+          (toEnum 200)+          [("Content-Type", "application/json")]+          (Aeson.encode configs)+    ("PUT", ["flags", flagName]) -> do+      body <- Wai.lazyRequestBody req+      case Aeson.decode body of+        Nothing ->+          respond (Wai.responseLBS (toEnum 400) [] "")+        Just percent -> do+          setFlag flagName percent store+          respond (Wai.responseLBS (toEnum 200) [] "")+    _ -> respond (Wai.responseLBS (toEnum 404) [] "")++setFlag :: T.Text -> Percent -> Store flags -> IO ()+setFlag flag (Percent percentage) store =+  writeKey+    store+    (TE.encodeUtf8 flag)+    (TE.encodeUtf8 (T.pack (show (min 100 percentage))))++readFlagConfigs :: [T.Text] -> Store flags -> IO (Map.HashMap T.Text Percent)+readFlagConfigs keys store = do+  let defaults = zip keys (repeat (Percent 0))+  stored <- Maybe.catMaybes . map decodeFlagConfig <$> readKeys store+  pure $ Map.fromList $ defaults <> stored++decodeFlagConfig :: (B.ByteString, B.ByteString) -> Maybe (T.Text, Percent)+decodeFlagConfig (flag, config) = do+  flag <- either (const Nothing) Just $ TE.decodeUtf8' flag+  enabledString <- either (const Nothing) Just $ TE.decodeUtf8' config+  (enabledInt, _) <- either (const Nothing) Just $ Read.decimal enabledString+  pure (flag, percent enabledInt)++-- STORES++-- | A type describing a store in which feature flag data can be saved. You are+-- recommended to define your own stores using a persistence mechanism of your+-- choice.+data Store flags+  = Store+      { -- | Read all key,value pairs from the store.+        readKeys :: IO [(B.ByteString, B.ByteString)],+        -- | Save a key,value pair to the store. Create the key,value pair if it+        -- does not exist yet and overwrite it otherwise.+        writeKey :: B.ByteString -> B.ByteString -> IO ()+      }++-- | An in-memory store that does not persist feature flag data across+-- application restarts. Suitable for experimentation but not recommended for+-- production use.+memoryStore :: IO (Store flags)+memoryStore = do+  ref <- IORef.newIORef Map.empty+  pure+    Store+      { readKeys = Map.toList <$> IORef.readIORef ref,+        writeKey = \key value ->+          IORef.atomicModifyIORef' ref (\xs -> (Map.insert key value xs, ()))+      }++-- | Read feature flag states out of the store. The states of flags enabled for+-- part of the traffic will be determined by die-roll.+--+-- The default state for new flags and flags we cannot find values for in the+-- store is off. This library offers no way to set other defaults to keep it as+-- simple as possibe. You are encouraged to phrase your flag names in such a+-- way that off corresponds to what you'd like the default value to be, i.e.+-- @enableExperimentalDoodad@ is likely safer than @disableExperimentalDoodad@.+fetch :: forall flags. Flags flags => Store flags -> IO flags+fetch store = do+  let keys = flags (Proxy :: Proxy flags)+  configs <- readFlagConfigs keys store+  getStdRandom (generate configs)++-- PERCENT++newtype Percent = Percent Word.Word deriving (Aeson.ToJSON, Aeson.FromJSON)++percent :: Word.Word -> Percent+percent = Percent . min 100++-- FLAGS++-- | The feature flags you define are described by a type you create yourself.+-- It needs to be a record though, with every field a boolean. Then we add a+-- `Flags` instance to it so this library is able to work with the type.+--+-- > data Features+-- >   = Features+-- >       { openWindow :: Bool,+-- >         feedPigeons :: Bool+-- >       }+-- >   deriving (Generic)+-- >+-- > instance Flags Features+class Flags flags where+  generate :: Map.HashMap T.Text Percent -> StdGen -> (flags, StdGen)++  flags :: proxy flags -> [T.Text]++  default generate :: (Generic flags, GFlags (Rep flags)) => Map.HashMap T.Text Percent -> StdGen -> (flags, StdGen)+  generate configs gen = first GHC.Generics.to $ ggenerate configs gen++  default flags :: (Generic flags, GFlags (Rep flags)) => proxy flags -> [T.Text]+  flags _ = gflags (Proxy :: Proxy (Rep flags))++class GFlags flags where+  ggenerate :: Map.HashMap T.Text Percent -> StdGen -> (flags g, StdGen)++  gflags :: proxy flags -> [T.Text]++instance GFlags fields => GFlags (D1 m (C1 ('MetaCons s f 'True) fields)) where+  ggenerate configs gen = first (M1 . M1) $ ggenerate configs gen++  gflags _ = gflags (Proxy :: Proxy fields)++instance (GFlags l, GFlags r) => GFlags (l :*: r) where+  ggenerate configs gen =+    let (lval, gen') = ggenerate configs gen+        (rval, gen'') = ggenerate configs gen'+     in (lval :*: rval, gen'')++  gflags _ = gflags (Proxy :: Proxy l) <> gflags (Proxy :: Proxy r)++instance+  ( KnownSymbol fieldName,+    FromBool (IsBool bool) bool+  ) =>+  GFlags (S1 ('MetaSel ('Just fieldName) su ss ds) (K1 i bool))+  where+  ggenerate configs gen =+    first (M1 . K1 . fromBool (Proxy :: Proxy (IsBool bool))) $+      case Map.lookup (T.pack $ symbolVal (Proxy :: Proxy fieldName)) configs of+        Nothing -> (False, gen)+        Just (Percent 0) -> (False, gen)+        Just (Percent 100) -> (True, gen)+        Just config -> roll gen config++  gflags _ = [T.pack $ symbolVal (Proxy :: Proxy fieldName)]++type family IsBool (b :: Type) :: Bool where+  IsBool Bool = 'True+  IsBool _ = 'False++class FromBool (b :: Bool) a where+  fromBool :: Proxy b -> Bool -> a++instance FromBool 'True Bool where+  fromBool _ = id++instance TypeError InvalidFlagsTypeMessage => FromBool 'False a where+  fromBool = error "unreachable"++instance TypeError InvalidFlagsTypeMessage => GFlags (D1 m (C1 ('MetaCons s f 'False) a)) where+  ggenerate = error "unreachable"++  gflags = error "unreachable"++type InvalidFlagsTypeMessage =+  'Text "Not a valid flags type."+    :$$: 'Text "A flags type needs to be a record with boolean fields."+    :$$: 'Text "For example:"+    :$$: 'Text "  data Flags ="+    :$$: 'Text "     Flags { showErrorPage    :: Bool"+    :$$: 'Text "           , throttleRequests :: Bool }"++roll :: StdGen -> Percent -> (Bool, StdGen)+roll gen (Percent trueChance) =+  let (randomPercentage, gen') = randomR (1, 100) gen+   in (trueChance >= randomPercentage, gen')
+ wai-feature-flags.cabal view
@@ -0,0 +1,60 @@+cabal-version: 1.18++-- This file has been generated from package.yaml by hpack version 0.33.0.+--+-- see: https://github.com/sol/hpack+--+-- hash: 184959f4466db0edd22a62ebbfe0a7cd9dff71d3499da077fb28b6c3f877e384++name:           wai-feature-flags+version:        0.1.0.0+synopsis:       Feature flag support for WAI applications.+description:    Please see the README at <https://github.com/jwoudenberg/wai-feature-flags>.+category:       Web+homepage:       https://github.com/jwoudenberg/wai-feature-flags#readme+bug-reports:    https://github.com/jwoudenberg/wai-feature-flags/issues+author:         Jasper Woudenberg+maintainer:     mail@jasperwoudenberg.com+copyright:      2020 Jasper Woudenberg+license:        BSD3+license-file:   LICENSE+build-type:     Simple+extra-doc-files:+    README.md+    CHANGELOG.md+data-files:+    frontend/index.html++source-repository head+  type: git+  location: https://github.com/jwoudenberg/wai-feature-flags++library+  exposed-modules:+      Network.FeatureFlags+  other-modules:+      Paths_wai_feature_flags+  hs-source-dirs:+      src+  build-depends:+      aeson >=1.2.4.0 && <1.6+    , base >=4.10.1.0 && <5+    , bytestring >=0.10.8.2 && <0.12+    , random >=1.1 && <1.3+    , text >=1.2.3.0 && <1.3+    , unordered-containers >=0.2.9.0 && <0.3+    , wai >=3.2.2.1 && <3.3+  default-language: Haskell2010++executable example-app+  main-is: Main.hs+  other-modules:+      Paths_wai_feature_flags+  hs-source-dirs:+      example-app+  build-depends:+      base+    , wai+    , wai-feature-flags+    , warp >=3.3.5 && <3.4+  default-language: Haskell2010