on master help sign in
Add a bunch of functions to Dict and Set libs.
commitaab53b27740e64dcf301956bfd610376f1f1ce8f authorevancz <info@elm-lang.org> dateThu 18 Oct 2012, 02:19 (14 years ago) parent4a57153
5 files changed+3077−25
core-elm/Dict.elm+58−17 core-elm/Set.elm+16−3 core-js/cat.bat+1−1 elm/Elm.cabal+6−4 elm/elm-runtime-0.5.0.js+2996
core-elm/Dict.elm+58−17
@@ -1,14 +1,19 @@
11
2−module Dict (empty,singleton,insert,lookup,remove,member,fold) where
2+module Dict (empty,singleton,insert
3+ ,lookup,find,findWithDefault
4+ ,remove,member
5+ ,fold,map
6+ ,union,intersect,diff
7+ ,keys,values
8+ ,toList,fromList
9+ ) where
310
4−import Data.Maybe (isJust)
11+import Maybe (isJust)
512
613data NColor = Red | Black
714
815data RBTree k v = RBNode NColor k v (RBTree k v) (RBTree k v) | RBEmpty
916
10−raise = console.log
11−
1217empty = RBEmpty
1318
1419-- Helpers for checking invariants
@@ -93,14 +98,14 @@ min t =
9398 case t of
9499 { RBNode _ k v RBEmpty _ -> (k,v)
95100 ; RBNode _ _ _ l _ -> min l
96− ; RBEmpty -> console.log "(min RBEmpty) is not defined"
101+ ; RBEmpty -> throw "(min RBEmpty) is not defined"
97102 }
98103
99104max t =
100105 case t of
101106 { RBNode _ k v _ RBEmpty -> (k,v)
102107 ; RBNode _ _ _ _ r -> max r
103− ; RBEmpty -> console.log "(max RBEmpty) is not defined"
108+ ; RBEmpty -> throw "(max RBEmpty) is not defined"
104109 }
105110
106111lookup k t =
@@ -113,20 +118,40 @@ lookup k t =
113118 ; GT -> lookup k r }
114119 }
115120
121+findWithDefault base k t =
122+ case t of
123+ { RBEmpty -> base
124+ ; RBNode _ k' v l r ->
125+ case compare k k' of
126+ { LT -> findWithDefault base k l
127+ ; EQ -> v
128+ ; GT -> findWithDefault base k r }
129+ }
130+
131+find k t =
132+ case t of
133+ { RBEmpty -> throw "Key was not found in dictionary!"
134+ ; RBNode _ k' v l r ->
135+ case compare k k' of
136+ { LT -> find k l
137+ ; EQ -> v
138+ ; GT -> find k r }
139+ }
140+
116141-- Does t contain k?
117142member k t = isJust $ lookup k t
118143
119144rotateLeft t =
120145 case t of
121146 { RBNode cy ky vy a (RBNode cz kz vz b c) -> RBNode cy kz vz (RBNode Red ky vy a b) c
122− ; _ -> raise "rotateLeft of a node without enough children" }
147+ ; _ -> throw "rotateLeft of a node without enough children" }
123148
124149-- rotateRight -- the reverse, and
125150-- makes Y have Z's color, and makes Z Red.
126151rotateRight t =
127152 case t of
128153 { RBNode cz kz vz (RBNode cy ky vy a b) c -> RBNode cz ky vy a (RBNode Red kz vz b c)
129− ; _ -> raise "rotateRight of a node without enough children" }
154+ ; _ -> throw "rotateRight of a node without enough children" }
130155
131156rotateLeftIfNeeded t =
132157 case t of
@@ -146,7 +171,7 @@ color_flip t =
146171 RBNode (otherColor c1) bk bv
147172 (RBNode (otherColor c2) ak av la ra)
148173 (RBNode (otherColor c3) ck cv lc rc)
149− ; _ -> raise "color_flip called on a RBEmpty or RBNode with a RBEmpty child" }
174+ ; _ -> throw "color_flip called on a RBEmpty or RBNode with a RBEmpty child" }
150175
151176color_flipIfNeeded t =
152177 case t of
@@ -173,10 +198,10 @@ insert k v t =
173198 ; GT -> RBNode c k' v' l (ins r) }
174199 in fixUp h }
175200 in if not (invariants_hold t) then
176− raise "invariants broken before insert"
201+ throw "invariants broken before insert"
177202 else (let new_t = ensureBlackRoot (ins t) in
178203 if not (invariants_hold new_t) then
179− raise "invariants broken after insert"
204+ throw "invariants broken after insert"
180205 else new_t)
181206
182207singleton k v = insert k v RBEmpty
@@ -262,17 +287,17 @@ remove k t =
262287 let t' = moveRedLeftIfNeeded t in
263288 case t' of
264289 { RBNode c k' v l r -> fixUp (RBNode c k' v (del l) r)
265− ; RBEmpty -> raise "delLT on RBEmpty" }
290+ ; RBEmpty -> throw "delLT on RBEmpty" }
266291 ; delEQ t =
267292 case t of -- Replace with successor
268293 { RBNode c _ _ l r ->
269294 let (k',v') = min r in
270295 fixUp (RBNode c k' v' l (deleteMin r))
271− ; RBEmpty -> raise "delEQ called on a RBEmpty" }
296+ ; RBEmpty -> throw "delEQ called on a RBEmpty" }
272297 ; delGT t =
273298 case t of
274299 { RBNode c k' v l r -> fixUp (RBNode c k' v l (del r))
275− ; RBEmpty -> raise "delGT called on a RBEmpty" }
300+ ; RBEmpty -> throw "delGT called on a RBEmpty" }
276301 ; del t =
277302 case t of
278303 { RBEmpty -> RBEmpty
@@ -284,13 +309,29 @@ remove k t =
284309 if eq t then delEQ t else delGT t)) }
285310 }
286311 in if not (invariants_hold t) then
287− raise "invariants broken before remove"
312+ throw "invariants broken before remove"
288313 else (let t' = ensureBlackRoot (del t) in
289314 if invariants_hold t' then t' else
290− raise "invariants broken after remove")
315+ throw "invariants broken after remove")
316+
317+map f t =
318+ case t of
319+ { RBEmpty -> RBEmpty
320+ ; RBNode c k v l r -> RBNode c k (f v) (map f l) (map f r)
321+ }
291322
292323fold f acc t =
293324 case t of
294325 { RBEmpty -> acc
295326 ; RBNode _ k v l r -> fold f (f k v (fold f acc l)) r
296− }
327+ }
328+
329+union t1 t2 = fold insert t2 t1
330+intersect t1 t2 = fold (\k v t -> if k `member` t2 then insert k v t else t) empty t1
331+diff t1 t2 = fold (\k _ t -> remove k t) t1 t2
332+
333+keys t = fold (\k _ acc -> k : acc) [] t
334+values t = fold (\_ -> (:)) [] t
335+
336+toList t = fold (\k v acc -> (k,v) : acc) [] t
337+fromList assocs = List.foldl (\(k,v) t -> insert k v t) empty assocs
core-elm/Set.elm+16−3
@@ -1,10 +1,23 @@
11
2−module Set (empty,singleton,insert,remove,member) where
3−
4−import Dict as Dict
2+module Set (empty,singleton,insert,remove
3+ ,member
4+ ,fold,map
5+ ,union,intersect,diff
6+ ,toList,fromList
7+ ) where
58
69empty = Dict.empty
710singleton k = Dict.singleton k ()
811insert k = Dict.insert k ()
912remove = Dict.remove
1013member = Dict.member
14+
15+union = Dict.union
16+intersect = Dict.intersect
17+diff = Dict.diff
18+
19+toList = Dict.keys
20+fromList = List.foldl (\k t -> Dict.insert k () t) empty
21+
22+fold f = Dict.fold (\k v b -> f k b)
23+map f t = fromList . List.map f $ toList t
core-js/cat.bat+1−1
@@ -2,4 +2,4 @@ copy /B Guid.js+foreign\JavaScript.js+foreign\JSON.js+Value.js+List.js+Dict.js+S
22
33cd ..\elm
44
5−copy /B ..\elm-mini.js elm-runtime-0.4.5.js
5+copy /B ..\elm-mini.js elm-runtime-0.5.0.js
elm/Elm.cabal+6−4
@@ -1,6 +1,6 @@
11
22Name: Elm
3−Version: 0.4.5
3+Version: 0.5.0
44Synopsis: The Elm language module.
55Description: Elm aims to make client-side web-development more pleasant.
66 It is a statically/strongly typed, functional reactive
@@ -22,7 +22,7 @@ Category: Compiler, Language
2222Build-type: Simple
2323
2424Extra-source-files: changelog.txt
25−Data-files: elm-runtime-0.4.5.js
25+Data-files: elm-runtime-0.5.0.js
2626Cabal-version: >=1.8
2727
2828source-repository head
@@ -32,6 +32,7 @@ source-repository head
3232Library
3333 exposed-modules: Language.Elm,
3434 Language.Elm.Quasi
35+ GHC-Options: -O2
3536 Hs-Source-Dirs: src, src/Parse, src/Types, src/Gen
3637 other-modules: Ast,
3738 CompileToJS,
@@ -63,7 +64,7 @@ Library
6364 transformers >= 0.2,
6465 mtl >= 2,
6566 parsec >= 3.1.1,
66− blaze-html == 0.5.0.*,
67+ blaze-html == 0.5.*,
6768 blaze-markup == 0.5.1.*,
6869 deepseq,
6970 text,
@@ -75,6 +76,7 @@ Library
7576
7677Executable elm
7778 Main-is: Compiler.hs
79+ GHC-Options: -O2 -prof -auto-all
7880 Hs-Source-Dirs: src, src/Parse, src/Types, src/Gen
7981 other-modules: Ast,
8082 CompileToJS,
@@ -106,7 +108,7 @@ Executable elm
106108 transformers >= 0.2,
107109 mtl >= 2,
108110 parsec >= 3.1.1,
109− blaze-html == 0.5.0.*,
111+ blaze-html == 0.5.*,
110112 blaze-markup == 0.5.1.*,
111113 deepseq,
112114 cmdargs,
elm/elm-runtime-0.5.0.jsnew file+2996
@@ -0,0 +1,2996 @@
1+
2+var Guid = function() {
3+ var counter = 0;
4+ var guid = function() { counter += 1; return counter; };
5+ return {guid : guid};
6+}();
7+var Elm = Elm || {};
8+Elm.JavaScript = function() {
9+ function castJSBoolToBool(b) { return b; }
10+ function castBoolToJSBool(b) { return b; }
11+
12+ function castJSNumberToFloat(n) { return n; }
13+ function castFloatToJSNumber(n) { return n; }
14+
15+ function castJSNumberToInt(n) { return ~~n; }
16+ function castIntToJSNumber(n) { return n; }
17+
18+ function castJSElementToElement(w) {
19+ return function(h) {
20+ return function(node) {
21+ return ["Element",Guid.guid(),
22+ ["EExternalHtml",node],
23+ w,h,1,Nothing,Nothing];
24+ }
25+ }
26+ }
27+ function castElementToJSElement(elem) { return Render.render(elem); }
28+
29+ function castJSArrayToList(arr) {
30+ var list = ["Nil"];
31+ for (var i = arr.length; i--; ) {
32+ list = [ "Cons", arr[i], list ];
33+ }
34+ return list;
35+ }
36+ function castListToJSArray(list) {
37+ var a = [];
38+ while (list[0] === "Cons") {
39+ a.push(list[1]);
40+ list = list[2];
41+ }
42+ return a;
43+ }
44+
45+ var castJSStringToString = castJSArrayToList;
46+ function castStringToJSString(str) {
47+ if (typeof str === "string") return str;
48+ return castListToJSArray(str).join('');
49+ }
50+
51+ function fromTuple(t) { return t.slice(1); }
52+ function toTuple(a) { return ["Tuple" + a.length].concat(a); }
53+
54+ return {castJSBoolToBool:castJSBoolToBool,
55+ castBoolToJSBool:castBoolToJSBool,
56+ castJSNumberToFloat:castJSNumberToFloat,
57+ castFloatToJSNumber:castFloatToJSNumber,
58+ castJSNumberToInt:castJSNumberToInt,
59+ castIntToJSNumber:castIntToJSNumber,
60+ Experimental : {castJSElementToElement:castJSElementToElement,
61+ castElementToJSElement:castElementToJSElement},
62+ castJSArrayToList:castJSArrayToList,
63+ castListToJSArray:castListToJSArray,
64+ castJSStringToString:castJSStringToString,
65+ castStringToJSString:castStringToJSString,
66+ castTupleToJSTuple2:fromTuple,
67+ castTupleToJSTuple3:fromTuple,
68+ castTupleToJSTuple4:fromTuple,
69+ castTupleToJSTuple5:fromTuple,
70+ castJSTupleToTuple2:toTuple,
71+ castJSTupleToTuple3:toTuple,
72+ castJSTupleToTuple4:toTuple,
73+ castJSTupleToTuple5:toTuple
74+ };
75+}();
76+
77+var Elm = Elm || {};
78+Elm.JSON = function() {
79+ var JS = Elm.JavaScript;
80+ var empty = ['JSON',{}];
81+ function singleton(k) { return function(v) {
82+ var obj = {};
83+ obj[JS.castStringToJSString(k)] = v;
84+ return ['JSON', obj ];
85+ };
86+ }
87+ function insert(k) { return function(v) { return function(inObj) {
88+ var obj = inObj[1];
89+ var outObj = {};
90+ for (var i in obj) {
91+ outObj[i] = obj[i];
92+ }
93+ outObj[JS.castStringToJSString(k)] = v;
94+ return ['JSON', outObj ];
95+ };
96+ };
97+ }
98+ function lookup(key) { return function(obj) {
99+ var k = JS.castStringToJSString(key);
100+ return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
101+ };
102+ }
103+ function lookupWithDefault(base) { return function(key) { return function(obj) {
104+ var k = JS.castStringToJSString(key);
105+ return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
106+ };
107+ };
108+ }
109+ function remove(k) { return function(inObj) {
110+ var obj = inObj[1];
111+ var outObj = {};
112+ for (var i in obj) {
113+ outObj[i] = obj[i];
114+ }
115+ delete outObj[JS.castStringToJSString(k)];
116+ return ['JSON', outObj];
117+ };
118+ }
119+
120+ function JsonString(v) { return [ "JsonString", v ]; }
121+ function JsonNumber(v) { return [ "JsonNumber", v ]; }
122+ function JsonBool(v) { return [ "JsonBool", v ]; }
123+ var JsonNull = [ "JsonNull" ];
124+ function JsonArray(v) { return [ "JsonArray", v ]; }
125+ function JsonObject(v) { return [ "JsonObject", v ]; }
126+
127+ function toList(json) {
128+ var obj = json[1];
129+ var arr = [];
130+ for (var i in obj) {
131+ arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
132+ }
133+ return JS.castJSArrayToList(arr);
134+ }
135+ function fromList(list) {
136+ var arr = JS.castListToJSArray(list);
137+ var obj = {};
138+ for (var i = arr.length; i--; ) {
139+ obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
140+ }
141+ return [ "JSON", obj ];
142+ }
143+
144+ function toPrettyJSString(sep) { return function (obj) {
145+ function fromValue(v) {
146+ switch (v[0]) {
147+ case 'JsonNull' : return null;
148+ case 'JsonString' : return JS.castStringToJSString(v[1]);
149+ case 'JsonObject' :
150+ var o = {};
151+ var from = v[1][1];
152+ for (var i in from) {
153+ o[i] = fromValue(from[i]);
154+ }
155+ return o;
156+ case 'JsonArray' :
157+ var a = JS.castListToJSArray(v[1]);
158+ for (var i = a.length; i--; ) {
159+ a[i] = fromValue(a[i]);
160+ }
161+ return a;
162+ default :
163+ return v[1];
164+ }
165+ }
166+ return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
167+ };
168+ }
169+ function fromJSString(str) {
170+ var obj = JSON.parse(str);
171+ function toValue(v) {
172+ switch (typeof v) {
173+ case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
174+ case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
175+ case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
176+ case 'object' :
177+ if (v === null) return [ "JsonNull" ];
178+ for (var i in v) {
179+ v[i] = toValue(v[i]);
180+ }
181+ if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
182+ return [ "JsonObject", [ "JSON", v ] ];
183+ }
184+ }
185+ for (var i in obj) {
186+ obj[i] = toValue(obj[i]);
187+ }
188+ return ['JSON',obj];
189+ }
190+ return {empty : empty,
191+ singleton : singleton,
192+ insert : insert,
193+ lookup : lookup,
194+ findWithDefault : lookupWithDefault,
195+ remove : remove,
196+ toPrettyJSString : toPrettyJSString,
197+ toJSString : toPrettyJSString(''),
198+ fromJSString : fromJSString,
199+ toPrettyString : function(sep) { return function(v) {
200+ return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
201+ toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
202+ fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
203+ toList : toList,
204+ fromList : fromList,
205+ JsonString : JsonString,
206+ JsonNumber : JsonNumber,
207+ JsonBool : JsonBool,
208+ JsonNull : JsonNull,
209+ JsonArray : JsonArray,
210+ JsonObject : JsonObject
211+ };
212+}();
213+var Value = function(){
214+
215+ var eq = function(x,y) {
216+ if (typeof x === "object") {
217+ if (x === y) return true;
218+ if (x.length !== y.length) return false;
219+ for (var i = x.length; i--; ) {
220+ if (!eq(x[i],y[i])) return false;
221+ }
222+ return true;
223+ }
224+ return x === y;
225+ };
226+
227+ var Tuple = function() {
228+ var len = arguments.length;
229+ var arr = new Array(len+1);
230+ arr[0] = "Tuple" + arguments.length;
231+ for (var i = len; i--; ) {
232+ arr[i+1] = arguments[i];
233+ }
234+ return arr;
235+ };
236+
237+ var listToArray = function(list) {
238+ var arr = [];
239+ while (list[0] === "Cons") {
240+ arr.push(list[1]);
241+ list = list[2];
242+ }
243+ return arr;
244+ };
245+
246+ function makeSpaces(s) {
247+ if (s.length == 0) { return s; }
248+ var arr = s.split('');
249+ if (arr[0] == ' ') { arr[0] = "&nbsp;" }
250+ for (var i = arr.length; --i; ) {
251+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {
252+ arr[i-1] = arr[i-1] + arr[i];
253+ arr[i] = '';
254+ }
255+ }
256+ for (var i = arr.length; i--; ) {
257+ if (arr[i].length > 1 && arr[i][0] == ' ') {
258+ var spaces = arr[i].split('');
259+ for (var j = spaces.length - 2; j >= 0; j -= 2) {
260+ spaces[j] = '&nbsp;';
261+ }
262+ arr[i] = spaces.join('');
263+ }
264+ }
265+ return arr.join('');
266+ }
267+
268+ function properEscape(str) {
269+ if (str.length == 0) return str;
270+ str = str //.replace(/&/g, "&#38;")
271+ .replace(/"/g, /*"*/ "&#34;")
272+ .replace(/'/g, /*'*/ "&#39;")
273+ .replace(/</g, "&#60;")
274+ .replace(/>/g, "&#62;")
275+ .replace(/\n/g, "<br/>");
276+ var arr = str.split('<br/>');
277+ for (var i = arr.length; i--; ) {
278+ arr[i] = makeSpaces(arr[i]);
279+ }
280+ return arr.join('<br/>');
281+ }
282+
283+ var toText = function(elmList) {
284+ if (typeof elmList === "string") return properEscape(elmList);
285+ var a = [];
286+ while (elmList[0] === "Cons") {
287+ a.push(elmList[1]);
288+ elmList = elmList[2];
289+ }
290+ return properEscape(a.join(''));
291+ };
292+
293+ function getTextSize(w,h,txt) {
294+ var t = document.createElement('div');
295+ t.innerHTML = txt;
296+ t.style.textAlign = 'left';
297+ if (w > 0) { t.style.width = w + "px"; }
298+
299+ t.style.visibility = "hidden";
300+ t.style.styleFloat = "left";
301+ t.style.cssFloat = "left";
302+
303+ document.body.appendChild(t);
304+ var cStyle = window.getComputedStyle(t);
305+ var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
306+ var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
307+ document.body.removeChild(t);
308+ delete t;
309+ return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
310+ }
311+
312+ function getSize(e) {
313+ var t = e.cloneNode(true);
314+
315+ t.style.visibility = "hidden";
316+ t.style.styleFloat = "left";
317+ t.style.cssFloat = "left";
318+
319+ document.body.appendChild(t);
320+ var w = t.offsetWidth;
321+ var h = t.offsetHeight;
322+ document.body.removeChild(t);
323+ delete t;
324+ return [w,h];
325+ }
326+
327+ function getExcess(e) {
328+ var t = e.cloneNode(true);
329+
330+ t.style.visibility = "hidden";
331+ t.style.styleFloat = "left";
332+ t.style.cssFloat = "left";
333+
334+ document.body.appendChild(t);
335+ var ow = t.offsetWidth;
336+ var oh = t.offsetHeight;
337+ var cStyle = window.getComputedStyle(t);
338+ var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
339+ var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
340+ document.body.removeChild(t);
341+ delete t;
342+ return [ow-w,oh-h];
343+ }
344+
345+
346+ function groupForms(forms) {
347+ forms = Elm.JavaScript.castListToJSArray(forms);
348+ var groups = [];
349+ var arr = [];
350+ for (var i = forms.length; i--; ) {
351+ var f = forms[i];
352+ switch(f[4][0]) {
353+ case "FElement":
354+ if (arr.length > 0) {
355+ groups.push(arr);
356+ arr = [];
357+ }
358+ groups.push(f);
359+ break;
360+ default:
361+ arr.push(f);
362+ }
363+ }
364+ if (arr.length > 0) groups.push(arr);
365+ return groups;
366+ }
367+
368+ var toString = function(v) {
369+ if (typeof v === "boolean") {
370+ return v ? "True" : "False";
371+ } else if (typeof v === "number") {
372+ return v+"";
373+ } else if (typeof v === "string" && v.length < 2) {
374+ return "'"+v+"'";
375+ } else if (v[0]) {
376+ if (v[0].substring(0,5) === "Tuple") {
377+ var output = "";
378+ for (var i = v.length; --i; ) {
379+ output = "," + toString(v[i]) + output;
380+ }
381+ if (output[0] === ",") output = output.substring(1);
382+ return "("+output+")";
383+ } else if (v[0] === "Cons") {
384+ var start = (typeof v[1] === "string") ? '"' : "[";
385+ var end = (typeof v[1] === "string") ? '"' : "]";
386+ var div = (typeof v[1] === "string") ? "" : ",";
387+ var f = (typeof v[1] === "string") ? function(x){return x} : toString;
388+ var output = start + f(v[1]);
389+ v = v[2];
390+ while (true) {
391+ if (v[0] === "Cons") {
392+ output += div + f(v[1]);
393+ v = v[2];
394+ } else {
395+ return output + end;
396+ }
397+ }
398+ } else if (v[0] === "Nil") {
399+ return "[]";
400+ } else if (v[0] === "JSON") {
401+ return "(JSON.fromList " + toString(ElmJSON.toList(v)) + ")";
402+ } else if (v[0] === "RBNode" || v[0] === "RBEmpty") {
403+ function cons(k){ return function(v) { return function(acc) { return ["Cons",["Tuple2",k,v],acc]; }; }; }
404+ return "(Map.fromList " + toString(Elm.Dict.fold(cons)(["Nil"])(v)) + ")";
405+ } else {
406+ var output = "";
407+ for (var i = v.length; --i; ) {
408+ output = " " + toString(v[i]) + output
409+ }
410+ output = v[0] + output;
411+ return (v.length > 1) ? "(" + output + ")" : output;
412+ }
413+ }
414+ return v+"";
415+ };
416+ var show = function(v) { return str(toString(v)); };
417+ var append = function(xs,ys) {
418+ if (typeof xs === "string" && typeof ys === "string") {
419+ return xs.concat(ys);
420+ }
421+ if (xs[0] === "Nil") {
422+ return ys;
423+ }
424+ var root = ["Cons", xs[1], ["Nil"]];
425+ var curr = root;
426+ xs = xs[2];
427+ while (xs[0]==="Cons") {
428+ curr[2] = ["Cons", xs[1], ["Nil"]];
429+ xs = xs[2];
430+ curr = curr[2];
431+ }
432+ curr[2] = ys;
433+ return root;
434+ };
435+
436+ var str = function(s) {
437+ var out = ["Nil"];
438+ for (var i = s.length; i--; ) {
439+ out = ["Cons", s[i], out];
440+ }
441+ return out;
442+ };
443+
444+ function wrap(elem) {
445+ var p = Value.getSize(elem);
446+ return ["Element", Guid.guid(), ["EHtml",elem],
447+ p[0], p[1], 1, Nothing, Nothing];
448+ }
449+ var addListener = function() {
450+ if(document.addEventListener) {
451+ return function(element, event, handler) {
452+ element.addEventListener(event, handler, false);
453+ };
454+ } else {
455+ return function(element, event, handler) {
456+ element.attachEvent('on' + event, handler);
457+ };
458+ }
459+ }();
460+
461+ return {eq:eq,
462+ str:str,
463+ show:show,
464+ Tuple:Tuple,
465+ append:append,
466+ listToArray:listToArray,
467+ toText : toText,
468+ properEscape : properEscape,
469+ getTextSize : getTextSize,
470+ getSize : getSize,
471+ getExcess : getExcess,
472+ groupForms : groupForms,
473+ wrap : wrap,
474+ addListener : addListener
475+ };
476+}();var Elm = Elm || {};
477+Elm.List = function() {
478+
479+ var throwError = function(f) {
480+ throw "Function '" + f + "' expecting a list!";
481+ }
482+
483+ function length(xs) {
484+ var out = 0;
485+ while (xs[0] === "Cons") {
486+ out += 1;
487+ xs = xs[2];
488+ }
489+ return out;
490+ };
491+ var reverse = foldl(function(x_72) {
492+ return function(y_73) {
493+ return["Cons", x_72, y_73]
494+ }
495+ })(["Nil"]);
496+ var concat = foldr(function(x_74) {
497+ return function(y_75) {
498+ return Value.append(x_74, y_75)
499+ }
500+ })(["Nil"]);
501+ var and = foldl(function(x_77) {
502+ return function(y_78) {
503+ return x_77 && y_78
504+ }
505+ })(true);
506+ var or = foldl(function(x_79) {
507+ return function(y_80) {
508+ return x_79 || y_80
509+ }
510+ })(false);
511+ var sum = foldl(function(x_89) {
512+ return function(y_90) {
513+ return x_89 + y_90
514+ }
515+ })(0);
516+ var product = foldl(function(x_91) {
517+ return function(y_92) {
518+ return x_91 * y_92
519+ }
520+ })(1);
521+ var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
522+ var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
523+ function head(v) {
524+ if (v[0] !== "Cons") {
525+ throw "Error: 'head' only accepts lists of length greater than one.";
526+ }
527+ return v[1];
528+ }
529+ function tail(v) {
530+ if (v[0] !== "Cons") {
531+ throw "Error: 'tail' only accepts lists of length greater than one.";
532+ }
533+ return v[2];
534+ }
535+ function last(v) {
536+ if (v[0] !== "Cons") {
537+ throw "Error: 'last' only accepts lists of length greater than one.";
538+ }
539+ var out = v[1];
540+ while (v[0] === "Cons") {
541+ out = v[1];
542+ v = v[2];
543+ }
544+ return out;
545+ }
546+ function map(f) {
547+ return function(xs) {
548+ if (xs[0] === "Nil") { return xs; }
549+ if (xs[0] !== "Cons") { throwError('map'); }
550+ var root = ["Cons", f(xs[1]), ["Nil"]];
551+ var curr = root;
552+ xs = xs[2];
553+ while (xs[0]==="Cons") {
554+ curr[2] = ["Cons", f(xs[1]), ["Nil"]];
555+ xs = xs[2];
556+ curr = curr[2];
557+ }
558+ return root;
559+ }
560+ }
561+ function foldl(f) {
562+ return function(b) {
563+ return function(xs) {
564+ var acc = b;
565+ if (xs[0] === "Nil") { return acc; }
566+ if (xs[0] !== "Cons") { throwError('foldl'); }
567+ while (xs[0] === "Cons") {
568+ acc = f(xs[1])(acc);
569+ xs = xs[2];
570+ }
571+ return acc;
572+ }
573+ }
574+ }
575+ function foldr(f) {
576+ return function(b) {
577+ return function(xs) {
578+ var acc = b;
579+ if (xs[0] === "Nil") { return acc; }
580+ if (xs[0] !== "Cons") { throwError('foldr'); }
581+ var arr = [];
582+ while (xs[0] === "Cons") {
583+ arr.push(xs[1]);
584+ xs = xs[2];
585+ }
586+ for (var i = arr.length; i--; ) {
587+ acc = f(arr[i])(acc);
588+ }
589+ return acc;
590+ }
591+ }
592+ }
593+ function foldl1(f_49) {
594+ return function(_temp_50) {
595+ return function(v) {
596+ if("Cons" !== v[0]) {
597+ return undefined
598+ }else {
599+ var x_51 = v[1];
600+ var xs_52 = v[2];
601+ return foldl(f_49)(x_51)(xs_52)
602+ }
603+ }(_temp_50)
604+ }
605+ }
606+ function foldr1(f) {
607+ return function(xs) {
608+ if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
609+ if (xs[0] !== "Cons") { throwError('foldr1'); }
610+ var arr = [];
611+ while (xs[0] === "Cons") {
612+ arr.push(xs[1]);
613+ xs = xs[2];
614+ }
615+ var acc = arr.pop();
616+ for (var i = arr.length; i--; ) {
617+ acc = f(arr[i])(acc);
618+ }
619+ return acc;
620+ }
621+ }
622+ function scanl(f) {
623+ return function(b) {
624+ return function(xs) {
625+ if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
626+ if (xs[0] !== "Cons") { throwError('scanl'); }
627+ var arr = [b];
628+ while (xs[0] === "Cons") {
629+ b = f(xs[1])(b);
630+ arr.push(b);
631+ xs = xs[2];
632+ }
633+ var out = ["Nil"];
634+ for (var i = arr.length; i--; ) {
635+ out = ["Cons", arr[i], out];
636+ }
637+ return out;
638+ }
639+ }
640+ }
641+ function scanl1(f) {
642+ return function(xs) {
643+ if (xs[0] !== "Cons") {
644+ throw "Error: 'scanl1' requires a list of at least length 1.";
645+ }
646+ return scanl(f)(xs[1])(xs[2]);
647+ }
648+ }
649+ function filter(pred) {
650+ return function(xs) {
651+ if (xs[0] === "Nil") { return xs; }
652+ if (xs[0] !== "Cons") { throwError('filter'); }
653+ var arr = [];
654+ while (xs[0] === "Cons") {
655+ if (pred(xs[1])) { arr.push(xs[1]); }
656+ xs = xs[2];
657+ }
658+ var out = ["Nil"];
659+ for (var i = arr.length; i--; ) {
660+ out = ["Cons", arr[i], out];
661+ }
662+ return out;
663+ }
664+ }
665+ function concatMap(f_76) {
666+ return function(x) {
667+ return concat(map(f_76)(x))
668+ }
669+ }
670+ function all(pred) {
671+ return foldl(function(x) { return function(acc) {
672+ return acc && pred(x);
673+ };})(true);
674+ }
675+ function any(pred) {
676+ return foldl(function(x) { return function(acc) {
677+ return acc || pred(x);
678+ };})(false);
679+ }
680+ function partition(pred_93) {
681+ return function(lst_94) {
682+ return function() {
683+ var v = lst_94;
684+ var c = [function(v) {
685+ if("Nil" !== v[0]) {
686+ return undefined
687+ }else {
688+ return["Tuple2", ["Nil"], ["Nil"]]
689+ }
690+ }, function(v) {
691+ if("Cons" !== v[0]) {
692+ return undefined
693+ }else {
694+ var x_95 = v[1];
695+ var xs_96 = v[2];
696+ return function(v) {
697+ if("Tuple2" !== v[0]) {
698+ return undefined
699+ }else {
700+ var as_97 = v[1];
701+ var bs_98 = v[2];
702+ return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
703+ }
704+ }(partition(pred_93)(xs_96))
705+ }
706+ }];
707+ for(var i = c.length;i--;) {
708+ var r = c[i](v);
709+ if(r !== undefined) {
710+ return r
711+ }
712+ }
713+ }()
714+ }
715+ }
716+ function zipWith(f) {
717+ return function(listA) {
718+ return function(listB) {
719+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
720+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
721+ var arr = [];
722+ while (listA[0] === "Cons" && listB[0] === "Cons") {
723+ arr.push(f(listA[1])(listB[1]));
724+ listA = listA[2];
725+ listB = listB[2];
726+ }
727+ var out = ["Nil"];
728+ for (var i = arr.length; i--; ) {
729+ out = ["Cons", arr[i], out];
730+ }
731+ return out;
732+ }
733+ }
734+ }
735+ function zip(listA) {
736+ return function(listB) {
737+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
738+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
739+ var arr = [];
740+ while (listA[0] === "Cons" && listB[0] === "Cons") {
741+ arr.push(["Tuple2", listA[1], listB[1]]);
742+ listA = listA[2];
743+ listB = listB[2];
744+ }
745+ var out = ["Nil"];
746+ for (var i = arr.length; i--; ) {
747+ out = ["Cons", arr[i], out];
748+ }
749+ return out;
750+ }
751+ }
752+ function unzip(pairs_112) {
753+ return function() {
754+ var v = pairs_112;
755+ var c = [function(v) {
756+ if("Nil" !== v[0]) {
757+ return undefined
758+ }else {
759+ return["Tuple2", ["Nil"], ["Nil"]]
760+ }
761+ }, function(v) {
762+ if("Cons" !== v[0]) {
763+ return undefined
764+ }else {
765+ var p_113 = v[1];
766+ var ps_114 = v[2];
767+ return function(v) {
768+ if("Tuple2" !== v[0]) {
769+ return undefined
770+ }else {
771+ if("Tuple2" !== v[1][0]) {
772+ return undefined
773+ }else {
774+ var x_115 = v[1][1];
775+ var y_116 = v[1][2];
776+ if("Tuple2" !== v[2][0]) {
777+ return undefined
778+ }else {
779+ var xs_117 = v[2][1];
780+ var ys_118 = v[2][2];
781+ return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
782+ }
783+ }
784+ }
785+ }(["Tuple2", p_113, unzip(ps_114)])
786+ }
787+ }];
788+ for(var i = c.length;i--;) {
789+ var r = c[i](v);
790+ if(r !== undefined) {
791+ return r
792+ }
793+ }
794+ }()
795+ }
796+ function intersperse(sep_119) {
797+ return function(xs_120) {
798+ return function() {
799+ var v = xs_120;
800+ var c = [function(v) {
801+ if("Nil" !== v[0]) {
802+ return undefined
803+ }else {
804+ return["Nil"]
805+ }
806+ }, function(v) {
807+ if("Cons" !== v[0]) {
808+ return undefined
809+ }else {
810+ var a_124 = v[1];
811+ if("Nil" !== v[2][0]) {
812+ return undefined
813+ }else {
814+ return["Cons", a_124, ["Nil"]]
815+ }
816+ }
817+ }, function(v) {
818+ if("Cons" !== v[0]) {
819+ return undefined
820+ }else {
821+ var a_121 = v[1];
822+ if("Cons" !== v[2][0]) {
823+ return undefined
824+ }else {
825+ var b_122 = v[2][1];
826+ var cs_123 = v[2][2];
827+ return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
828+ }
829+ }
830+ }];
831+ for(var i = c.length;i--;) {
832+ var r = c[i](v);
833+ if(r !== undefined) {
834+ return r
835+ }
836+ }
837+ }()
838+ }
839+ }
840+ function intercalate(sep_125) {
841+ return function(xs_126) {
842+ return function() {
843+ var v = xs_126;
844+ var c = [function(v) {
845+ if("Nil" !== v[0]) {
846+ return undefined
847+ }else {
848+ return["Nil"]
849+ }
850+ }, function(v) {
851+ if("Cons" !== v[0]) {
852+ return undefined
853+ }else {
854+ var a_130 = v[1];
855+ if("Nil" !== v[2][0]) {
856+ return undefined
857+ }else {
858+ return a_130
859+ }
860+ }
861+ }, function(v) {
862+ if("Cons" !== v[0]) {
863+ return undefined
864+ }else {
865+ var a_127 = v[1];
866+ if("Cons" !== v[2][0]) {
867+ return undefined
868+ }else {
869+ var b_128 = v[2][1];
870+ var cs_129 = v[2][2];
871+ return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
872+ }
873+ }
874+ }];
875+ for(var i = c.length;i--;) {
876+ var r = c[i](v);
877+ if(r !== undefined) {
878+ return r
879+ }
880+ }
881+ }()
882+ }
883+ }
884+ function sort(xs) {
885+ if (xs[0] === "Nil") { return xs; }
886+ if (xs[0] !== "Cons") { throwError('sort'); }
887+ var arr = [];
888+ while (xs[0] === "Cons") {
889+ arr.push(xs[1]);
890+ xs = xs[2];
891+ }
892+ arr.sort(function(a,b) { return a - b});
893+ var out = ["Nil"];
894+ for (var i = arr.length; i--; ) {
895+ out = [ "Cons", arr[i], out ];
896+ }
897+ return out;
898+ }
899+ function take(n) { return function(xs) {
900+ if (n <= 0) { return ["Nil"]; }
901+ if (xs[0] === "Nil") { return xs; }
902+ if (xs[0] !== "Cons") { throwError('take'); }
903+ var out = [ "Cons", xs[1], ["Nil"] ];
904+ var temp = out;
905+ xs = xs[2];
906+ --n;
907+ while (xs[0] === "Cons" && n > 0) {
908+ temp[2] = [ "Cons", xs[1], ["Nil"] ];
909+ temp = temp[2];
910+ xs = xs[2];
911+ --n;
912+ }
913+ return out;
914+ };
915+ }
916+ function drop(n) { return function(xs) {
917+ if (xs[0] === "Nil") { return xs; }
918+ if (xs[0] !== "Cons") { throwError('drop'); }
919+ while (xs[0] === "Cons" && n > 0) {
920+ xs = xs[2];
921+ --n;
922+ }
923+ return xs;
924+ };
925+ }
926+ return {head:head,
927+ tail:tail,
928+ last:last,
929+ map:map,
930+ foldl:foldl,
931+ foldr:foldr,
932+ foldl1:foldl1,
933+ foldr1:foldr1,
934+ scanl:scanl,
935+ scanl1:scanl1,
936+ filter:filter,
937+ length:length,
938+ reverse:reverse,
939+ concat:concat,
940+ concatMap:concatMap,
941+ and:and,
942+ or:or,
943+ all:all,
944+ any:any,
945+ sum:sum,
946+ product:product,
947+ maximum:maximum,
948+ minimum:minimum,
949+ partition:partition,
950+ zipWith:zipWith,
951+ zip:zip,
952+ unzip:unzip,
953+ intersperse:intersperse,
954+ intercalate:intercalate,
955+ sort:sort,
956+ take:take,
957+ drop:drop};
958+}();try{if(Elm.Dict)throw "Module name collision, 'Dict' is already defined.";Elm.Dict=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Data.Maybe instanceof Object))throw 'module not found'}catch(e){throw "Module 'Data.Maybe' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var isJust=Elm.Data.Maybe.isJust,Red_0=["Red"],Black_1=["Black"]
959+function RBNode_2(a1){return function(a2){return function(a3){return function(a4){return function(a5){return ["RBNode",a1,a2,a3,a4,a5]}}}}};var RBEmpty_3=["RBEmpty"],raise_4=console.log,empty_5=RBEmpty_3
960+function equal_pathLen_6(t_46){return function(){function path_numBlacks_47(t_48){return function(){switch(t_48[0]){case"RBEmpty":return 1;case"RBNode":return function(){var bl_52=path_numBlacks_47(t_48[4]),br_53=path_numBlacks_47(t_48[5]);return((not(eq(bl_52,br_53))||(eq(bl_52,-1)||eq(br_53,-1)))?-1:(bl_52+(eq(t_48[1],Red_0)?0:1)))}()};throw "Non-exhaustive pattern match in case"}()};return not(eq(-1,path_numBlacks_47(t_46)))}()}
961+function rootBlack_7(t_54){return function(){switch(t_54[0]){case"RBEmpty":return true;case"RBNode":switch(t_54[1][0]){case"Black":return true};break};return false}()}
962+function redBlack_children_8(t_55){return function(){switch(t_55[0]){case"RBEmpty":return true;case"RBNode":switch(t_55[1][0]){case"Red":switch(t_55[4][0]){case"RBNode":switch(t_55[4][1][0]){case"Red":return false};break};switch(t_55[5][0]){case"RBNode":switch(t_55[5][1][0]){case"Red":return false};break};break};return(redBlack_children_8(t_55[4])&&redBlack_children_8(t_55[5]))};throw "Non-exhaustive pattern match in case"}()}
963+function findExtreme_9(f_58){return function(t_59){return function(){switch(t_59[0]){case"RBEmpty":return Nothing;case"RBNode":return function(){var case6=findExtreme_9(f_58)(f_58(["Tuple2",t_59[4],t_59[5]]));switch(case6[0]){case"Just":return Just(case6[1]);case"Nothing":return Just(t_59[2])};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
964+function findminRbt_10(t_65){return findExtreme_9(fst)(t_65)}
965+function findmaxRbt_11(t_66){return findExtreme_9(snd)(t_66)}
966+function optionRelation_12(f_67){return function(u_68){return function(xo_69){return function(yo_70){return function(){var case0=["Tuple2",xo_69,yo_70];switch(case0[0]){case"Tuple2":switch(case0[1][0]){case"Nothing":return u_68};switch(case0[2][0]){case"Nothing":return u_68};switch(case0[1][0]){case"Just":switch(case0[2][0]){case"Just":return f_67(case0[1][1])(case0[2][1])};break};break};throw "Non-exhaustive pattern match in case"}()}}}}
967+function olt_13(xo_73){return function(yo_74){return optionRelation_12(function(x_75){return function(y_76){return(compare(x_75)(y_76)[0]==='LT')}})(true)(xo_73)(yo_74)}}
968+function olte_14(xo_77){return function(yo_78){return optionRelation_12(function(x_79){return function(y_80){return function(){var ord=compare(x_79)(y_80)[0];return ord==='LT'||ord==='EQ'}()}})(true)(xo_77)(yo_78)}}
969+function ordered_15(t_81){return function(){switch(t_81[0]){case"RBEmpty":return true;case"RBNode":return function(){var Tuple2$lmaxrmin_87=["Tuple2",findmaxRbt_11(t_81[4]),findminRbt_10(t_81[5])],lmax_88=function(){switch(Tuple2$lmaxrmin_87[0]){case"Tuple2":return Tuple2$lmaxrmin_87[1]};throw "Non-exhaustive pattern match in case"}(),rmin_89=function(){switch(Tuple2$lmaxrmin_87[0]){case"Tuple2":return Tuple2$lmaxrmin_87[2]};throw "Non-exhaustive pattern match in case"}();return(olte_14(lmax_88)(Just(t_81[2]))&&(olte_14(Just(t_81[2]))(rmin_89)&&(ordered_15(t_81[4])&&ordered_15(t_81[5]))))}()};throw "Non-exhaustive pattern match in case"}()}
970+function leftLeaning_16(t_94){return function(){switch(t_94[0]){case"RBEmpty":return true;case"RBNode":switch(t_94[4][0]){case"RBEmpty":switch(t_94[5][0]){case"RBNode":switch(t_94[5][1][0]){case"Red":return false};break};break;case"RBNode":switch(t_94[4][1][0]){case"Black":switch(t_94[5][0]){case"RBNode":switch(t_94[5][1][0]){case"Red":return false};break};break};break};return(leftLeaning_16(t_94[4])&&leftLeaning_16(t_94[5]))};throw "Non-exhaustive pattern match in case"}()}
971+function invariants_hold_17(t_97){return(ordered_15(t_97)&&(rootBlack_7(t_97)&&(redBlack_children_8(t_97)&&(equal_pathLen_6(t_97)&&leftLeaning_16(t_97)))))}
972+function min_18(t_98){return function(){switch(t_98[0]){case"RBEmpty":return console.log(Value.str("(min RBEmpty) is not defined"));case"RBNode":switch(t_98[4][0]){case"RBEmpty":return ["Tuple2",t_98[2],t_98[3]]};return min_18(t_98[4])};throw "Non-exhaustive pattern match in case"}()}
973+function max_19(t_102){return function(){switch(t_102[0]){case"RBEmpty":return console.log(Value.str("(max RBEmpty) is not defined"));case"RBNode":switch(t_102[5][0]){case"RBEmpty":return ["Tuple2",t_102[2],t_102[3]]};return max_19(t_102[5])};throw "Non-exhaustive pattern match in case"}()}
974+function lookup_20(k_106){return function(t_107){return function(){switch(t_107[0]){case"RBEmpty":return Nothing;case"RBNode":return function(){var case6=compare(k_106)(t_107[2]);switch(case6[0]){case"EQ":return Just(t_107[3]);case"GT":return lookup_20(k_106)(t_107[5]);case"LT":return lookup_20(k_106)(t_107[4])};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
975+function member_21(k_112){return function(t_113){return isJust(lookup_20(k_112)(t_113))}}
976+function rotateLeft_22(t_114){return function(){switch(t_114[0]){case"RBNode":switch(t_114[5][0]){case"RBNode":return RBNode_2(t_114[1])(t_114[5][2])(t_114[5][3])(RBNode_2(Red_0)(t_114[2])(t_114[3])(t_114[4])(t_114[5][4]))(t_114[5][5])};break};return raise_4(Value.str("rotateLeft of a node without enough children"))}()}
977+function rotateRight_23(t_124){return function(){switch(t_124[0]){case"RBNode":switch(t_124[4][0]){case"RBNode":return RBNode_2(t_124[1])(t_124[4][2])(t_124[4][3])(t_124[4][4])(RBNode_2(Red_0)(t_124[2])(t_124[3])(t_124[4][5])(t_124[5]))};break};return raise_4(Value.str("rotateRight of a node without enough children"))}()}
978+function rotateLeftIfNeeded_24(t_134){return function(){switch(t_134[0]){case"RBNode":switch(t_134[5][0]){case"RBNode":switch(t_134[5][1][0]){case"Red":return rotateLeft_22(t_134)};break};break};return t_134}()}
979+function rotateRightIfNeeded_25(t_135){return function(){switch(t_135[0]){case"RBNode":switch(t_135[4][0]){case"RBNode":switch(t_135[4][1][0]){case"Red":switch(t_135[4][4][0]){case"RBNode":switch(t_135[4][4][1][0]){case"Red":return rotateRight_23(t_135)};break};break};break};break};return t_135}()}
980+function otherColor_26(c_136){return function(){switch(c_136[0]){case"Black":return Red_0;case"Red":return Black_1};throw "Non-exhaustive pattern match in case"}()}
981+function color_flip_27(t_137){return function(){switch(t_137[0]){case"RBNode":switch(t_137[4][0]){case"RBNode":switch(t_137[5][0]){case"RBNode":return RBNode_2(otherColor_26(t_137[1]))(t_137[2])(t_137[3])(RBNode_2(otherColor_26(t_137[4][1]))(t_137[4][2])(t_137[4][3])(t_137[4][4])(t_137[4][5]))(RBNode_2(otherColor_26(t_137[5][1]))(t_137[5][2])(t_137[5][3])(t_137[5][4])(t_137[5][5]))};break};break};return raise_4(Value.str("color_flip called on a RBEmpty or RBNode with a RBEmpty child"))}()}
982+function color_flipIfNeeded_28(t_151){return function(){switch(t_151[0]){case"RBNode":switch(t_151[4][0]){case"RBNode":switch(t_151[4][1][0]){case"Red":switch(t_151[5][0]){case"RBNode":switch(t_151[5][1][0]){case"Red":return color_flip_27(t_151)};break};break};break};break};return t_151}()}
983+function fixUp_29(t_152){return color_flipIfNeeded_28(rotateRightIfNeeded_25(rotateLeftIfNeeded_24(t_152)))}
984+function ensureBlackRoot_30(t_153){return function(){switch(t_153[0]){case"RBNode":switch(t_153[1][0]){case"Red":return RBNode_2(Black_1)(t_153[2])(t_153[3])(t_153[4])(t_153[5])};break};return t_153}()}
985+function insert_31(k_158){return function(v_159){return function(t_160){return function(){function ins_161(t_162){return function(){switch(t_162[0]){case"RBEmpty":return RBNode_2(Red_0)(k_158)(v_159)(RBEmpty_3)(RBEmpty_3);case"RBNode":return function(){var h_168=function(){var case6=compare(k_158)(t_162[2]);switch(case6[0]){case"EQ":return RBNode_2(t_162[1])(t_162[2])(v_159)(t_162[4])(t_162[5]);case"GT":return RBNode_2(t_162[1])(t_162[2])(t_162[3])(t_162[4])(ins_161(t_162[5]));case"LT":return RBNode_2(t_162[1])(t_162[2])(t_162[3])(ins_161(t_162[4]))(t_162[5])};throw "Non-exhaustive pattern match in case"}();return fixUp_29(h_168)}()};throw "Non-exhaustive pattern match in case"}()};return(not(invariants_hold_17(t_160))?raise_4(Value.str("invariants broken before insert")):function(){var new_t_169=ensureBlackRoot_30(ins_161(t_160));return(not(invariants_hold_17(new_t_169))?raise_4(Value.str("invariants broken after insert")):new_t_169)}())}()}}}
986+function singleton_32(k_170){return function(v_171){return insert_31(k_170)(v_171)(RBEmpty_3)}}
987+function isRed_33(t_172){return function(){switch(t_172[0]){case"RBNode":switch(t_172[1][0]){case"Red":return true};break};return false}()}
988+function isRedLeft_34(t_173){return function(){switch(t_173[0]){case"RBNode":switch(t_173[4][0]){case"RBNode":switch(t_173[4][1][0]){case"Red":return true};break};break};return false}()}
989+function isRedLeftLeft_35(t_174){return function(){switch(t_174[0]){case"RBNode":switch(t_174[4][0]){case"RBNode":switch(t_174[4][4][0]){case"RBNode":switch(t_174[4][4][1][0]){case"Red":return true};break};break};break};return false}()}
990+function isRedRight_36(t_175){return function(){switch(t_175[0]){case"RBNode":switch(t_175[5][0]){case"RBNode":switch(t_175[5][1][0]){case"Red":return true};break};break};return false}()}
991+function isRedRightLeft_37(t_176){return function(){switch(t_176[0]){case"RBNode":switch(t_176[5][0]){case"RBNode":switch(t_176[5][4][0]){case"RBNode":switch(t_176[5][4][1][0]){case"Red":return true};break};break};break};return false}()}
992+function moveRedLeft_38(t_177){return function(){var t__178=color_flip_27(t_177);return function(){switch(t__178[0]){case"RBNode":return function(){switch(t__178[5][0]){case"RBNode":switch(t__178[5][4][0]){case"RBNode":switch(t__178[5][4][1][0]){case"Red":return color_flip_27(rotateLeft_22(RBNode_2(t__178[1])(t__178[2])(t__178[3])(t__178[4])(rotateRight_23(t__178[5]))))};break};break};return t__178}()};return t__178}()}()}
993+function moveRedRight_39(t_184){return function(){var t__185=color_flip_27(t_184);return(isRedLeftLeft_35(t__185)?color_flip_27(rotateRight_23(t__185)):t__185)}()}
994+function moveRedLeftIfNeeded_40(t_186){return((not(isRedLeft_34(t_186))&&not(isRedLeftLeft_35(t_186)))?moveRedLeft_38(t_186):t_186)}
995+function moveRedRightIfNeeded_41(t_187){return((not(isRedRight_36(t_187))&&not(isRedRightLeft_37(t_187)))?moveRedRight_39(t_187):t_187)}
996+function deleteMin_42(t_188){return function(){function del_189(t_190){return function(){switch(t_190[0]){case"RBNode":switch(t_190[4][0]){case"RBEmpty":return RBEmpty_3};break};return function(){var t__191=moveRedLeftIfNeeded_40(t_190);return function(){switch(t__191[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return fixUp_29(RBNode_2(t__191[1])(t__191[2])(t__191[3])(del_189(t__191[4]))(t__191[5]))};throw "Non-exhaustive pattern match in case"}()}()}()};return ensureBlackRoot_30(del_189(t_188))}()}
997+function deleteMax_43(t_197){return function(){function del_198(t_199){return function(){var t__200=(isRedLeft_34(t_199)?rotateRight_23(t_199):t_199);return function(){switch(t__200[0]){case"RBNode":switch(t__200[5][0]){case"RBEmpty":return RBEmpty_3};break};return function(){var t___201=moveRedRightIfNeeded_41(t__200);return function(){switch(t___201[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return fixUp_29(RBNode_2(t___201[1])(t___201[2])(t___201[3])(t___201[4])(del_198(t___201[5])))};throw "Non-exhaustive pattern match in case"}()}()}()}()};return ensureBlackRoot_30(del_198(t_197))}()}
998+function remove_44(k_207){return function(t_208){return function(){function eq_and_noRightNode_209(t_215){return function(){switch(t_215[0]){case"RBNode":switch(t_215[5][0]){case"RBEmpty":return eq(k_207,t_215[2])};break};return false}()}
999+function eq_210(t_217){return function(){switch(t_217[0]){case"RBNode":return eq(k_207,t_217[2])};return false}()}
1000+function delLT_211(t_219){return function(){var t__220=moveRedLeftIfNeeded_40(t_219);return function(){switch(t__220[0]){case"RBEmpty":return raise_4(Value.str("delLT on RBEmpty"));case"RBNode":return fixUp_29(RBNode_2(t__220[1])(t__220[2])(t__220[3])(del_214(t__220[4]))(t__220[5]))};throw "Non-exhaustive pattern match in case"}()}()}
1001+function delEQ_212(t_226){return function(){switch(t_226[0]){case"RBEmpty":return raise_4(Value.str("delEQ called on a RBEmpty"));case"RBNode":return function(){var Tuple2$k_v__230=min_18(t_226[5]),k__231=function(){switch(Tuple2$k_v__230[0]){case"Tuple2":return Tuple2$k_v__230[1]};throw "Non-exhaustive pattern match in case"}(),v__232=function(){switch(Tuple2$k_v__230[0]){case"Tuple2":return Tuple2$k_v__230[2]};throw "Non-exhaustive pattern match in case"}();return fixUp_29(RBNode_2(t_226[1])(k__231)(v__232)(t_226[4])(deleteMin_42(t_226[5])))}()};throw "Non-exhaustive pattern match in case"}()}
1002+function delGT_213(t_237){return function(){switch(t_237[0]){case"RBEmpty":return raise_4(Value.str("delGT called on a RBEmpty"));case"RBNode":return fixUp_29(RBNode_2(t_237[1])(t_237[2])(t_237[3])(t_237[4])(del_214(t_237[5])))};throw "Non-exhaustive pattern match in case"}()}
1003+function del_214(t_243){return function(){switch(t_243[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return((compare(k_207)(t_243[2])[0]==='LT')?delLT_211(t_243):function(){var t__245=(isRedLeft_34(t_243)?rotateRight_23(t_243):t_243);return(eq_and_noRightNode_209(t__245)?RBEmpty_3:function(){var t_246=moveRedRightIfNeeded_41(t_246);return(eq_210(t_246)?delEQ_212(t_246):delGT_213(t_246))}())}())};throw "Non-exhaustive pattern match in case"}()};return(not(invariants_hold_17(t_208))?raise_4(Value.str("invariants broken before remove")):function(){var t__247=ensureBlackRoot_30(del_214(t_208));return(invariants_hold_17(t__247)?t__247:raise_4(Value.str("invariants broken after remove")))}())}()}}
1004+function fold_45(f_248){return function(acc_249){return function(t_250){return function(){switch(t_250[0]){case"RBEmpty":return acc_249;case"RBNode":return fold_45(f_248)(f_248(t_250[2])(t_250[3])(fold_45(f_248)(acc_249)(t_250[4])))(t_250[5])};throw "Non-exhaustive pattern match in case"}()}}};return {empty:empty_5,lookup:lookup_20,member:member_21,insert:insert_31,singleton:singleton_32,remove:remove_44,fold:fold_45}}();Elm.main=function(){return Elm.Dict.main}}catch(e){Elm.main=function(){var msg=('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>'+'<br/><span style="color:grey">Runtime Error in Dict module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>EQ, GT, LT, console.log, fst, snd</span>');document.body.innerHTML=Text.monospace(msg);throw e}}try{if(Elm.Set)throw "Module name collision, 'Set' is already defined.";Elm.Set=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Dict instanceof Object))throw 'module not found'}catch(e){throw "Module 'Dict' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var Dict=Elm.Dict,empty_0=Dict.empty,remove_3=Dict.remove,member_4=Dict.member
1005+function singleton_1(k_5){return Dict.singleton(k_5)(["Tuple0"])}
1006+function insert_2(k_6){return Dict.insert(k_6)(["Tuple0"])};return {empty:empty_0,singleton:singleton_1,insert:insert_2,remove:remove_3,member:member_4}}();Elm.main=function(){return Elm.Set.main}}catch(e){Elm.main=function(){var msg=('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>'+'<br/><span style="color:grey">Runtime Error in Set module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>Dict.empty, Dict.insert, Dict.member, Dict.remove, Dict.singleton</span>');document.body.innerHTML=Text.monospace(msg);throw e}}
1007+var Elm = Elm || {};
1008+Elm.Char = function() {
1009+ function isBetween(lo,hi) { return function(chr) {
1010+ var c = chr.charCodeAt(0);
1011+ return lo <= c && c <= hi;
1012+ };
1013+ }
1014+ var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
1015+ var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
1016+ var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
1017+
1018+ return {fromCode : function(c) { return String.fromCharCode(c); },
1019+ toCode : function(c) { return c.charCodeAt(0); },
1020+ toUpper : function(c) { return c.toUpperCase(); },
1021+ toLower : function(c) { return c.toLowerCase(); },
1022+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
1023+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
1024+ isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
1025+ isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
1026+ isDigit : isDigit,
1027+ isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
1028+ isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
1029+ };
1030+}();
1031+
1032+var Elm = Elm || {};
1033+Elm.Maybe = function() {
1034+ function consMaybe(x) { return function(xs) {
1035+ if (x[0] === "Just") return ["Cons", x[1], xs];
1036+ return xs;
1037+ };
1038+ }
1039+ function fromMaybe(b) { return function(m) {
1040+ if (m[0] === "Just") return m[1];
1041+ return b;
1042+ };
1043+ }
1044+ function mapCons(f) { return function(y) { return function(xs) {
1045+ var x = f(y);
1046+ if (x[0] === "Just") return ["Cons", x[1], xs];
1047+ return xs;
1048+ };
1049+ };
1050+ }
1051+ function maybe(b) { return function(f) { return function(m) {
1052+ if (m[0] === "Just") return f(m[1]);
1053+ return b;
1054+ };
1055+ };
1056+ }
1057+
1058+ return {Just : function(x) { return ["Just",x]; },
1059+ Nothing : ["Nothing"],
1060+ catMaybes : Elm.List.foldr(consMaybe)(["Nil"]),
1061+ isJust : function(m) { return m[0] === "Just"; },
1062+ isNothing : function(m) { return m[0] === "Nothing"; },
1063+ fromMaybe : fromMaybe,
1064+ consMaybe : consMaybe,
1065+ mapMaybe : function(f) { return Elm.List.foldr(mapCons(f))(["Nil"]); },
1066+ maybe : maybe
1067+ };
1068+}();
1069+
1070+/*
1071+var String = function() {
1072+
1073+ function append(s1) { return function(s2) {
1074+ return s1.concat(s2);
1075+ };
1076+ }
1077+ function map(f) { return function(s) {
1078+ for (var i = s.length; i--; ) { s[i] = f(s[i]); }
1079+ };
1080+ }
1081+
1082+ function intercalate(sep) { return function(ss) {
1083+ return Value.listToArray(ss).join(sep);
1084+ };
1085+ }
1086+ function intersperse(sep) { return function(s) {
1087+ return s.split("").join(sep);
1088+ };
1089+ }
1090+
1091+ function foldl(f) { return function(b) { return function(s) {
1092+ var acc = b;
1093+ for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
1094+ return acc;
1095+ };
1096+ };
1097+ }
1098+ function foldr(f) { return function(b) { return function(s) {
1099+ var acc = b;
1100+ for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
1101+ return acc;
1102+ };
1103+ };
1104+ }
1105+
1106+ function concatMap(f) { return function(s) {
1107+ var a = s.split("");
1108+ for (var i = a.length; i--; ) { a[i] = f(a[i]); }
1109+ return a.join("");
1110+ };
1111+ }
1112+
1113+ function forall(pred) { return function(s) {
1114+ for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
1115+ return true;
1116+ };
1117+ }
1118+ function exists(pred) { return function(s) {
1119+ for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
1120+ return false;
1121+ };
1122+ }
1123+
1124+ return {cons : append,
1125+ snoc : append,
1126+ head : function(s) { return s[0]; },
1127+ last : function(s) { return s[s.length-1]; },
1128+ tail : function(s) { return s.slice(1); },
1129+ length : function(s) { return s.length; },
1130+ map : map,
1131+ intercalate : intercalate,
1132+ intersperse : intersperse,
1133+ reverse : function(s) { return s.split("").reverse().join(""); },
1134+ toLower : function(s) { return s.toLowerCase(); },
1135+ toUpper : function(s) { return s.toUpperCase(); },
1136+ foldl : foldl,
1137+ foldr : foldr,
1138+ concat : function(ss) { return Value.listToArray(ss).join(""); },
1139+ concatMap : concatMap,
1140+ forall : forall,
1141+ exists : exists,
1142+ //filter : filter,
1143+ //take:,
1144+ //drop:,
1145+ toText : Value.toText,
1146+ properEscape : Value.properEscape
1147+ };
1148+}();
1149+*/
1150+
1151+var String = {toText:Value.toText, properEscape:Value.properEscape};
1152+var Elm = Elm || {};
1153+Elm.Graphics = Elm.Graphics || {};
1154+Elm.Graphics.Color = function() {
1155+ function Color_0(a1) {
1156+ return function(a2) {
1157+ return function(a3) {
1158+ return function(a4) {
1159+ return["Color", a1, a2, a3, a4]
1160+ }
1161+ }
1162+ }
1163+ }
1164+ var rgba_1 = Color_0;
1165+ var red_3 = ["Color",255,0,0,1];
1166+ var green_4 = ["Color",0,255,0,1];
1167+ var blue_5 = ["Color",0,0,255,1];
1168+ var yellow_6 = ["Color",255,255,0,1];
1169+ var cyan_7 = ["Color",0,255,255,1];
1170+ var magenta_8 = ["Color",255,0,255,1];
1171+ var black_9 = ["Color",0,0,0,1];
1172+ var white_10 = ["Color",255,255,255,1];
1173+ var gray_11 = ["Color",128,128,128,1];
1174+ var grey_12 = ["Color",128,128,128,1];
1175+ function rgb_2(r_13) {
1176+ return function(g_14) {
1177+ return function(b_15) {
1178+ return ["Color",r_13,g_14,b_15,1]
1179+ }
1180+ }
1181+ }
1182+ function extract(c) {
1183+ if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1184+ return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1185+ }
1186+ return{rgba:rgba_1, rgb:rgb_2, red:red_3, green:green_4, blue:blue_5, yellow:yellow_6, cyan:cyan_7, magenta:magenta_8, black:black_9, white:white_10, gray:gray_11, grey:grey_12,extract:extract}
1187+}();
1188+var Collage = function() {
1189+
1190+var JS = Elm.JavaScript;
1191+
1192+function tracePoints(ctx,points) {
1193+ var i = points.length - 1;
1194+ if (i <= 0) return;
1195+ ctx.moveTo(points[i][1], points[i][2]);
1196+ while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1197+}
1198+
1199+function solid(ctx,color,points) {
1200+ tracePoints(ctx,points);
1201+ ctx.strokeStyle = Elm.Graphics.Color.extract(color);
1202+ ctx.stroke();
1203+};
1204+
1205+function filled(ctx,color,points) {
1206+ tracePoints(ctx,points);
1207+ ctx.fillStyle = Elm.Graphics.Color.extract(color);
1208+ ctx.fill();
1209+}
1210+
1211+function textured(redo,ctx,src,points) {
1212+ var img = new Image();
1213+ img.src = JS.castStringToJSString(src);
1214+ img.onload = redo;
1215+
1216+ tracePoints(ctx,points);
1217+ ctx.fillStyle = ctx.createPattern(img,'repeat');
1218+ ctx.fill();
1219+}
1220+
1221+function customLine(pattern,ctx,color,points) {
1222+ if (pattern.length === 0) { pattern = [8,4]; }
1223+ customLineHelp(ctx, pattern, points);
1224+ ctx.strokeStyle = Elm.Graphics.Color.extract(color);
1225+ ctx.stroke();
1226+};
1227+
1228+var customLineHelp = function(ctx, pattern, points) {
1229+ var i = points.length - 1;
1230+ if (i <= 0) return;
1231+ var x0 = points[i][1], y0 = points[i][2];
1232+ var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1233+ var pindex = 0, plen = pattern.length;
1234+ var draw = true, segmentLength = pattern[0];
1235+ ctx.moveTo(x0,y0);
1236+ while (i--) {
1237+ x1 = points[i][1]; y1 = points[i][2];
1238+ dx = x1 - x0; dy = y1 - y0;
1239+ remaining = Math.sqrt(dx * dx + dy * dy);
1240+ while (segmentLength <= remaining) {
1241+ x0 += dx * segmentLength / remaining;
1242+ y0 += dy * segmentLength / remaining;
1243+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1244+ // update starting position
1245+ dx = x1 - x0; dy = y1 - y0;
1246+ remaining = Math.sqrt(dx * dx + dy * dy);
1247+ // update pattern
1248+ draw = !draw;
1249+ pindex = (pindex + 1) % plen;
1250+ segmentLength = pattern[pindex];
1251+ }
1252+ if (remaining > 0) {
1253+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1254+ segmentLength -= remaining;
1255+ }
1256+ x0 = x1; y0 = y1;
1257+ }
1258+};
1259+
1260+function drawLine(ctx,form) {
1261+ var points = form[3][1];
1262+ switch(form[1][0]) {
1263+ case "Solid" : return solid(ctx,form[2],points);
1264+ case "Dotted": return customLine([3,3],ctx,form[2],points);
1265+ case "Dashed": return customLine([8,4],ctx,form[2],points);
1266+ case "Custom": return customLine(form[1][1],ctx,form[2],points);
1267+ }
1268+};
1269+
1270+function drawShape(redo,ctx,shapeStyle,color,points) {
1271+ switch(shapeStyle[0]) {
1272+ case "Filled": return filled(ctx,color,points);
1273+ case "Outlined": return solid(ctx,color,points);
1274+ case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1275+ case "CustomOutline":
1276+ return customLine(shapeStyle[1],ctx,color,points);
1277+ }
1278+};
1279+
1280+function drawImage(redo,ctx,w,h,src) {
1281+ var img = new Image();
1282+ img.onload = redo;
1283+ img.src = JS.castStringToJSString(src);
1284+ ctx.drawImage(img,-w/2,-h/2,w,h);
1285+}
1286+
1287+function renderForm(redo,ctx,theta,scale,x,y,form) {
1288+ ctx.save();
1289+ if (x !== 0 || y !== 0) ctx.translate(x,y);
1290+ if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1291+ if (scale !== 1) ctx.scale(scale,scale);
1292+ ctx.beginPath();
1293+ switch(form[0]) {
1294+ case "FLine": drawLine(ctx,form); break;
1295+ case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1296+ case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1297+ }
1298+ ctx.restore();
1299+};
1300+
1301+function renderForms(redo,ctx,w,h,forms) {
1302+ ctx.clearRect(0,0,w,h);
1303+ for (var i = forms.length; i--; ) {
1304+ var f = forms[i];
1305+ renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1306+ }
1307+}
1308+
1309+function collageForms(w,h,forms) {
1310+ var canvas = Render.newElement('canvas');
1311+ canvas.style.width = (~~w) + 'px';
1312+ canvas.style.height = (~~h) + 'px';
1313+ canvas.style.display = "block";
1314+ canvas.width = ~~w;
1315+ canvas.height = ~~h;
1316+ if (canvas.getContext) {
1317+ var ctx = canvas.getContext('2d');
1318+ var w = canvas.width, h = canvas.height;
1319+ function redo() { renderForms(this,ctx,w,h,forms); }
1320+ renderForms(redo,ctx,w,h,forms);
1321+ return canvas;
1322+ }
1323+ canvas.innerHTML = "Your browser does not support the canvas element.";
1324+ return canvas;
1325+};
1326+
1327+function collageElement(w,h,theta,scale,x,y,elem) {
1328+ var e = Render.render(elem);
1329+ var t = "translate(" + (x - elem[3] / 2) + "px,"+ (y - elem[4] / 2) + "px)";
1330+ var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1331+ var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1332+ var transforms = t + " " + s + " " + r;
1333+ e.style.transform = transforms;
1334+ e.style.msTransform = transforms;
1335+ e.style.MozTransform = transforms;
1336+ e.style.webkitTransform = transforms;
1337+ e.style.OTransform = transforms;
1338+ var div = Render.newElement('div');
1339+ Render.addTo(div,e);
1340+ div.style.width = (~~w) + "px";
1341+ div.style.height = (~~h) + "px";
1342+ div.style.overflow = "hidden";
1343+ return div;
1344+}
1345+
1346+function collage(w,h,formss) {
1347+ if (formss.length === 0) { return collageForms(w,h,[]); }
1348+ var elems = new Array(formss.length);
1349+ for (var i = formss.length; i--; ) {
1350+ var f = formss[i];
1351+ if (typeof f[0] === "string") {
1352+ elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1353+ } else {
1354+ elems[i] = collageForms(w,h,f);
1355+ }
1356+ }
1357+ if (formss.length === 1) { return elems[0]; }
1358+ return Render.flowWith(Render.goIn,function(x){return x},elems);
1359+}
1360+
1361+function updateFormSet(node,currSet,nextSet) {
1362+ if (Value.eq(nextSet,currSet)) return;
1363+ var w = node.style.width.slice(0,-2) - 0;
1364+ var h = node.style.height.slice(0,-2) - 0;
1365+ if (typeof nextSet[0] === "object") {
1366+ if (typeof currSet[0] === "object") {
1367+ if (node.getContext) {
1368+ var ctx = node.getContext('2d');
1369+ function redo() { renderForms(this,ctx,w,h,nextSet); }
1370+ return renderForms(redo,ctx,w,h,nextSet);
1371+ }
1372+ }
1373+ var newNode = collageForms(w,h,nextSet);
1374+ newNode.style.position = 'absolute';
1375+ return node.parentNode.replaceChild(newNode,node);
1376+ }
1377+ var f = nextSet;
1378+ var newNode = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1379+ newNode.style.position = 'absolute';
1380+ return node.parentNode.replaceChild(newNode,node);
1381+}
1382+
1383+// assumes that the form sets are the same length.
1384+function updateCollage(node,currs,nexts) {
1385+ if (nexts.length === 1) {
1386+ return updateFormSet(node,currs[0],nexts[0]);
1387+ }
1388+ var kids = node.childNodes;
1389+ var len = kids.length;
1390+ for (var i = len; i--; ) {
1391+ updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1392+ }
1393+}
1394+
1395+function style(clr,n,list) {
1396+ return ["Tuple2",
1397+ '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1398+ list];
1399+}
1400+
1401+function insideForm(point) { return function(form) {
1402+ if (!inBoundsOf(point[1],point[2],form)) return false;
1403+ var hw, hh;
1404+ switch (form[4][0]) {
1405+ case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1406+ case "FLine": return false;
1407+ case "FImage":
1408+ hw = form[4][1] / 2;
1409+ hh = form[4][2] / 2;
1410+ break;
1411+ case "FElement":
1412+ hw = form[4][1][3] / 2;
1413+ hh = form[4][1][4] / 2;
1414+ break;
1415+ }
1416+ return insideShape(point,form[1],form[2],form[3],
1417+ [ [null, hw, hh],
1418+ [null,-hw, hh],
1419+ [null,-hw,-hh],
1420+ [null, hw,-hh],
1421+ [null, hw, hh] ]);
1422+ };
1423+}
1424+
1425+function inBoundsOf(px,py,form) {
1426+ if (form.length < 6) {
1427+ var fx = form[3][1], fy = form[3][2];
1428+ var radiusSquared = 0;
1429+ var scale = form[2];
1430+ switch (form[4][0]) {
1431+ case "FShape":
1432+ var points = form[4][3][1];
1433+ for (var i = points.length; --i; ) {
1434+ var p = points[i];
1435+ radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1436+ }
1437+ radiusSquared *= scale * scale;
1438+ break;
1439+ case "FLine":
1440+ break;
1441+ case "FImage":
1442+ var x = scale * form[4][1] / 2;
1443+ var y = scale * form[4][2] / 2;
1444+ radiusSquared = x*x + y*y;
1445+ break;
1446+ case "FElement":
1447+ var x = scale * form[4][1][3] / 2;
1448+ var y = scale * form[4][1][4] / 2;
1449+ radiusSquared = x*x + y*y;
1450+ break;
1451+ }
1452+ form.push(function(px,py) {
1453+ var dx = px - fx;
1454+ var dy = py - fy;
1455+ return dx*dx + dy*dy < radiusSquared + 1;
1456+ });
1457+ }
1458+ return form[5](px,py);
1459+}
1460+
1461+function insideShape(point,theta,scale,pos,points) {
1462+ var counter = 0;
1463+ var list = ["Nil"];
1464+ var p1,p2;
1465+
1466+ var x = (point[1] - pos[1]) / scale;
1467+ var y = (point[2] - pos[2]) / scale;
1468+ if (theta !== 0) {
1469+ var t = -2 * Math.PI * theta;
1470+ var nx = x * Math.cos(t) - y * Math.sin(t);
1471+ y = x * Math.sin(t) + y * Math.cos(t);
1472+ x = nx;
1473+ }
1474+
1475+ if (points.length === 0) { return false; }
1476+ p1 = points[0];
1477+ for (var i = points.length - 1; i--; ) {
1478+ p2 = points[i];
1479+ var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1480+
1481+ if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1482+ if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1483+
1484+ if (ymin < y && y <= ymax && x <= xmax) {
1485+ if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1486+ ++counter;
1487+ }
1488+ }
1489+ p1 = p2;
1490+ }
1491+ return (counter % 2) === 1;
1492+}
1493+
1494+return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1495+
1496+}();var Elm = Elm || {};
1497+Elm.Graphics = Elm.Graphics || {};
1498+Elm.Graphics.Element = function() {
1499+ var JS = Elm.JavaScript;
1500+ var DLeft_0 = ["DLeft"];
1501+ var DRight_1 = ["DRight"];
1502+ var DUp_2 = ["DUp"];
1503+ var DDown_3 = ["DDown"];
1504+ var DIn_4 = ["DIn"];
1505+ var DOut_5 = ["DOut"];
1506+ function Absolute_12(a1) {
1507+ return["Absolute", a1]
1508+ }
1509+ function Relative_13(a1) {
1510+ return["Relative", a1]
1511+ }
1512+ var Near_14 = ["Near"];
1513+ var Mid_15 = ["Mid"];
1514+ var Far_16 = ["Far"];
1515+ function Position_17(a1) {
1516+ return function(a2) {
1517+ return["Position", a1, a2]
1518+ }
1519+ }
1520+ function PositionTL_18(a1) {
1521+ return function(a2) {
1522+ return["PositionTL", a1, a2]
1523+ }
1524+ }
1525+ function PositionTR_19(a1) {
1526+ return function(a2) {
1527+ return["PositionTR", a1, a2]
1528+ }
1529+ }
1530+ function PositionBL_20(a1) {
1531+ return function(a2) {
1532+ return["PositionBL", a1, a2]
1533+ }
1534+ }
1535+ function PositionBR_21(a1) {
1536+ return function(a2) {
1537+ return["PositionBR", a1, a2]
1538+ }
1539+ }
1540+ function Element_37(id,e,w,h,o,c,l) {
1541+ return["Element", id, e, w, h, o, c, l ]
1542+ }
1543+ function EText_39(a1) {
1544+ return function(a2) {
1545+ return["EText", a1, a2]
1546+ }
1547+ }
1548+ function EImage_40(a1) {
1549+ return["EImage", JS.castStringToJSString(a1)]
1550+ }
1551+ function EVideo_41(a1) {
1552+ return["EVideo", JS.castStringToJSString(a1)]
1553+ }
1554+ function EFittedImage_42(a1) {
1555+ return["EFittedImage", JS.castStringToJSString(a1)]
1556+ }
1557+ function EFlow_43(a1) {
1558+ return function(a2) {
1559+ return["EFlow", a1, JS.castListToJSArray(a2)]
1560+ }
1561+ }
1562+ function ECollage_44(a1) {
1563+ return function(a2) {
1564+ return function(a3) {
1565+ return["ECollage", a1, a2, Value.groupForms(a3)]
1566+ }
1567+ }
1568+ }
1569+ var EEmpty_45 = ["EEmpty"];
1570+ function EContainer_46(a1) {
1571+ return function(a2) {
1572+ return["EContainer", a1, a2]
1573+ }
1574+ }
1575+ var Solid_68 = ["Solid"];
1576+ var Dotted_69 = ["Dotted"];
1577+ var Dashed_70 = ["Dashed"];
1578+ function Custom_71(a1) {
1579+ return["Custom", JS.castListToJSArray(a1)]
1580+ }
1581+ var Filled_72 = ["Filled"];
1582+ var Outlined_73 = ["Outlined"];
1583+ function CustomOutline_74(a1) {
1584+ return["CustomOutline", JS.castListToJSArray(a1)]
1585+ }
1586+ function Line_75(a1) {
1587+ return["Line", JS.castListToJSArray(a1)]
1588+ }
1589+ function Shape_78(a1) {
1590+ return function(a2) {
1591+ var points = JS.castListToJSArray(a1);
1592+ if (points.length > 0) { points.push(points[0]); }
1593+ return["Shape", points, a2];
1594+ }
1595+ }
1596+ function Form_84(a1) {
1597+ return function(a2) {
1598+ return function(a3) {
1599+ return function(a4) {
1600+ return["Form", a1, a2, a3, a4]
1601+ }
1602+ }
1603+ }
1604+ }
1605+ function FLine_85(a1) {
1606+ return function(a2) {
1607+ return function(a3) {
1608+ return["FLine", a1, a2, a3]
1609+ }
1610+ }
1611+ }
1612+ function FShape_86(a1) {
1613+ return function(a2) {
1614+ return function(a3) {
1615+ return["FShape", a1, a2, a3]
1616+ }
1617+ }
1618+ }
1619+ function FImage_87(a1) {
1620+ return function(a2) {
1621+ return function(a3) {
1622+ return["FImage", a1, a2, JS.castStringToJSString(a3)]
1623+ }
1624+ }
1625+ }
1626+ function FElement_88(a1) {
1627+ return["FElement", a1]
1628+ }
1629+ var left_6 = DLeft_0;
1630+ var right_7 = DRight_1;
1631+ var down_8 = DDown_3;
1632+ var up_9 = DUp_2;
1633+ var inward_10 = DIn_4;
1634+ var outward_11 = DOut_5;
1635+ var topLeft_22 = Position_17(Near_14)(Near_14);
1636+ var topRight_23 = Position_17(Far_16)(Near_14);
1637+ var bottomLeft_24 = Position_17(Near_14)(Far_16);
1638+ var bottomRight_25 = Position_17(Far_16)(Far_16);
1639+ var midLeft_26 = Position_17(Near_14)(Mid_15);
1640+ var midRight_27 = Position_17(Far_16)(Mid_15);
1641+ var midTop_28 = Position_17(Mid_15)(Near_14);
1642+ var midBottom_29 = Position_17(Mid_15)(Far_16);
1643+ var middle_30 = Position_17(Mid_15)(Mid_15);
1644+ function middleAt(a1) {
1645+ return function(a2) {
1646+ return["PositionAt", a1, a2]
1647+ }
1648+ }
1649+ var topLeftAt_31 = PositionTL_18;
1650+ var topRightAt_32 = PositionTR_19;
1651+ var bottomLeftAt_33 = PositionBL_20;
1652+ var bottomRightAt_34 = PositionBR_21;
1653+ var absolute_35 = Absolute_12;
1654+ var relative_36 = Relative_13;
1655+ function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1656+ function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,Nothing,Nothing); }
1657+ var line_76 = Line_75;
1658+ var polygon_79 = Shape_78;
1659+ function sprite_96(src) {
1660+ return function(w) {
1661+ return function(h) {
1662+ return function(pos) {
1663+ return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1664+ }
1665+ }
1666+ }
1667+ }
1668+ function toForm_97(pos) {
1669+ return function(e) {
1670+ return Form_84(0)(1)(pos)(FElement_88(e))
1671+ }
1672+ }
1673+ function width_47(w__101) {
1674+ return function(e) {
1675+ var be = e[2];
1676+ switch(be[0]) {
1677+ case "EImage":
1678+ case "EVideo":
1679+ return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1680+ case "EText":
1681+ var p = Value.getTextSize(w__101,e[4],be[2]);
1682+ return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1683+ }
1684+ return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1685+ }
1686+ }
1687+ function height_48(h__108) {
1688+ return function(e) {
1689+ var be = e[2];
1690+ switch(be[0]) {
1691+ case "EImage":
1692+ case "EVideo":
1693+ return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1694+ }
1695+ return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1696+ }
1697+ }
1698+ function size_49(w) {
1699+ return function(h) {
1700+ return function(e) {
1701+ return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1702+ }
1703+ }
1704+ }
1705+ function opacity_50(o) {
1706+ return function(e) {
1707+ return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1708+ }
1709+ }
1710+ function color_51(c) {
1711+ return function(e) {
1712+ return newElement_38(e[2], e[3], e[4], e[5], Just(c), e[7]);
1713+ }
1714+ }
1715+ function link(lnk) {
1716+ return function(e) {
1717+ return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(JS.castStringToJSString(lnk)));
1718+ }
1719+ }
1720+ function widthOf_52(e) { return ~~e[3]; }
1721+ function heightOf_53(e) { return ~~e[4]; }
1722+ function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1723+ function text_56(txt) {
1724+ var p = Value.getTextSize(0,0,txt);
1725+ return basicNewElement(EText_39("left")(txt), p[0], p[1])
1726+ }
1727+ function plainText(str) {
1728+ var txt = Value.toText(str);
1729+ var p = Value.getTextSize(0,0,txt);
1730+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1731+ }
1732+ function asText(v) {
1733+ var txt = monospace(Value.toText(Value.show(v)));
1734+ var p = Value.getTextSize(0,0,txt);
1735+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1736+ }
1737+ function centeredText(txt) {
1738+ var p = Value.getTextSize(0,0,txt);
1739+ return basicNewElement(EText_39("center")(txt),p[0],p[1])
1740+ }
1741+ function justifiedText(txt) {
1742+ var p = Value.getTextSize(0,0,txt);
1743+ return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1744+ }
1745+ function rightedText(txt) {
1746+ var p = Value.getTextSize(0,0,txt);
1747+ return basicNewElement(EText_39("right")(txt),p[0],p[1])
1748+ }
1749+ function image_57(w) {
1750+ return function(h) {
1751+ return function(src) {
1752+ return basicNewElement(EImage_40(src),w,h)
1753+ }
1754+ }
1755+ }
1756+ function images(srcs) {
1757+ var pics = Elm.Signal.constant(spacer_66(0)(0));
1758+ var update = Elm.Signal.lift(function(src) {
1759+ src = JS.castStringToJSString(src);
1760+ var img = new Image();
1761+ img.onload = function() {
1762+ Dispatcher.notify(pics.id,
1763+ image_57(this.width)(this.height)(src));
1764+ };
1765+ img.src = src;
1766+ })(srcs);
1767+ function f(x) { return function(y) { return x; } }
1768+ var combine = Elm.Signal.lift2(f)(pics)(update);
1769+ return combine;
1770+ }
1771+ function video_58(w) {
1772+ return function(h) {
1773+ return function(src) {
1774+ return basicNewElement(EVideo_41(src),w,h)
1775+ }
1776+ }
1777+ }
1778+ function fittedImage_59(w_147) {
1779+ return function(h_148) {
1780+ return function(s_149) {
1781+ return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1782+ }
1783+ }
1784+ }
1785+ function flow_60(dir_150) {
1786+ return function(es_151) {
1787+ return function() {
1788+ var w_152 = function() {
1789+ var ws_154 = map(widthOf_52)(es_151);
1790+ return function(case1) {
1791+ var case0 = case1;
1792+ switch(case0[0]) {
1793+ case "DLeft":
1794+ return sum(ws_154);
1795+ case "DRight":
1796+ return sum(ws_154)
1797+ }
1798+ return maximum(ws_154)
1799+ }(dir_150)
1800+ }();
1801+ var h_153 = function() {
1802+ var hs_155 = map(heightOf_53)(es_151);
1803+ return function(case3) {
1804+ var case2 = case3;
1805+ switch(case2[0]) {
1806+ case "DDown":
1807+ return sum(hs_155);
1808+ case "DUp":
1809+ return sum(hs_155)
1810+ }
1811+ return maximum(hs_155)
1812+ }(dir_150)
1813+ }();
1814+ return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1815+ }()
1816+ }
1817+ }
1818+ function above_61(e1_156) {
1819+ return function(e2_157) {
1820+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), max(widthOf_52(e1_156))(widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157))
1821+ }
1822+ }
1823+ function below_62(e1_158) {
1824+ return function(e2_159) {
1825+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), max(widthOf_52(e1_158))(widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159))
1826+ }
1827+ }
1828+ function beside_63(e1_160) {
1829+ return function(e2_161) {
1830+ return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), max(heightOf_53(e1_160))(heightOf_53(e2_161)))
1831+ }
1832+ }
1833+ function layers_64(es_162) {
1834+ return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1835+ }
1836+ function collage_65(w_163) {
1837+ return function(h_164) {
1838+ return function(forms_165) {
1839+ return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1840+ }
1841+ }
1842+ }
1843+ function spacer_66(w_166) {
1844+ return function(h_167) {
1845+ return basicNewElement(EEmpty_45,w_166,h_167)
1846+ }
1847+ }
1848+ function container_67(w_169) {
1849+ return function(h_170) {
1850+ return function(pos_168) {
1851+ return function(e_171) {
1852+ return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1853+ }
1854+ }
1855+ }
1856+ }
1857+ function segment_77(p1_172) {
1858+ return function(p2_173) {
1859+ return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1860+ }
1861+ }
1862+ function rect_80(w_174) {
1863+ return function(h_175) {
1864+ return function(pos_176) {
1865+ return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1866+ ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1867+ ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1868+ ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1869+ }
1870+ }
1871+ }
1872+ function oval_81(w_177) {
1873+ return function(h_178) {
1874+ return function(pos_179) {
1875+ return function() {
1876+ var n_180 = 50;
1877+ return function() {
1878+ function f_181(i_182) {
1879+ return["Tuple2", w_177 / 2 * cos(2 * (pi / n_180) * i_182), h_178 / 2 * sin(2 * (pi / n_180) * i_182)]
1880+ }
1881+ return Shape_78(map(f_181)(function() {
1882+ var lo = 0;
1883+ var hi = n_180 - 1;
1884+ var lst = ["Nil"];
1885+ if(lo <= hi) {
1886+ do {
1887+ var lst = ["Cons", hi, lst]
1888+ }while(hi-- > lo)
1889+ }
1890+ return lst
1891+ }()))(pos_179)
1892+ }()
1893+ }()
1894+ }
1895+ }
1896+ }
1897+ function circle_82(r_183) {
1898+ return oval_81(2 * r_183)(2 * r_183)
1899+ }
1900+ function ngon_83(n_184) {
1901+ return function(r_185) {
1902+ return function(pos_186) {
1903+ return function() {
1904+ var m_187 = toFloat(n_184);
1905+ return function() {
1906+ function f_188(i_189) {
1907+ return["Tuple2", r_185 * cos(2 * (pi / m_187) * i_189), r_185 * sin(2 * (pi / m_187) * i_189)]
1908+ }
1909+ return Shape_78(map(f_188)(function() {
1910+ var lo = 0;
1911+ var hi = n_184 - 1;
1912+ var lst = ["Nil"];
1913+ if(lo <= hi) {
1914+ do {
1915+ var lst = ["Cons", hi, lst]
1916+ }while(hi-- > lo)
1917+ }
1918+ return lst
1919+ }()))(pos_186)
1920+ }()
1921+ }()
1922+ }
1923+ }
1924+ }
1925+ function solid_89(clr_190) {
1926+ return function(ln_191) {
1927+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1928+ }
1929+ }
1930+ function dotted_90(clr_192) {
1931+ return function(ln_193) {
1932+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1933+ }
1934+ }
1935+ function dashed_91(clr_194) {
1936+ return function(ln_195) {
1937+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1938+ }
1939+ }
1940+ function customLine_92(pattern_196) {
1941+ return function(clr_197) {
1942+ return function(ln_198) {
1943+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1944+ }
1945+ }
1946+ }
1947+ function filled_93(clr) {
1948+ return function(shape) {
1949+ return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1950+ }
1951+ }
1952+ function outlined_94(clr) {
1953+ return function(shape) {
1954+ return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1955+ }
1956+ }
1957+ function customOutline_95(pattern) {
1958+ return function(clr) {
1959+ return function(shape) {
1960+ return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1961+ }
1962+ }
1963+ }
1964+ function textured(src) {
1965+ return function(shape) {
1966+ return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1967+ }
1968+ }
1969+ function rotate_98(t_212) {
1970+ return function(Form$thetascaleposform_213) {
1971+ return function(case5) {
1972+ var case0 = case5;
1973+ switch(case0[0]) {
1974+ case "Form":
1975+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1976+ return Form_84(t_212 + case1)(case2)(case3)(case4)
1977+ }
1978+ throw"Non-exhaustive pattern match in case";
1979+ }(Form$thetascaleposform_213)
1980+ }
1981+ }
1982+ function scale_99(s) {
1983+ return function(form) {
1984+ return Form_84(form[1])(s * form[2])(form[3])(form[4])
1985+ }
1986+ }
1987+ function move_100(x_224) {
1988+ return function(y_225) {
1989+ return function(Form$thetascaleTuple2$pxpyform_226) {
1990+ return function(case7) {
1991+ var case0 = case7;
1992+ switch(case0[0]) {
1993+ case "Form":
1994+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1995+ switch(case3[0]) {
1996+ case "Tuple2":
1997+ var case5 = case3[1], case6 = case3[2];
1998+ return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1999+ }
2000+ break
2001+ }
2002+ throw"Non-exhaustive pattern match in case";
2003+ }(Form$thetascaleTuple2$pxpyform_226)
2004+ }
2005+ }
2006+ }
2007+ return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
2008+ color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, images:images, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
2009+ outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
2010+ isWithin: Collage.insideForm}
2011+}();
2012+var Text = function() {
2013+ function fromString(s) { return Value.toText(s); }
2014+
2015+ var addTag = function(tag) { return function(text) {
2016+ return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
2017+ };
2018+ };
2019+ var addStyle = function(style, value) { return function(text) {
2020+ return "<span style='" + style + ":" + value + "'>" + text + "</span>";
2021+ };
2022+ };
2023+
2024+ var typeface = function(name) {
2025+ name = Elm.JavaScript.castStringToJSString(name);
2026+ return addStyle('font-family', name);
2027+ };
2028+ var size = function(px) {
2029+ return addStyle('font-size', px + 'px');
2030+ };
2031+ var header = addTag('h1');
2032+ var height = function(h) { return addStyle('font-size', h+'em'); }
2033+ var italic = addStyle('font-style', 'italic');
2034+ var bold = addTag('b');
2035+ var color = function(c) {
2036+ return addStyle('color', Elm.Graphics.Color.extract(c));
2037+ };
2038+ var underline = addStyle('text-decoration', 'underline');
2039+ var overline = addStyle('text-decoration', 'overline');
2040+ var strikeThrough = addStyle('text-decoration', 'line-through');
2041+ var link = function(href) { return function(text) {
2042+ return "<a href='" + fromString(href) + "'>" + text + "</a>";
2043+ };
2044+ };
2045+
2046+ return {fromString : fromString,
2047+ toText: fromString,
2048+ header : header,
2049+ height : height,
2050+ italic : italic,
2051+ bold : bold,
2052+ underline : underline,
2053+ overline : overline,
2054+ strikeThrough : strikeThrough,
2055+ monospace : typeface('monospace'),
2056+ typeface : typeface,
2057+ color : color,
2058+ link : link };
2059+}();
2060+
2061+var Elm = Elm || {};
2062+Elm.Graphics.Text = Text;
2063+
2064+var Render = function(){
2065+
2066+function newElement(elementType) {
2067+ var e = document.createElement(elementType);
2068+ e.style.padding = "0";
2069+ e.style.margin = "0";
2070+ return e;
2071+};
2072+
2073+function addTo(container, elem) {
2074+ container.appendChild(elem);
2075+};
2076+
2077+function makeText(pos,txt) {
2078+ var e = newElement('div');
2079+ e.innerHTML = txt;
2080+ e.style.textAlign = pos;
2081+ return e;
2082+};
2083+
2084+function image(src) {
2085+ var img = newElement('img');
2086+ img.src = src;
2087+ img.name = src;
2088+ img.style.display = "block";
2089+ return img;
2090+}
2091+
2092+function fittedImage(w,h,src) {
2093+ var canvas = newElement('canvas');
2094+ canvas.style.display = "block";
2095+ canvas.style.width = w + 'px';
2096+ canvas.style.height = h + 'px';
2097+ canvas.width = w;
2098+ canvas.height = h;
2099+ canvas.innerHTML = "Your browser does not support the canvas element.";
2100+
2101+ var img = newElement('img');
2102+ img.onload = function() {
2103+ if (canvas.getContext) {
2104+ var ctx = canvas.getContext('2d');
2105+ var sx = 0, sy = 0, sWidth = this.width, sHeight = this.height;
2106+ if (w / h > this.width / this.height) {
2107+ sHeight = this.width * h / w;
2108+ sy = (this.height - sHeight) / 2;
2109+ } else {
2110+ sWidth = this.height * w / h;
2111+ sx = (this.width - sWidth) / 2;
2112+ }
2113+ ctx.drawImage(img, sx, sy, sWidth, sHeight,
2114+ 0,0, canvas.width, canvas.height);
2115+ }
2116+ };
2117+ img.src = src;
2118+ return canvas;
2119+};
2120+
2121+var video = function(src) {
2122+ var e = newElement('video');
2123+ e.controls = "controls";
2124+ var source = newElement('source');
2125+ source.src = src;
2126+ var segs = src.split('.');
2127+ source.type = "video/" + segs[segs.length-1];
2128+ addTo(e, source);
2129+ e.style.display = "block";
2130+ return e;
2131+};
2132+
2133+function divify(e) {
2134+ var div = newElement('div');
2135+ addTo(div, e);
2136+ return div;
2137+};
2138+function goDown(e) {
2139+ return e //.tagName === "DIV" ? e : divify(e);
2140+};
2141+function goRight(e) {
2142+ e.style.styleFloat = "left";
2143+ e.style.cssFloat = "left";
2144+ return e;
2145+};
2146+function goIn(e) {
2147+ e.style.position = 'absolute';
2148+ return e;
2149+};
2150+function flowWith(f, prep, elist) {
2151+ var container = newElement('div');
2152+ for (var i = elist.length; i--; ) {
2153+ addTo(container, f(prep(elist[i])));
2154+ }
2155+ return container;
2156+};
2157+
2158+function flow(dir,elist) {
2159+ switch(dir) {
2160+ case "DDown": elist = elist.slice(0).reverse();
2161+ case "DUp": return flowWith(goDown,render,elist);
2162+ case "DRight": elist = elist.slice(0).reverse();
2163+ case "DLeft": return flowWith(goRight,render,elist);
2164+ case "DOut": elist = elist.slice(0).reverse();
2165+ case "DIn": return flowWith(goIn,render,elist);
2166+ };
2167+};
2168+
2169+function toPos(pos) {
2170+ switch(pos[0]) {
2171+ case "Absolute": return pos[1] + "px";
2172+ case "Relative": return (pos[1] * 100) + "%";
2173+ }
2174+}
2175+
2176+function setPos(pos,e) {
2177+ e.style.position = 'absolute';
2178+ e.style.margin = 'auto';
2179+ switch(pos[0]) {
2180+ case "Position":
2181+ if (pos[1][0] !== "Far") e.style.left = 0;
2182+ if (pos[1][0] !== "Near") e.style.right = 0;
2183+ if (pos[2][0] !== "Far") e.style.top = 0;
2184+ if (pos[2][0] !== "Near") e.style.bottom = 0;
2185+ break;
2186+ case "PositionAt":
2187+ e.style.top = toPos(pos[2]);
2188+ e.style.left = toPos(pos[1]);
2189+ var shift = "translate(" + (-elem[3]/2) + "px," + (-elem[4]/2) + "px)";
2190+ e.style.transform = shift;
2191+ e.style.msTransform = shift;
2192+ e.style.MozTransform = shift;
2193+ e.style.webkitTransform = shift;
2194+ e.style.OTransform = shift;
2195+ break;
2196+ default:
2197+ var p = pos[0].slice(-2);
2198+ e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2199+ e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2200+ }
2201+}
2202+
2203+function container(pos,elem) {
2204+ var e = render(elem);
2205+ setPos(pos,e);
2206+ var div = newElement('div');
2207+ div.style.position = "relative";
2208+ div.style.overflow = "hidden";
2209+ addTo(div,e);
2210+ return div;
2211+};
2212+
2213+function render(elem) {
2214+ var e = {};
2215+ switch(elem[2][0]) {
2216+ case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2217+ case "EImage": e = image(elem[2][1]); break;
2218+ case "EVideo": e = video(elem[2][1]); break;
2219+ case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2220+ case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2221+ case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2222+ case "EEmpty": e = newElement('div'); break;
2223+ case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2224+ case "EHtml":
2225+ e = elem[2][1];
2226+ if (e.type !== 'button') {
2227+ var p = Value.getExcess(e);
2228+ elem[3] -= p[0];
2229+ elem[4] -= p[1];
2230+ }
2231+ break;
2232+ case "EExternalHtml":
2233+ e = newElement('div');
2234+ addTo(e, elem[2][1]);
2235+ break;
2236+ }
2237+ e.id = elem[1];
2238+ e.style.width = (~~elem[3]) + 'px';
2239+ e.style.height = (~~elem[4]) + 'px';
2240+ if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2241+ if (elem[6][0] === "Just") {
2242+ e.style.backgroundColor = Elm.Graphics.Color.extract(elem[6][1]);
2243+ }
2244+ if (elem[7][0] === "Just") {
2245+ var a = newElement('a');
2246+ a.href = elem[7][1];
2247+ addTo(a,e);
2248+ return a;
2249+ }
2250+ return e;
2251+};
2252+
2253+function update(node,curr,next) {
2254+ if (node.tagName === 'A') { node = node.firstChild; }
2255+ if (curr[1] === next[1]) return;
2256+ if (curr[2][0] !== next[2][0]) {
2257+ return node.parentNode.replaceChild(render(next),node);
2258+ }
2259+ var nextE = next[2], currE = curr[2];
2260+ switch(nextE[0]) {
2261+ case "EText":
2262+ if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2263+ if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2264+ break;
2265+ case "EImage":
2266+ if (nextE[1] !== currE[1]) node.src = nextE[1];
2267+ break;
2268+ case "EVideo":
2269+ case "EFittedImage":
2270+ if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2271+ return node.parentNode.replaceChild(render(next),node);
2272+ }
2273+ break;
2274+ case "ECollage":
2275+ if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2276+ return node.parentNode.replaceChild(render(next),node);
2277+ }
2278+ Collage.updateCollage(node,currE[3],nextE[3]);
2279+ break;
2280+ case "EFlow":
2281+ if (nextE[1] !== currE[1]) {
2282+ return node.parentNode.replaceChild(render(next),node);
2283+ }
2284+ var nexts = nextE[2];
2285+ var kids = node.childNodes;
2286+ if (nexts.length !== kids.length) {
2287+ return node.parentNode.replaceChild(render(next),node);
2288+ }
2289+ var currs = currE[2];
2290+ var goDir = {};
2291+ switch(nextE[1][0]) {
2292+ case "DDown": case "DUp": goDir = goDown; break;
2293+ case "DRight": case "DLeft": goDir = goRight; break;
2294+ case "DOut": case "DIn": goDir = goIn; break;
2295+ }
2296+ for (var i = kids.length; i-- ;) {
2297+ update(kids[i],currs[i],nexts[i]);
2298+ goDir(kids[i]);
2299+ }
2300+ break;
2301+ case "EContainer":
2302+ update(node.childNodes[0],currE[2],nextE[2]);
2303+ setPos(nextE[1],node.childNodes[0]);
2304+ break;
2305+ case "EEmpty":
2306+ break;
2307+ case "EHtml":
2308+ if (next[1] !== curr[1]) {
2309+ var e = render(next);
2310+ node.parentNode.replaceChild(e,node);
2311+ node = e;
2312+ }
2313+ if (e.type !== 'button') {
2314+ var p = Value.getExcess(node);
2315+ next[3] -= p[0];
2316+ next[4] -= p[1];
2317+ }
2318+ break;
2319+ case "EExternalHtml":
2320+ if (next[1] !== curr[1])
2321+ node.parentNode.replaceChild(render(next),node);
2322+ break;
2323+ }
2324+ if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2325+ if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2326+ if (next[5] !== curr[5]) node.style.opacity = next[5];
2327+ if (next[6].length === 2) {
2328+ var clr = Elm.Graphics.Color.extract(next[6][1]);
2329+ if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2330+ }
2331+ if (next[7].length === 2) {
2332+ if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2333+ }
2334+ next[1] = curr[1];
2335+}
2336+
2337+return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2338+
2339+}();
2340+var Elm = Elm || {};
2341+Elm.Signal = function() {
2342+ var send = function(node, timestep, changed) {
2343+ var kids = node.kids;
2344+ for (var i = kids.length; i--; ) {
2345+ kids[i].recv(timestep, changed, node.id);
2346+ }
2347+ };
2348+ var input = function(base) {
2349+ this.id = Guid.guid();
2350+ this.value = base;
2351+ this.kids = [];
2352+ this.defaultNumberOfKids = 0;
2353+ this.recv = function(timestep, eid, v) {
2354+ var changed = eid === this.id;
2355+ if (changed) { this.value = v; }
2356+ send(this, timestep, changed);
2357+ return changed;
2358+ };
2359+ Dispatcher.inputs.push(this);
2360+ };
2361+ var lift = function(func,args) {
2362+ this.id = Guid.guid();
2363+ this.value = null;
2364+ this.kids = [];
2365+ this.count = 0;
2366+ this.changed = false;
2367+
2368+ args.reverse();
2369+ this.recalc = function() {
2370+ var f = func;
2371+ for (var i = args.length; i--; ) {
2372+ f = f(args[i].value);
2373+ }
2374+ this.value = f;
2375+ };
2376+ this.recalc();
2377+
2378+ this.recv = function(timestep, changed, parentID) {
2379+ this.count += 1;
2380+ if (changed) { this.changed = true; }
2381+ if (this.count == args.length) {
2382+ if (this.changed) { this.recalc() }
2383+ send(this, timestep, this.changed);
2384+ this.changed = false;
2385+ this.count = 0;
2386+ }
2387+ };
2388+ for (var i = args.length; i--; ) {
2389+ args[i].kids.push(this);
2390+ }
2391+ };
2392+ var fold = function(func,base,baseIsFunc,input) {
2393+ this.id = Guid.guid();
2394+ this.value = baseIsFunc ? base(input.value) : base;
2395+ this.kids = [];
2396+ this.recv = function(timestep, changed, parentID) {
2397+ if (changed) { this.value = func(input.value)(this.value); }
2398+ send(this, timestep, changed);
2399+ };
2400+ input.kids.push(this);
2401+ };
2402+
2403+ var dropIf = function(pred,base,input) {
2404+ this.id = Guid.guid();
2405+ this.value = pred(input.value) ? base : input.value;
2406+ this.kids = [];
2407+ this.recv = function(timestep, changed, parentID) {
2408+ var chng = changed && !pred(input.value);
2409+ if (chng) { this.value = input.value; }
2410+ send(this, timestep, chng);
2411+ };
2412+ input.kids.push(this);
2413+ };
2414+ var dropRepeats = function(input) {
2415+ this.id = Guid.guid();
2416+ this.value = input.value;
2417+ this.kids = [];
2418+ this.recv = function(timestep, changed, parentID) {
2419+ var chng = changed && !eq(this.value,input.value);
2420+ if (chng) { this.value = input.value; }
2421+ send(this, timestep, chng);
2422+ };
2423+ input.kids.push(this);
2424+ };
2425+
2426+ var dropWhen = function(s1) { return function(b) { return function(s2) {
2427+ var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2428+ var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2429+ return new lift(function(p){return p[1];},[dropped]); }; };
2430+ };
2431+
2432+ var sampleOn = function(s1,s2) {
2433+ this.id = Guid.guid();
2434+ this.value = s2.value;
2435+ this.kids = [];
2436+ this.count = 0;
2437+ this.changed = false;
2438+
2439+ this.recv = function(timestep, changed, parentID) {
2440+ if (parentID === s1.id) this.changed = changed;
2441+ this.count += 1;
2442+ if (this.count == 2) {
2443+ if (this.changed) { this.value = s2.value; }
2444+ send(this, timestep, this.changed);
2445+ this.count = 0;
2446+ this.changed = false;
2447+ }
2448+ };
2449+ s1.kids.push(this);
2450+ s2.kids.push(this);
2451+ };
2452+
2453+ return {
2454+ constant : function(v) { return new input(v); },
2455+ lift : function(f){return function(e){return new lift(f,[e]);};},
2456+ lift2 : function(f) { return function(e1) { return function(e2) {
2457+ return new lift(f, [e1,e2]); }; }; },
2458+ lift3 : function(f) { return function(e1) { return function(e2) {
2459+ return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2460+ lift4 : function(f) { return function(e1) { return function(e2) {
2461+ return function(e3) { return function(e4) {
2462+ return new lift(f, [e1,e2,e3,e4]); }; }; }; }; },
2463+ foldp : function(f) { return function(b) { return function(e) {
2464+ return new fold(f,b,false,e); }; }; },
2465+ foldp_ : function(f) { return function(b) { return function(e) {
2466+ return new fold(f,b,true,e); }; }; },
2467+ foldp1 : function(f) { return function(e) {
2468+ return new fold(f,function(x){return x;},true,e); }; },
2469+ count : function(sig) {
2470+ var incr = function(_){return function(c){return c+1;};};
2471+ return new fold(incr,0,false,sig) },
2472+ keepIf : function(pred) { return function(base) { return function(sig) {
2473+ return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2474+ dropIf : function(pred) { return function(base) { return function(sig) {
2475+ return new dropIf(pred,base,sig); }; }; },
2476+ keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2477+ dropWhen : dropWhen,
2478+ dropRepeats : function(s) { return new dropRepeats(s);},
2479+ sampleOn : function(s1){return function(s2){return new sampleOn(s1,s2);};}
2480+ };
2481+}();
2482+var Dispatcher = function() {
2483+ var program = null;
2484+ var timestep = 0;
2485+ var inputs = [];
2486+ var currentElement = null;
2487+
2488+ var initialize = function() {
2489+ program = Elm.main();
2490+ if (!program.hasOwnProperty('recv')) {
2491+ program = Elm.Signal.constant(program);
2492+ }
2493+
2494+ currentElement = program.value;
2495+ filterDeadInputs();
2496+
2497+ var content = document.getElementById('content');
2498+ content.appendChild(Render.render(currentElement));
2499+ var w = document.getElementById('widthChecker').offsetWidth;
2500+ if (w !== window.innerWidth) {
2501+ Dispatcher.notify(Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2502+ }
2503+ program = Elm.Signal.lift(function(value) {
2504+ var content = document.getElementById('content');
2505+ Render.update(content.firstChild,currentElement,value);
2506+ currentElement = value;
2507+ return value;
2508+ })(program);
2509+ };
2510+ var notify = function(id, v) {
2511+ timestep += 1;
2512+ //console.log(timestep);
2513+ var hasListener = false;
2514+ for (var i = inputs.length; i--; ) {
2515+ hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2516+ }
2517+ return hasListener;
2518+ };
2519+
2520+ function isAlive(input) {
2521+ if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2522+ var len = input.kids.length;
2523+ if (len == 0) return false;
2524+ if (len > input.defaultNumberOfKids) return true;
2525+ var alive = false;
2526+ for (var i = len; i--; ) {
2527+ alive = alive || isAlive(input.kids[i]);
2528+ }
2529+ return alive;
2530+ }
2531+ function filterDeadInputs() {
2532+ var temp = [];
2533+ for (var i = inputs.length; i--; ) {
2534+ if (isAlive(inputs[i])) temp.push(inputs[i]);
2535+ }
2536+ inputs = temp;
2537+ }
2538+
2539+ return {initialize:initialize, notify:notify, inputs:inputs};
2540+}();Elm.HTTP = function() {
2541+ var JS = Elm.JavaScript;
2542+ var toElmString = Elm.JavaScript.castJSStringToString;
2543+ function request(verb) { return function(url) { return function(data) {
2544+ return function(headers) {
2545+ return {0 : "Request",
2546+ length : 1,
2547+ verb : JS.castStringToJSString(verb),
2548+ url : JS.castStringToJSString(url),
2549+ data : data === null ? null : JS.castStringToJSString(data),
2550+ headers : headers }; }; }; };
2551+ }
2552+ function get(url) { return request("GET")(url)(null)(["Nil"]); }
2553+ function post(url) { return function(data) {
2554+ return request("POST")(url)(data)(["Nil"]); }; }
2555+
2556+ function sendReq(responses) { return function(req) {
2557+ Dispatcher.notify(responses.id,["Waiting"]);
2558+ var request = null;
2559+ if (window.XMLHttpRequest) {
2560+ request = new XMLHttpRequest();
2561+ } else if (window.ActiveXObject) {
2562+ request = new ActiveXObject("Microsoft.XMLHTTP");
2563+ }
2564+ request.onreadystatechange = function(e) {
2565+ if (request.readyState === 4) {
2566+ Dispatcher.notify(
2567+ responses.id,
2568+ request.status === 200
2569+ ? ["Success", toElmString(request.responseText)]
2570+ : ["Failure", request.status, toElmString(request.statusText)]);
2571+ }
2572+ };
2573+ request.open(req.verb, req.url, true);
2574+ Elm.List.map(function(pair) {
2575+ request.setRequestHeader(
2576+ JS.castStringToJSString(pair[1]),
2577+ JS.castStringToJSString(pair[2]));
2578+ })(req.headers);
2579+ request.send(req.data);
2580+ return null;
2581+ };
2582+ }
2583+
2584+ function send(requests) {
2585+ var responses = Elm.Signal.constant(["Waiting"]);
2586+ var sender = Elm.Signal.lift(sendReq(responses))(requests);
2587+ function f(x) { return function(y) { return x; } }
2588+ var combine = Elm.Signal.lift2(f)(responses)(sender);
2589+ return combine;
2590+ }
2591+
2592+ return {get : get,
2593+ post : post,
2594+ request : request,
2595+ send : send,
2596+ sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
2597+ };
2598+}();
2599+
2600+Elm.Input = function() {
2601+ var JS = Elm.JavaScript;
2602+ var toElmString = Elm.JavaScript.castJSStringToString;
2603+ var newTextInput = function(elem, ghostText) {
2604+ elem.placeholder = JS.castStringToJSString(ghostText);
2605+ var str = Elm.Signal.constant(["Nil"]);
2606+ Value.addListener(elem, 'keyup', function(e) {
2607+ Dispatcher.notify(str.id, toElmString(elem.value));
2608+ elem.focus();
2609+ });
2610+ elem.style.padding = "1px";
2611+ return Value.Tuple(Value.wrap(elem), str);
2612+ };
2613+ var newElement = function(name) {
2614+ var e = document.createElement(name);
2615+ e.style.padding = "0";
2616+ e.style.margin = "0";
2617+ return e;
2618+ };
2619+ var textArea = function(cols) { return function(rows) {
2620+ var textarea = newElement('textarea');
2621+ textarea.rows = rows;
2622+ textarea.cols = cols;
2623+ return newTextInput(textarea, "");
2624+ };
2625+ };
2626+ var textField = function(ghostText) {
2627+ var field = newElement('input');
2628+ field.type = 'text';
2629+ return newTextInput(field, ghostText);
2630+ };
2631+ var password = function(ghostText) {
2632+ var field = newElement('input');
2633+ field.type = 'password';
2634+ return newTextInput(field, ghostText);
2635+ };
2636+ var checkbox = function(checked) {
2637+ var box = newElement('input');
2638+ box.type = 'checkbox';
2639+ box.checked = checked;
2640+ var status = Elm.Signal.constant(checked);
2641+ Value.addListener(box, 'change', function(e) {
2642+ Dispatcher.notify(status.id, box.checked);
2643+ });
2644+ return Value.Tuple(Value.wrap(box), status);
2645+ };
2646+ var dropDown = function(options) {
2647+ var slct = newElement('select');
2648+ var opts = [];
2649+ while (options[0] === "Cons") {
2650+ var opt = newElement('option');
2651+ var str = Text.toText(options[1][1]);
2652+ opt.value = str;
2653+ opt.innerHTML = str;
2654+ slct.appendChild(opt);
2655+ opts.push(options[1][2]);
2656+ options = options[2];
2657+ }
2658+ var status = Elm.Signal.constant(opts[0]);
2659+ Value.addListener(slct, 'change', function(e) {
2660+ Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2661+ });
2662+ return Value.Tuple(Value.wrap(slct), status);
2663+ };
2664+ var stringDropDown = function(opts) {
2665+ return dropDown(Elm.List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2666+ };
2667+ var button = function(name) {
2668+ var b = newElement('input');
2669+ b.type = "button";
2670+ b.value = JS.castStringToJSString(name);
2671+ var press = Elm.Signal.constant(false);
2672+ Value.addListener(b, 'click', function(e) {
2673+ Dispatcher.notify(press.id, true);
2674+ Dispatcher.notify(press.id, false);
2675+ });
2676+ return Value.Tuple(Value.wrap(b),press);
2677+ };
2678+ return {textArea:textArea, textField:textField,
2679+ password:password, checkbox:checkbox,
2680+ dropDown:dropDown, stringDropDown:stringDropDown,
2681+ button:button};
2682+}();
2683+
2684+Elm.Keyboard = { Raw : function() {
2685+ var keysDown = Elm.Signal.constant(["Nil"]);
2686+ var charPressed = Elm.Signal.constant(["Nothing"]);
2687+ function remove(x,xs) {
2688+ if (xs[0] === "Nil") return xs;
2689+ if (xs[1] === x) return xs[2];
2690+ return ["Cons", xs[1], remove(x,xs[2])];
2691+ }
2692+ function has(x,xs) {
2693+ while (xs[0] !== "Nil") {
2694+ if (xs[1] === x) return true;
2695+ xs = xs[2];
2696+ }
2697+ return false;
2698+ }
2699+ Value.addListener(document, 'keydown', function(e) {
2700+ if (has(e.keyCode, keysDown.value)) return;
2701+ var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2702+ if (!hasListener)
2703+ this.removeEventListener('keydown',arguments.callee,false);
2704+ });
2705+ Value.addListener(document, 'keyup', function(e) {
2706+ var codes = remove(e.keyCode, keysDown.value);
2707+ var hasListener = Dispatcher.notify(keysDown.id, codes);
2708+ if (!hasListener)
2709+ this.removeEventListener('keyup',arguments.callee,false);
2710+ });
2711+ Value.addListener(window, 'blur', function(e) {
2712+ var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2713+ if (!hasListener)
2714+ this.removeEventListener('blur',arguments.callee,false);
2715+ });
2716+ Value.addListener(document, 'keypress', function(e) {
2717+ var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2718+ Dispatcher.notify(charPressed.id, ["Nothing"]);
2719+ if (!hasListener)
2720+ this.removeEventListener('keypress',arguments.callee,false);
2721+ });
2722+ return {keysDown:keysDown,
2723+ charPressed:charPressed};
2724+ }()
2725+};
2726+Elm.Mouse = function() {
2727+ var position = Elm.Signal.constant(Value.Tuple(0,0));
2728+ position.defaultNumberOfKids = 2;
2729+
2730+ var x = Elm.Signal.lift(function(p){return p[1];})(position);
2731+ x.defaultNumberOfKids = 0;
2732+ var y = Elm.Signal.lift(function(p){return p[2];})(position);
2733+ y.defaultNumberOfKids = 0;
2734+
2735+ var isDown = Elm.Signal.constant(false);
2736+ var isClicked = Elm.Signal.constant(false);
2737+ var clicks = Elm.Signal.constant(Value.Tuple());
2738+
2739+ function getXY(e) {
2740+ var posx = 0;
2741+ var posy = 0;
2742+ if (!e) var e = window.event;
2743+ if (e.pageX || e.pageY) {
2744+ posx = e.pageX;
2745+ posy = e.pageY;
2746+ } else if (e.clientX || e.clientY) {
2747+ posx = e.clientX + document.body.scrollLeft +
2748+ document.documentElement.scrollLeft;
2749+ posy = e.clientY + document.body.scrollTop +
2750+ document.documentElement.scrollTop;
2751+ }
2752+ return Value.Tuple(posx, posy);
2753+ }
2754+
2755+ Value.addListener(document, 'click', function(e) {
2756+ var hasListener1 = Dispatcher.notify(isClicked.id, true);
2757+ var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2758+ Dispatcher.notify(isClicked.id, false);
2759+ if (!hasListener1 && !hasListener2)
2760+ this.removeEventListener('click',arguments.callee,false);
2761+ });
2762+ Value.addListener(document, 'mousedown', function(e) {
2763+ var hasListener = Dispatcher.notify(isDown.id, true);
2764+ if (!hasListener)
2765+ this.removeEventListener('mousedown',arguments.callee,false);
2766+ });
2767+ Value.addListener(document, 'mouseup', function(e) {
2768+ var hasListener = Dispatcher.notify(isDown.id, false);
2769+ if (!hasListener)
2770+ this.removeEventListener('mouseup',arguments.callee,false);
2771+ });
2772+ Value.addListener(document, 'mousemove', function(e) {
2773+ var hasListener = Dispatcher.notify(position.id, getXY(e));
2774+ if (!hasListener)
2775+ this.removeEventListener('mousemove',arguments.callee,false);
2776+ });
2777+ var clickedOn = function(elem) {
2778+ var node = Render.render(elem);
2779+ var click = Elm.Signal.constant(false);
2780+ Value.addListener(node, 'click', function(e) {
2781+ Dispatcher.notify(click.id, true);
2782+ Dispatcher.notify(click.id, false);
2783+ });
2784+ return Value.Tuple(Value.wrap(node), click);
2785+ };
2786+ return {position: position,
2787+ x:x,
2788+ y:y,
2789+ isClicked: isClicked,
2790+ isDown: isDown,
2791+ clicks: clicks,
2792+ isClickedOn: clickedOn
2793+ };
2794+ }();
2795+Elm.Random = function() {
2796+ var inRange = function(min) { return function(max) {
2797+ return Elm.Signal.constant(Math.floor(Math.random() * (max-min+1)) + min);
2798+ };
2799+ };
2800+ var randomize = function(min) { return function(max) { return function(signal) {
2801+ function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }
2802+ return Elm.Signal.lift(f)(signal);
2803+ };
2804+ };
2805+ };
2806+ return { inRange:inRange, randomize:randomize };
2807+}();Elm.Time = function() {
2808+ var every = function(t) {
2809+ t *= 1000;
2810+ var clock = Elm.Signal.constant(0);
2811+ var time = 0;
2812+ setInterval(function() {
2813+ time += t;
2814+ Dispatcher.notify(clock.id, time/1000);
2815+ }, t);
2816+ return clock;
2817+ };
2818+ var after = function(t) {
2819+ t *= 1000;
2820+ var thread = Elm.Signal.constant(false);
2821+ setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2822+ return thread;
2823+ };
2824+ var before = function(t) {
2825+ t *= 1000;
2826+ var thread = Elm.Signal.constant(true);
2827+ setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2828+ return thread;
2829+ };
2830+ return {every:every,after:after,before:before};
2831+}();Elm.Window = function() {
2832+ var dimensions = Elm.Signal.constant(Value.Tuple(window.innerWidth,
2833+ window.innerHeight));
2834+ dimensions.defaultNumberOfKids = 2;
2835+
2836+ var width = Elm.Signal.lift(function(p){return p[1];})(dimensions);
2837+ width.defaultNumberOfKids = 0;
2838+ var height = Elm.Signal.lift(function(p){return p[2];})(dimensions);
2839+ height.defaultNumberOfKids = 0;
2840+
2841+ Value.addListener(window, 'resize', function(e) {
2842+ var w = document.getElementById('widthChecker').offsetWidth;
2843+ var hasListener = Dispatcher.notify(dimensions.id,
2844+ Value.Tuple(w, window.innerHeight));
2845+ if (!hasListener)
2846+ this.removeEventListener('resize',arguments.callee,false);
2847+ });
2848+ return {dimensions:dimensions,width:width,height:height};
2849+}();
2850+
2851+Value.addListener(document, 'elm_log', function(e) { console.log(e.value); });
2852+Value.addListener(document, 'elm_title', function(e) {document.title = e.value;});
2853+Value.addListener(document, 'elm_redirect', function(e) {
2854+ if (e.value.length > 0) { window.location = e.value; }
2855+ });
2856+
2857+var Elm = Elm || {};
2858+Elm.Prelude = function() {
2859+ var mod = function(x) { return function(y) {
2860+ var r = x % y;
2861+ var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
2862+ return m == y ? 0 : m;
2863+ }; };
2864+
2865+ var min = function(x) { return function(y) { return Math.min(x,y); }; };
2866+ var max = function(x) { return function(y) { return Math.max(x,y); }; };
2867+
2868+ var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
2869+ var clamp = function(lo) { return function(hi) {
2870+ return function(x) { return Math.min(hi, Math.max(lo, x)); };
2871+ };
2872+ };
2873+ var curry = function(f) { return function(x) { return function(y) {
2874+ return f(["Tuple2",x,y]); }; };
2875+ };
2876+ var uncurry = function(f) { return function(p) {
2877+ if (p[0] !== "Tuple2") {
2878+ throw "Function was uncurry'd but was not given a pair.";
2879+ }
2880+ return f(p[1])(p[2]); };
2881+ };
2882+
2883+ var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
2884+
2885+ return {eq : Value.eq,
2886+ id : function(x) { return x; },
2887+ not : function(b) { return !b; },
2888+ fst : function(p) { return p[1]; },
2889+ snd : function(p) { return p[2]; },
2890+ rem : function(x) { return function(y) { return x % y; }; },
2891+ div : function(x) { return function(y) { return ~~(x / y); }; },
2892+ compare : function(x) { return function (y) {
2893+ x = (typeof x === "object") ? toText(x) : x;
2894+ y = (typeof y === "object") ? toText(y) : y;
2895+ return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
2896+ };
2897+ },
2898+ toFloat : function(x) { return x; },
2899+ round : function(n) { return Math.round(n); },
2900+ floor : function(n) { return Math.floor(n); },
2901+ ceiling : function(n) { return Math.ceil(n); },
2902+ truncate : function(n) { return ~~n; },
2903+ sqrt : Math.sqrt,
2904+ abs : Math.abs,
2905+ pi : Math.PI,
2906+ e : Math.E,
2907+ sin : Math.sin,
2908+ cos : Math.cos,
2909+ tan : Math.tan,
2910+ asin : Math.asin,
2911+ acos : Math.acos,
2912+ atan : Math.atan,
2913+ atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
2914+ mod : mod,
2915+ min : min,
2916+ max : max,
2917+ flip : flip,
2918+ clamp : clamp,
2919+ curry : curry,
2920+ uncurry : uncurry,
2921+ logBase : logBase,
2922+ Just : Elm.Maybe.Just,
2923+ Nothing : Elm.Maybe.Nothing,
2924+ maybe : Elm.Maybe.maybe,
2925+ map : Elm.List.map,
2926+ filter : Elm.List.filter,
2927+ head : Elm.List.head,
2928+ tail : Elm.List.tail,
2929+ last : Elm.List.last,
2930+ length : Elm.List.length,
2931+ reverse : Elm.List.reverse,
2932+ foldr : Elm.List.foldr,
2933+ foldr1 : Elm.List.foldr1,
2934+ foldl : Elm.List.foldl,
2935+ foldl1 : Elm.List.foldl1,
2936+ and : Elm.List.and,
2937+ or : Elm.List.or,
2938+ all : Elm.List.all,
2939+ any : Elm.List.any,
2940+ sum : Elm.List.sum,
2941+ product : Elm.List.product,
2942+ concat : Elm.List.concat,
2943+ concatMap : Elm.List.concatMap,
2944+ maximum : Elm.List.maximum,
2945+ minimum : Elm.List.minimum,
2946+ scanl : Elm.List.scanl,
2947+ scanl1 : Elm.List.scanl1,
2948+ take : Elm.List.take,
2949+ drop : Elm.List.drop,
2950+ zip : Elm.List.zip,
2951+ unzip : Elm.List.unzip,
2952+ lift : Elm.Signal.lift,
2953+ lift2 : Elm.Signal.lift2,
2954+ lift3 : Elm.Signal.lift3,
2955+ lift4 : Elm.Signal.lift4,
2956+ foldp : Elm.Signal.foldp,
2957+ foldp1 : Elm.Signal.foldp1,
2958+ foldp_ : Elm.Signal.foldp_,
2959+ constant : Elm.Signal.constant,
2960+ count : Elm.Signal.count,
2961+ keepIf : Elm.Signal.keepIf,
2962+ dropIf : Elm.Signal.dropIf,
2963+ keepWhen : Elm.Signal.keepWhen,
2964+ dropWhen : Elm.Signal.dropWhen,
2965+ dropRepeats : Elm.Signal.dropRepeats,
2966+ sampleOn : Elm.Signal.sampleOn
2967+ };
2968+
2969+}();
2970+
2971+(function() {
2972+ var include = function(library) {
2973+ for (var i in library) {
2974+ Elm.Prelude[i] = library[i];
2975+ }
2976+ };
2977+ include (Elm.Graphics.Color);
2978+ include (Elm.Graphics.Text);
2979+ include (Elm.Graphics.Element);
2980+
2981+ show = Value.show;
2982+
2983+}());
2984+try{if(Elm.Automaton)throw "Module name collision, 'Automaton' is already defined.";Elm.Automaton=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Data.List instanceof Object))throw 'module not found'}catch(e){throw "Module 'Data.List' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var unzip=Elm.Data.List.unzip
2985+function Automaton_0(a1){return ["Automaton",a1]};var Listen_9=["Listen"],Ignore_10=["Ignore"]
2986+function DragFrom_11(a1){return ["DragFrom",a1]};var count_8=init_6(0)(function(__75){return function(c_76){return(1+c_76)}})
2987+function run_1(Automaton$m0_15){return function(input_16){return function(){switch(Automaton$m0_15[0]){case"Automaton":return lift(fst)(foldp_(function(a_18){return function(Tuple2$bAutomaton$m_19){return function(){switch(Tuple2$bAutomaton$m_19[0]){case"Tuple2":switch(Tuple2$bAutomaton$m_19[2][0]){case"Automaton":return Tuple2$bAutomaton$m_19[2][1](a_18)};break};throw "Non-exhaustive pattern match in case"}()}})(Automaton$m0_15[1])(input_16))};throw "Non-exhaustive pattern match in case"}()}}
2988+function step_2(a_22){return function(Automaton$m_23){return function(){switch(Automaton$m_23[0]){case"Automaton":return Automaton$m_23[1](a_22)};throw "Non-exhaustive pattern match in case"}()}}
2989+function composeAuto_3(a1_25){return function(a2_26){return function(){var Automaton$m1_27=a1_25,m1_28=function(){switch(Automaton$m1_27[0]){case"Automaton":return Automaton$m1_27[1]};throw "Non-exhaustive pattern match in case"}(),Automaton$m2_29=a2_26,m2_30=function(){switch(Automaton$m2_29[0]){case"Automaton":return Automaton$m2_29[1]};throw "Non-exhaustive pattern match in case"}();return Automaton_0(function(a_33){return function(){var Tuple2$bm1__34=m1_28(a_33),b_35=function(){switch(Tuple2$bm1__34[0]){case"Tuple2":return Tuple2$bm1__34[1]};throw "Non-exhaustive pattern match in case"}(),m1__36=function(){switch(Tuple2$bm1__34[0]){case"Tuple2":return Tuple2$bm1__34[2]};throw "Non-exhaustive pattern match in case"}();return function(){var Tuple2$cm2__41=m2_30(b_35),c_42=function(){switch(Tuple2$cm2__41[0]){case"Tuple2":return Tuple2$cm2__41[1]};throw "Non-exhaustive pattern match in case"}(),m2__43=function(){switch(Tuple2$cm2__41[0]){case"Tuple2":return Tuple2$cm2__41[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",c_42,composeAuto_3(m1__36)(m2__43)]}()}()})}()}}
2990+function combine_4(autos_48){return Automaton_0(function(a_49){return function(){var Tuple2$bsautos__50=unzip(map(function(Automaton$m_53){return function(){switch(Automaton$m_53[0]){case"Automaton":return Automaton$m_53[1](a_49)};throw "Non-exhaustive pattern match in case"}()})(autos_48)),bs_51=function(){switch(Tuple2$bsautos__50[0]){case"Tuple2":return Tuple2$bsautos__50[1]};throw "Non-exhaustive pattern match in case"}(),autos__52=function(){switch(Tuple2$bsautos__50[0]){case"Tuple2":return Tuple2$bsautos__50[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",bs_51,combine_4(autos__52)]}()})}
2991+function pure_5(f_59){return Automaton_0(function(x_60){return ["Tuple2",f_59(x_60),pure_5(f_59)]})}
2992+function init_6(s_61){return function(step_62){return Automaton_0(function(a_63){return function(){var s__64=step_62(a_63)(s_61);return ["Tuple2",s__64,init_6(s__64)(step_62)]}()})}}
2993+function init__7(s_65){return function(step_66){return Automaton_0(function(a_67){return function(){var Tuple2$bs__68=step_66(a_67)(s_65),b_69=function(){switch(Tuple2$bs__68[0]){case"Tuple2":return Tuple2$bs__68[1]};throw "Non-exhaustive pattern match in case"}(),s__70=function(){switch(Tuple2$bs__68[0]){case"Tuple2":return Tuple2$bs__68[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",b_69,init__7(s__70)(step_66)]}()})}}
2994+function vecSub_12(Tuple2$x1y1_77){return function(Tuple2$x2y2_78){return function(){switch(Tuple2$x1y1_77[0]){case"Tuple2":return function(){switch(Tuple2$x2y2_78[0]){case"Tuple2":return ["Tuple2",(Tuple2$x1y1_77[1]-Tuple2$x2y2_78[1]),(Tuple2$x1y1_77[2]-Tuple2$x2y2_78[2])]};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
2995+function stepDrag_13(Tuple2$presspos_83){return function(Tuple2$dsform_84){return function(){switch(Tuple2$presspos_83[0]){case"Tuple2":return function(){switch(Tuple2$dsform_84[0]){case"Tuple2":return function(){function wrap_89(ds__90){return ["Tuple2",Tuple2$dsform_84[2],["Tuple2",ds__90,Tuple2$dsform_84[2]]]};return function(){switch(Tuple2$dsform_84[1][0]){case"DragFrom":return(Tuple2$presspos_83[1]?["Tuple2",uncurry(move)(vecSub_12(Tuple2$presspos_83[2])(Tuple2$dsform_84[1][1]))(Tuple2$dsform_84[2]),["Tuple2",DragFrom_11(Tuple2$dsform_84[1][1]),Tuple2$dsform_84[2]]]:function(){var form__92=uncurry(move)(vecSub_12(Tuple2$presspos_83[2])(Tuple2$dsform_84[1][1]))(Tuple2$dsform_84[2]);return ["Tuple2",form__92,["Tuple2",Listen_9,form__92]]}());case"Ignore":return wrap_89((Tuple2$presspos_83[1]?Ignore_10:Listen_9));case"Listen":return wrap_89((not(Tuple2$presspos_83[1])?Listen_9:(isWithin(Tuple2$presspos_83[2])(Tuple2$dsform_84[2])?DragFrom_11(Tuple2$presspos_83[2]):Ignore_10)))};throw "Non-exhaustive pattern match in case"}()}()};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
2996+function dragForm_14(form_93){return init__7(["Tuple2",Listen_9,form_93])(stepDrag_13)};return {Automaton:Automaton_0,run:run_1,step:step_2,composeAuto:composeAuto_3,combine:combine_4,pure:pure_5,init:init_6,init_:init__7,count:count_8,Listen:Listen_9,Ignore:Ignore_10,DragFrom:DragFrom_11,vecSub:vecSub_12,stepDrag:stepDrag_13,dragForm:dragForm_14}}();Elm.main=function(){return Elm.Automaton.main}}catch(e){Elm.main=function(){var msg=('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>'+'<br/><span style="color:grey">Runtime Error in Automaton module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>fst, unzip</span>');document.body.innerHTML=Text.monospace(msg);throw e}}