From 2a7c06583621e9123f61133960c57d007e2da615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Debois?= Date: Tue, 15 Mar 2016 17:39:38 +0100 Subject: [PATCH] Initial pages --- .gitignore | 5 + elm.js | 11963 +++++++++++++++++++++++++++++++++++++++++++++++++++ index.html | 21 + 3 files changed, 11989 insertions(+) create mode 100644 .gitignore create mode 100644 elm.js create mode 100644 index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..59a62c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +elm-stuff +.*.sw? +index.html +docs.json +documentation.json diff --git a/elm.js b/elm.js new file mode 100644 index 0000000..29aad16 --- /dev/null +++ b/elm.js @@ -0,0 +1,11963 @@ +var Elm = Elm || { Native: {} }; +Elm.Native.Basics = {}; +Elm.Native.Basics.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Basics = localRuntime.Native.Basics || {}; + if (localRuntime.Native.Basics.values) + { + return localRuntime.Native.Basics.values; + } + + var Utils = Elm.Native.Utils.make(localRuntime); + + function div(a, b) + { + return (a / b) | 0; + } + function rem(a, b) + { + return a % b; + } + function mod(a, b) + { + if (b === 0) + { + throw new Error('Cannot perform mod 0. Division by zero error.'); + } + var r = a % b; + var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r + b) : -mod(-a, -b)); + + return m === b ? 0 : m; + } + function logBase(base, n) + { + return Math.log(n) / Math.log(base); + } + function negate(n) + { + return -n; + } + function abs(n) + { + return n < 0 ? -n : n; + } + + function min(a, b) + { + return Utils.cmp(a, b) < 0 ? a : b; + } + function max(a, b) + { + return Utils.cmp(a, b) > 0 ? a : b; + } + function clamp(lo, hi, n) + { + return Utils.cmp(n, lo) < 0 ? lo : Utils.cmp(n, hi) > 0 ? hi : n; + } + + function xor(a, b) + { + return a !== b; + } + function not(b) + { + return !b; + } + function isInfinite(n) + { + return n === Infinity || n === -Infinity; + } + + function truncate(n) + { + return n | 0; + } + + function degrees(d) + { + return d * Math.PI / 180; + } + function turns(t) + { + return 2 * Math.PI * t; + } + function fromPolar(point) + { + var r = point._0; + var t = point._1; + return Utils.Tuple2(r * Math.cos(t), r * Math.sin(t)); + } + function toPolar(point) + { + var x = point._0; + var y = point._1; + return Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x)); + } + + return localRuntime.Native.Basics.values = { + div: F2(div), + rem: F2(rem), + mod: F2(mod), + + pi: Math.PI, + e: Math.E, + cos: Math.cos, + sin: Math.sin, + tan: Math.tan, + acos: Math.acos, + asin: Math.asin, + atan: Math.atan, + atan2: F2(Math.atan2), + + degrees: degrees, + turns: turns, + fromPolar: fromPolar, + toPolar: toPolar, + + sqrt: Math.sqrt, + logBase: F2(logBase), + negate: negate, + abs: abs, + min: F2(min), + max: F2(max), + clamp: F3(clamp), + compare: Utils.compare, + + xor: F2(xor), + not: not, + + truncate: truncate, + ceiling: Math.ceil, + floor: Math.floor, + round: Math.round, + toFloat: function(x) { return x; }, + isNaN: isNaN, + isInfinite: isInfinite + }; +}; + +Elm.Native.Port = {}; + +Elm.Native.Port.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Port = localRuntime.Native.Port || {}; + if (localRuntime.Native.Port.values) + { + return localRuntime.Native.Port.values; + } + + var NS; + + // INBOUND + + function inbound(name, type, converter) + { + if (!localRuntime.argsTracker[name]) + { + throw new Error( + 'Port Error:\n' + + 'No argument was given for the port named \'' + name + '\' with type:\n\n' + + ' ' + type.split('\n').join('\n ') + '\n\n' + + 'You need to provide an initial value!\n\n' + + 'Find out more about ports here ' + ); + } + var arg = localRuntime.argsTracker[name]; + arg.used = true; + + return jsToElm(name, type, converter, arg.value); + } + + + function inboundSignal(name, type, converter) + { + var initialValue = inbound(name, type, converter); + + if (!NS) + { + NS = Elm.Native.Signal.make(localRuntime); + } + var signal = NS.input('inbound-port-' + name, initialValue); + + function send(jsValue) + { + var elmValue = jsToElm(name, type, converter, jsValue); + setTimeout(function() { + localRuntime.notify(signal.id, elmValue); + }, 0); + } + + localRuntime.ports[name] = { send: send }; + + return signal; + } + + + function jsToElm(name, type, converter, value) + { + try + { + return converter(value); + } + catch(e) + { + throw new Error( + 'Port Error:\n' + + 'Regarding the port named \'' + name + '\' with type:\n\n' + + ' ' + type.split('\n').join('\n ') + '\n\n' + + 'You just sent the value:\n\n' + + ' ' + JSON.stringify(value) + '\n\n' + + 'but it cannot be converted to the necessary type.\n' + + e.message + ); + } + } + + + // OUTBOUND + + function outbound(name, converter, elmValue) + { + localRuntime.ports[name] = converter(elmValue); + } + + + function outboundSignal(name, converter, signal) + { + var subscribers = []; + + function subscribe(handler) + { + subscribers.push(handler); + } + function unsubscribe(handler) + { + subscribers.pop(subscribers.indexOf(handler)); + } + + function notify(elmValue) + { + var jsValue = converter(elmValue); + var len = subscribers.length; + for (var i = 0; i < len; ++i) + { + subscribers[i](jsValue); + } + } + + if (!NS) + { + NS = Elm.Native.Signal.make(localRuntime); + } + NS.output('outbound-port-' + name, notify, signal); + + localRuntime.ports[name] = { + subscribe: subscribe, + unsubscribe: unsubscribe + }; + + return signal; + } + + + return localRuntime.Native.Port.values = { + inbound: inbound, + outbound: outbound, + inboundSignal: inboundSignal, + outboundSignal: outboundSignal + }; +}; + +if (!Elm.fullscreen) { + (function() { + 'use strict'; + + var Display = { + FULLSCREEN: 0, + COMPONENT: 1, + NONE: 2 + }; + + Elm.fullscreen = function(module, args) + { + var container = document.createElement('div'); + document.body.appendChild(container); + return init(Display.FULLSCREEN, container, module, args || {}); + }; + + Elm.embed = function(module, container, args) + { + var tag = container.tagName; + if (tag !== 'DIV') + { + throw new Error('Elm.node must be given a DIV, not a ' + tag + '.'); + } + return init(Display.COMPONENT, container, module, args || {}); + }; + + Elm.worker = function(module, args) + { + return init(Display.NONE, {}, module, args || {}); + }; + + function init(display, container, module, args, moduleToReplace) + { + // defining state needed for an instance of the Elm RTS + var inputs = []; + + /* OFFSET + * Elm's time traveling debugger lets you pause time. This means + * "now" may be shifted a bit into the past. By wrapping Date.now() + * we can manage this. + */ + var timer = { + programStart: Date.now(), + now: function() + { + return Date.now(); + } + }; + + var updateInProgress = false; + function notify(id, v) + { + if (updateInProgress) + { + throw new Error( + 'The notify function has been called synchronously!\n' + + 'This can lead to frames being dropped.\n' + + 'Definitely report this to \n'); + } + updateInProgress = true; + var timestep = timer.now(); + for (var i = inputs.length; i--; ) + { + inputs[i].notify(timestep, id, v); + } + updateInProgress = false; + } + function setTimeout(func, delay) + { + return window.setTimeout(func, delay); + } + + var listeners = []; + function addListener(relevantInputs, domNode, eventName, func) + { + domNode.addEventListener(eventName, func); + var listener = { + relevantInputs: relevantInputs, + domNode: domNode, + eventName: eventName, + func: func + }; + listeners.push(listener); + } + + var argsTracker = {}; + for (var name in args) + { + argsTracker[name] = { + value: args[name], + used: false + }; + } + + // create the actual RTS. Any impure modules will attach themselves to this + // object. This permits many Elm programs to be embedded per document. + var elm = { + notify: notify, + setTimeout: setTimeout, + node: container, + addListener: addListener, + inputs: inputs, + timer: timer, + argsTracker: argsTracker, + ports: {}, + + isFullscreen: function() { return display === Display.FULLSCREEN; }, + isEmbed: function() { return display === Display.COMPONENT; }, + isWorker: function() { return display === Display.NONE; } + }; + + function swap(newModule) + { + removeListeners(listeners); + var div = document.createElement('div'); + var newElm = init(display, div, newModule, args, elm); + inputs = []; + + return newElm; + } + + function dispose() + { + removeListeners(listeners); + inputs = []; + } + + var Module = {}; + try + { + Module = module.make(elm); + checkInputs(elm); + } + catch (error) + { + if (typeof container.appendChild === "function") + { + container.appendChild(errorNode(error.message)); + } + else + { + console.error(error.message); + } + throw error; + } + + if (display !== Display.NONE) + { + var graphicsNode = initGraphics(elm, Module); + } + + var rootNode = { kids: inputs }; + trimDeadNodes(rootNode); + inputs = rootNode.kids; + filterListeners(inputs, listeners); + + addReceivers(elm.ports); + + if (typeof moduleToReplace !== 'undefined') + { + hotSwap(moduleToReplace, elm); + + // rerender scene if graphics are enabled. + if (typeof graphicsNode !== 'undefined') + { + graphicsNode.notify(0, true, 0); + } + } + + return { + swap: swap, + ports: elm.ports, + dispose: dispose + }; + } + + function checkInputs(elm) + { + var argsTracker = elm.argsTracker; + for (var name in argsTracker) + { + if (!argsTracker[name].used) + { + throw new Error( + "Port Error:\nYou provided an argument named '" + name + + "' but there is no corresponding port!\n\n" + + "Maybe add a port '" + name + "' to your Elm module?\n" + + "Maybe remove the '" + name + "' argument from your initialization code in JS?" + ); + } + } + } + + function errorNode(message) + { + var code = document.createElement('code'); + + var lines = message.split('\n'); + code.appendChild(document.createTextNode(lines[0])); + code.appendChild(document.createElement('br')); + code.appendChild(document.createElement('br')); + for (var i = 1; i < lines.length; ++i) + { + code.appendChild(document.createTextNode('\u00A0 \u00A0 ' + lines[i].replace(/ /g, '\u00A0 '))); + code.appendChild(document.createElement('br')); + } + code.appendChild(document.createElement('br')); + code.appendChild(document.createTextNode('Open the developer console for more details.')); + return code; + } + + + //// FILTER SIGNALS //// + + // TODO: move this code into the signal module and create a function + // Signal.initializeGraph that actually instantiates everything. + + function filterListeners(inputs, listeners) + { + loop: + for (var i = listeners.length; i--; ) + { + var listener = listeners[i]; + for (var j = inputs.length; j--; ) + { + if (listener.relevantInputs.indexOf(inputs[j].id) >= 0) + { + continue loop; + } + } + listener.domNode.removeEventListener(listener.eventName, listener.func); + } + } + + function removeListeners(listeners) + { + for (var i = listeners.length; i--; ) + { + var listener = listeners[i]; + listener.domNode.removeEventListener(listener.eventName, listener.func); + } + } + + // add receivers for built-in ports if they are defined + function addReceivers(ports) + { + if ('title' in ports) + { + if (typeof ports.title === 'string') + { + document.title = ports.title; + } + else + { + ports.title.subscribe(function(v) { document.title = v; }); + } + } + if ('redirect' in ports) + { + ports.redirect.subscribe(function(v) { + if (v.length > 0) + { + window.location = v; + } + }); + } + } + + + // returns a boolean representing whether the node is alive or not. + function trimDeadNodes(node) + { + if (node.isOutput) + { + return true; + } + + var liveKids = []; + for (var i = node.kids.length; i--; ) + { + var kid = node.kids[i]; + if (trimDeadNodes(kid)) + { + liveKids.push(kid); + } + } + node.kids = liveKids; + + return liveKids.length > 0; + } + + + //// RENDERING //// + + function initGraphics(elm, Module) + { + if (!('main' in Module)) + { + throw new Error("'main' is missing! What do I display?!"); + } + + var signalGraph = Module.main; + + // make sure the signal graph is actually a signal & extract the visual model + if (!('notify' in signalGraph)) + { + signalGraph = Elm.Signal.make(elm).constant(signalGraph); + } + var initialScene = signalGraph.value; + + // Figure out what the render functions should be + var render; + var update; + if (initialScene.ctor === 'Element_elm_builtin') + { + var Element = Elm.Native.Graphics.Element.make(elm); + render = Element.render; + update = Element.updateAndReplace; + } + else + { + var VirtualDom = Elm.Native.VirtualDom.make(elm); + render = VirtualDom.render; + update = VirtualDom.updateAndReplace; + } + + // Add the initialScene to the DOM + var container = elm.node; + var node = render(initialScene); + while (container.firstChild) + { + container.removeChild(container.firstChild); + } + container.appendChild(node); + + var _requestAnimationFrame = + typeof requestAnimationFrame !== 'undefined' + ? requestAnimationFrame + : function(cb) { setTimeout(cb, 1000 / 60); } + ; + + // domUpdate is called whenever the main Signal changes. + // + // domUpdate and drawCallback implement a small state machine in order + // to schedule only 1 draw per animation frame. This enforces that + // once draw has been called, it will not be called again until the + // next frame. + // + // drawCallback is scheduled whenever + // 1. The state transitions from PENDING_REQUEST to EXTRA_REQUEST, or + // 2. The state transitions from NO_REQUEST to PENDING_REQUEST + // + // Invariants: + // 1. In the NO_REQUEST state, there is never a scheduled drawCallback. + // 2. In the PENDING_REQUEST and EXTRA_REQUEST states, there is always exactly 1 + // scheduled drawCallback. + var NO_REQUEST = 0; + var PENDING_REQUEST = 1; + var EXTRA_REQUEST = 2; + var state = NO_REQUEST; + var savedScene = initialScene; + var scheduledScene = initialScene; + + function domUpdate(newScene) + { + scheduledScene = newScene; + + switch (state) + { + case NO_REQUEST: + _requestAnimationFrame(drawCallback); + state = PENDING_REQUEST; + return; + case PENDING_REQUEST: + state = PENDING_REQUEST; + return; + case EXTRA_REQUEST: + state = PENDING_REQUEST; + return; + } + } + + function drawCallback() + { + switch (state) + { + case NO_REQUEST: + // This state should not be possible. How can there be no + // request, yet somehow we are actively fulfilling a + // request? + throw new Error( + 'Unexpected draw callback.\n' + + 'Please report this to .' + ); + + case PENDING_REQUEST: + // At this point, we do not *know* that another frame is + // needed, but we make an extra request to rAF just in + // case. It's possible to drop a frame if rAF is called + // too late, so we just do it preemptively. + _requestAnimationFrame(drawCallback); + state = EXTRA_REQUEST; + + // There's also stuff we definitely need to draw. + draw(); + return; + + case EXTRA_REQUEST: + // Turns out the extra request was not needed, so we will + // stop calling rAF. No reason to call it all the time if + // no one needs it. + state = NO_REQUEST; + return; + } + } + + function draw() + { + update(elm.node.firstChild, savedScene, scheduledScene); + if (elm.Native.Window) + { + elm.Native.Window.values.resizeIfNeeded(); + } + savedScene = scheduledScene; + } + + var renderer = Elm.Native.Signal.make(elm).output('main', domUpdate, signalGraph); + + // must check for resize after 'renderer' is created so + // that changes show up. + if (elm.Native.Window) + { + elm.Native.Window.values.resizeIfNeeded(); + } + + return renderer; + } + + //// HOT SWAPPING //// + + // Returns boolean indicating if the swap was successful. + // Requires that the two signal graphs have exactly the same + // structure. + function hotSwap(from, to) + { + function similar(nodeOld, nodeNew) + { + if (nodeOld.id !== nodeNew.id) + { + return false; + } + if (nodeOld.isOutput) + { + return nodeNew.isOutput; + } + return nodeOld.kids.length === nodeNew.kids.length; + } + function swap(nodeOld, nodeNew) + { + nodeNew.value = nodeOld.value; + return true; + } + var canSwap = depthFirstTraversals(similar, from.inputs, to.inputs); + if (canSwap) + { + depthFirstTraversals(swap, from.inputs, to.inputs); + } + from.node.parentNode.replaceChild(to.node, from.node); + + return canSwap; + } + + // Returns false if the node operation f ever fails. + function depthFirstTraversals(f, queueOld, queueNew) + { + if (queueOld.length !== queueNew.length) + { + return false; + } + queueOld = queueOld.slice(0); + queueNew = queueNew.slice(0); + + var seen = []; + while (queueOld.length > 0 && queueNew.length > 0) + { + var nodeOld = queueOld.pop(); + var nodeNew = queueNew.pop(); + if (seen.indexOf(nodeOld.id) < 0) + { + if (!f(nodeOld, nodeNew)) + { + return false; + } + queueOld = queueOld.concat(nodeOld.kids || []); + queueNew = queueNew.concat(nodeNew.kids || []); + seen.push(nodeOld.id); + } + } + return true; + } + }()); + + function F2(fun) + { + function wrapper(a) { return function(b) { return fun(a,b); }; } + wrapper.arity = 2; + wrapper.func = fun; + return wrapper; + } + + function F3(fun) + { + function wrapper(a) { + return function(b) { return function(c) { return fun(a, b, c); }; }; + } + wrapper.arity = 3; + wrapper.func = fun; + return wrapper; + } + + function F4(fun) + { + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return fun(a, b, c, d); }; }; }; + } + wrapper.arity = 4; + wrapper.func = fun; + return wrapper; + } + + function F5(fun) + { + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; + } + wrapper.arity = 5; + wrapper.func = fun; + return wrapper; + } + + function F6(fun) + { + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return fun(a, b, c, d, e, f); }; }; }; }; }; + } + wrapper.arity = 6; + wrapper.func = fun; + return wrapper; + } + + function F7(fun) + { + function wrapper(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); }; }; }; }; }; }; + } + wrapper.arity = 7; + wrapper.func = fun; + return wrapper; + } + + function F8(fun) + { + function wrapper(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); }; }; }; }; }; }; }; + } + wrapper.arity = 8; + wrapper.func = fun; + return wrapper; + } + + function F9(fun) + { + function wrapper(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); }; }; }; }; }; }; }; }; + } + wrapper.arity = 9; + wrapper.func = fun; + return wrapper; + } + + function A2(fun, a, b) + { + return fun.arity === 2 + ? fun.func(a, b) + : fun(a)(b); + } + function A3(fun, a, b, c) + { + return fun.arity === 3 + ? fun.func(a, b, c) + : fun(a)(b)(c); + } + function A4(fun, a, b, c, d) + { + return fun.arity === 4 + ? fun.func(a, b, c, d) + : fun(a)(b)(c)(d); + } + function A5(fun, a, b, c, d, e) + { + return fun.arity === 5 + ? fun.func(a, b, c, d, e) + : fun(a)(b)(c)(d)(e); + } + function A6(fun, a, b, c, d, e, f) + { + return fun.arity === 6 + ? fun.func(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.arity === 7 + ? fun.func(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.arity === 8 + ? fun.func(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.arity === 9 + ? fun.func(a, b, c, d, e, f, g, h, i) + : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); + } +} + +Elm.Native = Elm.Native || {}; +Elm.Native.Utils = {}; +Elm.Native.Utils.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Utils = localRuntime.Native.Utils || {}; + if (localRuntime.Native.Utils.values) + { + return localRuntime.Native.Utils.values; + } + + + // COMPARISONS + + function eq(l, r) + { + var stack = [{'x': l, 'y': r}]; + while (stack.length > 0) + { + var front = stack.pop(); + var x = front.x; + var y = front.y; + if (x === y) + { + continue; + } + if (typeof x === 'object') + { + var c = 0; + for (var i in x) + { + ++c; + if (i in y) + { + if (i !== 'ctor') + { + stack.push({ 'x': x[i], 'y': y[i] }); + } + } + else + { + return false; + } + } + if ('ctor' in x) + { + stack.push({'x': x.ctor, 'y': y.ctor}); + } + if (c !== Object.keys(y).length) + { + return false; + } + } + else if (typeof x === 'function') + { + throw new Error('Equality error: general function equality is ' + + 'undecidable, and therefore, unsupported'); + } + else + { + return false; + } + } + return true; + } + + // code in Generate/JavaScript.hs depends on the particular + // integer values assigned to LT, EQ, and GT + var LT = -1, EQ = 0, GT = 1, ord = ['LT', 'EQ', 'GT']; + + function compare(x, y) + { + return { + ctor: ord[cmp(x, y) + 1] + }; + } + + function cmp(x, y) { + var ord; + if (typeof x !== 'object') + { + return x === y ? EQ : x < y ? LT : GT; + } + else if (x.isChar) + { + var a = x.toString(); + var b = y.toString(); + return a === b + ? EQ + : a < b + ? LT + : GT; + } + else if (x.ctor === '::' || x.ctor === '[]') + { + while (true) + { + if (x.ctor === '[]' && y.ctor === '[]') + { + return EQ; + } + if (x.ctor !== y.ctor) + { + return x.ctor === '[]' ? LT : GT; + } + ord = cmp(x._0, y._0); + if (ord !== EQ) + { + return ord; + } + x = x._1; + y = y._1; + } + } + else if (x.ctor.slice(0, 6) === '_Tuple') + { + var n = x.ctor.slice(6) - 0; + var err = 'cannot compare tuples with more than 6 elements.'; + if (n === 0) return EQ; + if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord; + if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord; + if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord; + if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord; + if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord; + if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord; + if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } } + return EQ; + } + else + { + throw new Error('Comparison error: comparison is only defined on ints, ' + + 'floats, times, chars, strings, lists of comparable values, ' + + 'and tuples of comparable values.'); + } + } + + + // TUPLES + + var Tuple0 = { + ctor: '_Tuple0' + }; + + function Tuple2(x, y) + { + return { + ctor: '_Tuple2', + _0: x, + _1: y + }; + } + + + // LITERALS + + function chr(c) + { + var x = new String(c); + x.isChar = true; + return x; + } + + function txt(str) + { + var t = new String(str); + t.text = true; + return t; + } + + + // GUID + + var count = 0; + function guid(_) + { + return count++; + } + + + // RECORDS + + function update(oldRecord, updatedFields) + { + var newRecord = {}; + for (var key in oldRecord) + { + var value = (key in updatedFields) ? updatedFields[key] : oldRecord[key]; + newRecord[key] = value; + } + return newRecord; + } + + + // MOUSE COORDINATES + + function getXY(e) + { + var posx = 0; + var posy = 0; + if (e.pageX || e.pageY) + { + posx = e.pageX; + posy = e.pageY; + } + else if (e.clientX || e.clientY) + { + posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; + posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; + } + + if (localRuntime.isEmbed()) + { + var rect = localRuntime.node.getBoundingClientRect(); + var relx = rect.left + document.body.scrollLeft + document.documentElement.scrollLeft; + var rely = rect.top + document.body.scrollTop + document.documentElement.scrollTop; + // TODO: figure out if there is a way to avoid rounding here + posx = posx - Math.round(relx) - localRuntime.node.clientLeft; + posy = posy - Math.round(rely) - localRuntime.node.clientTop; + } + return Tuple2(posx, posy); + } + + + //// LIST STUFF //// + + var Nil = { ctor: '[]' }; + + function Cons(hd, tl) + { + return { + ctor: '::', + _0: hd, + _1: tl + }; + } + + function list(arr) + { + var out = Nil; + for (var i = arr.length; i--; ) + { + out = Cons(arr[i], out); + } + return out; + } + + function range(lo, hi) + { + var list = Nil; + if (lo <= hi) + { + do + { + list = Cons(hi, list); + } + while (hi-- > lo); + } + return list; + } + + function append(xs, ys) + { + // append Strings + if (typeof xs === 'string') + { + return xs + ys; + } + + // append Text + if (xs.ctor.slice(0, 5) === 'Text:') + { + return { + ctor: 'Text:Append', + _0: xs, + _1: ys + }; + } + + + // append Lists + if (xs.ctor === '[]') + { + return ys; + } + var root = Cons(xs._0, Nil); + var curr = root; + xs = xs._1; + while (xs.ctor !== '[]') + { + curr._1 = Cons(xs._0, Nil); + xs = xs._1; + curr = curr._1; + } + curr._1 = ys; + return root; + } + + + // CRASHES + + function crash(moduleName, region) + { + return function(message) { + throw new Error( + 'Ran into a `Debug.crash` in module `' + moduleName + '` ' + regionToString(region) + '\n' + + 'The message provided by the code author is:\n\n ' + + message + ); + }; + } + + function crashCase(moduleName, region, value) + { + return function(message) { + throw new Error( + 'Ran into a `Debug.crash` in module `' + moduleName + '`\n\n' + + 'This was caused by the `case` expression ' + regionToString(region) + '.\n' + + 'One of the branches ended with a crash and the following value got through:\n\n ' + toString(value) + '\n\n' + + 'The message provided by the code author is:\n\n ' + + message + ); + }; + } + + function regionToString(region) + { + if (region.start.line == region.end.line) + { + return 'on line ' + region.start.line; + } + return 'between lines ' + region.start.line + ' and ' + region.end.line; + } + + + // BAD PORTS + + function badPort(expected, received) + { + throw new Error( + 'Runtime error when sending values through a port.\n\n' + + 'Expecting ' + expected + ' but was given ' + formatValue(received) + ); + } + + function formatValue(value) + { + // Explicity format undefined values as "undefined" + // because JSON.stringify(undefined) unhelpfully returns "" + return (value === undefined) ? "undefined" : JSON.stringify(value); + } + + + // TO STRING + + var _Array; + var Dict; + var List; + + var toString = function(v) + { + var type = typeof v; + if (type === 'function') + { + var name = v.func ? v.func.name : v.name; + return ''; + } + else if (type === 'boolean') + { + return v ? 'True' : 'False'; + } + else if (type === 'number') + { + return v + ''; + } + else if ((v instanceof String) && v.isChar) + { + return '\'' + addSlashes(v, true) + '\''; + } + else if (type === 'string') + { + return '"' + addSlashes(v, false) + '"'; + } + else if (type === 'object' && 'ctor' in v) + { + if (v.ctor.substring(0, 6) === '_Tuple') + { + var output = []; + for (var k in v) + { + if (k === 'ctor') continue; + output.push(toString(v[k])); + } + return '(' + output.join(',') + ')'; + } + else if (v.ctor === '_Array') + { + if (!_Array) + { + _Array = Elm.Array.make(localRuntime); + } + var list = _Array.toList(v); + return 'Array.fromList ' + toString(list); + } + else if (v.ctor === '::') + { + var output = '[' + toString(v._0); + v = v._1; + while (v.ctor === '::') + { + output += ',' + toString(v._0); + v = v._1; + } + return output + ']'; + } + else if (v.ctor === '[]') + { + return '[]'; + } + else if (v.ctor === 'RBNode_elm_builtin' || v.ctor === 'RBEmpty_elm_builtin' || v.ctor === 'Set_elm_builtin') + { + if (!Dict) + { + Dict = Elm.Dict.make(localRuntime); + } + var list; + var name; + if (v.ctor === 'Set_elm_builtin') + { + if (!List) + { + List = Elm.List.make(localRuntime); + } + name = 'Set'; + list = A2(List.map, function(x) {return x._0; }, Dict.toList(v._0)); + } + else + { + name = 'Dict'; + list = Dict.toList(v); + } + return name + '.fromList ' + toString(list); + } + else if (v.ctor.slice(0, 5) === 'Text:') + { + return ''; + } + else if (v.ctor === 'Element_elm_builtin') + { + return '' + } + else if (v.ctor === 'Form_elm_builtin') + { + return '
' + } + else + { + var output = ''; + for (var i in v) + { + if (i === 'ctor') continue; + var str = toString(v[i]); + var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0; + output += ' ' + (parenless ? str : '(' + str + ')'); + } + return v.ctor + output; + } + } + else if (type === 'object' && 'notify' in v && 'id' in v) + { + return ''; + } + else if (type === 'object') + { + var output = []; + for (var k in v) + { + output.push(k + ' = ' + toString(v[k])); + } + if (output.length === 0) + { + return '{}'; + } + return '{ ' + output.join(', ') + ' }'; + } + return ''; + }; + + function 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, '\\"'); + } + } + + + return localRuntime.Native.Utils.values = { + eq: eq, + cmp: cmp, + compare: F2(compare), + Tuple0: Tuple0, + Tuple2: Tuple2, + chr: chr, + txt: txt, + update: update, + guid: guid, + getXY: getXY, + + Nil: Nil, + Cons: Cons, + list: list, + range: range, + append: F2(append), + + crash: crash, + crashCase: crashCase, + badPort: badPort, + + toString: toString + }; +}; + +Elm.Basics = Elm.Basics || {}; +Elm.Basics.make = function (_elm) { + "use strict"; + _elm.Basics = _elm.Basics || {}; + if (_elm.Basics.values) return _elm.Basics.values; + var _U = Elm.Native.Utils.make(_elm),$Native$Basics = Elm.Native.Basics.make(_elm),$Native$Utils = Elm.Native.Utils.make(_elm); + var _op = {}; + var uncurry = F2(function (f,_p0) { var _p1 = _p0;return A2(f,_p1._0,_p1._1);}); + var curry = F3(function (f,a,b) { return f({ctor: "_Tuple2",_0: a,_1: b});}); + var flip = F3(function (f,b,a) { return A2(f,a,b);}); + var snd = function (_p2) { var _p3 = _p2;return _p3._1;}; + var fst = function (_p4) { var _p5 = _p4;return _p5._0;}; + var always = F2(function (a,_p6) { return a;}); + var identity = function (x) { return x;}; + _op["<|"] = F2(function (f,x) { return f(x);}); + _op["|>"] = F2(function (x,f) { return f(x);}); + _op[">>"] = F3(function (f,g,x) { return g(f(x));}); + _op["<<"] = F3(function (g,f,x) { return g(f(x));}); + _op["++"] = $Native$Utils.append; + var toString = $Native$Utils.toString; + var isInfinite = $Native$Basics.isInfinite; + var isNaN = $Native$Basics.isNaN; + var toFloat = $Native$Basics.toFloat; + var ceiling = $Native$Basics.ceiling; + var floor = $Native$Basics.floor; + var truncate = $Native$Basics.truncate; + var round = $Native$Basics.round; + var not = $Native$Basics.not; + var xor = $Native$Basics.xor; + _op["||"] = $Native$Basics.or; + _op["&&"] = $Native$Basics.and; + var max = $Native$Basics.max; + var min = $Native$Basics.min; + var GT = {ctor: "GT"}; + var EQ = {ctor: "EQ"}; + var LT = {ctor: "LT"}; + var compare = $Native$Basics.compare; + _op[">="] = $Native$Basics.ge; + _op["<="] = $Native$Basics.le; + _op[">"] = $Native$Basics.gt; + _op["<"] = $Native$Basics.lt; + _op["/="] = $Native$Basics.neq; + _op["=="] = $Native$Basics.eq; + var e = $Native$Basics.e; + var pi = $Native$Basics.pi; + var clamp = $Native$Basics.clamp; + var logBase = $Native$Basics.logBase; + var abs = $Native$Basics.abs; + var negate = $Native$Basics.negate; + var sqrt = $Native$Basics.sqrt; + var atan2 = $Native$Basics.atan2; + var atan = $Native$Basics.atan; + var asin = $Native$Basics.asin; + var acos = $Native$Basics.acos; + var tan = $Native$Basics.tan; + var sin = $Native$Basics.sin; + var cos = $Native$Basics.cos; + _op["^"] = $Native$Basics.exp; + _op["%"] = $Native$Basics.mod; + var rem = $Native$Basics.rem; + _op["//"] = $Native$Basics.div; + _op["/"] = $Native$Basics.floatDiv; + _op["*"] = $Native$Basics.mul; + _op["-"] = $Native$Basics.sub; + _op["+"] = $Native$Basics.add; + var toPolar = $Native$Basics.toPolar; + var fromPolar = $Native$Basics.fromPolar; + var turns = $Native$Basics.turns; + var degrees = $Native$Basics.degrees; + var radians = function (t) { return t;}; + return _elm.Basics.values = {_op: _op + ,max: max + ,min: min + ,compare: compare + ,not: not + ,xor: xor + ,rem: rem + ,negate: negate + ,abs: abs + ,sqrt: sqrt + ,clamp: clamp + ,logBase: logBase + ,e: e + ,pi: pi + ,cos: cos + ,sin: sin + ,tan: tan + ,acos: acos + ,asin: asin + ,atan: atan + ,atan2: atan2 + ,round: round + ,floor: floor + ,ceiling: ceiling + ,truncate: truncate + ,toFloat: toFloat + ,degrees: degrees + ,radians: radians + ,turns: turns + ,toPolar: toPolar + ,fromPolar: fromPolar + ,isNaN: isNaN + ,isInfinite: isInfinite + ,toString: toString + ,fst: fst + ,snd: snd + ,identity: identity + ,always: always + ,flip: flip + ,curry: curry + ,uncurry: uncurry + ,LT: LT + ,EQ: EQ + ,GT: GT}; +}; +Elm.Maybe = Elm.Maybe || {}; +Elm.Maybe.make = function (_elm) { + "use strict"; + _elm.Maybe = _elm.Maybe || {}; + if (_elm.Maybe.values) return _elm.Maybe.values; + var _U = Elm.Native.Utils.make(_elm); + var _op = {}; + var withDefault = F2(function ($default,maybe) { var _p0 = maybe;if (_p0.ctor === "Just") { return _p0._0;} else { return $default;}}); + var Nothing = {ctor: "Nothing"}; + var oneOf = function (maybes) { + oneOf: while (true) { + var _p1 = maybes; + if (_p1.ctor === "[]") { + return Nothing; + } else { + var _p3 = _p1._0; + var _p2 = _p3; + if (_p2.ctor === "Nothing") { + var _v3 = _p1._1; + maybes = _v3; + continue oneOf; + } else { + return _p3; + } + } + } + }; + var andThen = F2(function (maybeValue,callback) { + var _p4 = maybeValue; + if (_p4.ctor === "Just") { + return callback(_p4._0); + } else { + return Nothing; + } + }); + var Just = function (a) { return {ctor: "Just",_0: a};}; + var map = F2(function (f,maybe) { var _p5 = maybe;if (_p5.ctor === "Just") { return Just(f(_p5._0));} else { return Nothing;}}); + var map2 = F3(function (func,ma,mb) { + var _p6 = {ctor: "_Tuple2",_0: ma,_1: mb}; + if (_p6.ctor === "_Tuple2" && _p6._0.ctor === "Just" && _p6._1.ctor === "Just") { + return Just(A2(func,_p6._0._0,_p6._1._0)); + } else { + return Nothing; + } + }); + var map3 = F4(function (func,ma,mb,mc) { + var _p7 = {ctor: "_Tuple3",_0: ma,_1: mb,_2: mc}; + if (_p7.ctor === "_Tuple3" && _p7._0.ctor === "Just" && _p7._1.ctor === "Just" && _p7._2.ctor === "Just") { + return Just(A3(func,_p7._0._0,_p7._1._0,_p7._2._0)); + } else { + return Nothing; + } + }); + var map4 = F5(function (func,ma,mb,mc,md) { + var _p8 = {ctor: "_Tuple4",_0: ma,_1: mb,_2: mc,_3: md}; + if (_p8.ctor === "_Tuple4" && _p8._0.ctor === "Just" && _p8._1.ctor === "Just" && _p8._2.ctor === "Just" && _p8._3.ctor === "Just") { + return Just(A4(func,_p8._0._0,_p8._1._0,_p8._2._0,_p8._3._0)); + } else { + return Nothing; + } + }); + var map5 = F6(function (func,ma,mb,mc,md,me) { + var _p9 = {ctor: "_Tuple5",_0: ma,_1: mb,_2: mc,_3: md,_4: me}; + if (_p9.ctor === "_Tuple5" && _p9._0.ctor === "Just" && _p9._1.ctor === "Just" && _p9._2.ctor === "Just" && _p9._3.ctor === "Just" && _p9._4.ctor === "Just") + { + return Just(A5(func,_p9._0._0,_p9._1._0,_p9._2._0,_p9._3._0,_p9._4._0)); + } else { + return Nothing; + } + }); + return _elm.Maybe.values = {_op: _op + ,andThen: andThen + ,map: map + ,map2: map2 + ,map3: map3 + ,map4: map4 + ,map5: map5 + ,withDefault: withDefault + ,oneOf: oneOf + ,Just: Just + ,Nothing: Nothing}; +}; +Elm.Native.List = {}; +Elm.Native.List.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.List = localRuntime.Native.List || {}; + if (localRuntime.Native.List.values) + { + return localRuntime.Native.List.values; + } + if ('values' in Elm.Native.List) + { + return localRuntime.Native.List.values = Elm.Native.List.values; + } + + var Utils = Elm.Native.Utils.make(localRuntime); + + var Nil = Utils.Nil; + var Cons = Utils.Cons; + + var fromArray = Utils.list; + + function toArray(xs) + { + var out = []; + while (xs.ctor !== '[]') + { + out.push(xs._0); + xs = xs._1; + } + return out; + } + + // f defined similarly for both foldl and foldr (NB: different from Haskell) + // ie, foldl : (a -> b -> b) -> b -> [a] -> b + function foldl(f, b, xs) + { + var acc = b; + while (xs.ctor !== '[]') + { + acc = A2(f, xs._0, acc); + xs = xs._1; + } + return acc; + } + + function foldr(f, b, xs) + { + var arr = toArray(xs); + var acc = b; + for (var i = arr.length; i--; ) + { + acc = A2(f, arr[i], acc); + } + return acc; + } + + function map2(f, xs, ys) + { + var arr = []; + while (xs.ctor !== '[]' && ys.ctor !== '[]') + { + arr.push(A2(f, xs._0, ys._0)); + xs = xs._1; + ys = ys._1; + } + return fromArray(arr); + } + + function map3(f, xs, ys, zs) + { + var arr = []; + while (xs.ctor !== '[]' && ys.ctor !== '[]' && zs.ctor !== '[]') + { + arr.push(A3(f, xs._0, ys._0, zs._0)); + xs = xs._1; + ys = ys._1; + zs = zs._1; + } + return fromArray(arr); + } + + function map4(f, ws, xs, ys, zs) + { + var arr = []; + while ( ws.ctor !== '[]' + && xs.ctor !== '[]' + && ys.ctor !== '[]' + && zs.ctor !== '[]') + { + arr.push(A4(f, ws._0, xs._0, ys._0, zs._0)); + ws = ws._1; + xs = xs._1; + ys = ys._1; + zs = zs._1; + } + return fromArray(arr); + } + + function map5(f, vs, ws, xs, ys, zs) + { + var arr = []; + while ( vs.ctor !== '[]' + && ws.ctor !== '[]' + && xs.ctor !== '[]' + && ys.ctor !== '[]' + && zs.ctor !== '[]') + { + arr.push(A5(f, vs._0, ws._0, xs._0, ys._0, zs._0)); + vs = vs._1; + ws = ws._1; + xs = xs._1; + ys = ys._1; + zs = zs._1; + } + return fromArray(arr); + } + + function sortBy(f, xs) + { + return fromArray(toArray(xs).sort(function(a, b) { + return Utils.cmp(f(a), f(b)); + })); + } + + function sortWith(f, xs) + { + return fromArray(toArray(xs).sort(function(a, b) { + var ord = f(a)(b).ctor; + return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1; + })); + } + + function take(n, xs) + { + var arr = []; + while (xs.ctor !== '[]' && n > 0) + { + arr.push(xs._0); + xs = xs._1; + --n; + } + return fromArray(arr); + } + + + Elm.Native.List.values = { + Nil: Nil, + Cons: Cons, + cons: F2(Cons), + toArray: toArray, + fromArray: fromArray, + + foldl: F3(foldl), + foldr: F3(foldr), + + map2: F3(map2), + map3: F4(map3), + map4: F5(map4), + map5: F6(map5), + sortBy: F2(sortBy), + sortWith: F2(sortWith), + take: F2(take) + }; + return localRuntime.Native.List.values = Elm.Native.List.values; +}; + +Elm.List = Elm.List || {}; +Elm.List.make = function (_elm) { + "use strict"; + _elm.List = _elm.List || {}; + if (_elm.List.values) return _elm.List.values; + var _U = Elm.Native.Utils.make(_elm),$Basics = Elm.Basics.make(_elm),$Maybe = Elm.Maybe.make(_elm),$Native$List = Elm.Native.List.make(_elm); + var _op = {}; + var sortWith = $Native$List.sortWith; + var sortBy = $Native$List.sortBy; + var sort = function (xs) { return A2(sortBy,$Basics.identity,xs);}; + var drop = F2(function (n,list) { + drop: while (true) if (_U.cmp(n,0) < 1) return list; else { + var _p0 = list; + if (_p0.ctor === "[]") { + return list; + } else { + var _v1 = n - 1,_v2 = _p0._1; + n = _v1; + list = _v2; + continue drop; + } + } + }); + var take = $Native$List.take; + var map5 = $Native$List.map5; + var map4 = $Native$List.map4; + var map3 = $Native$List.map3; + var map2 = $Native$List.map2; + var any = F2(function (isOkay,list) { + any: while (true) { + var _p1 = list; + if (_p1.ctor === "[]") { + return false; + } else { + if (isOkay(_p1._0)) return true; else { + var _v4 = isOkay,_v5 = _p1._1; + isOkay = _v4; + list = _v5; + continue any; + } + } + } + }); + var all = F2(function (isOkay,list) { return $Basics.not(A2(any,function (_p2) { return $Basics.not(isOkay(_p2));},list));}); + var foldr = $Native$List.foldr; + var foldl = $Native$List.foldl; + var length = function (xs) { return A3(foldl,F2(function (_p3,i) { return i + 1;}),0,xs);}; + var sum = function (numbers) { return A3(foldl,F2(function (x,y) { return x + y;}),0,numbers);}; + var product = function (numbers) { return A3(foldl,F2(function (x,y) { return x * y;}),1,numbers);}; + var maximum = function (list) { + var _p4 = list; + if (_p4.ctor === "::") { + return $Maybe.Just(A3(foldl,$Basics.max,_p4._0,_p4._1)); + } else { + return $Maybe.Nothing; + } + }; + var minimum = function (list) { + var _p5 = list; + if (_p5.ctor === "::") { + return $Maybe.Just(A3(foldl,$Basics.min,_p5._0,_p5._1)); + } else { + return $Maybe.Nothing; + } + }; + var indexedMap = F2(function (f,xs) { return A3(map2,f,_U.range(0,length(xs) - 1),xs);}); + var member = F2(function (x,xs) { return A2(any,function (a) { return _U.eq(a,x);},xs);}); + var isEmpty = function (xs) { var _p6 = xs;if (_p6.ctor === "[]") { return true;} else { return false;}}; + var tail = function (list) { var _p7 = list;if (_p7.ctor === "::") { return $Maybe.Just(_p7._1);} else { return $Maybe.Nothing;}}; + var head = function (list) { var _p8 = list;if (_p8.ctor === "::") { return $Maybe.Just(_p8._0);} else { return $Maybe.Nothing;}}; + _op["::"] = $Native$List.cons; + var map = F2(function (f,xs) { return A3(foldr,F2(function (x,acc) { return A2(_op["::"],f(x),acc);}),_U.list([]),xs);}); + var filter = F2(function (pred,xs) { + var conditionalCons = F2(function (x,xs$) { return pred(x) ? A2(_op["::"],x,xs$) : xs$;}); + return A3(foldr,conditionalCons,_U.list([]),xs); + }); + var maybeCons = F3(function (f,mx,xs) { var _p9 = f(mx);if (_p9.ctor === "Just") { return A2(_op["::"],_p9._0,xs);} else { return xs;}}); + var filterMap = F2(function (f,xs) { return A3(foldr,maybeCons(f),_U.list([]),xs);}); + var reverse = function (list) { return A3(foldl,F2(function (x,y) { return A2(_op["::"],x,y);}),_U.list([]),list);}; + var scanl = F3(function (f,b,xs) { + var scan1 = F2(function (x,accAcc) { + var _p10 = accAcc; + if (_p10.ctor === "::") { + return A2(_op["::"],A2(f,x,_p10._0),accAcc); + } else { + return _U.list([]); + } + }); + return reverse(A3(foldl,scan1,_U.list([b]),xs)); + }); + var append = F2(function (xs,ys) { + var _p11 = ys; + if (_p11.ctor === "[]") { + return xs; + } else { + return A3(foldr,F2(function (x,y) { return A2(_op["::"],x,y);}),ys,xs); + } + }); + var concat = function (lists) { return A3(foldr,append,_U.list([]),lists);}; + var concatMap = F2(function (f,list) { return concat(A2(map,f,list));}); + var partition = F2(function (pred,list) { + var step = F2(function (x,_p12) { + var _p13 = _p12; + var _p15 = _p13._0; + var _p14 = _p13._1; + return pred(x) ? {ctor: "_Tuple2",_0: A2(_op["::"],x,_p15),_1: _p14} : {ctor: "_Tuple2",_0: _p15,_1: A2(_op["::"],x,_p14)}; + }); + return A3(foldr,step,{ctor: "_Tuple2",_0: _U.list([]),_1: _U.list([])},list); + }); + var unzip = function (pairs) { + var step = F2(function (_p17,_p16) { + var _p18 = _p17; + var _p19 = _p16; + return {ctor: "_Tuple2",_0: A2(_op["::"],_p18._0,_p19._0),_1: A2(_op["::"],_p18._1,_p19._1)}; + }); + return A3(foldr,step,{ctor: "_Tuple2",_0: _U.list([]),_1: _U.list([])},pairs); + }; + var intersperse = F2(function (sep,xs) { + var _p20 = xs; + if (_p20.ctor === "[]") { + return _U.list([]); + } else { + var step = F2(function (x,rest) { return A2(_op["::"],sep,A2(_op["::"],x,rest));}); + var spersed = A3(foldr,step,_U.list([]),_p20._1); + return A2(_op["::"],_p20._0,spersed); + } + }); + var repeatHelp = F3(function (result,n,value) { + repeatHelp: while (true) if (_U.cmp(n,0) < 1) return result; else { + var _v18 = A2(_op["::"],value,result),_v19 = n - 1,_v20 = value; + result = _v18; + n = _v19; + value = _v20; + continue repeatHelp; + } + }); + var repeat = F2(function (n,value) { return A3(repeatHelp,_U.list([]),n,value);}); + return _elm.List.values = {_op: _op + ,isEmpty: isEmpty + ,length: length + ,reverse: reverse + ,member: member + ,head: head + ,tail: tail + ,filter: filter + ,take: take + ,drop: drop + ,repeat: repeat + ,append: append + ,concat: concat + ,intersperse: intersperse + ,partition: partition + ,unzip: unzip + ,map: map + ,map2: map2 + ,map3: map3 + ,map4: map4 + ,map5: map5 + ,filterMap: filterMap + ,concatMap: concatMap + ,indexedMap: indexedMap + ,foldr: foldr + ,foldl: foldl + ,sum: sum + ,product: product + ,maximum: maximum + ,minimum: minimum + ,all: all + ,any: any + ,scanl: scanl + ,sort: sort + ,sortBy: sortBy + ,sortWith: sortWith}; +}; +Elm.Native.Transform2D = {}; +Elm.Native.Transform2D.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Transform2D = localRuntime.Native.Transform2D || {}; + if (localRuntime.Native.Transform2D.values) + { + return localRuntime.Native.Transform2D.values; + } + + var A; + if (typeof Float32Array === 'undefined') + { + A = function(arr) + { + this.length = arr.length; + this[0] = arr[0]; + this[1] = arr[1]; + this[2] = arr[2]; + this[3] = arr[3]; + this[4] = arr[4]; + this[5] = arr[5]; + }; + } + else + { + A = Float32Array; + } + + // layout of matrix in an array is + // + // | m11 m12 dx | + // | m21 m22 dy | + // | 0 0 1 | + // + // new A([ m11, m12, dx, m21, m22, dy ]) + + var identity = new A([1, 0, 0, 0, 1, 0]); + function matrix(m11, m12, m21, m22, dx, dy) + { + return new A([m11, m12, dx, m21, m22, dy]); + } + + function rotation(t) + { + var c = Math.cos(t); + var s = Math.sin(t); + return new A([c, -s, 0, s, c, 0]); + } + + function rotate(t, m) + { + var c = Math.cos(t); + var s = Math.sin(t); + var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4]; + return new A([m11 * c + m12 * s, -m11 * s + m12 * c, m[2], + m21 * c + m22 * s, -m21 * s + m22 * c, m[5]]); + } + /* + function move(xy,m) { + var x = xy._0; + var y = xy._1; + var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4]; + return new A([m11, m12, m11*x + m12*y + m[2], + m21, m22, m21*x + m22*y + m[5]]); + } + function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); } + function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); } + function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); } + function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); } + function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); } + + function transform(m11, m21, m12, m22, mdx, mdy, n) { + var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5]; + return new A([m11*n11 + m12*n21, + m11*n12 + m12*n22, + m11*ndx + m12*ndy + mdx, + m21*n11 + m22*n21, + m21*n12 + m22*n22, + m21*ndx + m22*ndy + mdy]); + } + */ + function multiply(m, n) + { + var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4], mdx = m[2], mdy = m[5]; + var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5]; + return new A([m11 * n11 + m12 * n21, + m11 * n12 + m12 * n22, + m11 * ndx + m12 * ndy + mdx, + m21 * n11 + m22 * n21, + m21 * n12 + m22 * n22, + m21 * ndx + m22 * ndy + mdy]); + } + + return localRuntime.Native.Transform2D.values = { + identity: identity, + matrix: F6(matrix), + rotation: rotation, + multiply: F2(multiply) + /* + transform: F7(transform), + rotate: F2(rotate), + move: F2(move), + scale: F2(scale), + scaleX: F2(scaleX), + scaleY: F2(scaleY), + reflectX: reflectX, + reflectY: reflectY + */ + }; +}; + +Elm.Transform2D = Elm.Transform2D || {}; +Elm.Transform2D.make = function (_elm) { + "use strict"; + _elm.Transform2D = _elm.Transform2D || {}; + if (_elm.Transform2D.values) return _elm.Transform2D.values; + var _U = Elm.Native.Utils.make(_elm),$Native$Transform2D = Elm.Native.Transform2D.make(_elm); + var _op = {}; + var multiply = $Native$Transform2D.multiply; + var rotation = $Native$Transform2D.rotation; + var matrix = $Native$Transform2D.matrix; + var translation = F2(function (x,y) { return A6(matrix,1,0,0,1,x,y);}); + var scale = function (s) { return A6(matrix,s,0,0,s,0,0);}; + var scaleX = function (x) { return A6(matrix,x,0,0,1,0,0);}; + var scaleY = function (y) { return A6(matrix,1,0,0,y,0,0);}; + var identity = $Native$Transform2D.identity; + var Transform2D = {ctor: "Transform2D"}; + return _elm.Transform2D.values = {_op: _op + ,identity: identity + ,matrix: matrix + ,multiply: multiply + ,rotation: rotation + ,translation: translation + ,scale: scale + ,scaleX: scaleX + ,scaleY: scaleY}; +}; + +// setup +Elm.Native = Elm.Native || {}; +Elm.Native.Graphics = Elm.Native.Graphics || {}; +Elm.Native.Graphics.Collage = Elm.Native.Graphics.Collage || {}; + +// definition +Elm.Native.Graphics.Collage.make = function(localRuntime) { + 'use strict'; + + // attempt to short-circuit + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Graphics = localRuntime.Native.Graphics || {}; + localRuntime.Native.Graphics.Collage = localRuntime.Native.Graphics.Collage || {}; + if ('values' in localRuntime.Native.Graphics.Collage) + { + return localRuntime.Native.Graphics.Collage.values; + } + + // okay, we cannot short-ciruit, so now we define everything + var Color = Elm.Native.Color.make(localRuntime); + var List = Elm.Native.List.make(localRuntime); + var NativeElement = Elm.Native.Graphics.Element.make(localRuntime); + var Transform = Elm.Transform2D.make(localRuntime); + var Utils = Elm.Native.Utils.make(localRuntime); + + function setStrokeStyle(ctx, style) + { + ctx.lineWidth = style.width; + + var cap = style.cap.ctor; + ctx.lineCap = cap === 'Flat' + ? 'butt' + : cap === 'Round' + ? 'round' + : 'square'; + + var join = style.join.ctor; + ctx.lineJoin = join === 'Smooth' + ? 'round' + : join === 'Sharp' + ? 'miter' + : 'bevel'; + + ctx.miterLimit = style.join._0 || 10; + ctx.strokeStyle = Color.toCss(style.color); + } + + function setFillStyle(redo, ctx, style) + { + var sty = style.ctor; + ctx.fillStyle = sty === 'Solid' + ? Color.toCss(style._0) + : sty === 'Texture' + ? texture(redo, ctx, style._0) + : gradient(ctx, style._0); + } + + function trace(ctx, path) + { + var points = List.toArray(path); + var i = points.length - 1; + if (i <= 0) + { + return; + } + ctx.moveTo(points[i]._0, points[i]._1); + while (i--) + { + ctx.lineTo(points[i]._0, points[i]._1); + } + if (path.closed) + { + i = points.length - 1; + ctx.lineTo(points[i]._0, points[i]._1); + } + } + + function line(ctx, style, path) + { + if (style.dashing.ctor === '[]') + { + trace(ctx, path); + } + else + { + customLineHelp(ctx, style, path); + } + ctx.scale(1, -1); + ctx.stroke(); + } + + function customLineHelp(ctx, style, path) + { + var points = List.toArray(path); + if (path.closed) + { + points.push(points[0]); + } + var pattern = List.toArray(style.dashing); + var i = points.length - 1; + if (i <= 0) + { + return; + } + var x0 = points[i]._0, y0 = points[i]._1; + var x1 = 0, y1 = 0, dx = 0, dy = 0, remaining = 0; + var pindex = 0, plen = pattern.length; + var draw = true, segmentLength = pattern[0]; + ctx.moveTo(x0, y0); + while (i--) + { + x1 = points[i]._0; + y1 = points[i]._1; + dx = x1 - x0; + dy = y1 - y0; + remaining = Math.sqrt(dx * dx + dy * dy); + while (segmentLength <= remaining) + { + x0 += dx * segmentLength / remaining; + y0 += dy * segmentLength / remaining; + ctx[draw ? 'lineTo' : 'moveTo'](x0, y0); + // update starting position + dx = x1 - x0; + dy = y1 - y0; + remaining = Math.sqrt(dx * dx + dy * dy); + // update pattern + draw = !draw; + pindex = (pindex + 1) % plen; + segmentLength = pattern[pindex]; + } + if (remaining > 0) + { + ctx[draw ? 'lineTo' : 'moveTo'](x1, y1); + segmentLength -= remaining; + } + x0 = x1; + y0 = y1; + } + } + + function drawLine(ctx, style, path) + { + setStrokeStyle(ctx, style); + return line(ctx, style, path); + } + + function texture(redo, ctx, src) + { + var img = new Image(); + img.src = src; + img.onload = redo; + return ctx.createPattern(img, 'repeat'); + } + + function gradient(ctx, grad) + { + var g; + var stops = []; + if (grad.ctor === 'Linear') + { + var p0 = grad._0, p1 = grad._1; + g = ctx.createLinearGradient(p0._0, -p0._1, p1._0, -p1._1); + stops = List.toArray(grad._2); + } + else + { + var p0 = grad._0, p2 = grad._2; + g = ctx.createRadialGradient(p0._0, -p0._1, grad._1, p2._0, -p2._1, grad._3); + stops = List.toArray(grad._4); + } + var len = stops.length; + for (var i = 0; i < len; ++i) + { + var stop = stops[i]; + g.addColorStop(stop._0, Color.toCss(stop._1)); + } + return g; + } + + function drawShape(redo, ctx, style, path) + { + trace(ctx, path); + setFillStyle(redo, ctx, style); + ctx.scale(1, -1); + ctx.fill(); + } + + + // TEXT RENDERING + + function fillText(redo, ctx, text) + { + drawText(ctx, text, ctx.fillText); + } + + function strokeText(redo, ctx, style, text) + { + setStrokeStyle(ctx, style); + // Use native canvas API for dashes only for text for now + // Degrades to non-dashed on IE 9 + 10 + if (style.dashing.ctor !== '[]' && ctx.setLineDash) + { + var pattern = List.toArray(style.dashing); + ctx.setLineDash(pattern); + } + drawText(ctx, text, ctx.strokeText); + } + + function drawText(ctx, text, canvasDrawFn) + { + var textChunks = chunkText(defaultContext, text); + + var totalWidth = 0; + var maxHeight = 0; + var numChunks = textChunks.length; + + ctx.scale(1,-1); + + for (var i = numChunks; i--; ) + { + var chunk = textChunks[i]; + ctx.font = chunk.font; + var metrics = ctx.measureText(chunk.text); + chunk.width = metrics.width; + totalWidth += chunk.width; + if (chunk.height > maxHeight) + { + maxHeight = chunk.height; + } + } + + var x = -totalWidth / 2.0; + for (var i = 0; i < numChunks; ++i) + { + var chunk = textChunks[i]; + ctx.font = chunk.font; + ctx.fillStyle = chunk.color; + canvasDrawFn.call(ctx, chunk.text, x, maxHeight / 2); + x += chunk.width; + } + } + + function toFont(props) + { + return [ + props['font-style'], + props['font-variant'], + props['font-weight'], + props['font-size'], + props['font-family'] + ].join(' '); + } + + + // Convert the object returned by the text module + // into something we can use for styling canvas text + function chunkText(context, text) + { + var tag = text.ctor; + if (tag === 'Text:Append') + { + var leftChunks = chunkText(context, text._0); + var rightChunks = chunkText(context, text._1); + return leftChunks.concat(rightChunks); + } + if (tag === 'Text:Text') + { + return [{ + text: text._0, + color: context.color, + height: context['font-size'].slice(0, -2) | 0, + font: toFont(context) + }]; + } + if (tag === 'Text:Meta') + { + var newContext = freshContext(text._0, context); + return chunkText(newContext, text._1); + } + } + + function freshContext(props, ctx) + { + return { + 'font-style': props['font-style'] || ctx['font-style'], + 'font-variant': props['font-variant'] || ctx['font-variant'], + 'font-weight': props['font-weight'] || ctx['font-weight'], + 'font-size': props['font-size'] || ctx['font-size'], + 'font-family': props['font-family'] || ctx['font-family'], + 'color': props['color'] || ctx['color'] + }; + } + + var defaultContext = { + 'font-style': 'normal', + 'font-variant': 'normal', + 'font-weight': 'normal', + 'font-size': '12px', + 'font-family': 'sans-serif', + 'color': 'black' + }; + + + // IMAGES + + function drawImage(redo, ctx, form) + { + var img = new Image(); + img.onload = redo; + img.src = form._3; + var w = form._0, + h = form._1, + pos = form._2, + srcX = pos._0, + srcY = pos._1, + srcW = w, + srcH = h, + destX = -w / 2, + destY = -h / 2, + destW = w, + destH = h; + + ctx.scale(1, -1); + ctx.drawImage(img, srcX, srcY, srcW, srcH, destX, destY, destW, destH); + } + + function renderForm(redo, ctx, form) + { + ctx.save(); + + var x = form.x, + y = form.y, + theta = form.theta, + scale = form.scale; + + if (x !== 0 || y !== 0) + { + ctx.translate(x, y); + } + if (theta !== 0) + { + ctx.rotate(theta % (Math.PI * 2)); + } + if (scale !== 1) + { + ctx.scale(scale, scale); + } + if (form.alpha !== 1) + { + ctx.globalAlpha = ctx.globalAlpha * form.alpha; + } + + ctx.beginPath(); + var f = form.form; + switch (f.ctor) + { + case 'FPath': + drawLine(ctx, f._0, f._1); + break; + + case 'FImage': + drawImage(redo, ctx, f); + break; + + case 'FShape': + if (f._0.ctor === 'Line') + { + f._1.closed = true; + drawLine(ctx, f._0._0, f._1); + } + else + { + drawShape(redo, ctx, f._0._0, f._1); + } + break; + + case 'FText': + fillText(redo, ctx, f._0); + break; + + case 'FOutlinedText': + strokeText(redo, ctx, f._0, f._1); + break; + } + ctx.restore(); + } + + function formToMatrix(form) + { + var scale = form.scale; + var matrix = A6( Transform.matrix, scale, 0, 0, scale, form.x, form.y ); + + var theta = form.theta; + if (theta !== 0) + { + matrix = A2( Transform.multiply, matrix, Transform.rotation(theta) ); + } + + return matrix; + } + + function str(n) + { + if (n < 0.00001 && n > -0.00001) + { + return 0; + } + return n; + } + + function makeTransform(w, h, form, matrices) + { + var props = form.form._0._0.props; + var m = A6( Transform.matrix, 1, 0, 0, -1, + (w - props.width ) / 2, + (h - props.height) / 2 ); + var len = matrices.length; + for (var i = 0; i < len; ++i) + { + m = A2( Transform.multiply, m, matrices[i] ); + } + m = A2( Transform.multiply, m, formToMatrix(form) ); + + return 'matrix(' + + str( m[0]) + ', ' + str( m[3]) + ', ' + + str(-m[1]) + ', ' + str(-m[4]) + ', ' + + str( m[2]) + ', ' + str( m[5]) + ')'; + } + + function stepperHelp(list) + { + var arr = List.toArray(list); + var i = 0; + function peekNext() + { + return i < arr.length ? arr[i]._0.form.ctor : ''; + } + // assumes that there is a next element + function next() + { + var out = arr[i]._0; + ++i; + return out; + } + return { + peekNext: peekNext, + next: next + }; + } + + function formStepper(forms) + { + var ps = [stepperHelp(forms)]; + var matrices = []; + var alphas = []; + function peekNext() + { + var len = ps.length; + var formType = ''; + for (var i = 0; i < len; ++i ) + { + if (formType = ps[i].peekNext()) return formType; + } + return ''; + } + // assumes that there is a next element + function next(ctx) + { + while (!ps[0].peekNext()) + { + ps.shift(); + matrices.pop(); + alphas.shift(); + if (ctx) + { + ctx.restore(); + } + } + var out = ps[0].next(); + var f = out.form; + if (f.ctor === 'FGroup') + { + ps.unshift(stepperHelp(f._1)); + var m = A2(Transform.multiply, f._0, formToMatrix(out)); + ctx.save(); + ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]); + matrices.push(m); + + var alpha = (alphas[0] || 1) * out.alpha; + alphas.unshift(alpha); + ctx.globalAlpha = alpha; + } + return out; + } + function transforms() + { + return matrices; + } + function alpha() + { + return alphas[0] || 1; + } + return { + peekNext: peekNext, + next: next, + transforms: transforms, + alpha: alpha + }; + } + + function makeCanvas(w, h) + { + var canvas = NativeElement.createNode('canvas'); + canvas.style.width = w + 'px'; + canvas.style.height = h + 'px'; + canvas.style.display = 'block'; + canvas.style.position = 'absolute'; + var ratio = window.devicePixelRatio || 1; + canvas.width = w * ratio; + canvas.height = h * ratio; + return canvas; + } + + function render(model) + { + var div = NativeElement.createNode('div'); + div.style.overflow = 'hidden'; + div.style.position = 'relative'; + update(div, model, model); + return div; + } + + function nodeStepper(w, h, div) + { + var kids = div.childNodes; + var i = 0; + var ratio = window.devicePixelRatio || 1; + + function transform(transforms, ctx) + { + ctx.translate( w / 2 * ratio, h / 2 * ratio ); + ctx.scale( ratio, -ratio ); + var len = transforms.length; + for (var i = 0; i < len; ++i) + { + var m = transforms[i]; + ctx.save(); + ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]); + } + return ctx; + } + function nextContext(transforms) + { + while (i < kids.length) + { + var node = kids[i]; + if (node.getContext) + { + node.width = w * ratio; + node.height = h * ratio; + node.style.width = w + 'px'; + node.style.height = h + 'px'; + ++i; + return transform(transforms, node.getContext('2d')); + } + div.removeChild(node); + } + var canvas = makeCanvas(w, h); + div.appendChild(canvas); + // we have added a new node, so we must step our position + ++i; + return transform(transforms, canvas.getContext('2d')); + } + function addElement(matrices, alpha, form) + { + var kid = kids[i]; + var elem = form.form._0; + + var node = (!kid || kid.getContext) + ? NativeElement.render(elem) + : NativeElement.update(kid, kid.oldElement, elem); + + node.style.position = 'absolute'; + node.style.opacity = alpha * form.alpha * elem._0.props.opacity; + NativeElement.addTransform(node.style, makeTransform(w, h, form, matrices)); + node.oldElement = elem; + ++i; + if (!kid) + { + div.appendChild(node); + } + else + { + div.insertBefore(node, kid); + } + } + function clearRest() + { + while (i < kids.length) + { + div.removeChild(kids[i]); + } + } + return { + nextContext: nextContext, + addElement: addElement, + clearRest: clearRest + }; + } + + + function update(div, _, model) + { + var w = model.w; + var h = model.h; + + var forms = formStepper(model.forms); + var nodes = nodeStepper(w, h, div); + var ctx = null; + var formType = ''; + + while (formType = forms.peekNext()) + { + // make sure we have context if we need it + if (ctx === null && formType !== 'FElement') + { + ctx = nodes.nextContext(forms.transforms()); + ctx.globalAlpha = forms.alpha(); + } + + var form = forms.next(ctx); + // if it is FGroup, all updates are made within formStepper when next is called. + if (formType === 'FElement') + { + // update or insert an element, get a new context + nodes.addElement(forms.transforms(), forms.alpha(), form); + ctx = null; + } + else if (formType !== 'FGroup') + { + renderForm(function() { update(div, model, model); }, ctx, form); + } + } + nodes.clearRest(); + return div; + } + + + function collage(w, h, forms) + { + return A3(NativeElement.newElement, w, h, { + ctor: 'Custom', + type: 'Collage', + render: render, + update: update, + model: {w: w, h: h, forms: forms} + }); + } + + return localRuntime.Native.Graphics.Collage.values = { + collage: F3(collage) + }; +}; + +Elm.Native.Color = {}; +Elm.Native.Color.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Color = localRuntime.Native.Color || {}; + if (localRuntime.Native.Color.values) + { + return localRuntime.Native.Color.values; + } + + function toCss(c) + { + var format = ''; + var colors = ''; + if (c.ctor === 'RGBA') + { + format = 'rgb'; + colors = c._0 + ', ' + c._1 + ', ' + c._2; + } + else + { + format = 'hsl'; + colors = (c._0 * 180 / Math.PI) + ', ' + + (c._1 * 100) + '%, ' + + (c._2 * 100) + '%'; + } + if (c._3 === 1) + { + return format + '(' + colors + ')'; + } + else + { + return format + 'a(' + colors + ', ' + c._3 + ')'; + } + } + + return localRuntime.Native.Color.values = { + toCss: toCss + }; +}; + +Elm.Color = Elm.Color || {}; +Elm.Color.make = function (_elm) { + "use strict"; + _elm.Color = _elm.Color || {}; + if (_elm.Color.values) return _elm.Color.values; + var _U = Elm.Native.Utils.make(_elm),$Basics = Elm.Basics.make(_elm); + var _op = {}; + var Radial = F5(function (a,b,c,d,e) { return {ctor: "Radial",_0: a,_1: b,_2: c,_3: d,_4: e};}); + var radial = Radial; + var Linear = F3(function (a,b,c) { return {ctor: "Linear",_0: a,_1: b,_2: c};}); + var linear = Linear; + var fmod = F2(function (f,n) { var integer = $Basics.floor(f);return $Basics.toFloat(A2($Basics._op["%"],integer,n)) + f - $Basics.toFloat(integer);}); + var rgbToHsl = F3(function (red,green,blue) { + var b = $Basics.toFloat(blue) / 255; + var g = $Basics.toFloat(green) / 255; + var r = $Basics.toFloat(red) / 255; + var cMax = A2($Basics.max,A2($Basics.max,r,g),b); + var cMin = A2($Basics.min,A2($Basics.min,r,g),b); + var c = cMax - cMin; + var lightness = (cMax + cMin) / 2; + var saturation = _U.eq(lightness,0) ? 0 : c / (1 - $Basics.abs(2 * lightness - 1)); + var hue = $Basics.degrees(60) * (_U.eq(cMax,r) ? A2(fmod,(g - b) / c,6) : _U.eq(cMax,g) ? (b - r) / c + 2 : (r - g) / c + 4); + return {ctor: "_Tuple3",_0: hue,_1: saturation,_2: lightness}; + }); + var hslToRgb = F3(function (hue,saturation,lightness) { + var hue$ = hue / $Basics.degrees(60); + var chroma = (1 - $Basics.abs(2 * lightness - 1)) * saturation; + var x = chroma * (1 - $Basics.abs(A2(fmod,hue$,2) - 1)); + var _p0 = _U.cmp(hue$,0) < 0 ? {ctor: "_Tuple3",_0: 0,_1: 0,_2: 0} : _U.cmp(hue$,1) < 0 ? {ctor: "_Tuple3",_0: chroma,_1: x,_2: 0} : _U.cmp(hue$, + 2) < 0 ? {ctor: "_Tuple3",_0: x,_1: chroma,_2: 0} : _U.cmp(hue$,3) < 0 ? {ctor: "_Tuple3",_0: 0,_1: chroma,_2: x} : _U.cmp(hue$,4) < 0 ? {ctor: "_Tuple3" + ,_0: 0 + ,_1: x + ,_2: chroma} : _U.cmp(hue$, + 5) < 0 ? {ctor: "_Tuple3",_0: x,_1: 0,_2: chroma} : _U.cmp(hue$,6) < 0 ? {ctor: "_Tuple3",_0: chroma,_1: 0,_2: x} : {ctor: "_Tuple3",_0: 0,_1: 0,_2: 0}; + var r = _p0._0; + var g = _p0._1; + var b = _p0._2; + var m = lightness - chroma / 2; + return {ctor: "_Tuple3",_0: r + m,_1: g + m,_2: b + m}; + }); + var toRgb = function (color) { + var _p1 = color; + if (_p1.ctor === "RGBA") { + return {red: _p1._0,green: _p1._1,blue: _p1._2,alpha: _p1._3}; + } else { + var _p2 = A3(hslToRgb,_p1._0,_p1._1,_p1._2); + var r = _p2._0; + var g = _p2._1; + var b = _p2._2; + return {red: $Basics.round(255 * r),green: $Basics.round(255 * g),blue: $Basics.round(255 * b),alpha: _p1._3}; + } + }; + var toHsl = function (color) { + var _p3 = color; + if (_p3.ctor === "HSLA") { + return {hue: _p3._0,saturation: _p3._1,lightness: _p3._2,alpha: _p3._3}; + } else { + var _p4 = A3(rgbToHsl,_p3._0,_p3._1,_p3._2); + var h = _p4._0; + var s = _p4._1; + var l = _p4._2; + return {hue: h,saturation: s,lightness: l,alpha: _p3._3}; + } + }; + var HSLA = F4(function (a,b,c,d) { return {ctor: "HSLA",_0: a,_1: b,_2: c,_3: d};}); + var hsla = F4(function (hue,saturation,lightness,alpha) { + return A4(HSLA,hue - $Basics.turns($Basics.toFloat($Basics.floor(hue / (2 * $Basics.pi)))),saturation,lightness,alpha); + }); + var hsl = F3(function (hue,saturation,lightness) { return A4(hsla,hue,saturation,lightness,1);}); + var complement = function (color) { + var _p5 = color; + if (_p5.ctor === "HSLA") { + return A4(hsla,_p5._0 + $Basics.degrees(180),_p5._1,_p5._2,_p5._3); + } else { + var _p6 = A3(rgbToHsl,_p5._0,_p5._1,_p5._2); + var h = _p6._0; + var s = _p6._1; + var l = _p6._2; + return A4(hsla,h + $Basics.degrees(180),s,l,_p5._3); + } + }; + var grayscale = function (p) { return A4(HSLA,0,0,1 - p,1);}; + var greyscale = function (p) { return A4(HSLA,0,0,1 - p,1);}; + var RGBA = F4(function (a,b,c,d) { return {ctor: "RGBA",_0: a,_1: b,_2: c,_3: d};}); + var rgba = RGBA; + var rgb = F3(function (r,g,b) { return A4(RGBA,r,g,b,1);}); + var lightRed = A4(RGBA,239,41,41,1); + var red = A4(RGBA,204,0,0,1); + var darkRed = A4(RGBA,164,0,0,1); + var lightOrange = A4(RGBA,252,175,62,1); + var orange = A4(RGBA,245,121,0,1); + var darkOrange = A4(RGBA,206,92,0,1); + var lightYellow = A4(RGBA,255,233,79,1); + var yellow = A4(RGBA,237,212,0,1); + var darkYellow = A4(RGBA,196,160,0,1); + var lightGreen = A4(RGBA,138,226,52,1); + var green = A4(RGBA,115,210,22,1); + var darkGreen = A4(RGBA,78,154,6,1); + var lightBlue = A4(RGBA,114,159,207,1); + var blue = A4(RGBA,52,101,164,1); + var darkBlue = A4(RGBA,32,74,135,1); + var lightPurple = A4(RGBA,173,127,168,1); + var purple = A4(RGBA,117,80,123,1); + var darkPurple = A4(RGBA,92,53,102,1); + var lightBrown = A4(RGBA,233,185,110,1); + var brown = A4(RGBA,193,125,17,1); + var darkBrown = A4(RGBA,143,89,2,1); + var black = A4(RGBA,0,0,0,1); + var white = A4(RGBA,255,255,255,1); + var lightGrey = A4(RGBA,238,238,236,1); + var grey = A4(RGBA,211,215,207,1); + var darkGrey = A4(RGBA,186,189,182,1); + var lightGray = A4(RGBA,238,238,236,1); + var gray = A4(RGBA,211,215,207,1); + var darkGray = A4(RGBA,186,189,182,1); + var lightCharcoal = A4(RGBA,136,138,133,1); + var charcoal = A4(RGBA,85,87,83,1); + var darkCharcoal = A4(RGBA,46,52,54,1); + return _elm.Color.values = {_op: _op + ,rgb: rgb + ,rgba: rgba + ,hsl: hsl + ,hsla: hsla + ,greyscale: greyscale + ,grayscale: grayscale + ,complement: complement + ,linear: linear + ,radial: radial + ,toRgb: toRgb + ,toHsl: toHsl + ,red: red + ,orange: orange + ,yellow: yellow + ,green: green + ,blue: blue + ,purple: purple + ,brown: brown + ,lightRed: lightRed + ,lightOrange: lightOrange + ,lightYellow: lightYellow + ,lightGreen: lightGreen + ,lightBlue: lightBlue + ,lightPurple: lightPurple + ,lightBrown: lightBrown + ,darkRed: darkRed + ,darkOrange: darkOrange + ,darkYellow: darkYellow + ,darkGreen: darkGreen + ,darkBlue: darkBlue + ,darkPurple: darkPurple + ,darkBrown: darkBrown + ,white: white + ,lightGrey: lightGrey + ,grey: grey + ,darkGrey: darkGrey + ,lightCharcoal: lightCharcoal + ,charcoal: charcoal + ,darkCharcoal: darkCharcoal + ,black: black + ,lightGray: lightGray + ,gray: gray + ,darkGray: darkGray}; +}; + +// setup +Elm.Native = Elm.Native || {}; +Elm.Native.Graphics = Elm.Native.Graphics || {}; +Elm.Native.Graphics.Element = Elm.Native.Graphics.Element || {}; + +// definition +Elm.Native.Graphics.Element.make = function(localRuntime) { + 'use strict'; + + // attempt to short-circuit + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Graphics = localRuntime.Native.Graphics || {}; + localRuntime.Native.Graphics.Element = localRuntime.Native.Graphics.Element || {}; + if ('values' in localRuntime.Native.Graphics.Element) + { + return localRuntime.Native.Graphics.Element.values; + } + + var Color = Elm.Native.Color.make(localRuntime); + var List = Elm.Native.List.make(localRuntime); + var Maybe = Elm.Maybe.make(localRuntime); + var Text = Elm.Native.Text.make(localRuntime); + var Utils = Elm.Native.Utils.make(localRuntime); + + + // CREATION + + var createNode = + typeof document === 'undefined' + ? + function(_) + { + return { + style: {}, + appendChild: function() {} + }; + } + : + function(elementType) + { + var node = document.createElement(elementType); + node.style.padding = '0'; + node.style.margin = '0'; + return node; + } + ; + + + function newElement(width, height, elementPrim) + { + return { + ctor: 'Element_elm_builtin', + _0: { + element: elementPrim, + props: { + id: Utils.guid(), + width: width, + height: height, + opacity: 1, + color: Maybe.Nothing, + href: '', + tag: '', + hover: Utils.Tuple0, + click: Utils.Tuple0 + } + } + }; + } + + + // PROPERTIES + + function setProps(elem, node) + { + var props = elem.props; + + var element = elem.element; + var width = props.width - (element.adjustWidth || 0); + var height = props.height - (element.adjustHeight || 0); + node.style.width = (width | 0) + 'px'; + node.style.height = (height | 0) + 'px'; + + if (props.opacity !== 1) + { + node.style.opacity = props.opacity; + } + + if (props.color.ctor === 'Just') + { + node.style.backgroundColor = Color.toCss(props.color._0); + } + + if (props.tag !== '') + { + node.id = props.tag; + } + + if (props.hover.ctor !== '_Tuple0') + { + addHover(node, props.hover); + } + + if (props.click.ctor !== '_Tuple0') + { + addClick(node, props.click); + } + + if (props.href !== '') + { + var anchor = createNode('a'); + anchor.href = props.href; + anchor.style.display = 'block'; + anchor.style.pointerEvents = 'auto'; + anchor.appendChild(node); + node = anchor; + } + + return node; + } + + function addClick(e, handler) + { + e.style.pointerEvents = 'auto'; + e.elm_click_handler = handler; + function trigger(ev) + { + e.elm_click_handler(Utils.Tuple0); + ev.stopPropagation(); + } + e.elm_click_trigger = trigger; + e.addEventListener('click', trigger); + } + + function removeClick(e, handler) + { + if (e.elm_click_trigger) + { + e.removeEventListener('click', e.elm_click_trigger); + e.elm_click_trigger = null; + e.elm_click_handler = null; + } + } + + function addHover(e, handler) + { + e.style.pointerEvents = 'auto'; + e.elm_hover_handler = handler; + e.elm_hover_count = 0; + + function over(evt) + { + if (e.elm_hover_count++ > 0) return; + e.elm_hover_handler(true); + evt.stopPropagation(); + } + function out(evt) + { + if (e.contains(evt.toElement || evt.relatedTarget)) return; + e.elm_hover_count = 0; + e.elm_hover_handler(false); + evt.stopPropagation(); + } + e.elm_hover_over = over; + e.elm_hover_out = out; + e.addEventListener('mouseover', over); + e.addEventListener('mouseout', out); + } + + function removeHover(e) + { + e.elm_hover_handler = null; + if (e.elm_hover_over) + { + e.removeEventListener('mouseover', e.elm_hover_over); + e.elm_hover_over = null; + } + if (e.elm_hover_out) + { + e.removeEventListener('mouseout', e.elm_hover_out); + e.elm_hover_out = null; + } + } + + + // IMAGES + + function image(props, img) + { + switch (img._0.ctor) + { + case 'Plain': + return plainImage(img._3); + + case 'Fitted': + return fittedImage(props.width, props.height, img._3); + + case 'Cropped': + return croppedImage(img, props.width, props.height, img._3); + + case 'Tiled': + return tiledImage(img._3); + } + } + + function plainImage(src) + { + var img = createNode('img'); + img.src = src; + img.name = src; + img.style.display = 'block'; + return img; + } + + function tiledImage(src) + { + var div = createNode('div'); + div.style.backgroundImage = 'url(' + src + ')'; + return div; + } + + function fittedImage(w, h, src) + { + var div = createNode('div'); + div.style.background = 'url(' + src + ') no-repeat center'; + div.style.webkitBackgroundSize = 'cover'; + div.style.MozBackgroundSize = 'cover'; + div.style.OBackgroundSize = 'cover'; + div.style.backgroundSize = 'cover'; + return div; + } + + function croppedImage(elem, w, h, src) + { + var pos = elem._0._0; + var e = createNode('div'); + e.style.overflow = 'hidden'; + + var img = createNode('img'); + img.onload = function() { + var sw = w / elem._1, sh = h / elem._2; + img.style.width = ((this.width * sw) | 0) + 'px'; + img.style.height = ((this.height * sh) | 0) + 'px'; + img.style.marginLeft = ((- pos._0 * sw) | 0) + 'px'; + img.style.marginTop = ((- pos._1 * sh) | 0) + 'px'; + }; + img.src = src; + img.name = src; + e.appendChild(img); + return e; + } + + + // FLOW + + function goOut(node) + { + node.style.position = 'absolute'; + return node; + } + function goDown(node) + { + return node; + } + function goRight(node) + { + node.style.styleFloat = 'left'; + node.style.cssFloat = 'left'; + return node; + } + + var directionTable = { + DUp: goDown, + DDown: goDown, + DLeft: goRight, + DRight: goRight, + DIn: goOut, + DOut: goOut + }; + function needsReversal(dir) + { + return dir === 'DUp' || dir === 'DLeft' || dir === 'DIn'; + } + + function flow(dir, elist) + { + var array = List.toArray(elist); + var container = createNode('div'); + var goDir = directionTable[dir]; + if (goDir === goOut) + { + container.style.pointerEvents = 'none'; + } + if (needsReversal(dir)) + { + array.reverse(); + } + var len = array.length; + for (var i = 0; i < len; ++i) + { + container.appendChild(goDir(render(array[i]))); + } + return container; + } + + + // CONTAINER + + function toPos(pos) + { + return pos.ctor === 'Absolute' + ? pos._0 + 'px' + : (pos._0 * 100) + '%'; + } + + // must clear right, left, top, bottom, and transform + // before calling this function + function setPos(pos, wrappedElement, e) + { + var elem = wrappedElement._0; + var element = elem.element; + var props = elem.props; + var w = props.width + (element.adjustWidth ? element.adjustWidth : 0); + var h = props.height + (element.adjustHeight ? element.adjustHeight : 0); + + e.style.position = 'absolute'; + e.style.margin = 'auto'; + var transform = ''; + + switch (pos.horizontal.ctor) + { + case 'P': + e.style.right = toPos(pos.x); + e.style.removeProperty('left'); + break; + + case 'Z': + transform = 'translateX(' + ((-w / 2) | 0) + 'px) '; + + case 'N': + e.style.left = toPos(pos.x); + e.style.removeProperty('right'); + break; + } + switch (pos.vertical.ctor) + { + case 'N': + e.style.bottom = toPos(pos.y); + e.style.removeProperty('top'); + break; + + case 'Z': + transform += 'translateY(' + ((-h / 2) | 0) + 'px)'; + + case 'P': + e.style.top = toPos(pos.y); + e.style.removeProperty('bottom'); + break; + } + if (transform !== '') + { + addTransform(e.style, transform); + } + return e; + } + + function addTransform(style, transform) + { + style.transform = transform; + style.msTransform = transform; + style.MozTransform = transform; + style.webkitTransform = transform; + style.OTransform = transform; + } + + function container(pos, elem) + { + var e = render(elem); + setPos(pos, elem, e); + var div = createNode('div'); + div.style.position = 'relative'; + div.style.overflow = 'hidden'; + div.appendChild(e); + return div; + } + + + function rawHtml(elem) + { + var html = elem.html; + var align = elem.align; + + var div = createNode('div'); + div.innerHTML = html; + div.style.visibility = 'hidden'; + if (align) + { + div.style.textAlign = align; + } + div.style.visibility = 'visible'; + div.style.pointerEvents = 'auto'; + return div; + } + + + // RENDER + + function render(wrappedElement) + { + var elem = wrappedElement._0; + return setProps(elem, makeElement(elem)); + } + + function makeElement(e) + { + var elem = e.element; + switch (elem.ctor) + { + case 'Image': + return image(e.props, elem); + + case 'Flow': + return flow(elem._0.ctor, elem._1); + + case 'Container': + return container(elem._0, elem._1); + + case 'Spacer': + return createNode('div'); + + case 'RawHtml': + return rawHtml(elem); + + case 'Custom': + return elem.render(elem.model); + } + } + + function updateAndReplace(node, curr, next) + { + var newNode = update(node, curr, next); + if (newNode !== node) + { + node.parentNode.replaceChild(newNode, node); + } + return newNode; + } + + + // UPDATE + + function update(node, wrappedCurrent, wrappedNext) + { + var curr = wrappedCurrent._0; + var next = wrappedNext._0; + var rootNode = node; + if (node.tagName === 'A') + { + node = node.firstChild; + } + if (curr.props.id === next.props.id) + { + updateProps(node, curr, next); + return rootNode; + } + if (curr.element.ctor !== next.element.ctor) + { + return render(wrappedNext); + } + var nextE = next.element; + var currE = curr.element; + switch (nextE.ctor) + { + case 'Spacer': + updateProps(node, curr, next); + return rootNode; + + case 'RawHtml': + if(currE.html.valueOf() !== nextE.html.valueOf()) + { + node.innerHTML = nextE.html; + } + updateProps(node, curr, next); + return rootNode; + + case 'Image': + if (nextE._0.ctor === 'Plain') + { + if (nextE._3 !== currE._3) + { + node.src = nextE._3; + } + } + else if (!Utils.eq(nextE, currE) + || next.props.width !== curr.props.width + || next.props.height !== curr.props.height) + { + return render(wrappedNext); + } + updateProps(node, curr, next); + return rootNode; + + case 'Flow': + var arr = List.toArray(nextE._1); + for (var i = arr.length; i--; ) + { + arr[i] = arr[i]._0.element.ctor; + } + if (nextE._0.ctor !== currE._0.ctor) + { + return render(wrappedNext); + } + var nexts = List.toArray(nextE._1); + var kids = node.childNodes; + if (nexts.length !== kids.length) + { + return render(wrappedNext); + } + var currs = List.toArray(currE._1); + var dir = nextE._0.ctor; + var goDir = directionTable[dir]; + var toReverse = needsReversal(dir); + var len = kids.length; + for (var i = len; i--; ) + { + var subNode = kids[toReverse ? len - i - 1 : i]; + goDir(updateAndReplace(subNode, currs[i], nexts[i])); + } + updateProps(node, curr, next); + return rootNode; + + case 'Container': + var subNode = node.firstChild; + var newSubNode = updateAndReplace(subNode, currE._1, nextE._1); + setPos(nextE._0, nextE._1, newSubNode); + updateProps(node, curr, next); + return rootNode; + + case 'Custom': + if (currE.type === nextE.type) + { + var updatedNode = nextE.update(node, currE.model, nextE.model); + updateProps(updatedNode, curr, next); + return updatedNode; + } + return render(wrappedNext); + } + } + + function updateProps(node, curr, next) + { + var nextProps = next.props; + var currProps = curr.props; + + var element = next.element; + var width = nextProps.width - (element.adjustWidth || 0); + var height = nextProps.height - (element.adjustHeight || 0); + if (width !== currProps.width) + { + node.style.width = (width | 0) + 'px'; + } + if (height !== currProps.height) + { + node.style.height = (height | 0) + 'px'; + } + + if (nextProps.opacity !== currProps.opacity) + { + node.style.opacity = nextProps.opacity; + } + + var nextColor = nextProps.color.ctor === 'Just' + ? Color.toCss(nextProps.color._0) + : ''; + if (node.style.backgroundColor !== nextColor) + { + node.style.backgroundColor = nextColor; + } + + if (nextProps.tag !== currProps.tag) + { + node.id = nextProps.tag; + } + + if (nextProps.href !== currProps.href) + { + if (currProps.href === '') + { + // add a surrounding href + var anchor = createNode('a'); + anchor.href = nextProps.href; + anchor.style.display = 'block'; + anchor.style.pointerEvents = 'auto'; + + node.parentNode.replaceChild(anchor, node); + anchor.appendChild(node); + } + else if (nextProps.href === '') + { + // remove the surrounding href + var anchor = node.parentNode; + anchor.parentNode.replaceChild(node, anchor); + } + else + { + // just update the link + node.parentNode.href = nextProps.href; + } + } + + // update click and hover handlers + var removed = false; + + // update hover handlers + if (currProps.hover.ctor === '_Tuple0') + { + if (nextProps.hover.ctor !== '_Tuple0') + { + addHover(node, nextProps.hover); + } + } + else + { + if (nextProps.hover.ctor === '_Tuple0') + { + removed = true; + removeHover(node); + } + else + { + node.elm_hover_handler = nextProps.hover; + } + } + + // update click handlers + if (currProps.click.ctor === '_Tuple0') + { + if (nextProps.click.ctor !== '_Tuple0') + { + addClick(node, nextProps.click); + } + } + else + { + if (nextProps.click.ctor === '_Tuple0') + { + removed = true; + removeClick(node); + } + else + { + node.elm_click_handler = nextProps.click; + } + } + + // stop capturing clicks if + if (removed + && nextProps.hover.ctor === '_Tuple0' + && nextProps.click.ctor === '_Tuple0') + { + node.style.pointerEvents = 'none'; + } + } + + + // TEXT + + function block(align) + { + return function(text) + { + var raw = { + ctor: 'RawHtml', + html: Text.renderHtml(text), + align: align + }; + var pos = htmlHeight(0, raw); + return newElement(pos._0, pos._1, raw); + }; + } + + function markdown(text) + { + var raw = { + ctor: 'RawHtml', + html: text, + align: null + }; + var pos = htmlHeight(0, raw); + return newElement(pos._0, pos._1, raw); + } + + var htmlHeight = + typeof document !== 'undefined' + ? realHtmlHeight + : function(a, b) { return Utils.Tuple2(0, 0); }; + + function realHtmlHeight(width, rawHtml) + { + // create dummy node + var temp = document.createElement('div'); + temp.innerHTML = rawHtml.html; + if (width > 0) + { + temp.style.width = width + 'px'; + } + temp.style.visibility = 'hidden'; + temp.style.styleFloat = 'left'; + temp.style.cssFloat = 'left'; + + document.body.appendChild(temp); + + // get dimensions + var style = window.getComputedStyle(temp, null); + var w = Math.ceil(style.getPropertyValue('width').slice(0, -2) - 0); + var h = Math.ceil(style.getPropertyValue('height').slice(0, -2) - 0); + document.body.removeChild(temp); + return Utils.Tuple2(w, h); + } + + + return localRuntime.Native.Graphics.Element.values = { + render: render, + update: update, + updateAndReplace: updateAndReplace, + + createNode: createNode, + newElement: F3(newElement), + addTransform: addTransform, + htmlHeight: F2(htmlHeight), + guid: Utils.guid, + + block: block, + markdown: markdown + }; +}; + +Elm.Native.Text = {}; +Elm.Native.Text.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Text = localRuntime.Native.Text || {}; + if (localRuntime.Native.Text.values) + { + return localRuntime.Native.Text.values; + } + + var toCss = Elm.Native.Color.make(localRuntime).toCss; + var List = Elm.Native.List.make(localRuntime); + + + // CONSTRUCTORS + + function fromString(str) + { + return { + ctor: 'Text:Text', + _0: str + }; + } + + function append(a, b) + { + return { + ctor: 'Text:Append', + _0: a, + _1: b + }; + } + + function addMeta(field, value, text) + { + var newProps = {}; + var newText = { + ctor: 'Text:Meta', + _0: newProps, + _1: text + }; + + if (text.ctor === 'Text:Meta') + { + newText._1 = text._1; + var props = text._0; + for (var i = metaKeys.length; i--; ) + { + var key = metaKeys[i]; + var val = props[key]; + if (val) + { + newProps[key] = val; + } + } + } + newProps[field] = value; + return newText; + } + + var metaKeys = [ + 'font-size', + 'font-family', + 'font-style', + 'font-weight', + 'href', + 'text-decoration', + 'color' + ]; + + + // conversions from Elm values to CSS + + function toTypefaces(list) + { + var typefaces = List.toArray(list); + for (var i = typefaces.length; i--; ) + { + var typeface = typefaces[i]; + if (typeface.indexOf(' ') > -1) + { + typefaces[i] = "'" + typeface + "'"; + } + } + return typefaces.join(','); + } + + function toLine(line) + { + var ctor = line.ctor; + return ctor === 'Under' + ? 'underline' + : ctor === 'Over' + ? 'overline' + : 'line-through'; + } + + // setting styles of Text + + function style(style, text) + { + var newText = addMeta('color', toCss(style.color), text); + var props = newText._0; + + if (style.typeface.ctor !== '[]') + { + props['font-family'] = toTypefaces(style.typeface); + } + if (style.height.ctor !== 'Nothing') + { + props['font-size'] = style.height._0 + 'px'; + } + if (style.bold) + { + props['font-weight'] = 'bold'; + } + if (style.italic) + { + props['font-style'] = 'italic'; + } + if (style.line.ctor !== 'Nothing') + { + props['text-decoration'] = toLine(style.line._0); + } + return newText; + } + + function height(px, text) + { + return addMeta('font-size', px + 'px', text); + } + + function typeface(names, text) + { + return addMeta('font-family', toTypefaces(names), text); + } + + function monospace(text) + { + return addMeta('font-family', 'monospace', text); + } + + function italic(text) + { + return addMeta('font-style', 'italic', text); + } + + function bold(text) + { + return addMeta('font-weight', 'bold', text); + } + + function link(href, text) + { + return addMeta('href', href, text); + } + + function line(line, text) + { + return addMeta('text-decoration', toLine(line), text); + } + + function color(color, text) + { + return addMeta('color', toCss(color), text); + } + + + // RENDER + + function renderHtml(text) + { + var tag = text.ctor; + if (tag === 'Text:Append') + { + return renderHtml(text._0) + renderHtml(text._1); + } + if (tag === 'Text:Text') + { + return properEscape(text._0); + } + if (tag === 'Text:Meta') + { + return renderMeta(text._0, renderHtml(text._1)); + } + } + + function renderMeta(metas, string) + { + var href = metas.href; + if (href) + { + string = '' + string + ''; + } + var styles = ''; + for (var key in metas) + { + if (key === 'href') + { + continue; + } + styles += key + ':' + metas[key] + ';'; + } + if (styles) + { + string = '' + string + ''; + } + return string; + } + + function properEscape(str) + { + if (str.length === 0) + { + return str; + } + str = str //.replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, ''') + .replace(//g, '>'); + var arr = str.split('\n'); + for (var i = arr.length; i--; ) + { + arr[i] = makeSpaces(arr[i]); + } + return arr.join('
'); + } + + function makeSpaces(s) + { + if (s.length === 0) + { + return s; + } + var arr = s.split(''); + if (arr[0] === ' ') + { + arr[0] = ' '; + } + for (var i = arr.length; --i; ) + { + if (arr[i][0] === ' ' && arr[i - 1] === ' ') + { + arr[i - 1] = arr[i - 1] + arr[i]; + arr[i] = ''; + } + } + for (var i = arr.length; i--; ) + { + if (arr[i].length > 1 && arr[i][0] === ' ') + { + var spaces = arr[i].split(''); + for (var j = spaces.length - 2; j >= 0; j -= 2) + { + spaces[j] = ' '; + } + arr[i] = spaces.join(''); + } + } + arr = arr.join(''); + if (arr[arr.length - 1] === ' ') + { + return arr.slice(0, -1) + ' '; + } + return arr; + } + + + return localRuntime.Native.Text.values = { + fromString: fromString, + append: F2(append), + + height: F2(height), + italic: italic, + bold: bold, + line: F2(line), + monospace: monospace, + typeface: F2(typeface), + color: F2(color), + link: F2(link), + style: F2(style), + + toTypefaces: toTypefaces, + toLine: toLine, + renderHtml: renderHtml + }; +}; + +Elm.Text = Elm.Text || {}; +Elm.Text.make = function (_elm) { + "use strict"; + _elm.Text = _elm.Text || {}; + if (_elm.Text.values) return _elm.Text.values; + var _U = Elm.Native.Utils.make(_elm), + $Color = Elm.Color.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Text = Elm.Native.Text.make(_elm); + var _op = {}; + var line = $Native$Text.line; + var italic = $Native$Text.italic; + var bold = $Native$Text.bold; + var color = $Native$Text.color; + var height = $Native$Text.height; + var link = $Native$Text.link; + var monospace = $Native$Text.monospace; + var typeface = $Native$Text.typeface; + var style = $Native$Text.style; + var append = $Native$Text.append; + var fromString = $Native$Text.fromString; + var empty = fromString(""); + var concat = function (texts) { return A3($List.foldr,append,empty,texts);}; + var join = F2(function (seperator,texts) { return concat(A2($List.intersperse,seperator,texts));}); + var defaultStyle = {typeface: _U.list([]),height: $Maybe.Nothing,color: $Color.black,bold: false,italic: false,line: $Maybe.Nothing}; + var Style = F6(function (a,b,c,d,e,f) { return {typeface: a,height: b,color: c,bold: d,italic: e,line: f};}); + var Through = {ctor: "Through"}; + var Over = {ctor: "Over"}; + var Under = {ctor: "Under"}; + var Text = {ctor: "Text"}; + return _elm.Text.values = {_op: _op + ,fromString: fromString + ,empty: empty + ,append: append + ,concat: concat + ,join: join + ,link: link + ,style: style + ,defaultStyle: defaultStyle + ,typeface: typeface + ,monospace: monospace + ,height: height + ,color: color + ,bold: bold + ,italic: italic + ,line: line + ,Style: Style + ,Under: Under + ,Over: Over + ,Through: Through}; +}; +Elm.Graphics = Elm.Graphics || {}; +Elm.Graphics.Element = Elm.Graphics.Element || {}; +Elm.Graphics.Element.make = function (_elm) { + "use strict"; + _elm.Graphics = _elm.Graphics || {}; + _elm.Graphics.Element = _elm.Graphics.Element || {}; + if (_elm.Graphics.Element.values) return _elm.Graphics.Element.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Color = Elm.Color.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Graphics$Element = Elm.Native.Graphics.Element.make(_elm), + $Text = Elm.Text.make(_elm); + var _op = {}; + var DOut = {ctor: "DOut"}; + var outward = DOut; + var DIn = {ctor: "DIn"}; + var inward = DIn; + var DRight = {ctor: "DRight"}; + var right = DRight; + var DLeft = {ctor: "DLeft"}; + var left = DLeft; + var DDown = {ctor: "DDown"}; + var down = DDown; + var DUp = {ctor: "DUp"}; + var up = DUp; + var RawPosition = F4(function (a,b,c,d) { return {horizontal: a,vertical: b,x: c,y: d};}); + var Position = function (a) { return {ctor: "Position",_0: a};}; + var Relative = function (a) { return {ctor: "Relative",_0: a};}; + var relative = Relative; + var Absolute = function (a) { return {ctor: "Absolute",_0: a};}; + var absolute = Absolute; + var N = {ctor: "N"}; + var bottomLeft = Position({horizontal: N,vertical: N,x: Absolute(0),y: Absolute(0)}); + var bottomLeftAt = F2(function (x,y) { return Position({horizontal: N,vertical: N,x: x,y: y});}); + var Z = {ctor: "Z"}; + var middle = Position({horizontal: Z,vertical: Z,x: Relative(0.5),y: Relative(0.5)}); + var midLeft = Position({horizontal: N,vertical: Z,x: Absolute(0),y: Relative(0.5)}); + var midBottom = Position({horizontal: Z,vertical: N,x: Relative(0.5),y: Absolute(0)}); + var middleAt = F2(function (x,y) { return Position({horizontal: Z,vertical: Z,x: x,y: y});}); + var midLeftAt = F2(function (x,y) { return Position({horizontal: N,vertical: Z,x: x,y: y});}); + var midBottomAt = F2(function (x,y) { return Position({horizontal: Z,vertical: N,x: x,y: y});}); + var P = {ctor: "P"}; + var topLeft = Position({horizontal: N,vertical: P,x: Absolute(0),y: Absolute(0)}); + var topRight = Position({horizontal: P,vertical: P,x: Absolute(0),y: Absolute(0)}); + var bottomRight = Position({horizontal: P,vertical: N,x: Absolute(0),y: Absolute(0)}); + var midRight = Position({horizontal: P,vertical: Z,x: Absolute(0),y: Relative(0.5)}); + var midTop = Position({horizontal: Z,vertical: P,x: Relative(0.5),y: Absolute(0)}); + var topLeftAt = F2(function (x,y) { return Position({horizontal: N,vertical: P,x: x,y: y});}); + var topRightAt = F2(function (x,y) { return Position({horizontal: P,vertical: P,x: x,y: y});}); + var bottomRightAt = F2(function (x,y) { return Position({horizontal: P,vertical: N,x: x,y: y});}); + var midRightAt = F2(function (x,y) { return Position({horizontal: P,vertical: Z,x: x,y: y});}); + var midTopAt = F2(function (x,y) { return Position({horizontal: Z,vertical: P,x: x,y: y});}); + var justified = $Native$Graphics$Element.block("justify"); + var centered = $Native$Graphics$Element.block("center"); + var rightAligned = $Native$Graphics$Element.block("right"); + var leftAligned = $Native$Graphics$Element.block("left"); + var show = function (value) { return leftAligned($Text.monospace($Text.fromString($Basics.toString(value))));}; + var Tiled = {ctor: "Tiled"}; + var Cropped = function (a) { return {ctor: "Cropped",_0: a};}; + var Fitted = {ctor: "Fitted"}; + var Plain = {ctor: "Plain"}; + var Custom = {ctor: "Custom"}; + var RawHtml = {ctor: "RawHtml"}; + var Spacer = {ctor: "Spacer"}; + var Flow = F2(function (a,b) { return {ctor: "Flow",_0: a,_1: b};}); + var Container = F2(function (a,b) { return {ctor: "Container",_0: a,_1: b};}); + var Image = F4(function (a,b,c,d) { return {ctor: "Image",_0: a,_1: b,_2: c,_3: d};}); + var newElement = $Native$Graphics$Element.newElement; + var image = F3(function (w,h,src) { return A3(newElement,w,h,A4(Image,Plain,w,h,src));}); + var fittedImage = F3(function (w,h,src) { return A3(newElement,w,h,A4(Image,Fitted,w,h,src));}); + var croppedImage = F4(function (pos,w,h,src) { return A3(newElement,w,h,A4(Image,Cropped(pos),w,h,src));}); + var tiledImage = F3(function (w,h,src) { return A3(newElement,w,h,A4(Image,Tiled,w,h,src));}); + var container = F4(function (w,h,_p0,e) { var _p1 = _p0;return A3(newElement,w,h,A2(Container,_p1._0,e));}); + var spacer = F2(function (w,h) { return A3(newElement,w,h,Spacer);}); + var sizeOf = function (_p2) { var _p3 = _p2;var _p4 = _p3._0;return {ctor: "_Tuple2",_0: _p4.props.width,_1: _p4.props.height};}; + var heightOf = function (_p5) { var _p6 = _p5;return _p6._0.props.height;}; + var widthOf = function (_p7) { var _p8 = _p7;return _p8._0.props.width;}; + var above = F2(function (hi,lo) { + return A3(newElement,A2($Basics.max,widthOf(hi),widthOf(lo)),heightOf(hi) + heightOf(lo),A2(Flow,DDown,_U.list([hi,lo]))); + }); + var below = F2(function (lo,hi) { + return A3(newElement,A2($Basics.max,widthOf(hi),widthOf(lo)),heightOf(hi) + heightOf(lo),A2(Flow,DDown,_U.list([hi,lo]))); + }); + var beside = F2(function (lft,rht) { + return A3(newElement,widthOf(lft) + widthOf(rht),A2($Basics.max,heightOf(lft),heightOf(rht)),A2(Flow,right,_U.list([lft,rht]))); + }); + var layers = function (es) { + var hs = A2($List.map,heightOf,es); + var ws = A2($List.map,widthOf,es); + return A3(newElement,A2($Maybe.withDefault,0,$List.maximum(ws)),A2($Maybe.withDefault,0,$List.maximum(hs)),A2(Flow,DOut,es)); + }; + var empty = A2(spacer,0,0); + var flow = F2(function (dir,es) { + var newFlow = F2(function (w,h) { return A3(newElement,w,h,A2(Flow,dir,es));}); + var maxOrZero = function (list) { return A2($Maybe.withDefault,0,$List.maximum(list));}; + var hs = A2($List.map,heightOf,es); + var ws = A2($List.map,widthOf,es); + if (_U.eq(es,_U.list([]))) return empty; else { + var _p9 = dir; + switch (_p9.ctor) + {case "DUp": return A2(newFlow,maxOrZero(ws),$List.sum(hs)); + case "DDown": return A2(newFlow,maxOrZero(ws),$List.sum(hs)); + case "DLeft": return A2(newFlow,$List.sum(ws),maxOrZero(hs)); + case "DRight": return A2(newFlow,$List.sum(ws),maxOrZero(hs)); + case "DIn": return A2(newFlow,maxOrZero(ws),maxOrZero(hs)); + default: return A2(newFlow,maxOrZero(ws),maxOrZero(hs));} + } + }); + var Properties = F9(function (a,b,c,d,e,f,g,h,i) { return {id: a,width: b,height: c,opacity: d,color: e,href: f,tag: g,hover: h,click: i};}); + var Element_elm_builtin = function (a) { return {ctor: "Element_elm_builtin",_0: a};}; + var width = F2(function (newWidth,_p10) { + var _p11 = _p10; + var _p14 = _p11._0.props; + var _p13 = _p11._0.element; + var newHeight = function () { + var _p12 = _p13; + switch (_p12.ctor) + {case "Image": return $Basics.round($Basics.toFloat(_p12._2) / $Basics.toFloat(_p12._1) * $Basics.toFloat(newWidth)); + case "RawHtml": return $Basics.snd(A2($Native$Graphics$Element.htmlHeight,newWidth,_p13)); + default: return _p14.height;} + }(); + return Element_elm_builtin({element: _p13,props: _U.update(_p14,{width: newWidth,height: newHeight})}); + }); + var height = F2(function (newHeight,_p15) { + var _p16 = _p15; + return Element_elm_builtin({element: _p16._0.element,props: _U.update(_p16._0.props,{height: newHeight})}); + }); + var size = F3(function (w,h,e) { return A2(height,h,A2(width,w,e));}); + var opacity = F2(function (givenOpacity,_p17) { + var _p18 = _p17; + return Element_elm_builtin({element: _p18._0.element,props: _U.update(_p18._0.props,{opacity: givenOpacity})}); + }); + var color = F2(function (clr,_p19) { + var _p20 = _p19; + return Element_elm_builtin({element: _p20._0.element,props: _U.update(_p20._0.props,{color: $Maybe.Just(clr)})}); + }); + var tag = F2(function (name,_p21) { var _p22 = _p21;return Element_elm_builtin({element: _p22._0.element,props: _U.update(_p22._0.props,{tag: name})});}); + var link = F2(function (href,_p23) { + var _p24 = _p23; + return Element_elm_builtin({element: _p24._0.element,props: _U.update(_p24._0.props,{href: href})}); + }); + return _elm.Graphics.Element.values = {_op: _op + ,image: image + ,fittedImage: fittedImage + ,croppedImage: croppedImage + ,tiledImage: tiledImage + ,leftAligned: leftAligned + ,rightAligned: rightAligned + ,centered: centered + ,justified: justified + ,show: show + ,width: width + ,height: height + ,size: size + ,color: color + ,opacity: opacity + ,link: link + ,tag: tag + ,widthOf: widthOf + ,heightOf: heightOf + ,sizeOf: sizeOf + ,flow: flow + ,up: up + ,down: down + ,left: left + ,right: right + ,inward: inward + ,outward: outward + ,layers: layers + ,above: above + ,below: below + ,beside: beside + ,empty: empty + ,spacer: spacer + ,container: container + ,middle: middle + ,midTop: midTop + ,midBottom: midBottom + ,midLeft: midLeft + ,midRight: midRight + ,topLeft: topLeft + ,topRight: topRight + ,bottomLeft: bottomLeft + ,bottomRight: bottomRight + ,absolute: absolute + ,relative: relative + ,middleAt: middleAt + ,midTopAt: midTopAt + ,midBottomAt: midBottomAt + ,midLeftAt: midLeftAt + ,midRightAt: midRightAt + ,topLeftAt: topLeftAt + ,topRightAt: topRightAt + ,bottomLeftAt: bottomLeftAt + ,bottomRightAt: bottomRightAt}; +}; +Elm.Graphics = Elm.Graphics || {}; +Elm.Graphics.Collage = Elm.Graphics.Collage || {}; +Elm.Graphics.Collage.make = function (_elm) { + "use strict"; + _elm.Graphics = _elm.Graphics || {}; + _elm.Graphics.Collage = _elm.Graphics.Collage || {}; + if (_elm.Graphics.Collage.values) return _elm.Graphics.Collage.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Color = Elm.Color.make(_elm), + $Graphics$Element = Elm.Graphics.Element.make(_elm), + $List = Elm.List.make(_elm), + $Native$Graphics$Collage = Elm.Native.Graphics.Collage.make(_elm), + $Text = Elm.Text.make(_elm), + $Transform2D = Elm.Transform2D.make(_elm); + var _op = {}; + var Shape = function (a) { return {ctor: "Shape",_0: a};}; + var polygon = function (points) { return Shape(points);}; + var rect = F2(function (w,h) { + var hh = h / 2; + var hw = w / 2; + return Shape(_U.list([{ctor: "_Tuple2",_0: 0 - hw,_1: 0 - hh} + ,{ctor: "_Tuple2",_0: 0 - hw,_1: hh} + ,{ctor: "_Tuple2",_0: hw,_1: hh} + ,{ctor: "_Tuple2",_0: hw,_1: 0 - hh}])); + }); + var square = function (n) { return A2(rect,n,n);}; + var oval = F2(function (w,h) { + var hh = h / 2; + var hw = w / 2; + var n = 50; + var t = 2 * $Basics.pi / n; + var f = function (i) { return {ctor: "_Tuple2",_0: hw * $Basics.cos(t * i),_1: hh * $Basics.sin(t * i)};}; + return Shape(A2($List.map,f,_U.range(0,n - 1))); + }); + var circle = function (r) { return A2(oval,2 * r,2 * r);}; + var ngon = F2(function (n,r) { + var m = $Basics.toFloat(n); + var t = 2 * $Basics.pi / m; + var f = function (i) { return {ctor: "_Tuple2",_0: r * $Basics.cos(t * i),_1: r * $Basics.sin(t * i)};}; + return Shape(A2($List.map,f,_U.range(0,m - 1))); + }); + var Path = function (a) { return {ctor: "Path",_0: a};}; + var path = function (ps) { return Path(ps);}; + var segment = F2(function (p1,p2) { return Path(_U.list([p1,p2]));}); + var collage = $Native$Graphics$Collage.collage; + var Fill = function (a) { return {ctor: "Fill",_0: a};}; + var Line = function (a) { return {ctor: "Line",_0: a};}; + var FGroup = F2(function (a,b) { return {ctor: "FGroup",_0: a,_1: b};}); + var FElement = function (a) { return {ctor: "FElement",_0: a};}; + var FImage = F4(function (a,b,c,d) { return {ctor: "FImage",_0: a,_1: b,_2: c,_3: d};}); + var FText = function (a) { return {ctor: "FText",_0: a};}; + var FOutlinedText = F2(function (a,b) { return {ctor: "FOutlinedText",_0: a,_1: b};}); + var FShape = F2(function (a,b) { return {ctor: "FShape",_0: a,_1: b};}); + var FPath = F2(function (a,b) { return {ctor: "FPath",_0: a,_1: b};}); + var LineStyle = F6(function (a,b,c,d,e,f) { return {color: a,width: b,cap: c,join: d,dashing: e,dashOffset: f};}); + var Clipped = {ctor: "Clipped"}; + var Sharp = function (a) { return {ctor: "Sharp",_0: a};}; + var Smooth = {ctor: "Smooth"}; + var Padded = {ctor: "Padded"}; + var Round = {ctor: "Round"}; + var Flat = {ctor: "Flat"}; + var defaultLine = {color: $Color.black,width: 1,cap: Flat,join: Sharp(10),dashing: _U.list([]),dashOffset: 0}; + var solid = function (clr) { return _U.update(defaultLine,{color: clr});}; + var dashed = function (clr) { return _U.update(defaultLine,{color: clr,dashing: _U.list([8,4])});}; + var dotted = function (clr) { return _U.update(defaultLine,{color: clr,dashing: _U.list([3,3])});}; + var Grad = function (a) { return {ctor: "Grad",_0: a};}; + var Texture = function (a) { return {ctor: "Texture",_0: a};}; + var Solid = function (a) { return {ctor: "Solid",_0: a};}; + var Form_elm_builtin = function (a) { return {ctor: "Form_elm_builtin",_0: a};}; + var form = function (f) { return Form_elm_builtin({theta: 0,scale: 1,x: 0,y: 0,alpha: 1,form: f});}; + var fill = F2(function (style,_p0) { var _p1 = _p0;return form(A2(FShape,Fill(style),_p1._0));}); + var filled = F2(function (color,shape) { return A2(fill,Solid(color),shape);}); + var textured = F2(function (src,shape) { return A2(fill,Texture(src),shape);}); + var gradient = F2(function (grad,shape) { return A2(fill,Grad(grad),shape);}); + var outlined = F2(function (style,_p2) { var _p3 = _p2;return form(A2(FShape,Line(style),_p3._0));}); + var traced = F2(function (style,_p4) { var _p5 = _p4;return form(A2(FPath,style,_p5._0));}); + var sprite = F4(function (w,h,pos,src) { return form(A4(FImage,w,h,pos,src));}); + var toForm = function (e) { return form(FElement(e));}; + var group = function (fs) { return form(A2(FGroup,$Transform2D.identity,fs));}; + var groupTransform = F2(function (matrix,fs) { return form(A2(FGroup,matrix,fs));}); + var text = function (t) { return form(FText(t));}; + var outlinedText = F2(function (ls,t) { return form(A2(FOutlinedText,ls,t));}); + var move = F2(function (_p7,_p6) { + var _p8 = _p7; + var _p9 = _p6; + var _p10 = _p9._0; + return Form_elm_builtin(_U.update(_p10,{x: _p10.x + _p8._0,y: _p10.y + _p8._1})); + }); + var moveX = F2(function (x,_p11) { var _p12 = _p11;var _p13 = _p12._0;return Form_elm_builtin(_U.update(_p13,{x: _p13.x + x}));}); + var moveY = F2(function (y,_p14) { var _p15 = _p14;var _p16 = _p15._0;return Form_elm_builtin(_U.update(_p16,{y: _p16.y + y}));}); + var scale = F2(function (s,_p17) { var _p18 = _p17;var _p19 = _p18._0;return Form_elm_builtin(_U.update(_p19,{scale: _p19.scale * s}));}); + var rotate = F2(function (t,_p20) { var _p21 = _p20;var _p22 = _p21._0;return Form_elm_builtin(_U.update(_p22,{theta: _p22.theta + t}));}); + var alpha = F2(function (a,_p23) { var _p24 = _p23;return Form_elm_builtin(_U.update(_p24._0,{alpha: a}));}); + return _elm.Graphics.Collage.values = {_op: _op + ,collage: collage + ,toForm: toForm + ,filled: filled + ,textured: textured + ,gradient: gradient + ,outlined: outlined + ,traced: traced + ,text: text + ,outlinedText: outlinedText + ,move: move + ,moveX: moveX + ,moveY: moveY + ,scale: scale + ,rotate: rotate + ,alpha: alpha + ,group: group + ,groupTransform: groupTransform + ,rect: rect + ,oval: oval + ,square: square + ,circle: circle + ,ngon: ngon + ,polygon: polygon + ,segment: segment + ,path: path + ,solid: solid + ,dashed: dashed + ,dotted: dotted + ,defaultLine: defaultLine + ,LineStyle: LineStyle + ,Flat: Flat + ,Round: Round + ,Padded: Padded + ,Smooth: Smooth + ,Sharp: Sharp + ,Clipped: Clipped}; +}; +Elm.Native.Debug = {}; +Elm.Native.Debug.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Debug = localRuntime.Native.Debug || {}; + if (localRuntime.Native.Debug.values) + { + return localRuntime.Native.Debug.values; + } + + var toString = Elm.Native.Utils.make(localRuntime).toString; + + function log(tag, value) + { + var msg = tag + ': ' + toString(value); + var process = process || {}; + if (process.stdout) + { + process.stdout.write(msg); + } + else + { + console.log(msg); + } + return value; + } + + function crash(message) + { + throw new Error(message); + } + + function tracePath(tag, form) + { + if (localRuntime.debug) + { + return localRuntime.debug.trace(tag, form); + } + return form; + } + + function watch(tag, value) + { + if (localRuntime.debug) + { + localRuntime.debug.watch(tag, value); + } + return value; + } + + function watchSummary(tag, summarize, value) + { + if (localRuntime.debug) + { + localRuntime.debug.watch(tag, summarize(value)); + } + return value; + } + + return localRuntime.Native.Debug.values = { + crash: crash, + tracePath: F2(tracePath), + log: F2(log), + watch: F2(watch), + watchSummary: F3(watchSummary) + }; +}; + +Elm.Debug = Elm.Debug || {}; +Elm.Debug.make = function (_elm) { + "use strict"; + _elm.Debug = _elm.Debug || {}; + if (_elm.Debug.values) return _elm.Debug.values; + var _U = Elm.Native.Utils.make(_elm),$Graphics$Collage = Elm.Graphics.Collage.make(_elm),$Native$Debug = Elm.Native.Debug.make(_elm); + var _op = {}; + var trace = $Native$Debug.tracePath; + var watchSummary = $Native$Debug.watchSummary; + var watch = $Native$Debug.watch; + var crash = $Native$Debug.crash; + var log = $Native$Debug.log; + return _elm.Debug.values = {_op: _op,log: log,crash: crash,watch: watch,watchSummary: watchSummary,trace: trace}; +}; +Elm.Result = Elm.Result || {}; +Elm.Result.make = function (_elm) { + "use strict"; + _elm.Result = _elm.Result || {}; + if (_elm.Result.values) return _elm.Result.values; + var _U = Elm.Native.Utils.make(_elm),$Maybe = Elm.Maybe.make(_elm); + var _op = {}; + var toMaybe = function (result) { var _p0 = result;if (_p0.ctor === "Ok") { return $Maybe.Just(_p0._0);} else { return $Maybe.Nothing;}}; + var withDefault = F2(function (def,result) { var _p1 = result;if (_p1.ctor === "Ok") { return _p1._0;} else { return def;}}); + var Err = function (a) { return {ctor: "Err",_0: a};}; + var andThen = F2(function (result,callback) { var _p2 = result;if (_p2.ctor === "Ok") { return callback(_p2._0);} else { return Err(_p2._0);}}); + var Ok = function (a) { return {ctor: "Ok",_0: a};}; + var map = F2(function (func,ra) { var _p3 = ra;if (_p3.ctor === "Ok") { return Ok(func(_p3._0));} else { return Err(_p3._0);}}); + var map2 = F3(function (func,ra,rb) { + var _p4 = {ctor: "_Tuple2",_0: ra,_1: rb}; + if (_p4._0.ctor === "Ok") { + if (_p4._1.ctor === "Ok") { + return Ok(A2(func,_p4._0._0,_p4._1._0)); + } else { + return Err(_p4._1._0); + } + } else { + return Err(_p4._0._0); + } + }); + var map3 = F4(function (func,ra,rb,rc) { + var _p5 = {ctor: "_Tuple3",_0: ra,_1: rb,_2: rc}; + if (_p5._0.ctor === "Ok") { + if (_p5._1.ctor === "Ok") { + if (_p5._2.ctor === "Ok") { + return Ok(A3(func,_p5._0._0,_p5._1._0,_p5._2._0)); + } else { + return Err(_p5._2._0); + } + } else { + return Err(_p5._1._0); + } + } else { + return Err(_p5._0._0); + } + }); + var map4 = F5(function (func,ra,rb,rc,rd) { + var _p6 = {ctor: "_Tuple4",_0: ra,_1: rb,_2: rc,_3: rd}; + if (_p6._0.ctor === "Ok") { + if (_p6._1.ctor === "Ok") { + if (_p6._2.ctor === "Ok") { + if (_p6._3.ctor === "Ok") { + return Ok(A4(func,_p6._0._0,_p6._1._0,_p6._2._0,_p6._3._0)); + } else { + return Err(_p6._3._0); + } + } else { + return Err(_p6._2._0); + } + } else { + return Err(_p6._1._0); + } + } else { + return Err(_p6._0._0); + } + }); + var map5 = F6(function (func,ra,rb,rc,rd,re) { + var _p7 = {ctor: "_Tuple5",_0: ra,_1: rb,_2: rc,_3: rd,_4: re}; + if (_p7._0.ctor === "Ok") { + if (_p7._1.ctor === "Ok") { + if (_p7._2.ctor === "Ok") { + if (_p7._3.ctor === "Ok") { + if (_p7._4.ctor === "Ok") { + return Ok(A5(func,_p7._0._0,_p7._1._0,_p7._2._0,_p7._3._0,_p7._4._0)); + } else { + return Err(_p7._4._0); + } + } else { + return Err(_p7._3._0); + } + } else { + return Err(_p7._2._0); + } + } else { + return Err(_p7._1._0); + } + } else { + return Err(_p7._0._0); + } + }); + var formatError = F2(function (f,result) { var _p8 = result;if (_p8.ctor === "Ok") { return Ok(_p8._0);} else { return Err(f(_p8._0));}}); + var fromMaybe = F2(function (err,maybe) { var _p9 = maybe;if (_p9.ctor === "Just") { return Ok(_p9._0);} else { return Err(err);}}); + return _elm.Result.values = {_op: _op + ,withDefault: withDefault + ,map: map + ,map2: map2 + ,map3: map3 + ,map4: map4 + ,map5: map5 + ,andThen: andThen + ,toMaybe: toMaybe + ,fromMaybe: fromMaybe + ,formatError: formatError + ,Ok: Ok + ,Err: Err}; +}; +Elm.Native.Signal = {}; + +Elm.Native.Signal.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Signal = localRuntime.Native.Signal || {}; + if (localRuntime.Native.Signal.values) + { + return localRuntime.Native.Signal.values; + } + + + var Task = Elm.Native.Task.make(localRuntime); + var Utils = Elm.Native.Utils.make(localRuntime); + + + function broadcastToKids(node, timestamp, update) + { + var kids = node.kids; + for (var i = kids.length; i--; ) + { + kids[i].notify(timestamp, update, node.id); + } + } + + + // INPUT + + function input(name, base) + { + var node = { + id: Utils.guid(), + name: 'input-' + name, + value: base, + parents: [], + kids: [] + }; + + node.notify = function(timestamp, targetId, value) { + var update = targetId === node.id; + if (update) + { + node.value = value; + } + broadcastToKids(node, timestamp, update); + return update; + }; + + localRuntime.inputs.push(node); + + return node; + } + + function constant(value) + { + return input('constant', value); + } + + + // MAILBOX + + function mailbox(base) + { + var signal = input('mailbox', base); + + function send(value) { + return Task.asyncFunction(function(callback) { + localRuntime.setTimeout(function() { + localRuntime.notify(signal.id, value); + }, 0); + callback(Task.succeed(Utils.Tuple0)); + }); + } + + return { + signal: signal, + address: { + ctor: 'Address', + _0: send + } + }; + } + + function sendMessage(message) + { + Task.perform(message._0); + } + + + // OUTPUT + + function output(name, handler, parent) + { + var node = { + id: Utils.guid(), + name: 'output-' + name, + parents: [parent], + isOutput: true + }; + + node.notify = function(timestamp, parentUpdate, parentID) + { + if (parentUpdate) + { + handler(parent.value); + } + }; + + parent.kids.push(node); + + return node; + } + + + // MAP + + function mapMany(refreshValue, args) + { + var node = { + id: Utils.guid(), + name: 'map' + args.length, + value: refreshValue(), + parents: args, + kids: [] + }; + + var numberOfParents = args.length; + var count = 0; + var update = false; + + node.notify = function(timestamp, parentUpdate, parentID) + { + ++count; + + update = update || parentUpdate; + + if (count === numberOfParents) + { + if (update) + { + node.value = refreshValue(); + } + broadcastToKids(node, timestamp, update); + update = false; + count = 0; + } + }; + + for (var i = numberOfParents; i--; ) + { + args[i].kids.push(node); + } + + return node; + } + + + function map(func, a) + { + function refreshValue() + { + return func(a.value); + } + return mapMany(refreshValue, [a]); + } + + + function map2(func, a, b) + { + function refreshValue() + { + return A2( func, a.value, b.value ); + } + return mapMany(refreshValue, [a, b]); + } + + + function map3(func, a, b, c) + { + function refreshValue() + { + return A3( func, a.value, b.value, c.value ); + } + return mapMany(refreshValue, [a, b, c]); + } + + + function map4(func, a, b, c, d) + { + function refreshValue() + { + return A4( func, a.value, b.value, c.value, d.value ); + } + return mapMany(refreshValue, [a, b, c, d]); + } + + + function map5(func, a, b, c, d, e) + { + function refreshValue() + { + return A5( func, a.value, b.value, c.value, d.value, e.value ); + } + return mapMany(refreshValue, [a, b, c, d, e]); + } + + + // FOLD + + function foldp(update, state, signal) + { + var node = { + id: Utils.guid(), + name: 'foldp', + parents: [signal], + kids: [], + value: state + }; + + node.notify = function(timestamp, parentUpdate, parentID) + { + if (parentUpdate) + { + node.value = A2( update, signal.value, node.value ); + } + broadcastToKids(node, timestamp, parentUpdate); + }; + + signal.kids.push(node); + + return node; + } + + + // TIME + + function timestamp(signal) + { + var node = { + id: Utils.guid(), + name: 'timestamp', + value: Utils.Tuple2(localRuntime.timer.programStart, signal.value), + parents: [signal], + kids: [] + }; + + node.notify = function(timestamp, parentUpdate, parentID) + { + if (parentUpdate) + { + node.value = Utils.Tuple2(timestamp, signal.value); + } + broadcastToKids(node, timestamp, parentUpdate); + }; + + signal.kids.push(node); + + return node; + } + + + function delay(time, signal) + { + var delayed = input('delay-input-' + time, signal.value); + + function handler(value) + { + setTimeout(function() { + localRuntime.notify(delayed.id, value); + }, time); + } + + output('delay-output-' + time, handler, signal); + + return delayed; + } + + + // MERGING + + function genericMerge(tieBreaker, leftStream, rightStream) + { + var node = { + id: Utils.guid(), + name: 'merge', + value: A2(tieBreaker, leftStream.value, rightStream.value), + parents: [leftStream, rightStream], + kids: [] + }; + + var left = { touched: false, update: false, value: null }; + var right = { touched: false, update: false, value: null }; + + node.notify = function(timestamp, parentUpdate, parentID) + { + if (parentID === leftStream.id) + { + left.touched = true; + left.update = parentUpdate; + left.value = leftStream.value; + } + if (parentID === rightStream.id) + { + right.touched = true; + right.update = parentUpdate; + right.value = rightStream.value; + } + + if (left.touched && right.touched) + { + var update = false; + if (left.update && right.update) + { + node.value = A2(tieBreaker, left.value, right.value); + update = true; + } + else if (left.update) + { + node.value = left.value; + update = true; + } + else if (right.update) + { + node.value = right.value; + update = true; + } + left.touched = false; + right.touched = false; + + broadcastToKids(node, timestamp, update); + } + }; + + leftStream.kids.push(node); + rightStream.kids.push(node); + + return node; + } + + + // FILTERING + + function filterMap(toMaybe, base, signal) + { + var maybe = toMaybe(signal.value); + var node = { + id: Utils.guid(), + name: 'filterMap', + value: maybe.ctor === 'Nothing' ? base : maybe._0, + parents: [signal], + kids: [] + }; + + node.notify = function(timestamp, parentUpdate, parentID) + { + var update = false; + if (parentUpdate) + { + var maybe = toMaybe(signal.value); + if (maybe.ctor === 'Just') + { + update = true; + node.value = maybe._0; + } + } + broadcastToKids(node, timestamp, update); + }; + + signal.kids.push(node); + + return node; + } + + + // SAMPLING + + function sampleOn(ticker, signal) + { + var node = { + id: Utils.guid(), + name: 'sampleOn', + value: signal.value, + parents: [ticker, signal], + kids: [] + }; + + var signalTouch = false; + var tickerTouch = false; + var tickerUpdate = false; + + node.notify = function(timestamp, parentUpdate, parentID) + { + if (parentID === ticker.id) + { + tickerTouch = true; + tickerUpdate = parentUpdate; + } + if (parentID === signal.id) + { + signalTouch = true; + } + + if (tickerTouch && signalTouch) + { + if (tickerUpdate) + { + node.value = signal.value; + } + tickerTouch = false; + signalTouch = false; + + broadcastToKids(node, timestamp, tickerUpdate); + } + }; + + ticker.kids.push(node); + signal.kids.push(node); + + return node; + } + + + // DROP REPEATS + + function dropRepeats(signal) + { + var node = { + id: Utils.guid(), + name: 'dropRepeats', + value: signal.value, + parents: [signal], + kids: [] + }; + + node.notify = function(timestamp, parentUpdate, parentID) + { + var update = false; + if (parentUpdate && !Utils.eq(node.value, signal.value)) + { + node.value = signal.value; + update = true; + } + broadcastToKids(node, timestamp, update); + }; + + signal.kids.push(node); + + return node; + } + + + return localRuntime.Native.Signal.values = { + input: input, + constant: constant, + mailbox: mailbox, + sendMessage: sendMessage, + output: output, + map: F2(map), + map2: F3(map2), + map3: F4(map3), + map4: F5(map4), + map5: F6(map5), + foldp: F3(foldp), + genericMerge: F3(genericMerge), + filterMap: F3(filterMap), + sampleOn: F2(sampleOn), + dropRepeats: dropRepeats, + timestamp: timestamp, + delay: F2(delay) + }; +}; + +Elm.Native.Task = {}; + +Elm.Native.Task.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Task = localRuntime.Native.Task || {}; + if (localRuntime.Native.Task.values) + { + return localRuntime.Native.Task.values; + } + + var Result = Elm.Result.make(localRuntime); + var Signal; + var Utils = Elm.Native.Utils.make(localRuntime); + + + // CONSTRUCTORS + + function succeed(value) + { + return { + tag: 'Succeed', + value: value + }; + } + + function fail(error) + { + return { + tag: 'Fail', + value: error + }; + } + + function asyncFunction(func) + { + return { + tag: 'Async', + asyncFunction: func + }; + } + + function andThen(task, callback) + { + return { + tag: 'AndThen', + task: task, + callback: callback + }; + } + + function catch_(task, callback) + { + return { + tag: 'Catch', + task: task, + callback: callback + }; + } + + + // RUNNER + + function perform(task) { + runTask({ task: task }, function() {}); + } + + function performSignal(name, signal) + { + var workQueue = []; + + function onComplete() + { + workQueue.shift(); + + if (workQueue.length > 0) + { + var task = workQueue[0]; + + setTimeout(function() { + runTask(task, onComplete); + }, 0); + } + } + + function register(task) + { + var root = { task: task }; + workQueue.push(root); + if (workQueue.length === 1) + { + runTask(root, onComplete); + } + } + + if (!Signal) + { + Signal = Elm.Native.Signal.make(localRuntime); + } + Signal.output('perform-tasks-' + name, register, signal); + + register(signal.value); + + return signal; + } + + function mark(status, task) + { + return { status: status, task: task }; + } + + function runTask(root, onComplete) + { + var result = mark('runnable', root.task); + while (result.status === 'runnable') + { + result = stepTask(onComplete, root, result.task); + } + + if (result.status === 'done') + { + root.task = result.task; + onComplete(); + } + + if (result.status === 'blocked') + { + root.task = result.task; + } + } + + function stepTask(onComplete, root, task) + { + var tag = task.tag; + + if (tag === 'Succeed' || tag === 'Fail') + { + return mark('done', task); + } + + if (tag === 'Async') + { + var placeHolder = {}; + var couldBeSync = true; + var wasSync = false; + + task.asyncFunction(function(result) { + placeHolder.tag = result.tag; + placeHolder.value = result.value; + if (couldBeSync) + { + wasSync = true; + } + else + { + runTask(root, onComplete); + } + }); + couldBeSync = false; + return mark(wasSync ? 'done' : 'blocked', placeHolder); + } + + if (tag === 'AndThen' || tag === 'Catch') + { + var result = mark('runnable', task.task); + while (result.status === 'runnable') + { + result = stepTask(onComplete, root, result.task); + } + + if (result.status === 'done') + { + var activeTask = result.task; + var activeTag = activeTask.tag; + + var succeedChain = activeTag === 'Succeed' && tag === 'AndThen'; + var failChain = activeTag === 'Fail' && tag === 'Catch'; + + return (succeedChain || failChain) + ? mark('runnable', task.callback(activeTask.value)) + : mark('runnable', activeTask); + } + if (result.status === 'blocked') + { + return mark('blocked', { + tag: tag, + task: result.task, + callback: task.callback + }); + } + } + } + + + // THREADS + + function sleep(time) { + return asyncFunction(function(callback) { + setTimeout(function() { + callback(succeed(Utils.Tuple0)); + }, time); + }); + } + + function spawn(task) { + return asyncFunction(function(callback) { + var id = setTimeout(function() { + perform(task); + }, 0); + callback(succeed(id)); + }); + } + + + return localRuntime.Native.Task.values = { + succeed: succeed, + fail: fail, + asyncFunction: asyncFunction, + andThen: F2(andThen), + catch_: F2(catch_), + perform: perform, + performSignal: performSignal, + spawn: spawn, + sleep: sleep + }; +}; + +Elm.Task = Elm.Task || {}; +Elm.Task.make = function (_elm) { + "use strict"; + _elm.Task = _elm.Task || {}; + if (_elm.Task.values) return _elm.Task.values; + var _U = Elm.Native.Utils.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Task = Elm.Native.Task.make(_elm), + $Result = Elm.Result.make(_elm); + var _op = {}; + var sleep = $Native$Task.sleep; + var spawn = $Native$Task.spawn; + var ThreadID = function (a) { return {ctor: "ThreadID",_0: a};}; + var onError = $Native$Task.catch_; + var andThen = $Native$Task.andThen; + var fail = $Native$Task.fail; + var mapError = F2(function (f,task) { return A2(onError,task,function (err) { return fail(f(err));});}); + var succeed = $Native$Task.succeed; + var map = F2(function (func,taskA) { return A2(andThen,taskA,function (a) { return succeed(func(a));});}); + var map2 = F3(function (func,taskA,taskB) { + return A2(andThen,taskA,function (a) { return A2(andThen,taskB,function (b) { return succeed(A2(func,a,b));});}); + }); + var map3 = F4(function (func,taskA,taskB,taskC) { + return A2(andThen, + taskA, + function (a) { + return A2(andThen,taskB,function (b) { return A2(andThen,taskC,function (c) { return succeed(A3(func,a,b,c));});}); + }); + }); + var map4 = F5(function (func,taskA,taskB,taskC,taskD) { + return A2(andThen, + taskA, + function (a) { + return A2(andThen, + taskB, + function (b) { + return A2(andThen,taskC,function (c) { return A2(andThen,taskD,function (d) { return succeed(A4(func,a,b,c,d));});}); + }); + }); + }); + var map5 = F6(function (func,taskA,taskB,taskC,taskD,taskE) { + return A2(andThen, + taskA, + function (a) { + return A2(andThen, + taskB, + function (b) { + return A2(andThen, + taskC, + function (c) { + return A2(andThen,taskD,function (d) { return A2(andThen,taskE,function (e) { return succeed(A5(func,a,b,c,d,e));});}); + }); + }); + }); + }); + var andMap = F2(function (taskFunc,taskValue) { + return A2(andThen,taskFunc,function (func) { return A2(andThen,taskValue,function (value) { return succeed(func(value));});}); + }); + var sequence = function (tasks) { + var _p0 = tasks; + if (_p0.ctor === "[]") { + return succeed(_U.list([])); + } else { + return A3(map2,F2(function (x,y) { return A2($List._op["::"],x,y);}),_p0._0,sequence(_p0._1)); + } + }; + var toMaybe = function (task) { return A2(onError,A2(map,$Maybe.Just,task),function (_p1) { return succeed($Maybe.Nothing);});}; + var fromMaybe = F2(function ($default,maybe) { var _p2 = maybe;if (_p2.ctor === "Just") { return succeed(_p2._0);} else { return fail($default);}}); + var toResult = function (task) { return A2(onError,A2(map,$Result.Ok,task),function (msg) { return succeed($Result.Err(msg));});}; + var fromResult = function (result) { var _p3 = result;if (_p3.ctor === "Ok") { return succeed(_p3._0);} else { return fail(_p3._0);}}; + var Task = {ctor: "Task"}; + return _elm.Task.values = {_op: _op + ,succeed: succeed + ,fail: fail + ,map: map + ,map2: map2 + ,map3: map3 + ,map4: map4 + ,map5: map5 + ,andMap: andMap + ,sequence: sequence + ,andThen: andThen + ,onError: onError + ,mapError: mapError + ,toMaybe: toMaybe + ,fromMaybe: fromMaybe + ,toResult: toResult + ,fromResult: fromResult + ,spawn: spawn + ,sleep: sleep}; +}; +Elm.Signal = Elm.Signal || {}; +Elm.Signal.make = function (_elm) { + "use strict"; + _elm.Signal = _elm.Signal || {}; + if (_elm.Signal.values) return _elm.Signal.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Signal = Elm.Native.Signal.make(_elm), + $Task = Elm.Task.make(_elm); + var _op = {}; + var send = F2(function (_p0,value) { + var _p1 = _p0; + return A2($Task.onError,_p1._0(value),function (_p2) { return $Task.succeed({ctor: "_Tuple0"});}); + }); + var Message = function (a) { return {ctor: "Message",_0: a};}; + var message = F2(function (_p3,value) { var _p4 = _p3;return Message(_p4._0(value));}); + var mailbox = $Native$Signal.mailbox; + var Address = function (a) { return {ctor: "Address",_0: a};}; + var forwardTo = F2(function (_p5,f) { var _p6 = _p5;return Address(function (x) { return _p6._0(f(x));});}); + var Mailbox = F2(function (a,b) { return {address: a,signal: b};}); + var sampleOn = $Native$Signal.sampleOn; + var dropRepeats = $Native$Signal.dropRepeats; + var filterMap = $Native$Signal.filterMap; + var filter = F3(function (isOk,base,signal) { + return A3(filterMap,function (value) { return isOk(value) ? $Maybe.Just(value) : $Maybe.Nothing;},base,signal); + }); + var merge = F2(function (left,right) { return A3($Native$Signal.genericMerge,$Basics.always,left,right);}); + var mergeMany = function (signalList) { + var _p7 = $List.reverse(signalList); + if (_p7.ctor === "[]") { + return _U.crashCase("Signal",{start: {line: 184,column: 3},end: {line: 189,column: 40}},_p7)("mergeMany was given an empty list!"); + } else { + return A3($List.foldl,merge,_p7._0,_p7._1); + } + }; + var foldp = $Native$Signal.foldp; + var map5 = $Native$Signal.map5; + var map4 = $Native$Signal.map4; + var map3 = $Native$Signal.map3; + var map2 = $Native$Signal.map2; + var map = $Native$Signal.map; + var constant = $Native$Signal.constant; + var Signal = {ctor: "Signal"}; + return _elm.Signal.values = {_op: _op + ,merge: merge + ,mergeMany: mergeMany + ,map: map + ,map2: map2 + ,map3: map3 + ,map4: map4 + ,map5: map5 + ,constant: constant + ,dropRepeats: dropRepeats + ,filter: filter + ,filterMap: filterMap + ,sampleOn: sampleOn + ,foldp: foldp + ,mailbox: mailbox + ,send: send + ,message: message + ,forwardTo: forwardTo + ,Mailbox: Mailbox}; +}; +Elm.Native.Json = {}; + +Elm.Native.Json.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Json = localRuntime.Native.Json || {}; + if (localRuntime.Native.Json.values) { + return localRuntime.Native.Json.values; + } + + var ElmArray = Elm.Native.Array.make(localRuntime); + var List = Elm.Native.List.make(localRuntime); + var Maybe = Elm.Maybe.make(localRuntime); + var Result = Elm.Result.make(localRuntime); + var Utils = Elm.Native.Utils.make(localRuntime); + + + function crash(expected, actual) { + throw new Error( + 'expecting ' + expected + ' but got ' + JSON.stringify(actual) + ); + } + + + // PRIMITIVE VALUES + + function decodeNull(successValue) { + return function(value) { + if (value === null) { + return successValue; + } + crash('null', value); + }; + } + + + function decodeString(value) { + if (typeof value === 'string' || value instanceof String) { + return value; + } + crash('a String', value); + } + + + function decodeFloat(value) { + if (typeof value === 'number') { + return value; + } + crash('a Float', value); + } + + + function decodeInt(value) { + if (typeof value !== 'number') { + crash('an Int', value); + } + + if (value < 2147483647 && value > -2147483647 && (value | 0) === value) { + return value; + } + + if (isFinite(value) && !(value % 1)) { + return value; + } + + crash('an Int', value); + } + + + function decodeBool(value) { + if (typeof value === 'boolean') { + return value; + } + crash('a Bool', value); + } + + + // ARRAY + + function decodeArray(decoder) { + return function(value) { + if (value instanceof Array) { + var len = value.length; + var array = new Array(len); + for (var i = len; i--; ) { + array[i] = decoder(value[i]); + } + return ElmArray.fromJSArray(array); + } + crash('an Array', value); + }; + } + + + // LIST + + function decodeList(decoder) { + return function(value) { + if (value instanceof Array) { + var len = value.length; + var list = List.Nil; + for (var i = len; i--; ) { + list = List.Cons( decoder(value[i]), list ); + } + return list; + } + crash('a List', value); + }; + } + + + // MAYBE + + function decodeMaybe(decoder) { + return function(value) { + try { + return Maybe.Just(decoder(value)); + } catch(e) { + return Maybe.Nothing; + } + }; + } + + + // FIELDS + + function decodeField(field, decoder) { + return function(value) { + var subValue = value[field]; + if (subValue !== undefined) { + return decoder(subValue); + } + crash("an object with field '" + field + "'", value); + }; + } + + + // OBJECTS + + function decodeKeyValuePairs(decoder) { + return function(value) { + var isObject = + typeof value === 'object' + && value !== null + && !(value instanceof Array); + + if (isObject) { + var keyValuePairs = List.Nil; + for (var key in value) + { + var elmValue = decoder(value[key]); + var pair = Utils.Tuple2(key, elmValue); + keyValuePairs = List.Cons(pair, keyValuePairs); + } + return keyValuePairs; + } + + crash('an object', value); + }; + } + + function decodeObject1(f, d1) { + return function(value) { + return f(d1(value)); + }; + } + + function decodeObject2(f, d1, d2) { + return function(value) { + return A2( f, d1(value), d2(value) ); + }; + } + + function decodeObject3(f, d1, d2, d3) { + return function(value) { + return A3( f, d1(value), d2(value), d3(value) ); + }; + } + + function decodeObject4(f, d1, d2, d3, d4) { + return function(value) { + return A4( f, d1(value), d2(value), d3(value), d4(value) ); + }; + } + + function decodeObject5(f, d1, d2, d3, d4, d5) { + return function(value) { + return A5( f, d1(value), d2(value), d3(value), d4(value), d5(value) ); + }; + } + + function decodeObject6(f, d1, d2, d3, d4, d5, d6) { + return function(value) { + return A6( f, + d1(value), + d2(value), + d3(value), + d4(value), + d5(value), + d6(value) + ); + }; + } + + function decodeObject7(f, d1, d2, d3, d4, d5, d6, d7) { + return function(value) { + return A7( f, + d1(value), + d2(value), + d3(value), + d4(value), + d5(value), + d6(value), + d7(value) + ); + }; + } + + function decodeObject8(f, d1, d2, d3, d4, d5, d6, d7, d8) { + return function(value) { + return A8( f, + d1(value), + d2(value), + d3(value), + d4(value), + d5(value), + d6(value), + d7(value), + d8(value) + ); + }; + } + + + // TUPLES + + function decodeTuple1(f, d1) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 1 ) { + crash('a Tuple of length 1', value); + } + return f( d1(value[0]) ); + }; + } + + function decodeTuple2(f, d1, d2) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 2 ) { + crash('a Tuple of length 2', value); + } + return A2( f, d1(value[0]), d2(value[1]) ); + }; + } + + function decodeTuple3(f, d1, d2, d3) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 3 ) { + crash('a Tuple of length 3', value); + } + return A3( f, d1(value[0]), d2(value[1]), d3(value[2]) ); + }; + } + + + function decodeTuple4(f, d1, d2, d3, d4) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 4 ) { + crash('a Tuple of length 4', value); + } + return A4( f, d1(value[0]), d2(value[1]), d3(value[2]), d4(value[3]) ); + }; + } + + + function decodeTuple5(f, d1, d2, d3, d4, d5) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 5 ) { + crash('a Tuple of length 5', value); + } + return A5( f, + d1(value[0]), + d2(value[1]), + d3(value[2]), + d4(value[3]), + d5(value[4]) + ); + }; + } + + + function decodeTuple6(f, d1, d2, d3, d4, d5, d6) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 6 ) { + crash('a Tuple of length 6', value); + } + return A6( f, + d1(value[0]), + d2(value[1]), + d3(value[2]), + d4(value[3]), + d5(value[4]), + d6(value[5]) + ); + }; + } + + function decodeTuple7(f, d1, d2, d3, d4, d5, d6, d7) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 7 ) { + crash('a Tuple of length 7', value); + } + return A7( f, + d1(value[0]), + d2(value[1]), + d3(value[2]), + d4(value[3]), + d5(value[4]), + d6(value[5]), + d7(value[6]) + ); + }; + } + + + function decodeTuple8(f, d1, d2, d3, d4, d5, d6, d7, d8) { + return function(value) { + if ( !(value instanceof Array) || value.length !== 8 ) { + crash('a Tuple of length 8', value); + } + return A8( f, + d1(value[0]), + d2(value[1]), + d3(value[2]), + d4(value[3]), + d5(value[4]), + d6(value[5]), + d7(value[6]), + d8(value[7]) + ); + }; + } + + + // CUSTOM DECODERS + + function decodeValue(value) { + return value; + } + + function runDecoderValue(decoder, value) { + try { + return Result.Ok(decoder(value)); + } catch(e) { + return Result.Err(e.message); + } + } + + function customDecoder(decoder, callback) { + return function(value) { + var result = callback(decoder(value)); + if (result.ctor === 'Err') { + throw new Error('custom decoder failed: ' + result._0); + } + return result._0; + }; + } + + function andThen(decode, callback) { + return function(value) { + var result = decode(value); + return callback(result)(value); + }; + } + + function fail(msg) { + return function(value) { + throw new Error(msg); + }; + } + + function succeed(successValue) { + return function(value) { + return successValue; + }; + } + + + // ONE OF MANY + + function oneOf(decoders) { + return function(value) { + var errors = []; + var temp = decoders; + while (temp.ctor !== '[]') { + try { + return temp._0(value); + } catch(e) { + errors.push(e.message); + } + temp = temp._1; + } + throw new Error('expecting one of the following:\n ' + errors.join('\n ')); + }; + } + + function get(decoder, value) { + try { + return Result.Ok(decoder(value)); + } catch(e) { + return Result.Err(e.message); + } + } + + + // ENCODE / DECODE + + function runDecoderString(decoder, string) { + try { + return Result.Ok(decoder(JSON.parse(string))); + } catch(e) { + return Result.Err(e.message); + } + } + + function encode(indentLevel, value) { + return JSON.stringify(value, null, indentLevel); + } + + function identity(value) { + return value; + } + + function encodeObject(keyValuePairs) { + var obj = {}; + while (keyValuePairs.ctor !== '[]') { + var pair = keyValuePairs._0; + obj[pair._0] = pair._1; + keyValuePairs = keyValuePairs._1; + } + return obj; + } + + return localRuntime.Native.Json.values = { + encode: F2(encode), + runDecoderString: F2(runDecoderString), + runDecoderValue: F2(runDecoderValue), + + get: F2(get), + oneOf: oneOf, + + decodeNull: decodeNull, + decodeInt: decodeInt, + decodeFloat: decodeFloat, + decodeString: decodeString, + decodeBool: decodeBool, + + decodeMaybe: decodeMaybe, + + decodeList: decodeList, + decodeArray: decodeArray, + + decodeField: F2(decodeField), + + decodeObject1: F2(decodeObject1), + decodeObject2: F3(decodeObject2), + decodeObject3: F4(decodeObject3), + decodeObject4: F5(decodeObject4), + decodeObject5: F6(decodeObject5), + decodeObject6: F7(decodeObject6), + decodeObject7: F8(decodeObject7), + decodeObject8: F9(decodeObject8), + decodeKeyValuePairs: decodeKeyValuePairs, + + decodeTuple1: F2(decodeTuple1), + decodeTuple2: F3(decodeTuple2), + decodeTuple3: F4(decodeTuple3), + decodeTuple4: F5(decodeTuple4), + decodeTuple5: F6(decodeTuple5), + decodeTuple6: F7(decodeTuple6), + decodeTuple7: F8(decodeTuple7), + decodeTuple8: F9(decodeTuple8), + + andThen: F2(andThen), + decodeValue: decodeValue, + customDecoder: F2(customDecoder), + fail: fail, + succeed: succeed, + + identity: identity, + encodeNull: null, + encodeArray: ElmArray.toJSArray, + encodeList: List.toArray, + encodeObject: encodeObject + + }; +}; + +Elm.Native.Array = {}; +Elm.Native.Array.make = function(localRuntime) { + + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Array = localRuntime.Native.Array || {}; + if (localRuntime.Native.Array.values) + { + return localRuntime.Native.Array.values; + } + if ('values' in Elm.Native.Array) + { + return localRuntime.Native.Array.values = Elm.Native.Array.values; + } + + var List = Elm.Native.List.make(localRuntime); + + // A RRB-Tree has two distinct data types. + // Leaf -> "height" is always 0 + // "table" is an array of elements + // Node -> "height" is always greater than 0 + // "table" is an array of child nodes + // "lengths" is an array of accumulated lengths of the child nodes + + // M is the maximal table size. 32 seems fast. E is the allowed increase + // of search steps when concatting to find an index. Lower values will + // decrease balancing, but will increase search steps. + var M = 32; + var E = 2; + + // An empty array. + var empty = { + ctor: '_Array', + height: 0, + table: [] + }; + + + function get(i, array) + { + if (i < 0 || i >= length(array)) + { + throw new Error( + 'Index ' + i + ' is out of range. Check the length of ' + + 'your array first or use getMaybe or getWithDefault.'); + } + return unsafeGet(i, array); + } + + + function unsafeGet(i, array) + { + for (var x = array.height; x > 0; x--) + { + var slot = i >> (x * 5); + while (array.lengths[slot] <= i) + { + slot++; + } + if (slot > 0) + { + i -= array.lengths[slot - 1]; + } + array = array.table[slot]; + } + return array.table[i]; + } + + + // Sets the value at the index i. Only the nodes leading to i will get + // copied and updated. + function set(i, item, array) + { + if (i < 0 || length(array) <= i) + { + return array; + } + return unsafeSet(i, item, array); + } + + + function unsafeSet(i, item, array) + { + array = nodeCopy(array); + + if (array.height === 0) + { + array.table[i] = item; + } + else + { + var slot = getSlot(i, array); + if (slot > 0) + { + i -= array.lengths[slot - 1]; + } + array.table[slot] = unsafeSet(i, item, array.table[slot]); + } + return array; + } + + + function initialize(len, f) + { + if (len <= 0) + { + return empty; + } + var h = Math.floor( Math.log(len) / Math.log(M) ); + return initialize_(f, h, 0, len); + } + + function initialize_(f, h, from, to) + { + if (h === 0) + { + var table = new Array((to - from) % (M + 1)); + for (var i = 0; i < table.length; i++) + { + table[i] = f(from + i); + } + return { + ctor: '_Array', + height: 0, + table: table + }; + } + + var step = Math.pow(M, h); + var table = new Array(Math.ceil((to - from) / step)); + var lengths = new Array(table.length); + for (var i = 0; i < table.length; i++) + { + table[i] = initialize_(f, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); + lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0); + } + return { + ctor: '_Array', + height: h, + table: table, + lengths: lengths + }; + } + + function fromList(list) + { + if (list === List.Nil) + { + return empty; + } + + // Allocate M sized blocks (table) and write list elements to it. + var table = new Array(M); + var nodes = []; + var i = 0; + + while (list.ctor !== '[]') + { + table[i] = list._0; + list = list._1; + i++; + + // table is full, so we can push a leaf containing it into the + // next node. + if (i === M) + { + var leaf = { + ctor: '_Array', + height: 0, + table: table + }; + fromListPush(leaf, nodes); + table = new Array(M); + i = 0; + } + } + + // Maybe there is something left on the table. + if (i > 0) + { + var leaf = { + ctor: '_Array', + height: 0, + table: table.splice(0, i) + }; + fromListPush(leaf, nodes); + } + + // Go through all of the nodes and eventually push them into higher nodes. + for (var h = 0; h < nodes.length - 1; h++) + { + if (nodes[h].table.length > 0) + { + fromListPush(nodes[h], nodes); + } + } + + var head = nodes[nodes.length - 1]; + if (head.height > 0 && head.table.length === 1) + { + return head.table[0]; + } + else + { + return head; + } + } + + // Push a node into a higher node as a child. + function fromListPush(toPush, nodes) + { + var h = toPush.height; + + // Maybe the node on this height does not exist. + if (nodes.length === h) + { + var node = { + ctor: '_Array', + height: h + 1, + table: [], + lengths: [] + }; + nodes.push(node); + } + + nodes[h].table.push(toPush); + var len = length(toPush); + if (nodes[h].lengths.length > 0) + { + len += nodes[h].lengths[nodes[h].lengths.length - 1]; + } + nodes[h].lengths.push(len); + + if (nodes[h].table.length === M) + { + fromListPush(nodes[h], nodes); + nodes[h] = { + ctor: '_Array', + height: h + 1, + table: [], + lengths: [] + }; + } + } + + // Pushes an item via push_ to the bottom right of a tree. + function push(item, a) + { + var pushed = push_(item, a); + if (pushed !== null) + { + return pushed; + } + + var newTree = create(item, a.height); + return siblise(a, newTree); + } + + // Recursively tries to push an item to the bottom-right most + // tree possible. If there is no space left for the item, + // null will be returned. + function push_(item, a) + { + // Handle resursion stop at leaf level. + if (a.height === 0) + { + if (a.table.length < M) + { + var newA = { + ctor: '_Array', + height: 0, + table: a.table.slice() + }; + newA.table.push(item); + return newA; + } + else + { + return null; + } + } + + // Recursively push + var pushed = push_(item, botRight(a)); + + // There was space in the bottom right tree, so the slot will + // be updated. + if (pushed !== null) + { + var newA = nodeCopy(a); + newA.table[newA.table.length - 1] = pushed; + newA.lengths[newA.lengths.length - 1]++; + return newA; + } + + // When there was no space left, check if there is space left + // for a new slot with a tree which contains only the item + // at the bottom. + if (a.table.length < M) + { + var newSlot = create(item, a.height - 1); + var newA = nodeCopy(a); + newA.table.push(newSlot); + newA.lengths.push(newA.lengths[newA.lengths.length - 1] + length(newSlot)); + return newA; + } + else + { + return null; + } + } + + // Converts an array into a list of elements. + function toList(a) + { + return toList_(List.Nil, a); + } + + function toList_(list, a) + { + for (var i = a.table.length - 1; i >= 0; i--) + { + list = + a.height === 0 + ? List.Cons(a.table[i], list) + : toList_(list, a.table[i]); + } + return list; + } + + // Maps a function over the elements of an array. + function map(f, a) + { + var newA = { + ctor: '_Array', + height: a.height, + table: new Array(a.table.length) + }; + if (a.height > 0) + { + newA.lengths = a.lengths; + } + for (var i = 0; i < a.table.length; i++) + { + newA.table[i] = + a.height === 0 + ? f(a.table[i]) + : map(f, a.table[i]); + } + return newA; + } + + // Maps a function over the elements with their index as first argument. + function indexedMap(f, a) + { + return indexedMap_(f, a, 0); + } + + function indexedMap_(f, a, from) + { + var newA = { + ctor: '_Array', + height: a.height, + table: new Array(a.table.length) + }; + if (a.height > 0) + { + newA.lengths = a.lengths; + } + for (var i = 0; i < a.table.length; i++) + { + newA.table[i] = + a.height === 0 + ? A2(f, from + i, a.table[i]) + : indexedMap_(f, a.table[i], i == 0 ? from : from + a.lengths[i - 1]); + } + return newA; + } + + function foldl(f, b, a) + { + if (a.height === 0) + { + for (var i = 0; i < a.table.length; i++) + { + b = A2(f, a.table[i], b); + } + } + else + { + for (var i = 0; i < a.table.length; i++) + { + b = foldl(f, b, a.table[i]); + } + } + return b; + } + + function foldr(f, b, a) + { + if (a.height === 0) + { + for (var i = a.table.length; i--; ) + { + b = A2(f, a.table[i], b); + } + } + else + { + for (var i = a.table.length; i--; ) + { + b = foldr(f, b, a.table[i]); + } + } + return b; + } + + // TODO: currently, it slices the right, then the left. This can be + // optimized. + function slice(from, to, a) + { + if (from < 0) + { + from += length(a); + } + if (to < 0) + { + to += length(a); + } + return sliceLeft(from, sliceRight(to, a)); + } + + function sliceRight(to, a) + { + if (to === length(a)) + { + return a; + } + + // Handle leaf level. + if (a.height === 0) + { + var newA = { ctor:'_Array', height:0 }; + newA.table = a.table.slice(0, to); + return newA; + } + + // Slice the right recursively. + var right = getSlot(to, a); + var sliced = sliceRight(to - (right > 0 ? a.lengths[right - 1] : 0), a.table[right]); + + // Maybe the a node is not even needed, as sliced contains the whole slice. + if (right === 0) + { + return sliced; + } + + // Create new node. + var newA = { + ctor: '_Array', + height: a.height, + table: a.table.slice(0, right), + lengths: a.lengths.slice(0, right) + }; + if (sliced.table.length > 0) + { + newA.table[right] = sliced; + newA.lengths[right] = length(sliced) + (right > 0 ? newA.lengths[right - 1] : 0); + } + return newA; + } + + function sliceLeft(from, a) + { + if (from === 0) + { + return a; + } + + // Handle leaf level. + if (a.height === 0) + { + var newA = { ctor:'_Array', height:0 }; + newA.table = a.table.slice(from, a.table.length + 1); + return newA; + } + + // Slice the left recursively. + var left = getSlot(from, a); + var sliced = sliceLeft(from - (left > 0 ? a.lengths[left - 1] : 0), a.table[left]); + + // Maybe the a node is not even needed, as sliced contains the whole slice. + if (left === a.table.length - 1) + { + return sliced; + } + + // Create new node. + var newA = { + ctor: '_Array', + height: a.height, + table: a.table.slice(left, a.table.length + 1), + lengths: new Array(a.table.length - left) + }; + newA.table[0] = sliced; + var len = 0; + for (var i = 0; i < newA.table.length; i++) + { + len += length(newA.table[i]); + newA.lengths[i] = len; + } + + return newA; + } + + // Appends two trees. + function append(a,b) + { + if (a.table.length === 0) + { + return b; + } + if (b.table.length === 0) + { + return a; + } + + var c = append_(a, b); + + // Check if both nodes can be crunshed together. + if (c[0].table.length + c[1].table.length <= M) + { + if (c[0].table.length === 0) + { + return c[1]; + } + if (c[1].table.length === 0) + { + return c[0]; + } + + // Adjust .table and .lengths + c[0].table = c[0].table.concat(c[1].table); + if (c[0].height > 0) + { + var len = length(c[0]); + for (var i = 0; i < c[1].lengths.length; i++) + { + c[1].lengths[i] += len; + } + c[0].lengths = c[0].lengths.concat(c[1].lengths); + } + + return c[0]; + } + + if (c[0].height > 0) + { + var toRemove = calcToRemove(a, b); + if (toRemove > E) + { + c = shuffle(c[0], c[1], toRemove); + } + } + + return siblise(c[0], c[1]); + } + + // Returns an array of two nodes; right and left. One node _may_ be empty. + function append_(a, b) + { + if (a.height === 0 && b.height === 0) + { + return [a, b]; + } + + if (a.height !== 1 || b.height !== 1) + { + if (a.height === b.height) + { + a = nodeCopy(a); + b = nodeCopy(b); + var appended = append_(botRight(a), botLeft(b)); + + insertRight(a, appended[1]); + insertLeft(b, appended[0]); + } + else if (a.height > b.height) + { + a = nodeCopy(a); + var appended = append_(botRight(a), b); + + insertRight(a, appended[0]); + b = parentise(appended[1], appended[1].height + 1); + } + else + { + b = nodeCopy(b); + var appended = append_(a, botLeft(b)); + + var left = appended[0].table.length === 0 ? 0 : 1; + var right = left === 0 ? 1 : 0; + insertLeft(b, appended[left]); + a = parentise(appended[right], appended[right].height + 1); + } + } + + // Check if balancing is needed and return based on that. + if (a.table.length === 0 || b.table.length === 0) + { + return [a, b]; + } + + var toRemove = calcToRemove(a, b); + if (toRemove <= E) + { + return [a, b]; + } + return shuffle(a, b, toRemove); + } + + // Helperfunctions for append_. Replaces a child node at the side of the parent. + function insertRight(parent, node) + { + var index = parent.table.length - 1; + parent.table[index] = node; + parent.lengths[index] = length(node); + parent.lengths[index] += index > 0 ? parent.lengths[index - 1] : 0; + } + + function insertLeft(parent, node) + { + if (node.table.length > 0) + { + parent.table[0] = node; + parent.lengths[0] = length(node); + + var len = length(parent.table[0]); + for (var i = 1; i < parent.lengths.length; i++) + { + len += length(parent.table[i]); + parent.lengths[i] = len; + } + } + else + { + parent.table.shift(); + for (var i = 1; i < parent.lengths.length; i++) + { + parent.lengths[i] = parent.lengths[i] - parent.lengths[0]; + } + parent.lengths.shift(); + } + } + + // Returns the extra search steps for E. Refer to the paper. + function calcToRemove(a, b) + { + var subLengths = 0; + for (var i = 0; i < a.table.length; i++) + { + subLengths += a.table[i].table.length; + } + for (var i = 0; i < b.table.length; i++) + { + subLengths += b.table[i].table.length; + } + + var toRemove = a.table.length + b.table.length; + return toRemove - (Math.floor((subLengths - 1) / M) + 1); + } + + // get2, set2 and saveSlot are helpers for accessing elements over two arrays. + function get2(a, b, index) + { + return index < a.length + ? a[index] + : b[index - a.length]; + } + + function set2(a, b, index, value) + { + if (index < a.length) + { + a[index] = value; + } + else + { + b[index - a.length] = value; + } + } + + function saveSlot(a, b, index, slot) + { + set2(a.table, b.table, index, slot); + + var l = (index === 0 || index === a.lengths.length) + ? 0 + : get2(a.lengths, a.lengths, index - 1); + + set2(a.lengths, b.lengths, index, l + length(slot)); + } + + // Creates a node or leaf with a given length at their arrays for perfomance. + // Is only used by shuffle. + function createNode(h, length) + { + if (length < 0) + { + length = 0; + } + var a = { + ctor: '_Array', + height: h, + table: new Array(length) + }; + if (h > 0) + { + a.lengths = new Array(length); + } + return a; + } + + // Returns an array of two balanced nodes. + function shuffle(a, b, toRemove) + { + var newA = createNode(a.height, Math.min(M, a.table.length + b.table.length - toRemove)); + var newB = createNode(a.height, newA.table.length - (a.table.length + b.table.length - toRemove)); + + // Skip the slots with size M. More precise: copy the slot references + // to the new node + var read = 0; + while (get2(a.table, b.table, read).table.length % M === 0) + { + set2(newA.table, newB.table, read, get2(a.table, b.table, read)); + set2(newA.lengths, newB.lengths, read, get2(a.lengths, b.lengths, read)); + read++; + } + + // Pulling items from left to right, caching in a slot before writing + // it into the new nodes. + var write = read; + var slot = new createNode(a.height - 1, 0); + var from = 0; + + // If the current slot is still containing data, then there will be at + // least one more write, so we do not break this loop yet. + while (read - write - (slot.table.length > 0 ? 1 : 0) < toRemove) + { + // Find out the max possible items for copying. + var source = get2(a.table, b.table, read); + var to = Math.min(M - slot.table.length, source.table.length); + + // Copy and adjust size table. + slot.table = slot.table.concat(source.table.slice(from, to)); + if (slot.height > 0) + { + var len = slot.lengths.length; + for (var i = len; i < len + to - from; i++) + { + slot.lengths[i] = length(slot.table[i]); + slot.lengths[i] += (i > 0 ? slot.lengths[i - 1] : 0); + } + } + + from += to; + + // Only proceed to next slots[i] if the current one was + // fully copied. + if (source.table.length <= to) + { + read++; from = 0; + } + + // Only create a new slot if the current one is filled up. + if (slot.table.length === M) + { + saveSlot(newA, newB, write, slot); + slot = createNode(a.height - 1, 0); + write++; + } + } + + // Cleanup after the loop. Copy the last slot into the new nodes. + if (slot.table.length > 0) + { + saveSlot(newA, newB, write, slot); + write++; + } + + // Shift the untouched slots to the left + while (read < a.table.length + b.table.length ) + { + saveSlot(newA, newB, write, get2(a.table, b.table, read)); + read++; + write++; + } + + return [newA, newB]; + } + + // Navigation functions + function botRight(a) + { + return a.table[a.table.length - 1]; + } + function botLeft(a) + { + return a.table[0]; + } + + // Copies a node for updating. Note that you should not use this if + // only updating only one of "table" or "lengths" for performance reasons. + function nodeCopy(a) + { + var newA = { + ctor: '_Array', + height: a.height, + table: a.table.slice() + }; + if (a.height > 0) + { + newA.lengths = a.lengths.slice(); + } + return newA; + } + + // Returns how many items are in the tree. + function length(array) + { + if (array.height === 0) + { + return array.table.length; + } + else + { + return array.lengths[array.lengths.length - 1]; + } + } + + // Calculates in which slot of "table" the item probably is, then + // find the exact slot via forward searching in "lengths". Returns the index. + function getSlot(i, a) + { + var slot = i >> (5 * a.height); + while (a.lengths[slot] <= i) + { + slot++; + } + return slot; + } + + // Recursively creates a tree with a given height containing + // only the given item. + function create(item, h) + { + if (h === 0) + { + return { + ctor: '_Array', + height: 0, + table: [item] + }; + } + return { + ctor: '_Array', + height: h, + table: [create(item, h - 1)], + lengths: [1] + }; + } + + // Recursively creates a tree that contains the given tree. + function parentise(tree, h) + { + if (h === tree.height) + { + return tree; + } + + return { + ctor: '_Array', + height: h, + table: [parentise(tree, h - 1)], + lengths: [length(tree)] + }; + } + + // Emphasizes blood brotherhood beneath two trees. + function siblise(a, b) + { + return { + ctor: '_Array', + height: a.height + 1, + table: [a, b], + lengths: [length(a), length(a) + length(b)] + }; + } + + function toJSArray(a) + { + var jsArray = new Array(length(a)); + toJSArray_(jsArray, 0, a); + return jsArray; + } + + function toJSArray_(jsArray, i, a) + { + for (var t = 0; t < a.table.length; t++) + { + if (a.height === 0) + { + jsArray[i + t] = a.table[t]; + } + else + { + var inc = t === 0 ? 0 : a.lengths[t - 1]; + toJSArray_(jsArray, i + inc, a.table[t]); + } + } + } + + function fromJSArray(jsArray) + { + if (jsArray.length === 0) + { + return empty; + } + var h = Math.floor(Math.log(jsArray.length) / Math.log(M)); + return fromJSArray_(jsArray, h, 0, jsArray.length); + } + + function fromJSArray_(jsArray, h, from, to) + { + if (h === 0) + { + return { + ctor: '_Array', + height: 0, + table: jsArray.slice(from, to) + }; + } + + var step = Math.pow(M, h); + var table = new Array(Math.ceil((to - from) / step)); + var lengths = new Array(table.length); + for (var i = 0; i < table.length; i++) + { + table[i] = fromJSArray_(jsArray, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); + lengths[i] = length(table[i]) + (i > 0 ? lengths[i - 1] : 0); + } + return { + ctor: '_Array', + height: h, + table: table, + lengths: lengths + }; + } + + Elm.Native.Array.values = { + empty: empty, + fromList: fromList, + toList: toList, + initialize: F2(initialize), + append: F2(append), + push: F2(push), + slice: F3(slice), + get: F2(get), + set: F3(set), + map: F2(map), + indexedMap: F2(indexedMap), + foldl: F3(foldl), + foldr: F3(foldr), + length: length, + + toJSArray: toJSArray, + fromJSArray: fromJSArray + }; + + return localRuntime.Native.Array.values = Elm.Native.Array.values; +}; + +Elm.Array = Elm.Array || {}; +Elm.Array.make = function (_elm) { + "use strict"; + _elm.Array = _elm.Array || {}; + if (_elm.Array.values) return _elm.Array.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Array = Elm.Native.Array.make(_elm); + var _op = {}; + var append = $Native$Array.append; + var length = $Native$Array.length; + var isEmpty = function (array) { return _U.eq(length(array),0);}; + var slice = $Native$Array.slice; + var set = $Native$Array.set; + var get = F2(function (i,array) { + return _U.cmp(0,i) < 1 && _U.cmp(i,$Native$Array.length(array)) < 0 ? $Maybe.Just(A2($Native$Array.get,i,array)) : $Maybe.Nothing; + }); + var push = $Native$Array.push; + var empty = $Native$Array.empty; + var filter = F2(function (isOkay,arr) { + var update = F2(function (x,xs) { return isOkay(x) ? A2($Native$Array.push,x,xs) : xs;}); + return A3($Native$Array.foldl,update,$Native$Array.empty,arr); + }); + var foldr = $Native$Array.foldr; + var foldl = $Native$Array.foldl; + var indexedMap = $Native$Array.indexedMap; + var map = $Native$Array.map; + var toIndexedList = function (array) { + return A3($List.map2, + F2(function (v0,v1) { return {ctor: "_Tuple2",_0: v0,_1: v1};}), + _U.range(0,$Native$Array.length(array) - 1), + $Native$Array.toList(array)); + }; + var toList = $Native$Array.toList; + var fromList = $Native$Array.fromList; + var initialize = $Native$Array.initialize; + var repeat = F2(function (n,e) { return A2(initialize,n,$Basics.always(e));}); + var Array = {ctor: "Array"}; + return _elm.Array.values = {_op: _op + ,empty: empty + ,repeat: repeat + ,initialize: initialize + ,fromList: fromList + ,isEmpty: isEmpty + ,length: length + ,push: push + ,append: append + ,get: get + ,set: set + ,slice: slice + ,toList: toList + ,toIndexedList: toIndexedList + ,map: map + ,indexedMap: indexedMap + ,filter: filter + ,foldl: foldl + ,foldr: foldr}; +}; +Elm.Native.String = {}; + +Elm.Native.String.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.String = localRuntime.Native.String || {}; + if (localRuntime.Native.String.values) + { + return localRuntime.Native.String.values; + } + if ('values' in Elm.Native.String) + { + return localRuntime.Native.String.values = Elm.Native.String.values; + } + + + var Char = Elm.Char.make(localRuntime); + var List = Elm.Native.List.make(localRuntime); + var Maybe = Elm.Maybe.make(localRuntime); + var Result = Elm.Result.make(localRuntime); + var Utils = Elm.Native.Utils.make(localRuntime); + + function isEmpty(str) + { + return str.length === 0; + } + function cons(chr, str) + { + return chr + str; + } + function uncons(str) + { + var hd = str[0]; + if (hd) + { + return Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1))); + } + return Maybe.Nothing; + } + function append(a, b) + { + return a + b; + } + function concat(strs) + { + return List.toArray(strs).join(''); + } + function length(str) + { + return str.length; + } + function map(f, str) + { + var out = str.split(''); + for (var i = out.length; i--; ) + { + out[i] = f(Utils.chr(out[i])); + } + return out.join(''); + } + function filter(pred, str) + { + return str.split('').map(Utils.chr).filter(pred).join(''); + } + function reverse(str) + { + return str.split('').reverse().join(''); + } + function foldl(f, b, str) + { + var len = str.length; + for (var i = 0; i < len; ++i) + { + b = A2(f, Utils.chr(str[i]), b); + } + return b; + } + function foldr(f, b, str) + { + for (var i = str.length; i--; ) + { + b = A2(f, Utils.chr(str[i]), b); + } + return b; + } + function split(sep, str) + { + return List.fromArray(str.split(sep)); + } + function join(sep, strs) + { + return List.toArray(strs).join(sep); + } + function repeat(n, str) + { + var result = ''; + while (n > 0) + { + if (n & 1) + { + result += str; + } + n >>= 1, str += str; + } + return result; + } + function slice(start, end, str) + { + return str.slice(start, end); + } + function left(n, str) + { + return n < 1 ? '' : str.slice(0, n); + } + function right(n, str) + { + return n < 1 ? '' : str.slice(-n); + } + function dropLeft(n, str) + { + return n < 1 ? str : str.slice(n); + } + function dropRight(n, str) + { + return n < 1 ? str : str.slice(0, -n); + } + function pad(n, chr, str) + { + var half = (n - str.length) / 2; + return repeat(Math.ceil(half), chr) + str + repeat(half | 0, chr); + } + function padRight(n, chr, str) + { + return str + repeat(n - str.length, chr); + } + function padLeft(n, chr, str) + { + return repeat(n - str.length, chr) + str; + } + + function trim(str) + { + return str.trim(); + } + function trimLeft(str) + { + return str.replace(/^\s+/, ''); + } + function trimRight(str) + { + return str.replace(/\s+$/, ''); + } + + function words(str) + { + return List.fromArray(str.trim().split(/\s+/g)); + } + function lines(str) + { + return List.fromArray(str.split(/\r\n|\r|\n/g)); + } + + function toUpper(str) + { + return str.toUpperCase(); + } + function toLower(str) + { + return str.toLowerCase(); + } + + function any(pred, str) + { + for (var i = str.length; i--; ) + { + if (pred(Utils.chr(str[i]))) + { + return true; + } + } + return false; + } + function all(pred, str) + { + for (var i = str.length; i--; ) + { + if (!pred(Utils.chr(str[i]))) + { + return false; + } + } + return true; + } + + function contains(sub, str) + { + return str.indexOf(sub) > -1; + } + function startsWith(sub, str) + { + return str.indexOf(sub) === 0; + } + function endsWith(sub, str) + { + return str.length >= sub.length && + str.lastIndexOf(sub) === str.length - sub.length; + } + function indexes(sub, str) + { + var subLen = sub.length; + var i = 0; + var is = []; + while ((i = str.indexOf(sub, i)) > -1) + { + is.push(i); + i = i + subLen; + } + return List.fromArray(is); + } + + function toInt(s) + { + var len = s.length; + if (len === 0) + { + return Result.Err("could not convert string '" + s + "' to an Int" ); + } + var start = 0; + if (s[0] === '-') + { + if (len === 1) + { + return Result.Err("could not convert string '" + s + "' to an Int" ); + } + start = 1; + } + for (var i = start; i < len; ++i) + { + if (!Char.isDigit(s[i])) + { + return Result.Err("could not convert string '" + s + "' to an Int" ); + } + } + return Result.Ok(parseInt(s, 10)); + } + + function toFloat(s) + { + var len = s.length; + if (len === 0) + { + return Result.Err("could not convert string '" + s + "' to a Float" ); + } + var start = 0; + if (s[0] === '-') + { + if (len === 1) + { + return Result.Err("could not convert string '" + s + "' to a Float" ); + } + start = 1; + } + var dotCount = 0; + for (var i = start; i < len; ++i) + { + if (Char.isDigit(s[i])) + { + continue; + } + if (s[i] === '.') + { + dotCount += 1; + if (dotCount <= 1) + { + continue; + } + } + return Result.Err("could not convert string '" + s + "' to a Float" ); + } + return Result.Ok(parseFloat(s)); + } + + function toList(str) + { + return List.fromArray(str.split('').map(Utils.chr)); + } + function fromList(chars) + { + return List.toArray(chars).join(''); + } + + return Elm.Native.String.values = { + isEmpty: isEmpty, + cons: F2(cons), + uncons: uncons, + append: F2(append), + concat: concat, + length: length, + map: F2(map), + filter: F2(filter), + reverse: reverse, + foldl: F3(foldl), + foldr: F3(foldr), + + split: F2(split), + join: F2(join), + repeat: F2(repeat), + + slice: F3(slice), + left: F2(left), + right: F2(right), + dropLeft: F2(dropLeft), + dropRight: F2(dropRight), + + pad: F3(pad), + padLeft: F3(padLeft), + padRight: F3(padRight), + + trim: trim, + trimLeft: trimLeft, + trimRight: trimRight, + + words: words, + lines: lines, + + toUpper: toUpper, + toLower: toLower, + + any: F2(any), + all: F2(all), + + contains: F2(contains), + startsWith: F2(startsWith), + endsWith: F2(endsWith), + indexes: F2(indexes), + + toInt: toInt, + toFloat: toFloat, + toList: toList, + fromList: fromList + }; +}; + +Elm.Native.Char = {}; +Elm.Native.Char.make = function(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Char = localRuntime.Native.Char || {}; + if (localRuntime.Native.Char.values) + { + return localRuntime.Native.Char.values; + } + + var Utils = Elm.Native.Utils.make(localRuntime); + + return localRuntime.Native.Char.values = { + fromCode: function(c) { return Utils.chr(String.fromCharCode(c)); }, + toCode: function(c) { return c.charCodeAt(0); }, + toUpper: function(c) { return Utils.chr(c.toUpperCase()); }, + toLower: function(c) { return Utils.chr(c.toLowerCase()); }, + toLocaleUpper: function(c) { return Utils.chr(c.toLocaleUpperCase()); }, + toLocaleLower: function(c) { return Utils.chr(c.toLocaleLowerCase()); } + }; +}; + +Elm.Char = Elm.Char || {}; +Elm.Char.make = function (_elm) { + "use strict"; + _elm.Char = _elm.Char || {}; + if (_elm.Char.values) return _elm.Char.values; + var _U = Elm.Native.Utils.make(_elm),$Basics = Elm.Basics.make(_elm),$Native$Char = Elm.Native.Char.make(_elm); + var _op = {}; + var fromCode = $Native$Char.fromCode; + var toCode = $Native$Char.toCode; + var toLocaleLower = $Native$Char.toLocaleLower; + var toLocaleUpper = $Native$Char.toLocaleUpper; + var toLower = $Native$Char.toLower; + var toUpper = $Native$Char.toUpper; + var isBetween = F3(function (low,high,$char) { var code = toCode($char);return _U.cmp(code,toCode(low)) > -1 && _U.cmp(code,toCode(high)) < 1;}); + var isUpper = A2(isBetween,_U.chr("A"),_U.chr("Z")); + var isLower = A2(isBetween,_U.chr("a"),_U.chr("z")); + var isDigit = A2(isBetween,_U.chr("0"),_U.chr("9")); + var isOctDigit = A2(isBetween,_U.chr("0"),_U.chr("7")); + var isHexDigit = function ($char) { + return isDigit($char) || (A3(isBetween,_U.chr("a"),_U.chr("f"),$char) || A3(isBetween,_U.chr("A"),_U.chr("F"),$char)); + }; + return _elm.Char.values = {_op: _op + ,isUpper: isUpper + ,isLower: isLower + ,isDigit: isDigit + ,isOctDigit: isOctDigit + ,isHexDigit: isHexDigit + ,toUpper: toUpper + ,toLower: toLower + ,toLocaleUpper: toLocaleUpper + ,toLocaleLower: toLocaleLower + ,toCode: toCode + ,fromCode: fromCode}; +}; +Elm.String = Elm.String || {}; +Elm.String.make = function (_elm) { + "use strict"; + _elm.String = _elm.String || {}; + if (_elm.String.values) return _elm.String.values; + var _U = Elm.Native.Utils.make(_elm),$Maybe = Elm.Maybe.make(_elm),$Native$String = Elm.Native.String.make(_elm),$Result = Elm.Result.make(_elm); + var _op = {}; + var fromList = $Native$String.fromList; + var toList = $Native$String.toList; + var toFloat = $Native$String.toFloat; + var toInt = $Native$String.toInt; + var indices = $Native$String.indexes; + var indexes = $Native$String.indexes; + var endsWith = $Native$String.endsWith; + var startsWith = $Native$String.startsWith; + var contains = $Native$String.contains; + var all = $Native$String.all; + var any = $Native$String.any; + var toLower = $Native$String.toLower; + var toUpper = $Native$String.toUpper; + var lines = $Native$String.lines; + var words = $Native$String.words; + var trimRight = $Native$String.trimRight; + var trimLeft = $Native$String.trimLeft; + var trim = $Native$String.trim; + var padRight = $Native$String.padRight; + var padLeft = $Native$String.padLeft; + var pad = $Native$String.pad; + var dropRight = $Native$String.dropRight; + var dropLeft = $Native$String.dropLeft; + var right = $Native$String.right; + var left = $Native$String.left; + var slice = $Native$String.slice; + var repeat = $Native$String.repeat; + var join = $Native$String.join; + var split = $Native$String.split; + var foldr = $Native$String.foldr; + var foldl = $Native$String.foldl; + var reverse = $Native$String.reverse; + var filter = $Native$String.filter; + var map = $Native$String.map; + var length = $Native$String.length; + var concat = $Native$String.concat; + var append = $Native$String.append; + var uncons = $Native$String.uncons; + var cons = $Native$String.cons; + var fromChar = function ($char) { return A2(cons,$char,"");}; + var isEmpty = $Native$String.isEmpty; + return _elm.String.values = {_op: _op + ,isEmpty: isEmpty + ,length: length + ,reverse: reverse + ,repeat: repeat + ,cons: cons + ,uncons: uncons + ,fromChar: fromChar + ,append: append + ,concat: concat + ,split: split + ,join: join + ,words: words + ,lines: lines + ,slice: slice + ,left: left + ,right: right + ,dropLeft: dropLeft + ,dropRight: dropRight + ,contains: contains + ,startsWith: startsWith + ,endsWith: endsWith + ,indexes: indexes + ,indices: indices + ,toInt: toInt + ,toFloat: toFloat + ,toList: toList + ,fromList: fromList + ,toUpper: toUpper + ,toLower: toLower + ,pad: pad + ,padLeft: padLeft + ,padRight: padRight + ,trim: trim + ,trimLeft: trimLeft + ,trimRight: trimRight + ,map: map + ,filter: filter + ,foldl: foldl + ,foldr: foldr + ,any: any + ,all: all}; +}; +Elm.Dict = Elm.Dict || {}; +Elm.Dict.make = function (_elm) { + "use strict"; + _elm.Dict = _elm.Dict || {}; + if (_elm.Dict.values) return _elm.Dict.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Debug = Elm.Native.Debug.make(_elm), + $String = Elm.String.make(_elm); + var _op = {}; + var foldr = F3(function (f,acc,t) { + foldr: while (true) { + var _p0 = t; + if (_p0.ctor === "RBEmpty_elm_builtin") { + return acc; + } else { + var _v1 = f,_v2 = A3(f,_p0._1,_p0._2,A3(foldr,f,acc,_p0._4)),_v3 = _p0._3; + f = _v1; + acc = _v2; + t = _v3; + continue foldr; + } + } + }); + var keys = function (dict) { return A3(foldr,F3(function (key,value,keyList) { return A2($List._op["::"],key,keyList);}),_U.list([]),dict);}; + var values = function (dict) { return A3(foldr,F3(function (key,value,valueList) { return A2($List._op["::"],value,valueList);}),_U.list([]),dict);}; + var toList = function (dict) { + return A3(foldr,F3(function (key,value,list) { return A2($List._op["::"],{ctor: "_Tuple2",_0: key,_1: value},list);}),_U.list([]),dict); + }; + var foldl = F3(function (f,acc,dict) { + foldl: while (true) { + var _p1 = dict; + if (_p1.ctor === "RBEmpty_elm_builtin") { + return acc; + } else { + var _v5 = f,_v6 = A3(f,_p1._1,_p1._2,A3(foldl,f,acc,_p1._3)),_v7 = _p1._4; + f = _v5; + acc = _v6; + dict = _v7; + continue foldl; + } + } + }); + var reportRemBug = F4(function (msg,c,lgot,rgot) { + return $Native$Debug.crash($String.concat(_U.list(["Internal red-black tree invariant violated, expected " + ,msg + ," and got " + ,$Basics.toString(c) + ,"/" + ,lgot + ,"/" + ,rgot + ,"\nPlease report this bug to "]))); + }); + var isBBlack = function (dict) { + var _p2 = dict; + _v8_2: do { + if (_p2.ctor === "RBNode_elm_builtin") { + if (_p2._0.ctor === "BBlack") { + return true; + } else { + break _v8_2; + } + } else { + if (_p2._0.ctor === "LBBlack") { + return true; + } else { + break _v8_2; + } + } + } while (false); + return false; + }; + var Same = {ctor: "Same"}; + var Remove = {ctor: "Remove"}; + var Insert = {ctor: "Insert"}; + var sizeHelp = F2(function (n,dict) { + sizeHelp: while (true) { + var _p3 = dict; + if (_p3.ctor === "RBEmpty_elm_builtin") { + return n; + } else { + var _v10 = A2(sizeHelp,n + 1,_p3._4),_v11 = _p3._3; + n = _v10; + dict = _v11; + continue sizeHelp; + } + } + }); + var size = function (dict) { return A2(sizeHelp,0,dict);}; + var get = F2(function (targetKey,dict) { + get: while (true) { + var _p4 = dict; + if (_p4.ctor === "RBEmpty_elm_builtin") { + return $Maybe.Nothing; + } else { + var _p5 = A2($Basics.compare,targetKey,_p4._1); + switch (_p5.ctor) + {case "LT": var _v14 = targetKey,_v15 = _p4._3; + targetKey = _v14; + dict = _v15; + continue get; + case "EQ": return $Maybe.Just(_p4._2); + default: var _v16 = targetKey,_v17 = _p4._4; + targetKey = _v16; + dict = _v17; + continue get;} + } + } + }); + var member = F2(function (key,dict) { var _p6 = A2(get,key,dict);if (_p6.ctor === "Just") { return true;} else { return false;}}); + var maxWithDefault = F3(function (k,v,r) { + maxWithDefault: while (true) { + var _p7 = r; + if (_p7.ctor === "RBEmpty_elm_builtin") { + return {ctor: "_Tuple2",_0: k,_1: v}; + } else { + var _v20 = _p7._1,_v21 = _p7._2,_v22 = _p7._4; + k = _v20; + v = _v21; + r = _v22; + continue maxWithDefault; + } + } + }); + var RBEmpty_elm_builtin = function (a) { return {ctor: "RBEmpty_elm_builtin",_0: a};}; + var RBNode_elm_builtin = F5(function (a,b,c,d,e) { return {ctor: "RBNode_elm_builtin",_0: a,_1: b,_2: c,_3: d,_4: e};}); + var LBBlack = {ctor: "LBBlack"}; + var LBlack = {ctor: "LBlack"}; + var empty = RBEmpty_elm_builtin(LBlack); + var isEmpty = function (dict) { return _U.eq(dict,empty);}; + var map = F2(function (f,dict) { + var _p8 = dict; + if (_p8.ctor === "RBEmpty_elm_builtin") { + return RBEmpty_elm_builtin(LBlack); + } else { + var _p9 = _p8._1; + return A5(RBNode_elm_builtin,_p8._0,_p9,A2(f,_p9,_p8._2),A2(map,f,_p8._3),A2(map,f,_p8._4)); + } + }); + var NBlack = {ctor: "NBlack"}; + var BBlack = {ctor: "BBlack"}; + var Black = {ctor: "Black"}; + var ensureBlackRoot = function (dict) { + var _p10 = dict; + if (_p10.ctor === "RBNode_elm_builtin" && _p10._0.ctor === "Red") { + return A5(RBNode_elm_builtin,Black,_p10._1,_p10._2,_p10._3,_p10._4); + } else { + return dict; + } + }; + var blackish = function (t) { + var _p11 = t; + if (_p11.ctor === "RBNode_elm_builtin") { + var _p12 = _p11._0; + return _U.eq(_p12,Black) || _U.eq(_p12,BBlack); + } else { + return true; + } + }; + var blacken = function (t) { + var _p13 = t; + if (_p13.ctor === "RBEmpty_elm_builtin") { + return RBEmpty_elm_builtin(LBlack); + } else { + return A5(RBNode_elm_builtin,Black,_p13._1,_p13._2,_p13._3,_p13._4); + } + }; + var Red = {ctor: "Red"}; + var moreBlack = function (color) { + var _p14 = color; + switch (_p14.ctor) + {case "Black": return BBlack; + case "Red": return Black; + case "NBlack": return Red; + default: return $Native$Debug.crash("Can\'t make a double black node more black!");} + }; + var lessBlack = function (color) { + var _p15 = color; + switch (_p15.ctor) + {case "BBlack": return Black; + case "Black": return Red; + case "Red": return NBlack; + default: return $Native$Debug.crash("Can\'t make a negative black node less black!");} + }; + var lessBlackTree = function (dict) { + var _p16 = dict; + if (_p16.ctor === "RBNode_elm_builtin") { + return A5(RBNode_elm_builtin,lessBlack(_p16._0),_p16._1,_p16._2,_p16._3,_p16._4); + } else { + return RBEmpty_elm_builtin(LBlack); + } + }; + var balancedTree = function (col) { + return function (xk) { + return function (xv) { + return function (yk) { + return function (yv) { + return function (zk) { + return function (zv) { + return function (a) { + return function (b) { + return function (c) { + return function (d) { + return A5(RBNode_elm_builtin, + lessBlack(col), + yk, + yv, + A5(RBNode_elm_builtin,Black,xk,xv,a,b), + A5(RBNode_elm_builtin,Black,zk,zv,c,d)); + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + var redden = function (t) { + var _p17 = t; + if (_p17.ctor === "RBEmpty_elm_builtin") { + return $Native$Debug.crash("can\'t make a Leaf red"); + } else { + return A5(RBNode_elm_builtin,Red,_p17._1,_p17._2,_p17._3,_p17._4); + } + }; + var balanceHelp = function (tree) { + var _p18 = tree; + _v31_6: do { + _v31_5: do { + _v31_4: do { + _v31_3: do { + _v31_2: do { + _v31_1: do { + _v31_0: do { + if (_p18.ctor === "RBNode_elm_builtin") { + if (_p18._3.ctor === "RBNode_elm_builtin") { + if (_p18._4.ctor === "RBNode_elm_builtin") { + switch (_p18._3._0.ctor) + {case "Red": switch (_p18._4._0.ctor) + {case "Red": if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") { + break _v31_0; + } else { + if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") { + break _v31_1; + } else { + if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") { + break _v31_2; + } else { + if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") { + break _v31_3; + } else { + break _v31_6; + } + } + } + } + case "NBlack": if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") { + break _v31_0; + } else { + if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") { + break _v31_1; + } else { + if (_p18._0.ctor === "BBlack" && _p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") + { + break _v31_4; + } else { + break _v31_6; + } + } + } + default: if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") { + break _v31_0; + } else { + if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") { + break _v31_1; + } else { + break _v31_6; + } + }} + case "NBlack": switch (_p18._4._0.ctor) + {case "Red": if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") { + break _v31_2; + } else { + if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") { + break _v31_3; + } else { + if (_p18._0.ctor === "BBlack" && _p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") + { + break _v31_5; + } else { + break _v31_6; + } + } + } + case "NBlack": if (_p18._0.ctor === "BBlack") { + if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") + { + break _v31_4; + } else { + if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") + { + break _v31_5; + } else { + break _v31_6; + } + } + } else { + break _v31_6; + } + default: + if (_p18._0.ctor === "BBlack" && _p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") + { + break _v31_5; + } else { + break _v31_6; + }} + default: switch (_p18._4._0.ctor) + {case "Red": if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") { + break _v31_2; + } else { + if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") { + break _v31_3; + } else { + break _v31_6; + } + } + case "NBlack": + if (_p18._0.ctor === "BBlack" && _p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") + { + break _v31_4; + } else { + break _v31_6; + } + default: break _v31_6;}} + } else { + switch (_p18._3._0.ctor) + {case "Red": if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") { + break _v31_0; + } else { + if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") { + break _v31_1; + } else { + break _v31_6; + } + } + case "NBlack": + if (_p18._0.ctor === "BBlack" && _p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") + { + break _v31_5; + } else { + break _v31_6; + } + default: break _v31_6;} + } + } else { + if (_p18._4.ctor === "RBNode_elm_builtin") { + switch (_p18._4._0.ctor) + {case "Red": if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") { + break _v31_2; + } else { + if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") { + break _v31_3; + } else { + break _v31_6; + } + } + case "NBlack": + if (_p18._0.ctor === "BBlack" && _p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") + { + break _v31_4; + } else { + break _v31_6; + } + default: break _v31_6;} + } else { + break _v31_6; + } + } + } else { + break _v31_6; + } + } while (false); + return balancedTree(_p18._0)(_p18._3._3._1)(_p18._3._3._2)(_p18._3._1)(_p18._3._2)(_p18._1)(_p18._2)(_p18._3._3._3)(_p18._3._3._4)(_p18._3._4)(_p18._4); + } while (false); + return balancedTree(_p18._0)(_p18._3._1)(_p18._3._2)(_p18._3._4._1)(_p18._3._4._2)(_p18._1)(_p18._2)(_p18._3._3)(_p18._3._4._3)(_p18._3._4._4)(_p18._4); + } while (false); + return balancedTree(_p18._0)(_p18._1)(_p18._2)(_p18._4._3._1)(_p18._4._3._2)(_p18._4._1)(_p18._4._2)(_p18._3)(_p18._4._3._3)(_p18._4._3._4)(_p18._4._4); + } while (false); + return balancedTree(_p18._0)(_p18._1)(_p18._2)(_p18._4._1)(_p18._4._2)(_p18._4._4._1)(_p18._4._4._2)(_p18._3)(_p18._4._3)(_p18._4._4._3)(_p18._4._4._4); + } while (false); + return A5(RBNode_elm_builtin, + Black, + _p18._4._3._1, + _p18._4._3._2, + A5(RBNode_elm_builtin,Black,_p18._1,_p18._2,_p18._3,_p18._4._3._3), + A5(balance,Black,_p18._4._1,_p18._4._2,_p18._4._3._4,redden(_p18._4._4))); + } while (false); + return A5(RBNode_elm_builtin, + Black, + _p18._3._4._1, + _p18._3._4._2, + A5(balance,Black,_p18._3._1,_p18._3._2,redden(_p18._3._3),_p18._3._4._3), + A5(RBNode_elm_builtin,Black,_p18._1,_p18._2,_p18._3._4._4,_p18._4)); + } while (false); + return tree; + }; + var balance = F5(function (c,k,v,l,r) { var tree = A5(RBNode_elm_builtin,c,k,v,l,r);return blackish(tree) ? balanceHelp(tree) : tree;}); + var bubble = F5(function (c,k,v,l,r) { + return isBBlack(l) || isBBlack(r) ? A5(balance,moreBlack(c),k,v,lessBlackTree(l),lessBlackTree(r)) : A5(RBNode_elm_builtin,c,k,v,l,r); + }); + var removeMax = F5(function (c,k,v,l,r) { + var _p19 = r; + if (_p19.ctor === "RBEmpty_elm_builtin") { + return A3(rem,c,l,r); + } else { + return A5(bubble,c,k,v,l,A5(removeMax,_p19._0,_p19._1,_p19._2,_p19._3,_p19._4)); + } + }); + var rem = F3(function (c,l,r) { + var _p20 = {ctor: "_Tuple2",_0: l,_1: r}; + if (_p20._0.ctor === "RBEmpty_elm_builtin") { + if (_p20._1.ctor === "RBEmpty_elm_builtin") { + var _p21 = c; + switch (_p21.ctor) + {case "Red": return RBEmpty_elm_builtin(LBlack); + case "Black": return RBEmpty_elm_builtin(LBBlack); + default: return $Native$Debug.crash("cannot have bblack or nblack nodes at this point");} + } else { + var _p24 = _p20._1._0; + var _p23 = _p20._0._0; + var _p22 = {ctor: "_Tuple3",_0: c,_1: _p23,_2: _p24}; + if (_p22.ctor === "_Tuple3" && _p22._0.ctor === "Black" && _p22._1.ctor === "LBlack" && _p22._2.ctor === "Red") { + return A5(RBNode_elm_builtin,Black,_p20._1._1,_p20._1._2,_p20._1._3,_p20._1._4); + } else { + return A4(reportRemBug,"Black/LBlack/Red",c,$Basics.toString(_p23),$Basics.toString(_p24)); + } + } + } else { + if (_p20._1.ctor === "RBEmpty_elm_builtin") { + var _p27 = _p20._1._0; + var _p26 = _p20._0._0; + var _p25 = {ctor: "_Tuple3",_0: c,_1: _p26,_2: _p27}; + if (_p25.ctor === "_Tuple3" && _p25._0.ctor === "Black" && _p25._1.ctor === "Red" && _p25._2.ctor === "LBlack") { + return A5(RBNode_elm_builtin,Black,_p20._0._1,_p20._0._2,_p20._0._3,_p20._0._4); + } else { + return A4(reportRemBug,"Black/Red/LBlack",c,$Basics.toString(_p26),$Basics.toString(_p27)); + } + } else { + var _p31 = _p20._0._2; + var _p30 = _p20._0._4; + var _p29 = _p20._0._1; + var l$ = A5(removeMax,_p20._0._0,_p29,_p31,_p20._0._3,_p30); + var _p28 = A3(maxWithDefault,_p29,_p31,_p30); + var k = _p28._0; + var v = _p28._1; + return A5(bubble,c,k,v,l$,r); + } + } + }); + var update = F3(function (k,alter,dict) { + var up = function (dict) { + var _p32 = dict; + if (_p32.ctor === "RBEmpty_elm_builtin") { + var _p33 = alter($Maybe.Nothing); + if (_p33.ctor === "Nothing") { + return {ctor: "_Tuple2",_0: Same,_1: empty}; + } else { + return {ctor: "_Tuple2",_0: Insert,_1: A5(RBNode_elm_builtin,Red,k,_p33._0,empty,empty)}; + } + } else { + var _p44 = _p32._2; + var _p43 = _p32._4; + var _p42 = _p32._3; + var _p41 = _p32._1; + var _p40 = _p32._0; + var _p34 = A2($Basics.compare,k,_p41); + switch (_p34.ctor) + {case "EQ": var _p35 = alter($Maybe.Just(_p44)); + if (_p35.ctor === "Nothing") { + return {ctor: "_Tuple2",_0: Remove,_1: A3(rem,_p40,_p42,_p43)}; + } else { + return {ctor: "_Tuple2",_0: Same,_1: A5(RBNode_elm_builtin,_p40,_p41,_p35._0,_p42,_p43)}; + } + case "LT": var _p36 = up(_p42); + var flag = _p36._0; + var newLeft = _p36._1; + var _p37 = flag; + switch (_p37.ctor) + {case "Same": return {ctor: "_Tuple2",_0: Same,_1: A5(RBNode_elm_builtin,_p40,_p41,_p44,newLeft,_p43)}; + case "Insert": return {ctor: "_Tuple2",_0: Insert,_1: A5(balance,_p40,_p41,_p44,newLeft,_p43)}; + default: return {ctor: "_Tuple2",_0: Remove,_1: A5(bubble,_p40,_p41,_p44,newLeft,_p43)};} + default: var _p38 = up(_p43); + var flag = _p38._0; + var newRight = _p38._1; + var _p39 = flag; + switch (_p39.ctor) + {case "Same": return {ctor: "_Tuple2",_0: Same,_1: A5(RBNode_elm_builtin,_p40,_p41,_p44,_p42,newRight)}; + case "Insert": return {ctor: "_Tuple2",_0: Insert,_1: A5(balance,_p40,_p41,_p44,_p42,newRight)}; + default: return {ctor: "_Tuple2",_0: Remove,_1: A5(bubble,_p40,_p41,_p44,_p42,newRight)};}} + } + }; + var _p45 = up(dict); + var flag = _p45._0; + var updatedDict = _p45._1; + var _p46 = flag; + switch (_p46.ctor) + {case "Same": return updatedDict; + case "Insert": return ensureBlackRoot(updatedDict); + default: return blacken(updatedDict);} + }); + var insert = F3(function (key,value,dict) { return A3(update,key,$Basics.always($Maybe.Just(value)),dict);}); + var singleton = F2(function (key,value) { return A3(insert,key,value,empty);}); + var union = F2(function (t1,t2) { return A3(foldl,insert,t2,t1);}); + var fromList = function (assocs) { + return A3($List.foldl,F2(function (_p47,dict) { var _p48 = _p47;return A3(insert,_p48._0,_p48._1,dict);}),empty,assocs); + }; + var filter = F2(function (predicate,dictionary) { + var add = F3(function (key,value,dict) { return A2(predicate,key,value) ? A3(insert,key,value,dict) : dict;}); + return A3(foldl,add,empty,dictionary); + }); + var intersect = F2(function (t1,t2) { return A2(filter,F2(function (k,_p49) { return A2(member,k,t2);}),t1);}); + var partition = F2(function (predicate,dict) { + var add = F3(function (key,value,_p50) { + var _p51 = _p50; + var _p53 = _p51._1; + var _p52 = _p51._0; + return A2(predicate,key,value) ? {ctor: "_Tuple2",_0: A3(insert,key,value,_p52),_1: _p53} : {ctor: "_Tuple2",_0: _p52,_1: A3(insert,key,value,_p53)}; + }); + return A3(foldl,add,{ctor: "_Tuple2",_0: empty,_1: empty},dict); + }); + var remove = F2(function (key,dict) { return A3(update,key,$Basics.always($Maybe.Nothing),dict);}); + var diff = F2(function (t1,t2) { return A3(foldl,F3(function (k,v,t) { return A2(remove,k,t);}),t1,t2);}); + return _elm.Dict.values = {_op: _op + ,empty: empty + ,singleton: singleton + ,insert: insert + ,update: update + ,isEmpty: isEmpty + ,get: get + ,remove: remove + ,member: member + ,size: size + ,filter: filter + ,partition: partition + ,foldl: foldl + ,foldr: foldr + ,map: map + ,union: union + ,intersect: intersect + ,diff: diff + ,keys: keys + ,values: values + ,toList: toList + ,fromList: fromList}; +}; +Elm.Json = Elm.Json || {}; +Elm.Json.Encode = Elm.Json.Encode || {}; +Elm.Json.Encode.make = function (_elm) { + "use strict"; + _elm.Json = _elm.Json || {}; + _elm.Json.Encode = _elm.Json.Encode || {}; + if (_elm.Json.Encode.values) return _elm.Json.Encode.values; + var _U = Elm.Native.Utils.make(_elm),$Array = Elm.Array.make(_elm),$Native$Json = Elm.Native.Json.make(_elm); + var _op = {}; + var list = $Native$Json.encodeList; + var array = $Native$Json.encodeArray; + var object = $Native$Json.encodeObject; + var $null = $Native$Json.encodeNull; + var bool = $Native$Json.identity; + var $float = $Native$Json.identity; + var $int = $Native$Json.identity; + var string = $Native$Json.identity; + var encode = $Native$Json.encode; + var Value = {ctor: "Value"}; + return _elm.Json.Encode.values = {_op: _op + ,encode: encode + ,string: string + ,$int: $int + ,$float: $float + ,bool: bool + ,$null: $null + ,list: list + ,array: array + ,object: object}; +}; +Elm.Json = Elm.Json || {}; +Elm.Json.Decode = Elm.Json.Decode || {}; +Elm.Json.Decode.make = function (_elm) { + "use strict"; + _elm.Json = _elm.Json || {}; + _elm.Json.Decode = _elm.Json.Decode || {}; + if (_elm.Json.Decode.values) return _elm.Json.Decode.values; + var _U = Elm.Native.Utils.make(_elm), + $Array = Elm.Array.make(_elm), + $Dict = Elm.Dict.make(_elm), + $Json$Encode = Elm.Json.Encode.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Json = Elm.Native.Json.make(_elm), + $Result = Elm.Result.make(_elm); + var _op = {}; + var tuple8 = $Native$Json.decodeTuple8; + var tuple7 = $Native$Json.decodeTuple7; + var tuple6 = $Native$Json.decodeTuple6; + var tuple5 = $Native$Json.decodeTuple5; + var tuple4 = $Native$Json.decodeTuple4; + var tuple3 = $Native$Json.decodeTuple3; + var tuple2 = $Native$Json.decodeTuple2; + var tuple1 = $Native$Json.decodeTuple1; + var succeed = $Native$Json.succeed; + var fail = $Native$Json.fail; + var andThen = $Native$Json.andThen; + var customDecoder = $Native$Json.customDecoder; + var decodeValue = $Native$Json.runDecoderValue; + var value = $Native$Json.decodeValue; + var maybe = $Native$Json.decodeMaybe; + var $null = $Native$Json.decodeNull; + var array = $Native$Json.decodeArray; + var list = $Native$Json.decodeList; + var bool = $Native$Json.decodeBool; + var $int = $Native$Json.decodeInt; + var $float = $Native$Json.decodeFloat; + var string = $Native$Json.decodeString; + var oneOf = $Native$Json.oneOf; + var keyValuePairs = $Native$Json.decodeKeyValuePairs; + var object8 = $Native$Json.decodeObject8; + var object7 = $Native$Json.decodeObject7; + var object6 = $Native$Json.decodeObject6; + var object5 = $Native$Json.decodeObject5; + var object4 = $Native$Json.decodeObject4; + var object3 = $Native$Json.decodeObject3; + var object2 = $Native$Json.decodeObject2; + var object1 = $Native$Json.decodeObject1; + _op[":="] = $Native$Json.decodeField; + var at = F2(function (fields,decoder) { return A3($List.foldr,F2(function (x,y) { return A2(_op[":="],x,y);}),decoder,fields);}); + var decodeString = $Native$Json.runDecoderString; + var map = $Native$Json.decodeObject1; + var dict = function (decoder) { return A2(map,$Dict.fromList,keyValuePairs(decoder));}; + var Decoder = {ctor: "Decoder"}; + return _elm.Json.Decode.values = {_op: _op + ,decodeString: decodeString + ,decodeValue: decodeValue + ,string: string + ,$int: $int + ,$float: $float + ,bool: bool + ,$null: $null + ,list: list + ,array: array + ,tuple1: tuple1 + ,tuple2: tuple2 + ,tuple3: tuple3 + ,tuple4: tuple4 + ,tuple5: tuple5 + ,tuple6: tuple6 + ,tuple7: tuple7 + ,tuple8: tuple8 + ,at: at + ,object1: object1 + ,object2: object2 + ,object3: object3 + ,object4: object4 + ,object5: object5 + ,object6: object6 + ,object7: object7 + ,object8: object8 + ,keyValuePairs: keyValuePairs + ,dict: dict + ,maybe: maybe + ,oneOf: oneOf + ,map: map + ,fail: fail + ,succeed: succeed + ,andThen: andThen + ,value: value + ,customDecoder: customDecoder}; +}; +Elm.DOM = Elm.DOM || {}; +Elm.DOM.make = function (_elm) { + "use strict"; + _elm.DOM = _elm.DOM || {}; + if (_elm.DOM.values) return _elm.DOM.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Json$Decode = Elm.Json.Decode.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var Rectangle = F4(function (a,b,c,d) { return {top: a,left: b,width: c,height: d};}); + var scrollTop = A2($Json$Decode._op[":="],"scrollTop",$Json$Decode.$float); + var scrollLeft = A2($Json$Decode._op[":="],"scrollLeft",$Json$Decode.$float); + var offsetTop = A2($Json$Decode._op[":="],"offsetTop",$Json$Decode.$float); + var offsetLeft = A2($Json$Decode._op[":="],"offsetLeft",$Json$Decode.$float); + var offsetHeight = A2($Json$Decode._op[":="],"offsetHeight",$Json$Decode.$float); + var offsetWidth = A2($Json$Decode._op[":="],"offsetWidth",$Json$Decode.$float); + var offsetParent = F2(function (x,decoder) { + return $Json$Decode.oneOf(_U.list([A2($Json$Decode._op[":="],"offsetParent",$Json$Decode.$null(x)),A2($Json$Decode._op[":="],"offsetParent",decoder)])); + }); + var position = F2(function (x,y) { + return A2($Json$Decode.andThen, + A5($Json$Decode.object4, + F4(function (scrollLeft,scrollTop,offsetLeft,offsetTop) { return {ctor: "_Tuple2",_0: x + offsetLeft - scrollLeft,_1: y + offsetTop - scrollTop};}), + scrollLeft, + scrollTop, + offsetLeft, + offsetTop), + function (_p0) { + var _p1 = _p0; + var _p3 = _p1._1; + var _p2 = _p1._0; + return A2(offsetParent,{ctor: "_Tuple2",_0: _p2,_1: _p3},A2(position,_p2,_p3)); + }); + }); + var boundingClientRect = A4($Json$Decode.object3, + F3(function (_p4,width,height) { var _p5 = _p4;return {top: _p5._1,left: _p5._0,width: width,height: height};}), + A2(position,0,0), + offsetWidth, + offsetHeight); + var target = function (decoder) { return A2($Json$Decode._op[":="],"target",decoder);}; + return _elm.DOM.values = {_op: _op + ,target: target + ,offsetParent: offsetParent + ,offsetWidth: offsetWidth + ,offsetHeight: offsetHeight + ,offsetLeft: offsetLeft + ,offsetTop: offsetTop + ,scrollLeft: scrollLeft + ,scrollTop: scrollTop + ,boundingClientRect: boundingClientRect + ,Rectangle: Rectangle}; +}; +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o> 0 + currentItem = indices[currentIndex] + + if (minIndex === maxIndex) { + return currentItem >= left && currentItem <= right + } else if (currentItem < left) { + minIndex = currentIndex + 1 + } else if (currentItem > right) { + maxIndex = currentIndex - 1 + } else { + return true + } + } + + return false; +} + +function ascending(a, b) { + return a > b ? 1 : -1 +} + +},{}],8:[function(require,module,exports){ +var applyProperties = require("./apply-properties") + +var isWidget = require("../vnode/is-widget.js") +var VPatch = require("../vnode/vpatch.js") + +var render = require("./create-element") +var updateWidget = require("./update-widget") + +module.exports = applyPatch + +function applyPatch(vpatch, domNode, renderOptions) { + var type = vpatch.type + var vNode = vpatch.vNode + var patch = vpatch.patch + + switch (type) { + case VPatch.REMOVE: + return removeNode(domNode, vNode) + case VPatch.INSERT: + return insertNode(domNode, patch, renderOptions) + case VPatch.VTEXT: + return stringPatch(domNode, vNode, patch, renderOptions) + case VPatch.WIDGET: + return widgetPatch(domNode, vNode, patch, renderOptions) + case VPatch.VNODE: + return vNodePatch(domNode, vNode, patch, renderOptions) + case VPatch.ORDER: + reorderChildren(domNode, patch) + return domNode + case VPatch.PROPS: + applyProperties(domNode, patch, vNode.properties) + return domNode + case VPatch.THUNK: + return replaceRoot(domNode, + renderOptions.patch(domNode, patch, renderOptions)) + default: + return domNode + } +} + +function removeNode(domNode, vNode) { + var parentNode = domNode.parentNode + + if (parentNode) { + parentNode.removeChild(domNode) + } + + destroyWidget(domNode, vNode); + + return null +} + +function insertNode(parentNode, vNode, renderOptions) { + var newNode = render(vNode, renderOptions) + + if (parentNode) { + parentNode.appendChild(newNode) + } + + return parentNode +} + +function stringPatch(domNode, leftVNode, vText, renderOptions) { + var newNode + + if (domNode.nodeType === 3) { + domNode.replaceData(0, domNode.length, vText.text) + newNode = domNode + } else { + var parentNode = domNode.parentNode + newNode = render(vText, renderOptions) + + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } + } + + return newNode +} + +function widgetPatch(domNode, leftVNode, widget, renderOptions) { + var updating = updateWidget(leftVNode, widget) + var newNode + + if (updating) { + newNode = widget.update(leftVNode, domNode) || domNode + } else { + newNode = render(widget, renderOptions) + } + + var parentNode = domNode.parentNode + + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } + + if (!updating) { + destroyWidget(domNode, leftVNode) + } + + return newNode +} + +function vNodePatch(domNode, leftVNode, vNode, renderOptions) { + var parentNode = domNode.parentNode + var newNode = render(vNode, renderOptions) + + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } + + return newNode +} + +function destroyWidget(domNode, w) { + if (typeof w.destroy === "function" && isWidget(w)) { + w.destroy(domNode) + } +} + +function reorderChildren(domNode, moves) { + var childNodes = domNode.childNodes + var keyMap = {} + var node + var remove + var insert + + for (var i = 0; i < moves.removes.length; i++) { + remove = moves.removes[i] + node = childNodes[remove.from] + if (remove.key) { + keyMap[remove.key] = node + } + domNode.removeChild(node) + } + + var length = childNodes.length + for (var j = 0; j < moves.inserts.length; j++) { + insert = moves.inserts[j] + node = keyMap[insert.key] + // this is the weirdest bug i've ever seen in webkit + domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to]) + } +} + +function replaceRoot(oldRoot, newRoot) { + if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) { + oldRoot.parentNode.replaceChild(newRoot, oldRoot) + } + + return newRoot; +} + +},{"../vnode/is-widget.js":16,"../vnode/vpatch.js":19,"./apply-properties":5,"./create-element":6,"./update-widget":10}],9:[function(require,module,exports){ +var document = require("global/document") +var isArray = require("x-is-array") + +var domIndex = require("./dom-index") +var patchOp = require("./patch-op") +module.exports = patch + +function patch(rootNode, patches) { + return patchRecursive(rootNode, patches) +} + +function patchRecursive(rootNode, patches, renderOptions) { + var indices = patchIndices(patches) + + if (indices.length === 0) { + return rootNode + } + + var index = domIndex(rootNode, patches.a, indices) + var ownerDocument = rootNode.ownerDocument + + if (!renderOptions) { + renderOptions = { patch: patchRecursive } + if (ownerDocument !== document) { + renderOptions.document = ownerDocument + } + } + + for (var i = 0; i < indices.length; i++) { + var nodeIndex = indices[i] + rootNode = applyPatch(rootNode, + index[nodeIndex], + patches[nodeIndex], + renderOptions) + } + + return rootNode +} + +function applyPatch(rootNode, domNode, patchList, renderOptions) { + if (!domNode) { + return rootNode + } + + var newNode + + if (isArray(patchList)) { + for (var i = 0; i < patchList.length; i++) { + newNode = patchOp(patchList[i], domNode, renderOptions) + + if (domNode === rootNode) { + rootNode = newNode + } + } + } else { + newNode = patchOp(patchList, domNode, renderOptions) + + if (domNode === rootNode) { + rootNode = newNode + } + } + + return rootNode +} + +function patchIndices(patches) { + var indices = [] + + for (var key in patches) { + if (key !== "a") { + indices.push(Number(key)) + } + } + + return indices +} + +},{"./dom-index":7,"./patch-op":8,"global/document":2,"x-is-array":4}],10:[function(require,module,exports){ +var isWidget = require("../vnode/is-widget.js") + +module.exports = updateWidget + +function updateWidget(a, b) { + if (isWidget(a) && isWidget(b)) { + if ("name" in a && "name" in b) { + return a.id === b.id + } else { + return a.init === b.init + } + } + + return false +} + +},{"../vnode/is-widget.js":16}],11:[function(require,module,exports){ +var isVNode = require("./is-vnode") +var isVText = require("./is-vtext") +var isWidget = require("./is-widget") +var isThunk = require("./is-thunk") + +module.exports = handleThunk + +function handleThunk(a, b) { + var renderedA = a + var renderedB = b + + if (isThunk(b)) { + renderedB = renderThunk(b, a) + } + + if (isThunk(a)) { + renderedA = renderThunk(a, null) + } + + return { + a: renderedA, + b: renderedB + } +} + +function renderThunk(thunk, previous) { + var renderedThunk = thunk.vnode + + if (!renderedThunk) { + renderedThunk = thunk.vnode = thunk.render(previous) + } + + if (!(isVNode(renderedThunk) || + isVText(renderedThunk) || + isWidget(renderedThunk))) { + throw new Error("thunk did not return a valid node"); + } + + return renderedThunk +} + +},{"./is-thunk":12,"./is-vnode":14,"./is-vtext":15,"./is-widget":16}],12:[function(require,module,exports){ +module.exports = isThunk + +function isThunk(t) { + return t && t.type === "Thunk" +} + +},{}],13:[function(require,module,exports){ +module.exports = isHook + +function isHook(hook) { + return hook && + (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") || + typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) +} + +},{}],14:[function(require,module,exports){ +var version = require("./version") + +module.exports = isVirtualNode + +function isVirtualNode(x) { + return x && x.type === "VirtualNode" && x.version === version +} + +},{"./version":17}],15:[function(require,module,exports){ +var version = require("./version") + +module.exports = isVirtualText + +function isVirtualText(x) { + return x && x.type === "VirtualText" && x.version === version +} + +},{"./version":17}],16:[function(require,module,exports){ +module.exports = isWidget + +function isWidget(w) { + return w && w.type === "Widget" +} + +},{}],17:[function(require,module,exports){ +module.exports = "2" + +},{}],18:[function(require,module,exports){ +var version = require("./version") +var isVNode = require("./is-vnode") +var isWidget = require("./is-widget") +var isThunk = require("./is-thunk") +var isVHook = require("./is-vhook") + +module.exports = VirtualNode + +var noProperties = {} +var noChildren = [] + +function VirtualNode(tagName, properties, children, key, namespace) { + this.tagName = tagName + this.properties = properties || noProperties + this.children = children || noChildren + this.key = key != null ? String(key) : undefined + this.namespace = (typeof namespace === "string") ? namespace : null + + var count = (children && children.length) || 0 + var descendants = 0 + var hasWidgets = false + var hasThunks = false + var descendantHooks = false + var hooks + + for (var propName in properties) { + if (properties.hasOwnProperty(propName)) { + var property = properties[propName] + if (isVHook(property) && property.unhook) { + if (!hooks) { + hooks = {} + } + + hooks[propName] = property + } + } + } + + for (var i = 0; i < count; i++) { + var child = children[i] + if (isVNode(child)) { + descendants += child.count || 0 + + if (!hasWidgets && child.hasWidgets) { + hasWidgets = true + } + + if (!hasThunks && child.hasThunks) { + hasThunks = true + } + + if (!descendantHooks && (child.hooks || child.descendantHooks)) { + descendantHooks = true + } + } else if (!hasWidgets && isWidget(child)) { + if (typeof child.destroy === "function") { + hasWidgets = true + } + } else if (!hasThunks && isThunk(child)) { + hasThunks = true; + } + } + + this.count = count + descendants + this.hasWidgets = hasWidgets + this.hasThunks = hasThunks + this.hooks = hooks + this.descendantHooks = descendantHooks +} + +VirtualNode.prototype.version = version +VirtualNode.prototype.type = "VirtualNode" + +},{"./is-thunk":12,"./is-vhook":13,"./is-vnode":14,"./is-widget":16,"./version":17}],19:[function(require,module,exports){ +var version = require("./version") + +VirtualPatch.NONE = 0 +VirtualPatch.VTEXT = 1 +VirtualPatch.VNODE = 2 +VirtualPatch.WIDGET = 3 +VirtualPatch.PROPS = 4 +VirtualPatch.ORDER = 5 +VirtualPatch.INSERT = 6 +VirtualPatch.REMOVE = 7 +VirtualPatch.THUNK = 8 + +module.exports = VirtualPatch + +function VirtualPatch(type, vNode, patch) { + this.type = Number(type) + this.vNode = vNode + this.patch = patch +} + +VirtualPatch.prototype.version = version +VirtualPatch.prototype.type = "VirtualPatch" + +},{"./version":17}],20:[function(require,module,exports){ +var version = require("./version") + +module.exports = VirtualText + +function VirtualText(text) { + this.text = String(text) +} + +VirtualText.prototype.version = version +VirtualText.prototype.type = "VirtualText" + +},{"./version":17}],21:[function(require,module,exports){ +var isObject = require("is-object") +var isHook = require("../vnode/is-vhook") + +module.exports = diffProps + +function diffProps(a, b) { + var diff + + for (var aKey in a) { + if (!(aKey in b)) { + diff = diff || {} + diff[aKey] = undefined + } + + var aValue = a[aKey] + var bValue = b[aKey] + + if (aValue === bValue) { + continue + } else if (isObject(aValue) && isObject(bValue)) { + if (getPrototype(bValue) !== getPrototype(aValue)) { + diff = diff || {} + diff[aKey] = bValue + } else if (isHook(bValue)) { + diff = diff || {} + diff[aKey] = bValue + } else { + var objectDiff = diffProps(aValue, bValue) + if (objectDiff) { + diff = diff || {} + diff[aKey] = objectDiff + } + } + } else { + diff = diff || {} + diff[aKey] = bValue + } + } + + for (var bKey in b) { + if (!(bKey in a)) { + diff = diff || {} + diff[bKey] = b[bKey] + } + } + + return diff +} + +function getPrototype(value) { + if (Object.getPrototypeOf) { + return Object.getPrototypeOf(value) + } else if (value.__proto__) { + return value.__proto__ + } else if (value.constructor) { + return value.constructor.prototype + } +} + +},{"../vnode/is-vhook":13,"is-object":3}],22:[function(require,module,exports){ +var isArray = require("x-is-array") + +var VPatch = require("../vnode/vpatch") +var isVNode = require("../vnode/is-vnode") +var isVText = require("../vnode/is-vtext") +var isWidget = require("../vnode/is-widget") +var isThunk = require("../vnode/is-thunk") +var handleThunk = require("../vnode/handle-thunk") + +var diffProps = require("./diff-props") + +module.exports = diff + +function diff(a, b) { + var patch = { a: a } + walk(a, b, patch, 0) + return patch +} + +function walk(a, b, patch, index) { + if (a === b) { + return + } + + var apply = patch[index] + var applyClear = false + + if (isThunk(a) || isThunk(b)) { + thunks(a, b, patch, index) + } else if (b == null) { + + // If a is a widget we will add a remove patch for it + // Otherwise any child widgets/hooks must be destroyed. + // This prevents adding two remove patches for a widget. + if (!isWidget(a)) { + clearState(a, patch, index) + apply = patch[index] + } + + apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b)) + } else if (isVNode(b)) { + if (isVNode(a)) { + if (a.tagName === b.tagName && + a.namespace === b.namespace && + a.key === b.key) { + var propsPatch = diffProps(a.properties, b.properties) + if (propsPatch) { + apply = appendPatch(apply, + new VPatch(VPatch.PROPS, a, propsPatch)) + } + apply = diffChildren(a, b, patch, apply, index) + } else { + apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) + applyClear = true + } + } else { + apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) + applyClear = true + } + } else if (isVText(b)) { + if (!isVText(a)) { + apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) + applyClear = true + } else if (a.text !== b.text) { + apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) + } + } else if (isWidget(b)) { + if (!isWidget(a)) { + applyClear = true + } + + apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b)) + } + + if (apply) { + patch[index] = apply + } + + if (applyClear) { + clearState(a, patch, index) + } +} + +function diffChildren(a, b, patch, apply, index) { + var aChildren = a.children + var orderedSet = reorder(aChildren, b.children) + var bChildren = orderedSet.children + + var aLen = aChildren.length + var bLen = bChildren.length + var len = aLen > bLen ? aLen : bLen + + for (var i = 0; i < len; i++) { + var leftNode = aChildren[i] + var rightNode = bChildren[i] + index += 1 + + if (!leftNode) { + if (rightNode) { + // Excess nodes in b need to be added + apply = appendPatch(apply, + new VPatch(VPatch.INSERT, null, rightNode)) + } + } else { + walk(leftNode, rightNode, patch, index) + } + + if (isVNode(leftNode) && leftNode.count) { + index += leftNode.count + } + } + + if (orderedSet.moves) { + // Reorder nodes last + apply = appendPatch(apply, new VPatch( + VPatch.ORDER, + a, + orderedSet.moves + )) + } + + return apply +} + +function clearState(vNode, patch, index) { + // TODO: Make this a single walk, not two + unhook(vNode, patch, index) + destroyWidgets(vNode, patch, index) +} + +// Patch records for all destroyed widgets must be added because we need +// a DOM node reference for the destroy function +function destroyWidgets(vNode, patch, index) { + if (isWidget(vNode)) { + if (typeof vNode.destroy === "function") { + patch[index] = appendPatch( + patch[index], + new VPatch(VPatch.REMOVE, vNode, null) + ) + } + } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) { + var children = vNode.children + var len = children.length + for (var i = 0; i < len; i++) { + var child = children[i] + index += 1 + + destroyWidgets(child, patch, index) + + if (isVNode(child) && child.count) { + index += child.count + } + } + } else if (isThunk(vNode)) { + thunks(vNode, null, patch, index) + } +} + +// Create a sub-patch for thunks +function thunks(a, b, patch, index) { + var nodes = handleThunk(a, b) + var thunkPatch = diff(nodes.a, nodes.b) + if (hasPatches(thunkPatch)) { + patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch) + } +} + +function hasPatches(patch) { + for (var index in patch) { + if (index !== "a") { + return true + } + } + + return false +} + +// Execute hooks when two nodes are identical +function unhook(vNode, patch, index) { + if (isVNode(vNode)) { + if (vNode.hooks) { + patch[index] = appendPatch( + patch[index], + new VPatch( + VPatch.PROPS, + vNode, + undefinedKeys(vNode.hooks) + ) + ) + } + + if (vNode.descendantHooks || vNode.hasThunks) { + var children = vNode.children + var len = children.length + for (var i = 0; i < len; i++) { + var child = children[i] + index += 1 + + unhook(child, patch, index) + + if (isVNode(child) && child.count) { + index += child.count + } + } + } + } else if (isThunk(vNode)) { + thunks(vNode, null, patch, index) + } +} + +function undefinedKeys(obj) { + var result = {} + + for (var key in obj) { + result[key] = undefined + } + + return result +} + +// List diff, naive left to right reordering +function reorder(aChildren, bChildren) { + // O(M) time, O(M) memory + var bChildIndex = keyIndex(bChildren) + var bKeys = bChildIndex.keys + var bFree = bChildIndex.free + + if (bFree.length === bChildren.length) { + return { + children: bChildren, + moves: null + } + } + + // O(N) time, O(N) memory + var aChildIndex = keyIndex(aChildren) + var aKeys = aChildIndex.keys + var aFree = aChildIndex.free + + if (aFree.length === aChildren.length) { + return { + children: bChildren, + moves: null + } + } + + // O(MAX(N, M)) memory + var newChildren = [] + + var freeIndex = 0 + var freeCount = bFree.length + var deletedItems = 0 + + // Iterate through a and match a node in b + // O(N) time, + for (var i = 0 ; i < aChildren.length; i++) { + var aItem = aChildren[i] + var itemIndex + + if (aItem.key) { + if (bKeys.hasOwnProperty(aItem.key)) { + // Match up the old keys + itemIndex = bKeys[aItem.key] + newChildren.push(bChildren[itemIndex]) + + } else { + // Remove old keyed items + itemIndex = i - deletedItems++ + newChildren.push(null) + } + } else { + // Match the item in a with the next free item in b + if (freeIndex < freeCount) { + itemIndex = bFree[freeIndex++] + newChildren.push(bChildren[itemIndex]) + } else { + // There are no free items in b to match with + // the free items in a, so the extra free nodes + // are deleted. + itemIndex = i - deletedItems++ + newChildren.push(null) + } + } + } + + var lastFreeIndex = freeIndex >= bFree.length ? + bChildren.length : + bFree[freeIndex] + + // Iterate through b and append any new keys + // O(M) time + for (var j = 0; j < bChildren.length; j++) { + var newItem = bChildren[j] + + if (newItem.key) { + if (!aKeys.hasOwnProperty(newItem.key)) { + // Add any new keyed items + // We are adding new items to the end and then sorting them + // in place. In future we should insert new items in place. + newChildren.push(newItem) + } + } else if (j >= lastFreeIndex) { + // Add any leftover non-keyed items + newChildren.push(newItem) + } + } + + var simulate = newChildren.slice() + var simulateIndex = 0 + var removes = [] + var inserts = [] + var simulateItem + + for (var k = 0; k < bChildren.length;) { + var wantedItem = bChildren[k] + simulateItem = simulate[simulateIndex] + + // remove items + while (simulateItem === null && simulate.length) { + removes.push(remove(simulate, simulateIndex, null)) + simulateItem = simulate[simulateIndex] + } + + if (!simulateItem || simulateItem.key !== wantedItem.key) { + // if we need a key in this position... + if (wantedItem.key) { + if (simulateItem && simulateItem.key) { + // if an insert doesn't put this key in place, it needs to move + if (bKeys[simulateItem.key] !== k + 1) { + removes.push(remove(simulate, simulateIndex, simulateItem.key)) + simulateItem = simulate[simulateIndex] + // if the remove didn't put the wanted item in place, we need to insert it + if (!simulateItem || simulateItem.key !== wantedItem.key) { + inserts.push({key: wantedItem.key, to: k}) + } + // items are matching, so skip ahead + else { + simulateIndex++ + } + } + else { + inserts.push({key: wantedItem.key, to: k}) + } + } + else { + inserts.push({key: wantedItem.key, to: k}) + } + k++ + } + // a key in simulate has no matching wanted key, remove it + else if (simulateItem && simulateItem.key) { + removes.push(remove(simulate, simulateIndex, simulateItem.key)) + } + } + else { + simulateIndex++ + k++ + } + } + + // remove all the remaining nodes from simulate + while(simulateIndex < simulate.length) { + simulateItem = simulate[simulateIndex] + removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key)) + } + + // If the only moves we have are deletes then we can just + // let the delete patch remove these items. + if (removes.length === deletedItems && !inserts.length) { + return { + children: newChildren, + moves: null + } + } + + return { + children: newChildren, + moves: { + removes: removes, + inserts: inserts + } + } +} + +function remove(arr, index, key) { + arr.splice(index, 1) + + return { + from: index, + key: key + } +} + +function keyIndex(children) { + var keys = {} + var free = [] + var length = children.length + + for (var i = 0; i < length; i++) { + var child = children[i] + + if (child.key) { + keys[child.key] = i + } else { + free.push(i) + } + } + + return { + keys: keys, // A hash of key name to index + free: free, // An array of unkeyed item indices + } +} + +function appendPatch(apply, patch) { + if (apply) { + if (isArray(apply)) { + apply.push(patch) + } else { + apply = [apply, patch] + } + + return apply + } else { + return patch + } +} + +},{"../vnode/handle-thunk":11,"../vnode/is-thunk":12,"../vnode/is-vnode":14,"../vnode/is-vtext":15,"../vnode/is-widget":16,"../vnode/vpatch":19,"./diff-props":21,"x-is-array":4}],23:[function(require,module,exports){ +var VNode = require('virtual-dom/vnode/vnode'); +var VText = require('virtual-dom/vnode/vtext'); +var diff = require('virtual-dom/vtree/diff'); +var patch = require('virtual-dom/vdom/patch'); +var createElement = require('virtual-dom/vdom/create-element'); +var isHook = require("virtual-dom/vnode/is-vhook"); + + +Elm.Native.VirtualDom = {}; +Elm.Native.VirtualDom.make = function(elm) +{ + elm.Native = elm.Native || {}; + elm.Native.VirtualDom = elm.Native.VirtualDom || {}; + if (elm.Native.VirtualDom.values) + { + return elm.Native.VirtualDom.values; + } + + var Element = Elm.Native.Graphics.Element.make(elm); + var Json = Elm.Native.Json.make(elm); + var List = Elm.Native.List.make(elm); + var Signal = Elm.Native.Signal.make(elm); + var Utils = Elm.Native.Utils.make(elm); + + var ATTRIBUTE_KEY = 'UniqueNameThatOthersAreVeryUnlikelyToUse'; + + + + // VIRTUAL DOM NODES + + + function text(string) + { + return new VText(string); + } + + function node(name) + { + return F2(function(propertyList, contents) { + return makeNode(name, propertyList, contents); + }); + } + + + // BUILD VIRTUAL DOME NODES + + + function makeNode(name, propertyList, contents) + { + var props = listToProperties(propertyList); + + var key, namespace; + // support keys + if (props.key !== undefined) + { + key = props.key; + props.key = undefined; + } + + // support namespace + if (props.namespace !== undefined) + { + namespace = props.namespace; + props.namespace = undefined; + } + + // ensure that setting text of an input does not move the cursor + var useSoftSet = + (name === 'input' || name === 'textarea') + && props.value !== undefined + && !isHook(props.value); + + if (useSoftSet) + { + props.value = SoftSetHook(props.value); + } + + return new VNode(name, props, List.toArray(contents), key, namespace); + } + + function listToProperties(list) + { + var object = {}; + while (list.ctor !== '[]') + { + var entry = list._0; + if (entry.key === ATTRIBUTE_KEY) + { + object.attributes = object.attributes || {}; + object.attributes[entry.value.attrKey] = entry.value.attrValue; + } + else + { + object[entry.key] = entry.value; + } + list = list._1; + } + return object; + } + + + + // PROPERTIES AND ATTRIBUTES + + + function property(key, value) + { + return { + key: key, + value: value + }; + } + + function attribute(key, value) + { + return { + key: ATTRIBUTE_KEY, + value: { + attrKey: key, + attrValue: value + } + }; + } + + + + // NAMESPACED ATTRIBUTES + + + function attributeNS(namespace, key, value) + { + return { + key: key, + value: new AttributeHook(namespace, key, value) + }; + } + + function AttributeHook(namespace, key, value) + { + if (!(this instanceof AttributeHook)) + { + return new AttributeHook(namespace, key, value); + } + + this.namespace = namespace; + this.key = key; + this.value = value; + } + + AttributeHook.prototype.hook = function (node, prop, prev) + { + if (prev + && prev.type === 'AttributeHook' + && prev.value === this.value + && prev.namespace === this.namespace) + { + return; + } + + node.setAttributeNS(this.namespace, prop, this.value); + }; + + AttributeHook.prototype.unhook = function (node, prop, next) + { + if (next + && next.type === 'AttributeHook' + && next.namespace === this.namespace) + { + return; + } + + node.removeAttributeNS(this.namespace, this.key); + }; + + AttributeHook.prototype.type = 'AttributeHook'; + + + + // EVENTS + + + function on(name, options, decoder, createMessage) + { + function eventHandler(event) + { + var value = A2(Json.runDecoderValue, decoder, event); + if (value.ctor === 'Ok') + { + if (options.stopPropagation) + { + event.stopPropagation(); + } + if (options.preventDefault) + { + event.preventDefault(); + } + Signal.sendMessage(createMessage(value._0)); + } + } + return property('on' + name, eventHandler); + } + + function SoftSetHook(value) + { + if (!(this instanceof SoftSetHook)) + { + return new SoftSetHook(value); + } + + this.value = value; + } + + SoftSetHook.prototype.hook = function (node, propertyName) + { + if (node[propertyName] !== this.value) + { + node[propertyName] = this.value; + } + }; + + + + // INTEGRATION WITH ELEMENTS + + + function ElementWidget(element) + { + this.element = element; + } + + ElementWidget.prototype.type = "Widget"; + + ElementWidget.prototype.init = function init() + { + return Element.render(this.element); + }; + + ElementWidget.prototype.update = function update(previous, node) + { + return Element.update(node, previous.element, this.element); + }; + + function fromElement(element) + { + return new ElementWidget(element); + } + + function toElement(width, height, html) + { + return A3(Element.newElement, width, height, { + ctor: 'Custom', + type: 'evancz/elm-html', + render: render, + update: update, + model: html + }); + } + + + + // RENDER AND UPDATE + + + function render(model) + { + var element = Element.createNode('div'); + element.appendChild(createElement(model)); + return element; + } + + function update(node, oldModel, newModel) + { + updateAndReplace(node.firstChild, oldModel, newModel); + return node; + } + + function updateAndReplace(node, oldModel, newModel) + { + var patches = diff(oldModel, newModel); + var newNode = patch(node, patches); + return newNode; + } + + + + // LAZINESS + + + function lazyRef(fn, a) + { + function thunk() + { + return fn(a); + } + return new Thunk(fn, [a], thunk); + } + + function lazyRef2(fn, a, b) + { + function thunk() + { + return A2(fn, a, b); + } + return new Thunk(fn, [a,b], thunk); + } + + function lazyRef3(fn, a, b, c) + { + function thunk() + { + return A3(fn, a, b, c); + } + return new Thunk(fn, [a,b,c], thunk); + } + + function Thunk(fn, args, thunk) + { + /* public (used by VirtualDom.js) */ + this.vnode = null; + this.key = undefined; + + /* private */ + this.fn = fn; + this.args = args; + this.thunk = thunk; + } + + Thunk.prototype.type = "Thunk"; + Thunk.prototype.render = renderThunk; + + function shouldUpdate(current, previous) + { + if (current.fn !== previous.fn) + { + return true; + } + + // if it's the same function, we know the number of args must match + var cargs = current.args; + var pargs = previous.args; + + for (var i = cargs.length; i--; ) + { + if (cargs[i] !== pargs[i]) + { + return true; + } + } + + return false; + } + + function renderThunk(previous) + { + if (previous == null || shouldUpdate(this, previous)) + { + return this.thunk(); + } + else + { + return previous.vnode; + } + } + + + return elm.Native.VirtualDom.values = Elm.Native.VirtualDom.values = { + node: node, + text: text, + on: F4(on), + + property: F2(property), + attribute: F2(attribute), + attributeNS: F3(attributeNS), + + lazy: F2(lazyRef), + lazy2: F3(lazyRef2), + lazy3: F4(lazyRef3), + + toElement: F3(toElement), + fromElement: fromElement, + + render: createElement, + updateAndReplace: updateAndReplace + }; +}; + +},{"virtual-dom/vdom/create-element":6,"virtual-dom/vdom/patch":9,"virtual-dom/vnode/is-vhook":13,"virtual-dom/vnode/vnode":18,"virtual-dom/vnode/vtext":20,"virtual-dom/vtree/diff":22}]},{},[23]); + +Elm.VirtualDom = Elm.VirtualDom || {}; +Elm.VirtualDom.make = function (_elm) { + "use strict"; + _elm.VirtualDom = _elm.VirtualDom || {}; + if (_elm.VirtualDom.values) return _elm.VirtualDom.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Graphics$Element = Elm.Graphics.Element.make(_elm), + $Json$Decode = Elm.Json.Decode.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$VirtualDom = Elm.Native.VirtualDom.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var lazy3 = $Native$VirtualDom.lazy3; + var lazy2 = $Native$VirtualDom.lazy2; + var lazy = $Native$VirtualDom.lazy; + var defaultOptions = {stopPropagation: false,preventDefault: false}; + var Options = F2(function (a,b) { return {stopPropagation: a,preventDefault: b};}); + var onWithOptions = $Native$VirtualDom.on; + var on = F3(function (eventName,decoder,toMessage) { return A4($Native$VirtualDom.on,eventName,defaultOptions,decoder,toMessage);}); + var attributeNS = $Native$VirtualDom.attributeNS; + var attribute = $Native$VirtualDom.attribute; + var property = $Native$VirtualDom.property; + var Property = {ctor: "Property"}; + var fromElement = $Native$VirtualDom.fromElement; + var toElement = $Native$VirtualDom.toElement; + var text = $Native$VirtualDom.text; + var node = $Native$VirtualDom.node; + var Node = {ctor: "Node"}; + return _elm.VirtualDom.values = {_op: _op + ,text: text + ,node: node + ,toElement: toElement + ,fromElement: fromElement + ,property: property + ,attribute: attribute + ,attributeNS: attributeNS + ,on: on + ,onWithOptions: onWithOptions + ,defaultOptions: defaultOptions + ,lazy: lazy + ,lazy2: lazy2 + ,lazy3: lazy3 + ,Options: Options}; +}; +Elm.Html = Elm.Html || {}; +Elm.Html.make = function (_elm) { + "use strict"; + _elm.Html = _elm.Html || {}; + if (_elm.Html.values) return _elm.Html.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Graphics$Element = Elm.Graphics.Element.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $VirtualDom = Elm.VirtualDom.make(_elm); + var _op = {}; + var fromElement = $VirtualDom.fromElement; + var toElement = $VirtualDom.toElement; + var text = $VirtualDom.text; + var node = $VirtualDom.node; + var body = node("body"); + var section = node("section"); + var nav = node("nav"); + var article = node("article"); + var aside = node("aside"); + var h1 = node("h1"); + var h2 = node("h2"); + var h3 = node("h3"); + var h4 = node("h4"); + var h5 = node("h5"); + var h6 = node("h6"); + var header = node("header"); + var footer = node("footer"); + var address = node("address"); + var main$ = node("main"); + var p = node("p"); + var hr = node("hr"); + var pre = node("pre"); + var blockquote = node("blockquote"); + var ol = node("ol"); + var ul = node("ul"); + var li = node("li"); + var dl = node("dl"); + var dt = node("dt"); + var dd = node("dd"); + var figure = node("figure"); + var figcaption = node("figcaption"); + var div = node("div"); + var a = node("a"); + var em = node("em"); + var strong = node("strong"); + var small = node("small"); + var s = node("s"); + var cite = node("cite"); + var q = node("q"); + var dfn = node("dfn"); + var abbr = node("abbr"); + var time = node("time"); + var code = node("code"); + var $var = node("var"); + var samp = node("samp"); + var kbd = node("kbd"); + var sub = node("sub"); + var sup = node("sup"); + var i = node("i"); + var b = node("b"); + var u = node("u"); + var mark = node("mark"); + var ruby = node("ruby"); + var rt = node("rt"); + var rp = node("rp"); + var bdi = node("bdi"); + var bdo = node("bdo"); + var span = node("span"); + var br = node("br"); + var wbr = node("wbr"); + var ins = node("ins"); + var del = node("del"); + var img = node("img"); + var iframe = node("iframe"); + var embed = node("embed"); + var object = node("object"); + var param = node("param"); + var video = node("video"); + var audio = node("audio"); + var source = node("source"); + var track = node("track"); + var canvas = node("canvas"); + var svg = node("svg"); + var math = node("math"); + var table = node("table"); + var caption = node("caption"); + var colgroup = node("colgroup"); + var col = node("col"); + var tbody = node("tbody"); + var thead = node("thead"); + var tfoot = node("tfoot"); + var tr = node("tr"); + var td = node("td"); + var th = node("th"); + var form = node("form"); + var fieldset = node("fieldset"); + var legend = node("legend"); + var label = node("label"); + var input = node("input"); + var button = node("button"); + var select = node("select"); + var datalist = node("datalist"); + var optgroup = node("optgroup"); + var option = node("option"); + var textarea = node("textarea"); + var keygen = node("keygen"); + var output = node("output"); + var progress = node("progress"); + var meter = node("meter"); + var details = node("details"); + var summary = node("summary"); + var menuitem = node("menuitem"); + var menu = node("menu"); + return _elm.Html.values = {_op: _op + ,node: node + ,text: text + ,toElement: toElement + ,fromElement: fromElement + ,body: body + ,section: section + ,nav: nav + ,article: article + ,aside: aside + ,h1: h1 + ,h2: h2 + ,h3: h3 + ,h4: h4 + ,h5: h5 + ,h6: h6 + ,header: header + ,footer: footer + ,address: address + ,main$: main$ + ,p: p + ,hr: hr + ,pre: pre + ,blockquote: blockquote + ,ol: ol + ,ul: ul + ,li: li + ,dl: dl + ,dt: dt + ,dd: dd + ,figure: figure + ,figcaption: figcaption + ,div: div + ,a: a + ,em: em + ,strong: strong + ,small: small + ,s: s + ,cite: cite + ,q: q + ,dfn: dfn + ,abbr: abbr + ,time: time + ,code: code + ,$var: $var + ,samp: samp + ,kbd: kbd + ,sub: sub + ,sup: sup + ,i: i + ,b: b + ,u: u + ,mark: mark + ,ruby: ruby + ,rt: rt + ,rp: rp + ,bdi: bdi + ,bdo: bdo + ,span: span + ,br: br + ,wbr: wbr + ,ins: ins + ,del: del + ,img: img + ,iframe: iframe + ,embed: embed + ,object: object + ,param: param + ,video: video + ,audio: audio + ,source: source + ,track: track + ,canvas: canvas + ,svg: svg + ,math: math + ,table: table + ,caption: caption + ,colgroup: colgroup + ,col: col + ,tbody: tbody + ,thead: thead + ,tfoot: tfoot + ,tr: tr + ,td: td + ,th: th + ,form: form + ,fieldset: fieldset + ,legend: legend + ,label: label + ,input: input + ,button: button + ,select: select + ,datalist: datalist + ,optgroup: optgroup + ,option: option + ,textarea: textarea + ,keygen: keygen + ,output: output + ,progress: progress + ,meter: meter + ,details: details + ,summary: summary + ,menuitem: menuitem + ,menu: menu}; +}; +Elm.Html = Elm.Html || {}; +Elm.Html.Attributes = Elm.Html.Attributes || {}; +Elm.Html.Attributes.make = function (_elm) { + "use strict"; + _elm.Html = _elm.Html || {}; + _elm.Html.Attributes = _elm.Html.Attributes || {}; + if (_elm.Html.Attributes.values) return _elm.Html.Attributes.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $Json$Encode = Elm.Json.Encode.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $String = Elm.String.make(_elm), + $VirtualDom = Elm.VirtualDom.make(_elm); + var _op = {}; + var attribute = $VirtualDom.attribute; + var contextmenu = function (value) { return A2(attribute,"contextmenu",value);}; + var property = $VirtualDom.property; + var stringProperty = F2(function (name,string) { return A2(property,name,$Json$Encode.string(string));}); + var $class = function (name) { return A2(stringProperty,"className",name);}; + var id = function (name) { return A2(stringProperty,"id",name);}; + var title = function (name) { return A2(stringProperty,"title",name);}; + var accesskey = function ($char) { return A2(stringProperty,"accessKey",$String.fromChar($char));}; + var dir = function (value) { return A2(stringProperty,"dir",value);}; + var draggable = function (value) { return A2(stringProperty,"draggable",value);}; + var dropzone = function (value) { return A2(stringProperty,"dropzone",value);}; + var itemprop = function (value) { return A2(stringProperty,"itemprop",value);}; + var lang = function (value) { return A2(stringProperty,"lang",value);}; + var tabindex = function (n) { return A2(stringProperty,"tabIndex",$Basics.toString(n));}; + var charset = function (value) { return A2(stringProperty,"charset",value);}; + var content = function (value) { return A2(stringProperty,"content",value);}; + var httpEquiv = function (value) { return A2(stringProperty,"httpEquiv",value);}; + var language = function (value) { return A2(stringProperty,"language",value);}; + var src = function (value) { return A2(stringProperty,"src",value);}; + var height = function (value) { return A2(stringProperty,"height",$Basics.toString(value));}; + var width = function (value) { return A2(stringProperty,"width",$Basics.toString(value));}; + var alt = function (value) { return A2(stringProperty,"alt",value);}; + var preload = function (value) { return A2(stringProperty,"preload",value);}; + var poster = function (value) { return A2(stringProperty,"poster",value);}; + var kind = function (value) { return A2(stringProperty,"kind",value);}; + var srclang = function (value) { return A2(stringProperty,"srclang",value);}; + var sandbox = function (value) { return A2(stringProperty,"sandbox",value);}; + var srcdoc = function (value) { return A2(stringProperty,"srcdoc",value);}; + var type$ = function (value) { return A2(stringProperty,"type",value);}; + var value = function (value) { return A2(stringProperty,"value",value);}; + var placeholder = function (value) { return A2(stringProperty,"placeholder",value);}; + var accept = function (value) { return A2(stringProperty,"accept",value);}; + var acceptCharset = function (value) { return A2(stringProperty,"acceptCharset",value);}; + var action = function (value) { return A2(stringProperty,"action",value);}; + var autocomplete = function (bool) { return A2(stringProperty,"autocomplete",bool ? "on" : "off");}; + var autosave = function (value) { return A2(stringProperty,"autosave",value);}; + var enctype = function (value) { return A2(stringProperty,"enctype",value);}; + var formaction = function (value) { return A2(stringProperty,"formAction",value);}; + var list = function (value) { return A2(stringProperty,"list",value);}; + var minlength = function (n) { return A2(stringProperty,"minLength",$Basics.toString(n));}; + var maxlength = function (n) { return A2(stringProperty,"maxLength",$Basics.toString(n));}; + var method = function (value) { return A2(stringProperty,"method",value);}; + var name = function (value) { return A2(stringProperty,"name",value);}; + var pattern = function (value) { return A2(stringProperty,"pattern",value);}; + var size = function (n) { return A2(stringProperty,"size",$Basics.toString(n));}; + var $for = function (value) { return A2(stringProperty,"htmlFor",value);}; + var form = function (value) { return A2(stringProperty,"form",value);}; + var max = function (value) { return A2(stringProperty,"max",value);}; + var min = function (value) { return A2(stringProperty,"min",value);}; + var step = function (n) { return A2(stringProperty,"step",n);}; + var cols = function (n) { return A2(stringProperty,"cols",$Basics.toString(n));}; + var rows = function (n) { return A2(stringProperty,"rows",$Basics.toString(n));}; + var wrap = function (value) { return A2(stringProperty,"wrap",value);}; + var usemap = function (value) { return A2(stringProperty,"useMap",value);}; + var shape = function (value) { return A2(stringProperty,"shape",value);}; + var coords = function (value) { return A2(stringProperty,"coords",value);}; + var challenge = function (value) { return A2(stringProperty,"challenge",value);}; + var keytype = function (value) { return A2(stringProperty,"keytype",value);}; + var align = function (value) { return A2(stringProperty,"align",value);}; + var cite = function (value) { return A2(stringProperty,"cite",value);}; + var href = function (value) { return A2(stringProperty,"href",value);}; + var target = function (value) { return A2(stringProperty,"target",value);}; + var downloadAs = function (value) { return A2(stringProperty,"download",value);}; + var hreflang = function (value) { return A2(stringProperty,"hreflang",value);}; + var media = function (value) { return A2(stringProperty,"media",value);}; + var ping = function (value) { return A2(stringProperty,"ping",value);}; + var rel = function (value) { return A2(stringProperty,"rel",value);}; + var datetime = function (value) { return A2(stringProperty,"datetime",value);}; + var pubdate = function (value) { return A2(stringProperty,"pubdate",value);}; + var start = function (n) { return A2(stringProperty,"start",$Basics.toString(n));}; + var colspan = function (n) { return A2(stringProperty,"colSpan",$Basics.toString(n));}; + var headers = function (value) { return A2(stringProperty,"headers",value);}; + var rowspan = function (n) { return A2(stringProperty,"rowSpan",$Basics.toString(n));}; + var scope = function (value) { return A2(stringProperty,"scope",value);}; + var manifest = function (value) { return A2(stringProperty,"manifest",value);}; + var boolProperty = F2(function (name,bool) { return A2(property,name,$Json$Encode.bool(bool));}); + var hidden = function (bool) { return A2(boolProperty,"hidden",bool);}; + var contenteditable = function (bool) { return A2(boolProperty,"contentEditable",bool);}; + var spellcheck = function (bool) { return A2(boolProperty,"spellcheck",bool);}; + var async = function (bool) { return A2(boolProperty,"async",bool);}; + var defer = function (bool) { return A2(boolProperty,"defer",bool);}; + var scoped = function (bool) { return A2(boolProperty,"scoped",bool);}; + var autoplay = function (bool) { return A2(boolProperty,"autoplay",bool);}; + var controls = function (bool) { return A2(boolProperty,"controls",bool);}; + var loop = function (bool) { return A2(boolProperty,"loop",bool);}; + var $default = function (bool) { return A2(boolProperty,"default",bool);}; + var seamless = function (bool) { return A2(boolProperty,"seamless",bool);}; + var checked = function (bool) { return A2(boolProperty,"checked",bool);}; + var selected = function (bool) { return A2(boolProperty,"selected",bool);}; + var autofocus = function (bool) { return A2(boolProperty,"autofocus",bool);}; + var disabled = function (bool) { return A2(boolProperty,"disabled",bool);}; + var multiple = function (bool) { return A2(boolProperty,"multiple",bool);}; + var novalidate = function (bool) { return A2(boolProperty,"noValidate",bool);}; + var readonly = function (bool) { return A2(boolProperty,"readOnly",bool);}; + var required = function (bool) { return A2(boolProperty,"required",bool);}; + var ismap = function (value) { return A2(boolProperty,"isMap",value);}; + var download = function (bool) { return A2(boolProperty,"download",bool);}; + var reversed = function (bool) { return A2(boolProperty,"reversed",bool);}; + var classList = function (list) { return $class(A2($String.join," ",A2($List.map,$Basics.fst,A2($List.filter,$Basics.snd,list))));}; + var style = function (props) { + return A2(property, + "style", + $Json$Encode.object(A2($List.map,function (_p0) { var _p1 = _p0;return {ctor: "_Tuple2",_0: _p1._0,_1: $Json$Encode.string(_p1._1)};},props))); + }; + var key = function (k) { return A2(stringProperty,"key",k);}; + return _elm.Html.Attributes.values = {_op: _op + ,key: key + ,style: style + ,$class: $class + ,classList: classList + ,id: id + ,title: title + ,hidden: hidden + ,type$: type$ + ,value: value + ,checked: checked + ,placeholder: placeholder + ,selected: selected + ,accept: accept + ,acceptCharset: acceptCharset + ,action: action + ,autocomplete: autocomplete + ,autofocus: autofocus + ,autosave: autosave + ,disabled: disabled + ,enctype: enctype + ,formaction: formaction + ,list: list + ,maxlength: maxlength + ,minlength: minlength + ,method: method + ,multiple: multiple + ,name: name + ,novalidate: novalidate + ,pattern: pattern + ,readonly: readonly + ,required: required + ,size: size + ,$for: $for + ,form: form + ,max: max + ,min: min + ,step: step + ,cols: cols + ,rows: rows + ,wrap: wrap + ,href: href + ,target: target + ,download: download + ,downloadAs: downloadAs + ,hreflang: hreflang + ,media: media + ,ping: ping + ,rel: rel + ,ismap: ismap + ,usemap: usemap + ,shape: shape + ,coords: coords + ,src: src + ,height: height + ,width: width + ,alt: alt + ,autoplay: autoplay + ,controls: controls + ,loop: loop + ,preload: preload + ,poster: poster + ,$default: $default + ,kind: kind + ,srclang: srclang + ,sandbox: sandbox + ,seamless: seamless + ,srcdoc: srcdoc + ,reversed: reversed + ,start: start + ,align: align + ,colspan: colspan + ,rowspan: rowspan + ,headers: headers + ,scope: scope + ,async: async + ,charset: charset + ,content: content + ,defer: defer + ,httpEquiv: httpEquiv + ,language: language + ,scoped: scoped + ,accesskey: accesskey + ,contenteditable: contenteditable + ,contextmenu: contextmenu + ,dir: dir + ,draggable: draggable + ,dropzone: dropzone + ,itemprop: itemprop + ,lang: lang + ,spellcheck: spellcheck + ,tabindex: tabindex + ,challenge: challenge + ,keytype: keytype + ,cite: cite + ,datetime: datetime + ,pubdate: pubdate + ,manifest: manifest + ,property: property + ,attribute: attribute}; +}; +Elm.Native.Effects = {}; +Elm.Native.Effects.make = function(localRuntime) { + + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Effects = localRuntime.Native.Effects || {}; + if (localRuntime.Native.Effects.values) + { + return localRuntime.Native.Effects.values; + } + + var Task = Elm.Native.Task.make(localRuntime); + var Utils = Elm.Native.Utils.make(localRuntime); + var Signal = Elm.Signal.make(localRuntime); + var List = Elm.Native.List.make(localRuntime); + + + // polyfill so things will work even if rAF is not available for some reason + var _requestAnimationFrame = + typeof requestAnimationFrame !== 'undefined' + ? requestAnimationFrame + : function(cb) { setTimeout(cb, 1000 / 60); } + ; + + + // batchedSending and sendCallback implement a small state machine in order + // to schedule only one send(time) call per animation frame. + // + // Invariants: + // 1. In the NO_REQUEST state, there is never a scheduled sendCallback. + // 2. In the PENDING_REQUEST and EXTRA_REQUEST states, there is always exactly + // one scheduled sendCallback. + var NO_REQUEST = 0; + var PENDING_REQUEST = 1; + var EXTRA_REQUEST = 2; + var state = NO_REQUEST; + var messageArray = []; + + + function batchedSending(address, tickMessages) + { + // insert ticks into the messageArray + var foundAddress = false; + + for (var i = messageArray.length; i--; ) + { + if (messageArray[i].address === address) + { + foundAddress = true; + messageArray[i].tickMessages = A3(List.foldl, List.cons, messageArray[i].tickMessages, tickMessages); + break; + } + } + + if (!foundAddress) + { + messageArray.push({ address: address, tickMessages: tickMessages }); + } + + // do the appropriate state transition + switch (state) + { + case NO_REQUEST: + _requestAnimationFrame(sendCallback); + state = PENDING_REQUEST; + break; + case PENDING_REQUEST: + state = PENDING_REQUEST; + break; + case EXTRA_REQUEST: + state = PENDING_REQUEST; + break; + } + } + + + function sendCallback(time) + { + switch (state) + { + case NO_REQUEST: + // This state should not be possible. How can there be no + // request, yet somehow we are actively fulfilling a + // request? + throw new Error( + 'Unexpected send callback.\n' + + 'Please report this to .' + ); + + case PENDING_REQUEST: + // At this point, we do not *know* that another frame is + // needed, but we make an extra request to rAF just in + // case. It's possible to drop a frame if rAF is called + // too late, so we just do it preemptively. + _requestAnimationFrame(sendCallback); + state = EXTRA_REQUEST; + + // There's also stuff we definitely need to send. + send(time); + return; + + case EXTRA_REQUEST: + // Turns out the extra request was not needed, so we will + // stop calling rAF. No reason to call it all the time if + // no one needs it. + state = NO_REQUEST; + return; + } + } + + + function send(time) + { + for (var i = messageArray.length; i--; ) + { + var messages = A3( + List.foldl, + F2( function(toAction, list) { return List.Cons(toAction(time), list); } ), + List.Nil, + messageArray[i].tickMessages + ); + Task.perform( A2(Signal.send, messageArray[i].address, messages) ); + } + messageArray = []; + } + + + function requestTickSending(address, tickMessages) + { + return Task.asyncFunction(function(callback) { + batchedSending(address, tickMessages); + callback(Task.succeed(Utils.Tuple0)); + }); + } + + + return localRuntime.Native.Effects.values = { + requestTickSending: F2(requestTickSending) + }; + +}; + +Elm.Native.Time = {}; + +Elm.Native.Time.make = function(localRuntime) +{ + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Time = localRuntime.Native.Time || {}; + if (localRuntime.Native.Time.values) + { + return localRuntime.Native.Time.values; + } + + var NS = Elm.Native.Signal.make(localRuntime); + var Maybe = Elm.Maybe.make(localRuntime); + + + // FRAMES PER SECOND + + function fpsWhen(desiredFPS, isOn) + { + var msPerFrame = 1000 / desiredFPS; + var ticker = NS.input('fps-' + desiredFPS, null); + + function notifyTicker() + { + localRuntime.notify(ticker.id, null); + } + + function firstArg(x, y) + { + return x; + } + + // input fires either when isOn changes, or when ticker fires. + // Its value is a tuple with the current timestamp, and the state of isOn + var input = NS.timestamp(A3(NS.map2, F2(firstArg), NS.dropRepeats(isOn), ticker)); + + var initialState = { + isOn: false, + time: localRuntime.timer.programStart, + delta: 0 + }; + + var timeoutId; + + function update(input, state) + { + var currentTime = input._0; + var isOn = input._1; + var wasOn = state.isOn; + var previousTime = state.time; + + if (isOn) + { + timeoutId = localRuntime.setTimeout(notifyTicker, msPerFrame); + } + else if (wasOn) + { + clearTimeout(timeoutId); + } + + return { + isOn: isOn, + time: currentTime, + delta: (isOn && !wasOn) ? 0 : currentTime - previousTime + }; + } + + return A2( + NS.map, + function(state) { return state.delta; }, + A3(NS.foldp, F2(update), update(input.value, initialState), input) + ); + } + + + // EVERY + + function every(t) + { + var ticker = NS.input('every-' + t, null); + function tellTime() + { + localRuntime.notify(ticker.id, null); + } + var clock = A2(NS.map, fst, NS.timestamp(ticker)); + setInterval(tellTime, t); + return clock; + } + + + function fst(pair) + { + return pair._0; + } + + + function read(s) + { + var t = Date.parse(s); + return isNaN(t) ? Maybe.Nothing : Maybe.Just(t); + } + + return localRuntime.Native.Time.values = { + fpsWhen: F2(fpsWhen), + every: every, + toDate: function(t) { return new Date(t); }, + read: read + }; +}; + +Elm.Time = Elm.Time || {}; +Elm.Time.make = function (_elm) { + "use strict"; + _elm.Time = _elm.Time || {}; + if (_elm.Time.values) return _elm.Time.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Native$Signal = Elm.Native.Signal.make(_elm), + $Native$Time = Elm.Native.Time.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var delay = $Native$Signal.delay; + var since = F2(function (time,signal) { + var stop = A2($Signal.map,$Basics.always(-1),A2(delay,time,signal)); + var start = A2($Signal.map,$Basics.always(1),signal); + var delaydiff = A3($Signal.foldp,F2(function (x,y) { return x + y;}),0,A2($Signal.merge,start,stop)); + return A2($Signal.map,F2(function (x,y) { return !_U.eq(x,y);})(0),delaydiff); + }); + var timestamp = $Native$Signal.timestamp; + var every = $Native$Time.every; + var fpsWhen = $Native$Time.fpsWhen; + var fps = function (targetFrames) { return A2(fpsWhen,targetFrames,$Signal.constant(true));}; + var inMilliseconds = function (t) { return t;}; + var millisecond = 1; + var second = 1000 * millisecond; + var minute = 60 * second; + var hour = 60 * minute; + var inHours = function (t) { return t / hour;}; + var inMinutes = function (t) { return t / minute;}; + var inSeconds = function (t) { return t / second;}; + return _elm.Time.values = {_op: _op + ,millisecond: millisecond + ,second: second + ,minute: minute + ,hour: hour + ,inMilliseconds: inMilliseconds + ,inSeconds: inSeconds + ,inMinutes: inMinutes + ,inHours: inHours + ,fps: fps + ,fpsWhen: fpsWhen + ,every: every + ,timestamp: timestamp + ,delay: delay + ,since: since}; +}; +Elm.Effects = Elm.Effects || {}; +Elm.Effects.make = function (_elm) { + "use strict"; + _elm.Effects = _elm.Effects || {}; + if (_elm.Effects.values) return _elm.Effects.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Native$Effects = Elm.Native.Effects.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $Task = Elm.Task.make(_elm), + $Time = Elm.Time.make(_elm); + var _op = {}; + var ignore = function (task) { return A2($Task.map,$Basics.always({ctor: "_Tuple0"}),task);}; + var requestTickSending = $Native$Effects.requestTickSending; + var toTaskHelp = F3(function (address,effect,_p0) { + var _p1 = _p0; + var _p5 = _p1._1; + var _p4 = _p1; + var _p3 = _p1._0; + var _p2 = effect; + switch (_p2.ctor) + {case "Task": var reporter = A2($Task.andThen,_p2._0,function (answer) { return A2($Signal.send,address,_U.list([answer]));}); + return {ctor: "_Tuple2",_0: A2($Task.andThen,_p3,$Basics.always(ignore($Task.spawn(reporter)))),_1: _p5}; + case "Tick": return {ctor: "_Tuple2",_0: _p3,_1: A2($List._op["::"],_p2._0,_p5)}; + case "None": return _p4; + default: return A3($List.foldl,toTaskHelp(address),_p4,_p2._0);} + }); + var toTask = F2(function (address,effect) { + var _p6 = A3(toTaskHelp,address,effect,{ctor: "_Tuple2",_0: $Task.succeed({ctor: "_Tuple0"}),_1: _U.list([])}); + var combinedTask = _p6._0; + var tickMessages = _p6._1; + return $List.isEmpty(tickMessages) ? combinedTask : A2($Task.andThen,combinedTask,$Basics.always(A2(requestTickSending,address,tickMessages))); + }); + var Never = function (a) { return {ctor: "Never",_0: a};}; + var Batch = function (a) { return {ctor: "Batch",_0: a};}; + var batch = Batch; + var None = {ctor: "None"}; + var none = None; + var Tick = function (a) { return {ctor: "Tick",_0: a};}; + var tick = Tick; + var Task = function (a) { return {ctor: "Task",_0: a};}; + var task = Task; + var map = F2(function (func,effect) { + var _p7 = effect; + switch (_p7.ctor) + {case "Task": return Task(A2($Task.map,func,_p7._0)); + case "Tick": return Tick(function (_p8) { return func(_p7._0(_p8));}); + case "None": return None; + default: return Batch(A2($List.map,map(func),_p7._0));} + }); + return _elm.Effects.values = {_op: _op,none: none,task: task,tick: tick,map: map,batch: batch,toTask: toTask}; +}; +Elm.Html = Elm.Html || {}; +Elm.Html.Events = Elm.Html.Events || {}; +Elm.Html.Events.make = function (_elm) { + "use strict"; + _elm.Html = _elm.Html || {}; + _elm.Html.Events = _elm.Html.Events || {}; + if (_elm.Html.Events.values) return _elm.Html.Events.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $Json$Decode = Elm.Json.Decode.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $VirtualDom = Elm.VirtualDom.make(_elm); + var _op = {}; + var keyCode = A2($Json$Decode._op[":="],"keyCode",$Json$Decode.$int); + var targetChecked = A2($Json$Decode.at,_U.list(["target","checked"]),$Json$Decode.bool); + var targetValue = A2($Json$Decode.at,_U.list(["target","value"]),$Json$Decode.string); + var defaultOptions = $VirtualDom.defaultOptions; + var Options = F2(function (a,b) { return {stopPropagation: a,preventDefault: b};}); + var onWithOptions = $VirtualDom.onWithOptions; + var on = $VirtualDom.on; + var messageOn = F3(function (name,addr,msg) { return A3(on,name,$Json$Decode.value,function (_p0) { return A2($Signal.message,addr,msg);});}); + var onClick = messageOn("click"); + var onDoubleClick = messageOn("dblclick"); + var onMouseMove = messageOn("mousemove"); + var onMouseDown = messageOn("mousedown"); + var onMouseUp = messageOn("mouseup"); + var onMouseEnter = messageOn("mouseenter"); + var onMouseLeave = messageOn("mouseleave"); + var onMouseOver = messageOn("mouseover"); + var onMouseOut = messageOn("mouseout"); + var onBlur = messageOn("blur"); + var onFocus = messageOn("focus"); + var onSubmit = messageOn("submit"); + var onKey = F3(function (name,addr,handler) { return A3(on,name,keyCode,function (code) { return A2($Signal.message,addr,handler(code));});}); + var onKeyUp = onKey("keyup"); + var onKeyDown = onKey("keydown"); + var onKeyPress = onKey("keypress"); + return _elm.Html.Events.values = {_op: _op + ,onBlur: onBlur + ,onFocus: onFocus + ,onSubmit: onSubmit + ,onKeyUp: onKeyUp + ,onKeyDown: onKeyDown + ,onKeyPress: onKeyPress + ,onClick: onClick + ,onDoubleClick: onDoubleClick + ,onMouseMove: onMouseMove + ,onMouseDown: onMouseDown + ,onMouseUp: onMouseUp + ,onMouseEnter: onMouseEnter + ,onMouseLeave: onMouseLeave + ,onMouseOver: onMouseOver + ,onMouseOut: onMouseOut + ,on: on + ,onWithOptions: onWithOptions + ,defaultOptions: defaultOptions + ,targetValue: targetValue + ,targetChecked: targetChecked + ,keyCode: keyCode + ,Options: Options}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.Aux = Elm.Material.Aux || {}; +Elm.Material.Aux.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + _elm.Material.Aux = _elm.Material.Aux || {}; + if (_elm.Material.Aux.values) return _elm.Material.Aux.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Effects = Elm.Effects.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var blurOn = function (evt) { return A2($Html$Attributes.attribute,A2($Basics._op["++"],"on",evt),"this.blur()");}; + var clip = F3(function (lower,upper,k) { return A2($Basics.max,lower,A2($Basics.min,k,upper));}); + var effect = F2(function (e,x) { return {ctor: "_Tuple2",_0: x,_1: e};}); + var pure = effect($Effects.none); + var mapWithIndex = F2(function (f,xs) { + var loop = F2(function (k,ys) { + var _p0 = ys; + if (_p0.ctor === "[]") { + return _U.list([]); + } else { + return A2($List._op["::"],A2(f,k,_p0._0),A2(loop,k + 1,_p0._1)); + } + }); + return A2(loop,0,xs); + }); + var filter = F3(function (elem,attr,html) { return A2(elem,attr,A2($List.filterMap,function (x) { return x;},html));}); + return _elm.Material.Aux.values = {_op: _op,filter: filter,mapWithIndex: mapWithIndex,effect: effect,pure: pure,clip: clip,blurOn: blurOn}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.Ripple = Elm.Material.Ripple || {}; +Elm.Material.Ripple.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + _elm.Material.Ripple = _elm.Material.Ripple || {}; + if (_elm.Material.Ripple.values) return _elm.Material.Ripple.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $DOM = Elm.DOM.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Effects = Elm.Effects.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $Html$Events = Elm.Html.Events.make(_elm), + $Json$Decode = Elm.Json.Decode.make(_elm), + $List = Elm.List.make(_elm), + $Material$Aux = Elm.Material.Aux.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var styles = F2(function (m,frame) { + var r = m.rect; + var toPx = function (k) { return A2($Basics._op["++"],$Basics.toString($Basics.round(k)),"px");}; + var offset = A2($Basics._op["++"],"translate(",A2($Basics._op["++"],toPx(m.x),A2($Basics._op["++"],", ",A2($Basics._op["++"],toPx(m.y),")")))); + var rippleSize = toPx($Basics.sqrt(r.width * r.width + r.height * r.height) * 2.0 + 2.0); + var scale = _U.eq(frame,0) ? "scale(0.0001, 0.0001)" : ""; + var transformString = A2($Basics._op["++"],"translate(-50%, -50%) ",A2($Basics._op["++"],offset,scale)); + return _U.list([{ctor: "_Tuple2",_0: "width",_1: rippleSize} + ,{ctor: "_Tuple2",_0: "height",_1: rippleSize} + ,{ctor: "_Tuple2",_0: "-webkit-transform",_1: transformString} + ,{ctor: "_Tuple2",_0: "-ms-transform",_1: transformString} + ,{ctor: "_Tuple2",_0: "transform",_1: transformString}]); + }); + var Tick = {ctor: "Tick"}; + var Up = {ctor: "Up"}; + var upOn = F2(function (name,addr) { + return A3($Html$Events.on, + name, + $Json$Decode.succeed({ctor: "_Tuple0"}), + function (_p0) { + return A2($Signal.message,addr,function (_p1) { return Up;}(_p0)); + }); + }); + var Down = function (a) { return {ctor: "Down",_0: a};}; + var Geometry = F5(function (a,b,c,d,e) { return {rect: a,clientX: b,clientY: c,touchX: d,touchY: e};}); + var geometryDecoder = A6($Json$Decode.object5, + Geometry, + $DOM.target($DOM.boundingClientRect), + $Json$Decode.maybe(A2($Json$Decode._op[":="],"clientX",$Json$Decode.$float)), + $Json$Decode.maybe(A2($Json$Decode._op[":="],"clientY",$Json$Decode.$float)), + $Json$Decode.maybe(A2($Json$Decode.at,_U.list(["touches","0","clientX"]),$Json$Decode.$float)), + $Json$Decode.maybe(A2($Json$Decode.at,_U.list(["touches","0","clientY"]),$Json$Decode.$float))); + var downOn = F2(function (name,addr) { return A3($Html$Events.on,name,geometryDecoder,function (_p2) { return A2($Signal.message,addr,Down(_p2));});}); + var Model = F2(function (a,b) { return {animation: a,metrics: b};}); + var Inert = {ctor: "Inert"}; + var model = {animation: Inert,metrics: $Maybe.Nothing}; + var Frame = function (a) { return {ctor: "Frame",_0: a};}; + var view = F3(function (addr,attrs,model) { + var styling = function () { + var _p3 = {ctor: "_Tuple2",_0: model.metrics,_1: model.animation}; + if (_p3.ctor === "_Tuple2" && _p3._0.ctor === "Just") { + if (_p3._1.ctor === "Frame") { + return A2(styles,_p3._0._0,_p3._1._0); + } else { + return A2(styles,_p3._0._0,1); + } + } else { + return _U.list([]); + } + }(); + return A2($Html.span, + A2($List._op["::"], + A2(downOn,"mousedown",addr), + A2($List._op["::"], + A2(downOn,"touchstart",addr), + A2($List._op["::"], + A2(upOn,"mouseup",addr), + A2($List._op["::"],A2(upOn,"mouseleave",addr),A2($List._op["::"],A2(upOn,"touchend",addr),A2($List._op["::"],A2(upOn,"blur",addr),attrs)))))), + _U.list([A2($Html.span, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-ripple",_1: true} + ,{ctor: "_Tuple2",_0: "is-animating",_1: !_U.eq(model.animation,Frame(0))} + ,{ctor: "_Tuple2",_0: "is-visible",_1: !_U.eq(model.animation,Inert)}])) + ,$Html$Attributes.style(styling)]), + _U.list([]))])); + }); + var Metrics = F3(function (a,b,c) { return {rect: a,x: b,y: c};}); + var computeMetrics = function (g) { + var rect = g.rect; + var set = F2(function (x,y) { return $Maybe.Just({ctor: "_Tuple2",_0: x - rect.left,_1: y - rect.top});}); + return A2($Maybe.map, + function (_p4) { + var _p5 = _p4; + return A3(Metrics,rect,_p5._0,_p5._1); + }, + function () { + var _p6 = {ctor: "_Tuple4",_0: g.clientX,_1: g.clientY,_2: g.touchX,_3: g.touchY}; + _v2_3: do { + if (_p6.ctor === "_Tuple4") { + if (_p6._0.ctor === "Just" && _p6._1.ctor === "Just") { + if (_p6._0._0 === 0.0 && _p6._1._0 === 0.0) { + return $Maybe.Just({ctor: "_Tuple2",_0: rect.width / 2.0,_1: rect.height / 2.0}); + } else { + return A2(set,_p6._0._0,_p6._1._0); + } + } else { + if (_p6._2.ctor === "Just" && _p6._3.ctor === "Just") { + return A2(set,_p6._2._0,_p6._3._0); + } else { + break _v2_3; + } + } + } else { + break _v2_3; + } + } while (false); + return $Maybe.Nothing; + }()); + }; + var update = F2(function (action,model) { + var _p7 = action; + switch (_p7.ctor) + {case "Down": return A2($Material$Aux.effect, + $Effects.tick(function (_p8) { return Tick;}), + _U.update(model,{animation: Frame(0),metrics: computeMetrics(_p7._0)})); + case "Up": return A2($Material$Aux.effect,$Effects.none,_U.update(model,{animation: Inert})); + default: return A2($Material$Aux.effect,$Effects.none,_U.update(model,{animation: Frame(1)}));} + }); + return _elm.Material.Ripple.values = {_op: _op + ,Metrics: Metrics + ,Frame: Frame + ,Inert: Inert + ,Model: Model + ,model: model + ,Geometry: Geometry + ,geometryDecoder: geometryDecoder + ,computeMetrics: computeMetrics + ,Down: Down + ,Up: Up + ,Tick: Tick + ,update: update + ,downOn: downOn + ,upOn: upOn + ,styles: styles + ,view: view}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.Button = Elm.Material.Button || {}; +Elm.Material.Button.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + _elm.Material.Button = _elm.Material.Button || {}; + if (_elm.Material.Button.values) return _elm.Material.Button.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Effects = Elm.Effects.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $Html$Events = Elm.Html.Events.make(_elm), + $List = Elm.List.make(_elm), + $Material$Aux = Elm.Material.Aux.make(_elm), + $Material$Ripple = Elm.Material.Ripple.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var Accent = {ctor: "Accent"}; + var Primary = {ctor: "Primary"}; + var Colored = {ctor: "Colored"}; + var Plain = {ctor: "Plain"}; + var Click = {ctor: "Click"}; + var Ripple = function (a) { return {ctor: "Ripple",_0: a};}; + var S = function (a) { return {ctor: "S",_0: a};}; + var model = function (shouldRipple) { return shouldRipple ? S($Maybe.Just($Material$Ripple.model)) : S($Maybe.Nothing);}; + var update = F2(function (action,model) { + var _p0 = action; + if (_p0.ctor === "Click") { + return {ctor: "_Tuple2",_0: model,_1: $Effects.none}; + } else { + var _p1 = model; + if (_p1._0.ctor === "Just") { + var _p2 = A2($Material$Ripple.update,_p0._0,_p1._0._0); + var ripple$ = _p2._0; + var e = _p2._1; + return {ctor: "_Tuple2",_0: S($Maybe.Just(ripple$)),_1: A2($Effects.map,Ripple,e)}; + } else { + return {ctor: "_Tuple2",_0: model,_1: $Effects.none}; + } + } + }); + var view = F5(function (kind,addr,model,coloring,html) { + return A2($Html.button, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-button",_1: true} + ,{ctor: "_Tuple2",_0: "mdl-js-button",_1: true} + ,{ctor: "_Tuple2",_0: "mdl-js-ripple-effect",_1: !_U.eq(model,S($Maybe.Nothing))} + ,{ctor: "_Tuple2",_0: "mdl-button--colored",_1: _U.eq(coloring,Colored)} + ,{ctor: "_Tuple2",_0: "mdl-button--primary",_1: _U.eq(coloring,Primary)} + ,{ctor: "_Tuple2",_0: "mdl-button--accent",_1: _U.eq(coloring,Accent)} + ,{ctor: "_Tuple2",_0: kind,_1: !_U.eq(kind,"")}])) + ,$Material$Aux.blurOn("mouseup") + ,$Material$Aux.blurOn("mouseleave") + ,A2($Html$Events.onClick,addr,Click)]), + function () { + var _p3 = model; + if (_p3._0.ctor === "Just") { + return A2($List._op["::"], + A3($Material$Ripple.view, + A2($Signal.forwardTo,addr,Ripple), + _U.list([$Html$Attributes.$class("mdl-button__ripple-container"),$Material$Aux.blurOn("mouseup")]), + _p3._0._0), + html); + } else { + return html; + } + }()); + }); + var flat = view(""); + var raised = view("mdl-button--raised"); + var fab = view("mdl-button--fab"); + var minifab = view("mdl-button--mini-fab"); + var icon = view("mdl-button--icon"); + return _elm.Material.Button.values = {_op: _op + ,model: model + ,update: update + ,flat: flat + ,raised: raised + ,fab: fab + ,minifab: minifab + ,icon: icon + ,Click: Click + ,Plain: Plain + ,Colored: Colored + ,Primary: Primary + ,Accent: Accent}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.Grid = Elm.Material.Grid || {}; +Elm.Material.Grid.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + _elm.Material.Grid = _elm.Material.Grid || {}; + if (_elm.Material.Grid.values) return _elm.Material.Grid.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $List = Elm.List.make(_elm), + $Material$Aux = Elm.Material.Aux.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $String = Elm.String.make(_elm); + var _op = {}; + var Bottom = {ctor: "Bottom"}; + var Middle = {ctor: "Middle"}; + var Top = {ctor: "Top"}; + var suffix = function (device) { + var _p0 = device; + switch (_p0.ctor) + {case "All": return ""; + case "Desktop": return "-desktop"; + case "Tablet": return "-tablet"; + default: return "-phone";} + }; + var Cell = function (a) { return {ctor: "Cell",_0: a};}; + var cell = F2(function (configs,elms) { + return Cell(A2($Html.div, + _U.list([$Html$Attributes.$class(A2($String.join, + " ", + A2($List._op["::"],"mdl-cell",A2($List.map,function (_p1) { var _p2 = _p1;return _p2._0;},configs))))]), + elms)); + }); + var Config = function (a) { return {ctor: "Config",_0: a};}; + var size = F2(function (device,k) { + var c = function () { + var _p3 = device; + switch (_p3.ctor) + {case "All": return A3($Material$Aux.clip,1,12,k); + case "Desktop": return A3($Material$Aux.clip,1,12,k); + case "Tablet": return A3($Material$Aux.clip,1,8,k); + default: return A3($Material$Aux.clip,1,4,k);} + }(); + return Config(A2($Basics._op["++"],"mdl-cell--",A2($Basics._op["++"],$Basics.toString(c),A2($Basics._op["++"],"-col",suffix(device))))); + }); + var offset = F2(function (device,k) { + var c = function () { + var _p4 = device; + switch (_p4.ctor) + {case "All": return A3($Material$Aux.clip,1,11,k); + case "Desktop": return A3($Material$Aux.clip,1,11,k); + case "Tablet": return A3($Material$Aux.clip,1,7,k); + default: return A3($Material$Aux.clip,1,3,k);} + }(); + return Config(A2($Basics._op["++"],"mdl-cell--",A2($Basics._op["++"],$Basics.toString(c),A2($Basics._op["++"],"-offset",suffix(device))))); + }); + var align = function (a) { + return Config(function () { + var _p5 = a; + switch (_p5.ctor) + {case "Top": return "mdl-cell--top"; + case "Middle": return "mdl-cell--middle"; + default: return "mdl-cell--bottom";} + }()); + }; + var hide = function (device) { + return Config(function () { + var _p6 = device; + if (_p6.ctor === "All") { + return ""; + } else { + return A2($Basics._op["++"],"mdl-cell--hide-",suffix(device)); + } + }()); + }; + var order = F2(function (device,n) { + return Config(A2($Basics._op["++"],"mdl-cell--order-",A2($Basics._op["++"],$Basics.toString(A3($Material$Aux.clip,1,12,n)),suffix(device)))); + }); + var Phone = {ctor: "Phone"}; + var Tablet = {ctor: "Tablet"}; + var Desktop = {ctor: "Desktop"}; + var All = {ctor: "All"}; + var gridWithOptions = F2(function (options,elms) { + return A2($Html.div, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-grid",_1: true} + ,{ctor: "_Tuple2",_0: "mdl-grid--no-spacing",_1: $Basics.not(options.spacing)}])) + ,$Html$Attributes.style(A2($Maybe.withDefault, + _U.list([]), + A2($Maybe.map,function (maxwidth) { return _U.list([{ctor: "_Tuple2",_0: "max-width",_1: maxwidth}]);},options.maxWidth)))]), + A2($List.map,function (_p7) { var _p8 = _p7;return _p8._0;},elms)); + }); + var defaultOptions = {spacing: true,maxWidth: $Maybe.Nothing}; + var grid = gridWithOptions(defaultOptions); + var Options = F2(function (a,b) { return {spacing: a,maxWidth: b};}); + return _elm.Material.Grid.values = {_op: _op + ,grid: grid + ,gridWithOptions: gridWithOptions + ,cell: cell + ,size: size + ,offset: offset + ,align: align + ,hide: hide + ,order: order + ,Options: Options + ,All: All + ,Desktop: Desktop + ,Tablet: Tablet + ,Phone: Phone + ,Top: Top + ,Middle: Middle + ,Bottom: Bottom}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.Icon = Elm.Material.Icon || {}; +Elm.Material.Icon.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + _elm.Material.Icon = _elm.Material.Icon || {}; + if (_elm.Material.Icon.values) return _elm.Material.Icon.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var view = F3(function (name,size,attrs) { + var sz = function () { + var _p0 = size; + switch (_p0.ctor) + {case "S18": return " md-18"; + case "S24": return " md-24"; + case "S36": return " md-36"; + case "S48": return " md-48"; + default: return "";} + }(); + return A2($Html.i,A2($List._op["::"],$Html$Attributes.$class(A2($Basics._op["++"],"material-icons",sz)),attrs),_U.list([$Html.text(name)])); + }); + var S = {ctor: "S"}; + var i = function (name) { return A3(view,name,S,_U.list([]));}; + var S48 = {ctor: "S48"}; + var S36 = {ctor: "S36"}; + var S24 = {ctor: "S24"}; + var S18 = {ctor: "S18"}; + return _elm.Material.Icon.values = {_op: _op,view: view,i: i,S18: S18,S24: S24,S36: S36,S48: S48,S: S}; +}; +Elm.Demo = Elm.Demo || {}; +Elm.Demo.Buttons = Elm.Demo.Buttons || {}; +Elm.Demo.Buttons.make = function (_elm) { + "use strict"; + _elm.Demo = _elm.Demo || {}; + _elm.Demo.Buttons = _elm.Demo.Buttons || {}; + if (_elm.Demo.Buttons.values) return _elm.Demo.Buttons.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Dict = Elm.Dict.make(_elm), + $Effects = Elm.Effects.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $List = Elm.List.make(_elm), + $Material$Button = Elm.Material.Button.make(_elm), + $Material$Grid = Elm.Material.Grid.make(_elm), + $Material$Icon = Elm.Material.Icon.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var Model = F2(function (a,b) { return {clicked: a,buttons: b};}); + var Action = F2(function (a,b) { return {ctor: "Action",_0: a,_1: b};}); + var update = F2(function (_p0,model) { + var _p1 = _p0; + var _p3 = _p1._0; + return A2($Maybe.withDefault, + {ctor: "_Tuple2",_0: model,_1: $Effects.none}, + A2($Maybe.map, + function (m0) { + var _p2 = A2($Material$Button.update,_p1._1,m0); + var m1 = _p2._0; + var e = _p2._1; + return {ctor: "_Tuple2",_0: _U.update(model,{buttons: A3($Dict.insert,_p3,m1,model.buttons)}),_1: A2($Effects.map,Action(_p3),e)}; + }, + A2($Dict.get,_p3,model.buttons))); + }); + var describe = F3(function (kind,ripple,coloring) { + var c = function () { + var _p4 = coloring; + switch (_p4.ctor) + {case "Plain": return "plain"; + case "Colored": return "colored"; + case "Primary": return "primary"; + default: return "accent";} + }(); + return A2($Basics._op["++"],kind,A2($Basics._op["++"],", ",A2($Basics._op["++"],c,ripple ? " w/ripple" : ""))); + }); + var view$ = F5(function (view,coloring,elem,addr,model) { return A4(view,addr,model,coloring,_U.list([elem]));}); + var tabulate$ = F2(function (i,ys) { + var _p5 = ys; + if (_p5.ctor === "[]") { + return _U.list([]); + } else { + return A2($List._op["::"],{ctor: "_Tuple2",_0: i,_1: _p5._0},A2(tabulate$,i + 1,_p5._1)); + } + }); + var tabulate = tabulate$(0); + var row = F2(function (_p6,ripple) { + var _p7 = _p6; + return tabulate(A2($List.map, + function (c) { + return {ctor: "_Tuple3",_0: ripple,_1: A3(describe,_p7._0,ripple,c),_2: A3(view$,_p7._2,c,_p7._1)}; + }, + _U.list([$Material$Button.Plain,$Material$Button.Colored,$Material$Button.Primary,$Material$Button.Accent]))); + }); + var buttons = A2($List.map, + function (_p8) { + var _p9 = _p8; + return A2($List.map,function (_p10) { var _p11 = _p10;return {ctor: "_Tuple2",_0: {ctor: "_Tuple2",_0: _p9._0,_1: _p11._0},_1: _p11._1};},_p9._1); + }, + tabulate(A2($List.concatMap, + function (a) { + return _U.list([A2(row,a,false),A2(row,a,true)]); + }, + _U.list([{ctor: "_Tuple3",_0: "flat",_1: $Html.text("Flat Button"),_2: $Material$Button.flat} + ,{ctor: "_Tuple3",_0: "raised",_1: $Html.text("Raised Button"),_2: $Material$Button.raised} + ,{ctor: "_Tuple3",_0: "FAB",_1: $Material$Icon.i("add"),_2: $Material$Button.fab} + ,{ctor: "_Tuple3",_0: "mini-FAB",_1: $Material$Icon.i("zoom_in"),_2: $Material$Button.minifab} + ,{ctor: "_Tuple3",_0: "icon",_1: $Material$Icon.i("flight_land"),_2: $Material$Button.icon}])))); + var model = {clicked: "" + ,buttons: $Dict.fromList(A2($List.concatMap, + $List.map(function (_p12) { var _p13 = _p12;return {ctor: "_Tuple2",_0: _p13._0,_1: $Material$Button.model(_p13._1._0)};}), + buttons))}; + var view = F2(function (addr,model) { + return $Material$Grid.grid(A2($List.concatMap, + function (row) { + return A2($List.concatMap, + function (_p14) { + var _p15 = _p14; + var _p16 = _p15._0; + var model$ = A2($Maybe.withDefault,$Material$Button.model(false),A2($Dict.get,_p16,model.buttons)); + return _U.list([A2($Material$Grid.cell, + _U.list([A2($Material$Grid.size,$Material$Grid.All,3)]), + _U.list([A2($Html.div, + _U.list([$Html$Attributes.style(_U.list([{ctor: "_Tuple2",_0: "text-align",_1: "center"} + ,{ctor: "_Tuple2",_0: "margin-top",_1: "1em"} + ,{ctor: "_Tuple2",_0: "margin-bottom",_1: "1em"}]))]), + _U.list([A2(_p15._1._2,A2($Signal.forwardTo,addr,Action(_p16)),model$) + ,A2($Html.div, + _U.list([$Html$Attributes.style(_U.list([{ctor: "_Tuple2",_0: "font-size",_1: "9pt"},{ctor: "_Tuple2",_0: "margin-top",_1: "1em"}]))]), + _U.list([$Html.text(_p15._1._1)]))]))]))]); + }, + row); + }, + buttons)); + }); + return _elm.Demo.Buttons.values = {_op: _op + ,tabulate$: tabulate$ + ,tabulate: tabulate + ,view$: view$ + ,describe: describe + ,row: row + ,buttons: buttons + ,model: model + ,Action: Action + ,Model: Model + ,update: update + ,view: view}; +}; +Elm.Demo = Elm.Demo || {}; +Elm.Demo.Grid = Elm.Demo.Grid || {}; +Elm.Demo.Grid.make = function (_elm) { + "use strict"; + _elm.Demo = _elm.Demo || {}; + _elm.Demo.Grid = _elm.Demo.Grid || {}; + if (_elm.Demo.Grid.values) return _elm.Demo.Grid.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $List = Elm.List.make(_elm), + $Material$Grid = Elm.Material.Grid.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var view = _U.list([$Material$Grid.grid(A2($List.map, + function (i) { + return A2($Material$Grid.cell,_U.list([A2($Material$Grid.size,$Material$Grid.All,1)]),_U.list([$Html.text("1")])); + }, + _U.range(1,12))) + ,$Material$Grid.grid(A2($List.map, + function (i) { + return A2($Material$Grid.cell,_U.list([A2($Material$Grid.size,$Material$Grid.All,4)]),_U.list([$Html.text("4")])); + }, + _U.range(1,3))) + ,$Material$Grid.grid(_U.list([A2($Material$Grid.cell,_U.list([A2($Material$Grid.size,$Material$Grid.All,6)]),_U.list([$Html.text("6")])) + ,A2($Material$Grid.cell,_U.list([A2($Material$Grid.size,$Material$Grid.All,4)]),_U.list([$Html.text("4")])) + ,A2($Material$Grid.cell, + _U.list([A2($Material$Grid.size,$Material$Grid.All,2)]), + _U.list([$Html.text("2")]))])) + ,$Material$Grid.grid(_U.list([A2($Material$Grid.cell, + _U.list([A2($Material$Grid.size,$Material$Grid.All,6),A2($Material$Grid.size,$Material$Grid.Tablet,8)]), + _U.list([$Html.text("6 (8 tablet)")])) + ,A2($Material$Grid.cell, + _U.list([A2($Material$Grid.size,$Material$Grid.All,4),A2($Material$Grid.size,$Material$Grid.Tablet,6)]), + _U.list([$Html.text("4 (6 tablet)")])) + ,A2($Material$Grid.cell, + _U.list([A2($Material$Grid.size,$Material$Grid.All,2),A2($Material$Grid.size,$Material$Grid.Phone,4)]), + _U.list([$Html.text("2 (4 phone)")]))])) + ,A3($Html.node, + "style", + _U.list([]), + _U.list([$Html.text("\n .mdl-cell {\n text-sizing: border-box;\n background-color: #BDBDBD;\n height: 200px;\n padding-left: 8px;\n padding-top: 4px;\n color: white;\n }\n .mdl-grid:first-of-type .mdl-cell {\n height: 50px;\n }\n ")]))]); + return _elm.Demo.Grid.values = {_op: _op,view: view}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.Textfield = Elm.Material.Textfield || {}; +Elm.Material.Textfield.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + _elm.Material.Textfield = _elm.Material.Textfield || {}; + if (_elm.Material.Textfield.values) return _elm.Material.Textfield.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $Html$Events = Elm.Html.Events.make(_elm), + $List = Elm.List.make(_elm), + $Material$Aux = Elm.Material.Aux.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var update = F2(function (action,model) { + var _p0 = action; + switch (_p0.ctor) + {case "Input": return _U.update(model,{value: _p0._0}); + case "Blur": return _U.update(model,{isFocused: false}); + default: return _U.update(model,{isFocused: true});} + }); + var Focus = {ctor: "Focus"}; + var Blur = {ctor: "Blur"}; + var Input = function (a) { return {ctor: "Input",_0: a};}; + var view = F2(function (addr,model) { + var hasError = A2($Maybe.withDefault,false,A2($Maybe.map,$Basics.always(true),model.error)); + var hasFloat = A2($Maybe.withDefault,false,A2($Maybe.map,function (_) { return _.$float;},model.label)); + return A3($Material$Aux.filter, + $Html.div, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-textfield",_1: true} + ,{ctor: "_Tuple2",_0: "mdl-js-textfield",_1: true} + ,{ctor: "_Tuple2",_0: "is-upgraded",_1: true} + ,{ctor: "_Tuple2",_0: "mdl-textfield--floating-label",_1: hasFloat} + ,{ctor: "_Tuple2",_0: "is-invalid",_1: hasError} + ,{ctor: "_Tuple2",_0: "is-dirty",_1: !_U.eq(model.value,"")} + ,{ctor: "_Tuple2",_0: "is-focused",_1: model.isFocused && $Basics.not(model.isDisabled)} + ,{ctor: "_Tuple2",_0: "is-disabled",_1: model.isDisabled}]))]), + _U.list([$Maybe.Just(A2($Html.input, + _U.list([$Html$Attributes.$class("mdl-textfield__input") + ,$Html$Attributes.style(_U.list([{ctor: "_Tuple2",_0: "outline",_1: "none"}])) + ,$Html$Attributes.type$("text") + ,$Html$Attributes.disabled(model.isDisabled) + ,$Html$Attributes.value(model.value) + ,A3($Html$Events.on,"input",$Html$Events.targetValue,function (s) { return A2($Signal.message,addr,Input(s));}) + ,A2($Html$Events.onBlur,addr,Blur) + ,A2($Html$Events.onFocus,addr,Focus)]), + _U.list([]))) + ,A2($Maybe.map, + function (l) { + return A2($Html.label,_U.list([$Html$Attributes.$class("mdl-textfield__label")]),_U.list([$Html.text(l.text)])); + }, + model.label) + ,A2($Maybe.map, + function (e) { + return A2($Html.span,_U.list([$Html$Attributes.$class("mdl-textfield__error")]),_U.list([$Html.text(e)])); + }, + model.error)])); + }); + var Model = F6(function (a,b,c,d,e,f) { return {label: a,error: b,kind: c,isDisabled: d,isFocused: e,value: f};}); + var SingleLine = {ctor: "SingleLine"}; + var model = {label: $Maybe.Nothing,error: $Maybe.Nothing,kind: SingleLine,isDisabled: false,isFocused: false,value: ""}; + var Label = F2(function (a,b) { return {text: a,$float: b};}); + return _elm.Material.Textfield.values = {_op: _op + ,Label: Label + ,SingleLine: SingleLine + ,Model: Model + ,model: model + ,Input: Input + ,Blur: Blur + ,Focus: Focus + ,update: update + ,view: view}; +}; +Elm.Demo = Elm.Demo || {}; +Elm.Demo.Textfields = Elm.Demo.Textfields || {}; +Elm.Demo.Textfields.make = function (_elm) { + "use strict"; + _elm.Demo = _elm.Demo || {}; + _elm.Demo.Textfields = _elm.Demo.Textfields || {}; + if (_elm.Demo.Textfields.values) return _elm.Demo.Textfields.values; + var _U = Elm.Native.Utils.make(_elm), + $Array = Elm.Array.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $List = Elm.List.make(_elm), + $Material$Grid = Elm.Material.Grid.make(_elm), + $Material$Textfield = Elm.Material.Textfield.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm); + var _op = {}; + var update = F2(function (_p0,fields) { + var _p1 = _p0; + var _p2 = _p1._0; + return A2($Maybe.withDefault, + fields, + A2($Maybe.map, + function (field$) { + return A3($Array.set,_p2,field$,fields); + }, + A2($Maybe.map,$Material$Textfield.update(_p1._1),A2($Array.get,_p2,fields)))); + }); + var Field = F2(function (a,b) { return {ctor: "Field",_0: a,_1: b};}); + var view = F2(function (addr,model) { + return $Material$Grid.grid(A2($List.map, + function (x) { + return A2($Material$Grid.cell,_U.list([A2($Material$Grid.size,$Material$Grid.All,3)]),_U.list([x])); + }, + $Array.toList(A2($Array.indexedMap,F2(function (k,field) { return A2($Material$Textfield.view,A2($Signal.forwardTo,addr,Field(k)),field);}),model)))); + }); + var model = function () { + var t0 = $Material$Textfield.model; + return $Array.fromList(_U.list([t0 + ,_U.update(t0,{label: $Maybe.Just({text: "Labelled",$float: false})}) + ,_U.update(t0,{label: $Maybe.Just({text: "Floating label",$float: true})}) + ,_U.update(t0,{label: $Maybe.Just({text: "Disabled",$float: false}),isDisabled: true}) + ,_U.update(t0, + {label: $Maybe.Just({text: "With error and value",$float: false}) + ,error: $Maybe.Just("The input is wrong!") + ,value: "Incorrect input"})])); + }(); + return _elm.Demo.Textfields.values = {_op: _op,model: model,Field: Field,update: update,view: view}; +}; +Elm.StartApp = Elm.StartApp || {}; +Elm.StartApp.make = function (_elm) { + "use strict"; + _elm.StartApp = _elm.StartApp || {}; + if (_elm.StartApp.values) return _elm.StartApp.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Effects = Elm.Effects.make(_elm), + $Html = Elm.Html.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $Task = Elm.Task.make(_elm); + var _op = {}; + var start = function (config) { + var updateStep = F2(function (action,_p0) { + var _p1 = _p0; + var _p2 = A2(config.update,action,_p1._0); + var newModel = _p2._0; + var additionalEffects = _p2._1; + return {ctor: "_Tuple2",_0: newModel,_1: $Effects.batch(_U.list([_p1._1,additionalEffects]))}; + }); + var update = F2(function (actions,_p3) { var _p4 = _p3;return A3($List.foldl,updateStep,{ctor: "_Tuple2",_0: _p4._0,_1: $Effects.none},actions);}); + var messages = $Signal.mailbox(_U.list([])); + var singleton = function (action) { return _U.list([action]);}; + var address = A2($Signal.forwardTo,messages.address,singleton); + var inputs = $Signal.mergeMany(A2($List._op["::"],messages.signal,A2($List.map,$Signal.map(singleton),config.inputs))); + var effectsAndModel = A3($Signal.foldp,update,config.init,inputs); + var model = A2($Signal.map,$Basics.fst,effectsAndModel); + return {html: A2($Signal.map,config.view(address),model) + ,model: model + ,tasks: A2($Signal.map,function (_p5) { return A2($Effects.toTask,messages.address,$Basics.snd(_p5));},effectsAndModel)}; + }; + var App = F3(function (a,b,c) { return {html: a,model: b,tasks: c};}); + var Config = F4(function (a,b,c,d) { return {init: a,update: b,view: c,inputs: d};}); + return _elm.StartApp.values = {_op: _op,start: start,Config: Config,App: App}; +}; +Elm.Native = Elm.Native || {}; +Elm.Native.Window = {}; +Elm.Native.Window.make = function make(localRuntime) { + localRuntime.Native = localRuntime.Native || {}; + localRuntime.Native.Window = localRuntime.Native.Window || {}; + if (localRuntime.Native.Window.values) + { + return localRuntime.Native.Window.values; + } + + var NS = Elm.Native.Signal.make(localRuntime); + var Tuple2 = Elm.Native.Utils.make(localRuntime).Tuple2; + + + function getWidth() + { + return localRuntime.node.clientWidth; + } + + + function getHeight() + { + if (localRuntime.isFullscreen()) + { + return window.innerHeight; + } + return localRuntime.node.clientHeight; + } + + + var dimensions = NS.input('Window.dimensions', Tuple2(getWidth(), getHeight())); + + + function resizeIfNeeded() + { + // Do not trigger event if the dimensions have not changed. + // This should be most of the time. + var w = getWidth(); + var h = getHeight(); + if (dimensions.value._0 === w && dimensions.value._1 === h) + { + return; + } + + setTimeout(function() { + // Check again to see if the dimensions have changed. + // It is conceivable that the dimensions have changed + // again while some other event was being processed. + w = getWidth(); + h = getHeight(); + if (dimensions.value._0 === w && dimensions.value._1 === h) + { + return; + } + localRuntime.notify(dimensions.id, Tuple2(w, h)); + }, 0); + } + + + localRuntime.addListener([dimensions.id], window, 'resize', resizeIfNeeded); + + + return localRuntime.Native.Window.values = { + dimensions: dimensions, + resizeIfNeeded: resizeIfNeeded + }; +}; + +Elm.Window = Elm.Window || {}; +Elm.Window.make = function (_elm) { + "use strict"; + _elm.Window = _elm.Window || {}; + if (_elm.Window.values) return _elm.Window.values; + var _U = Elm.Native.Utils.make(_elm),$Basics = Elm.Basics.make(_elm),$Native$Window = Elm.Native.Window.make(_elm),$Signal = Elm.Signal.make(_elm); + var _op = {}; + var dimensions = $Native$Window.dimensions; + var width = A2($Signal.map,$Basics.fst,dimensions); + var height = A2($Signal.map,$Basics.snd,dimensions); + return _elm.Window.values = {_op: _op,dimensions: dimensions,width: width,height: height}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.Layout = Elm.Material.Layout || {}; +Elm.Material.Layout.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + _elm.Material.Layout = _elm.Material.Layout || {}; + if (_elm.Material.Layout.values) return _elm.Material.Layout.values; + var _U = Elm.Native.Utils.make(_elm), + $Array = Elm.Array.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Effects = Elm.Effects.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $Html$Events = Elm.Html.Events.make(_elm), + $List = Elm.List.make(_elm), + $Material$Aux = Elm.Material.Aux.make(_elm), + $Material$Icon = Elm.Material.Icon.make(_elm), + $Material$Ripple = Elm.Material.Ripple.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $Window = Elm.Window.make(_elm); + var _op = {}; + var Contents = F4(function (a,b,c,d) { return {header: a,drawer: b,tabs: c,main: d};}); + var drawerView = F3(function (addr,model,elems) { + return A2($Html.div, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-layout__drawer",_1: true} + ,{ctor: "_Tuple2",_0: "is-visible",_1: model.isDrawerOpen}]))]), + elems); + }); + var Scroll = {ctor: "Scroll"}; + var Seamed = {ctor: "Seamed"}; + var Standard = {ctor: "Standard"}; + var headerView = F2(function (model,_p0) { + var _p1 = _p0; + return A3($Material$Aux.filter, + $Html.header, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-layout__header",_1: true} + ,{ctor: "_Tuple2",_0: "is-casting-shadow",_1: _U.eq(model.mode,Standard)}]))]), + _U.list([_p1._0,A2($Maybe.map,$Html.div(_U.list([$Html$Attributes.$class("mdl-layout__header-row")])),_p1._1),_p1._2])); + }); + var link = F2(function (attrs,contents) { return A2($Html.a,A2($List._op["::"],$Html$Attributes.$class("mdl-navigation__link"),attrs),contents);}); + var navigation = function (contents) { return A2($Html.nav,_U.list([$Html$Attributes.$class("mdl-navigation")]),contents);}; + var title = function (t) { return A2($Html.span,_U.list([$Html$Attributes.$class("mdl-layout__title")]),_U.list([$Html.text(t)]));}; + var spacer = A2($Html.div,_U.list([$Html$Attributes.$class("mdl-layout-spacer")]),_U.list([])); + var Ripple = F2(function (a,b) { return {ctor: "Ripple",_0: a,_1: b};}); + var ScrollTab = function (a) { return {ctor: "ScrollTab",_0: a};}; + var SmallScreen = function (a) { return {ctor: "SmallScreen",_0: a};}; + var ToggleDrawer = {ctor: "ToggleDrawer"}; + var drawerButton = function (addr) { + return A2($Html.div, + _U.list([$Html$Attributes.$class("mdl-layout__drawer-button"),A2($Html$Events.onClick,addr,ToggleDrawer)]), + _U.list([$Material$Icon.i("menu")])); + }; + var obfuscator = F2(function (addr,model) { + return A2($Html.div, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-layout__obfuscator",_1: true} + ,{ctor: "_Tuple2",_0: "is-visible",_1: model.isDrawerOpen}])) + ,A2($Html$Events.onClick,addr,ToggleDrawer)]), + _U.list([])); + }); + var SwitchTab = function (a) { return {ctor: "SwitchTab",_0: a};}; + var Model = F8(function (a,b,c,d,e,f,g,h) { + return {selectedTab: a,isDrawerOpen: b,fixedHeader: c,fixedDrawer: d,fixedTabs: e,rippleTabs: f,mode: g,state: h}; + }); + var s = function (model) { var _p2 = model.state;return _p2._0;}; + var tabsView = F3(function (addr,model,tabs) { + var chevron = F2(function (direction,offset) { + return A2($Html.div, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-layout__tab-bar-button",_1: true} + ,{ctor: "_Tuple2" + ,_0: A2($Basics._op["++"],"mdl-layout__tab-bar-",A2($Basics._op["++"],direction,"-button")) + ,_1: true}]))]), + _U.list([A3($Material$Icon.view, + A2($Basics._op["++"],"chevron_",direction), + $Material$Icon.S, + _U.list([A2($Html$Events.onClick,addr,ScrollTab(offset))]))])); + }); + return A2($Html.div, + _U.list([$Html$Attributes.$class("mdl-layout__tab-bar-container")]), + _U.list([A2(chevron,"left",-100) + ,A2($Html.div, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-layout__tab-bar",_1: true} + ,{ctor: "_Tuple2",_0: "mdl-js-ripple-effect",_1: model.rippleTabs} + ,{ctor: "_Tuple2",_0: "mds-js-ripple-effect--ignore-events",_1: model.rippleTabs}]))]), + A2($Material$Aux.mapWithIndex, + F2(function (tabIndex,tab) { + return A3($Material$Aux.filter, + $Html.a, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-layout__tab",_1: true} + ,{ctor: "_Tuple2",_0: "is-active",_1: _U.eq(tabIndex,model.selectedTab)}])) + ,A2($Html$Events.onClick,addr,SwitchTab(tabIndex))]), + _U.list([$Maybe.Just(tab) + ,model.rippleTabs ? A2($Maybe.map, + A2($Material$Ripple.view, + A2($Signal.forwardTo,addr,Ripple(tabIndex)), + _U.list([$Html$Attributes.$class("mdl-layout__tab-ripple-container")])), + A2($Array.get,tabIndex,s(model).tabs)) : $Maybe.Nothing])); + }), + tabs)) + ,A2(chevron,"right",100)])); + }); + var view = F3(function (addr,model,_p3) { + var _p4 = _p3; + var _p11 = _p4.tabs; + var _p10 = _p4.header; + var _p9 = _p4.drawer; + var hasHeader = !_U.eq(_p11,$Maybe.Nothing) || !_U.eq(_p10,$Maybe.Nothing); + var mode = function () { + var _p5 = model.mode; + switch (_p5.ctor) + {case "Standard": return ""; + case "Scroll": return "mdl-layout__header-scroll"; + default: return "mdl-layout__header-seamed";} + }(); + var _p6 = function () { + var _p7 = {ctor: "_Tuple3",_0: _p9,_1: _p10,_2: model.fixedHeader}; + if (_p7.ctor === "_Tuple3" && _p7._0.ctor === "Just") { + if (_p7._1.ctor === "Just" && _p7._2 === true) { + return {ctor: "_Tuple2",_0: $Maybe.Nothing,_1: $Maybe.Just(drawerButton(addr))}; + } else { + return {ctor: "_Tuple2",_0: $Maybe.Just(drawerButton(addr)),_1: $Maybe.Nothing}; + } + } else { + return {ctor: "_Tuple2",_0: $Maybe.Nothing,_1: $Maybe.Nothing}; + } + }(); + var contentDrawerButton = _p6._0; + var headerDrawerButton = _p6._1; + return A2($Html.div, + _U.list([$Html$Attributes.$class("mdl-layout__container")]), + _U.list([A3($Material$Aux.filter, + $Html.div, + _U.list([$Html$Attributes.classList(_U.list([{ctor: "_Tuple2",_0: "mdl-layout",_1: true} + ,{ctor: "_Tuple2",_0: "is-upgraded",_1: true} + ,{ctor: "_Tuple2",_0: "is-small-screen",_1: s(model).isSmallScreen} + ,{ctor: "_Tuple2",_0: "has-drawer",_1: !_U.eq(_p9,$Maybe.Nothing)} + ,{ctor: "_Tuple2",_0: "has-tabs",_1: !_U.eq(_p11,$Maybe.Nothing)} + ,{ctor: "_Tuple2",_0: "mdl-js-layout",_1: true} + ,{ctor: "_Tuple2",_0: "mdl-layout--fixed-drawer",_1: model.fixedDrawer && !_U.eq(_p9,$Maybe.Nothing)} + ,{ctor: "_Tuple2",_0: "mdl-layout--fixed-header",_1: model.fixedHeader && hasHeader} + ,{ctor: "_Tuple2",_0: "mdl-layout--fixed-tabs",_1: model.fixedTabs && !_U.eq(_p11,$Maybe.Nothing)}]))]), + _U.list([hasHeader ? $Maybe.Just(A2(headerView, + model, + {ctor: "_Tuple3",_0: headerDrawerButton,_1: _p10,_2: A2($Maybe.map,A2(tabsView,addr,model),_p11)})) : $Maybe.Nothing + ,A2($Maybe.map,function (_p8) { return A2(obfuscator,addr,model);},_p9) + ,A2($Maybe.map,A2(drawerView,addr,model),_p9) + ,contentDrawerButton + ,$Maybe.Just(A2($Html.main$,_U.list([$Html$Attributes.$class("mdl-layout__content")]),_p4.main))]))])); + }); + var S = function (a) { return {ctor: "S",_0: a};}; + var initState = function (no_tabs) { return S({tabs: A2($Array.repeat,no_tabs,$Material$Ripple.model),isSmallScreen: false});}; + var defaultLayoutModel = {selectedTab: 0 + ,isDrawerOpen: false + ,fixedHeader: true + ,fixedDrawer: false + ,fixedTabs: false + ,rippleTabs: true + ,mode: Standard + ,state: initState(0)}; + var update = F2(function (action,model) { + var _p12 = model.state; + var state = _p12._0; + var _p13 = action; + switch (_p13.ctor) + {case "SmallScreen": var _p14 = _p13._0; + return $Material$Aux.pure(_U.update(model,{state: S(_U.update(state,{isSmallScreen: _p14})),isDrawerOpen: $Basics.not(_p14) && model.isDrawerOpen})); + case "SwitchTab": return $Material$Aux.pure(_U.update(model,{selectedTab: _p13._0})); + case "ToggleDrawer": return $Material$Aux.pure(_U.update(model,{isDrawerOpen: $Basics.not(model.isDrawerOpen)})); + case "Ripple": var _p18 = _p13._0; + var _p15 = A2($Maybe.withDefault, + $Material$Aux.pure(state), + A2($Maybe.map, + function (_p16) { + var _p17 = _p16; + return {ctor: "_Tuple2",_0: _U.update(state,{tabs: A3($Array.set,_p18,_p17._0,s(model).tabs)}),_1: A2($Effects.map,Ripple(_p18),_p17._1)}; + }, + A2($Maybe.map,$Material$Ripple.update(_p13._1),A2($Array.get,_p18,s(model).tabs)))); + var state$ = _p15._0; + var effect = _p15._1; + return {ctor: "_Tuple2",_0: _U.update(model,{state: S(state$)}),_1: effect}; + default: return {ctor: "_Tuple2",_0: model,_1: $Effects.none};} + }); + var State$ = F2(function (a,b) { return {tabs: a,isSmallScreen: b};}); + var setupSizeChangeSignal = function (f) { + return A2($Signal.map, + function (_p19) { + return f(SmallScreen(_p19)); + }, + $Signal.dropRepeats(A2($Signal.map,F2(function (x,y) { return _U.cmp(x,y) > 0;})(1024),$Window.width))); + }; + return _elm.Material.Layout.values = {_op: _op + ,setupSizeChangeSignal: setupSizeChangeSignal + ,defaultLayoutModel: defaultLayoutModel + ,initState: initState + ,update: update + ,spacer: spacer + ,title: title + ,navigation: navigation + ,link: link + ,view: view + ,Model: Model + ,Contents: Contents + ,SwitchTab: SwitchTab + ,ToggleDrawer: ToggleDrawer}; +}; +Elm.Material = Elm.Material || {}; +Elm.Material.make = function (_elm) { + "use strict"; + _elm.Material = _elm.Material || {}; + if (_elm.Material.values) return _elm.Material.values; + var _U = Elm.Native.Utils.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $List = Elm.List.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $String = Elm.String.make(_elm); + var _op = {}; + var toString = function (color) { + var _p0 = color; + switch (_p0.ctor) + {case "Indigo": return "indigo"; + case "Blue": return "blue"; + case "LightBlue": return "light-blue"; + case "Cyan": return "cyan"; + case "Teal": return "teal"; + case "Green": return "green"; + case "LightGreen": return "light-green"; + case "Lime": return "lime"; + case "Yellow": return "yellow"; + case "Amber": return "amber"; + case "Orange": return "orange"; + case "Brown": return "brown"; + case "BlueGrey": return "blue-grey"; + case "Grey": return "grey"; + case "DeepOrange": return "deep-orange"; + case "Red": return "red"; + case "Pink": return "pink"; + case "Purple": return "purple"; + default: return "deep-purple";} + }; + var css = F2(function (primary,accent) { + var cssFile = function () { + var _p1 = accent; + switch (_p1.ctor) + {case "Grey": return ""; + case "Brown": return ""; + case "BlueGrey": return ""; + default: return A2($Basics._op["++"],".",A2($Basics._op["++"],toString(primary),A2($Basics._op["++"],"-",toString(accent))));} + }(); + return A2($String.join, + "\n", + A2($List.map, + function (url) { + return A2($Basics._op["++"],"@import url(",A2($Basics._op["++"],url,");")); + }, + _U.list([A2($Basics._op["++"],"https://code.getmdl.io/1.1.1/material",A2($Basics._op["++"],cssFile,".min.css")) + ,"https://fonts.googleapis.com/icon?family=Material+Icons" + ,"https://fonts.googleapis.com/css?family=Roboto:400,300,500|Roboto+Mono|Roboto+Condensed:400,700&subset=latin,latin-ext"]))); + }); + var topWithColors = F3(function (primary,accent,content) { + return A2($Html.div, + _U.list([]), + _U.list([A3($Html.node,"style",_U.list([$Html$Attributes.type$("text/css")]),_U.list([$Html.text(A2(css,primary,accent))])),content])); + }); + var DeepPurple = {ctor: "DeepPurple"}; + var Purple = {ctor: "Purple"}; + var Pink = {ctor: "Pink"}; + var Red = {ctor: "Red"}; + var DeepOrange = {ctor: "DeepOrange"}; + var Grey = {ctor: "Grey"}; + var top = function (content) { return A3(topWithColors,Grey,Grey,content);}; + var BlueGrey = {ctor: "BlueGrey"}; + var Brown = {ctor: "Brown"}; + var Orange = {ctor: "Orange"}; + var Amber = {ctor: "Amber"}; + var Yellow = {ctor: "Yellow"}; + var Lime = {ctor: "Lime"}; + var LightGreen = {ctor: "LightGreen"}; + var Green = {ctor: "Green"}; + var Teal = {ctor: "Teal"}; + var Cyan = {ctor: "Cyan"}; + var LightBlue = {ctor: "LightBlue"}; + var Blue = {ctor: "Blue"}; + var Indigo = {ctor: "Indigo"}; + return _elm.Material.values = {_op: _op + ,topWithColors: topWithColors + ,top: top + ,Indigo: Indigo + ,Blue: Blue + ,LightBlue: LightBlue + ,Cyan: Cyan + ,Teal: Teal + ,Green: Green + ,LightGreen: LightGreen + ,Lime: Lime + ,Yellow: Yellow + ,Amber: Amber + ,Orange: Orange + ,Brown: Brown + ,BlueGrey: BlueGrey + ,Grey: Grey + ,DeepOrange: DeepOrange + ,Red: Red + ,Pink: Pink + ,Purple: Purple + ,DeepPurple: DeepPurple}; +}; +Elm.Main = Elm.Main || {}; +Elm.Main.make = function (_elm) { + "use strict"; + _elm.Main = _elm.Main || {}; + if (_elm.Main.values) return _elm.Main.values; + var _U = Elm.Native.Utils.make(_elm), + $Array = Elm.Array.make(_elm), + $Basics = Elm.Basics.make(_elm), + $Debug = Elm.Debug.make(_elm), + $Demo$Buttons = Elm.Demo.Buttons.make(_elm), + $Demo$Grid = Elm.Demo.Grid.make(_elm), + $Demo$Textfields = Elm.Demo.Textfields.make(_elm), + $Effects = Elm.Effects.make(_elm), + $Html = Elm.Html.make(_elm), + $Html$Attributes = Elm.Html.Attributes.make(_elm), + $List = Elm.List.make(_elm), + $Material = Elm.Material.make(_elm), + $Material$Layout = Elm.Material.Layout.make(_elm), + $Maybe = Elm.Maybe.make(_elm), + $Result = Elm.Result.make(_elm), + $Signal = Elm.Signal.make(_elm), + $StartApp = Elm.StartApp.make(_elm), + $Task = Elm.Task.make(_elm); + var _op = {}; + var header = _U.list([$Material$Layout.title("elm-mdl") + ,$Material$Layout.spacer + ,$Material$Layout.navigation(_U.list([A2($Material$Layout.link, + _U.list([$Html$Attributes.href("https://www.getmdl.io/components/index.html")]), + _U.list([$Html.text("MDL")])) + ,A2($Material$Layout.link, + _U.list([$Html$Attributes.href("https://www.google.com/design/spec/material-design/introduction.html")]), + _U.list([$Html.text("Material Design")]))]))]); + var drawer = _U.list([$Material$Layout.title("Example drawer") + ,$Material$Layout.navigation(_U.list([A2($Material$Layout.link, + _U.list([$Html$Attributes.href("https://groups.google.com/forum/#!forum/elm-discuss")]), + _U.list([$Html.text("Elm Discuss")])) + ,A2($Material$Layout.link, + _U.list([$Html$Attributes.href("http://elm-lang.org")]), + _U.list([$Html.text("Elm")]))]))]); + var TextfieldAction = function (a) { return {ctor: "TextfieldAction",_0: a};}; + var ButtonsAction = function (a) { return {ctor: "ButtonsAction",_0: a};}; + var tabs = _U.list([{ctor: "_Tuple2" + ,_0: "Buttons" + ,_1: F2(function (addr,model) { return _U.list([A2($Demo$Buttons.view,A2($Signal.forwardTo,addr,ButtonsAction),model.buttons)]);})} + ,{ctor: "_Tuple2" + ,_0: "Textfields" + ,_1: F2(function (addr,model) { + return _U.list([A2($Demo$Textfields.view,A2($Signal.forwardTo,addr,TextfieldAction),model.textfields)]); + })} + ,{ctor: "_Tuple2",_0: "Grid",_1: F2(function (addr,model) { return $Demo$Grid.view;})}]); + var tabViews = $Array.fromList(A2($List.map,$Basics.snd,tabs)); + var tabTitles = A2($List.map,function (_p0) { return $Html.text($Basics.fst(_p0));},tabs); + var LayoutAction = function (a) { return {ctor: "LayoutAction",_0: a};}; + var update = F2(function (action,model) { + var _p1 = action; + switch (_p1.ctor) + {case "LayoutAction": var _p2 = A2($Material$Layout.update,_p1._0,model.layout); + var l = _p2._0; + var e = _p2._1; + return {ctor: "_Tuple2",_0: _U.update(model,{layout: l}),_1: A2($Effects.map,LayoutAction,e)}; + case "ButtonsAction": var _p3 = A2($Demo$Buttons.update,_p1._0,model.buttons); + var b = _p3._0; + var e = _p3._1; + return {ctor: "_Tuple2",_0: _U.update(model,{buttons: b}),_1: A2($Effects.map,ButtonsAction,e)}; + default: return {ctor: "_Tuple2",_0: _U.update(model,{textfields: A2($Demo$Textfields.update,_p1._0,model.textfields)}),_1: $Effects.none};} + }); + var view = F2(function (addr,model) { + var top = A2($Html.div, + _U.list([$Html$Attributes.style(_U.list([{ctor: "_Tuple2",_0: "margin",_1: "auto"},{ctor: "_Tuple2",_0: "width",_1: "90%"}]))]), + A2(A2($Maybe.withDefault, + F2(function (addr,model) { return _U.list([A2($Html.div,_U.list([]),_U.list([$Html.text("This can\'t happen.")]))]);}), + A2($Array.get,model.layout.selectedTab,tabViews)), + addr, + model)); + return A3($Material.topWithColors, + $Material.Teal, + $Material.Red, + A3($Material$Layout.view, + A2($Signal.forwardTo,addr,LayoutAction), + model.layout, + {header: $Maybe.Just(header),drawer: $Maybe.Just(drawer),tabs: $Maybe.Just(tabTitles),main: _U.list([top])})); + }); + var inputs = _U.list([$Material$Layout.setupSizeChangeSignal(LayoutAction)]); + var layoutModel = _U.update($Material$Layout.defaultLayoutModel,{state: $Material$Layout.initState($List.length(tabs))}); + var model = {layout: layoutModel,buttons: $Demo$Buttons.model,textfields: $Demo$Textfields.model}; + var init = {ctor: "_Tuple2",_0: model,_1: $Effects.none}; + var app = $StartApp.start({init: init,view: view,update: update,inputs: inputs}); + var main = app.html; + var tasks = Elm.Native.Task.make(_elm).performSignal("tasks",app.tasks); + var Model = F3(function (a,b,c) { return {layout: a,buttons: b,textfields: c};}); + return _elm.Main.values = {_op: _op + ,Model: Model + ,layoutModel: layoutModel + ,model: model + ,LayoutAction: LayoutAction + ,ButtonsAction: ButtonsAction + ,TextfieldAction: TextfieldAction + ,update: update + ,drawer: drawer + ,header: header + ,tabs: tabs + ,tabViews: tabViews + ,tabTitles: tabTitles + ,view: view + ,init: init + ,inputs: inputs + ,app: app + ,main: main}; +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..a4b43f4 --- /dev/null +++ b/index.html @@ -0,0 +1,21 @@ + + + + + + + elm-mdl-demo + + + + + + + + + + + +